1 /*-------------------------------------------------------------------------
4 * Generalized routines for temporary tuple storage.
6 * This module handles temporary storage of tuples for purposes such
7 * as Materialize nodes, hashjoin batch files, etc. It is essentially
8 * a dumbed-down version of tuplesort.c; it does no sorting of tuples
9 * but can only store and regurgitate a sequence of tuples. However,
10 * because no sort is required, it is allowed to start reading the sequence
11 * before it has all been written. This is particularly useful for cursors,
12 * because it allows random access within the already-scanned portion of
13 * a query without having to process the underlying scan to completion.
14 * Also, it is possible to support multiple independent read pointers.
16 * A temporary file is used to handle the data if it exceeds the
17 * space limit specified by the caller.
19 * Beginning in Postgres 8.2, what is stored is just MinimalTuples;
20 * callers cannot expect valid system columns in regurgitated tuples.
21 * Also, we have changed the API to return tuples in TupleTableSlots,
22 * so that there is a check to prevent attempted access to system columns.
24 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
25 * Portions Copyright (c) 1994, Regents of the University of California
29 *-------------------------------------------------------------------------
34 #include "executor/tuptable.h"
37 /* Tuplestorestate is an opaque type whose details are not known outside
40 typedef struct Tuplestorestate Tuplestorestate
;
43 * Currently we only need to store MinimalTuples, but it would be easy
44 * to support the same behavior for IndexTuples and/or bare Datums.
47 extern Tuplestorestate
*tuplestore_begin_heap(bool randomAccess
,
51 extern void tuplestore_set_eflags(Tuplestorestate
*state
, int eflags
);
53 extern void tuplestore_puttupleslot(Tuplestorestate
*state
,
54 TupleTableSlot
*slot
);
55 extern void tuplestore_puttuple(Tuplestorestate
*state
, HeapTuple tuple
);
56 extern void tuplestore_putvalues(Tuplestorestate
*state
, TupleDesc tdesc
,
57 Datum
*values
, bool *isnull
);
59 /* tuplestore_donestoring() used to be required, but is no longer used */
60 #define tuplestore_donestoring(state) ((void) 0)
62 extern int tuplestore_alloc_read_pointer(Tuplestorestate
*state
, int eflags
);
64 extern void tuplestore_select_read_pointer(Tuplestorestate
*state
, int ptr
);
66 extern void tuplestore_copy_read_pointer(Tuplestorestate
*state
,
67 int srcptr
, int destptr
);
69 extern void tuplestore_trim(Tuplestorestate
*state
);
71 extern bool tuplestore_in_memory(Tuplestorestate
*state
);
73 extern bool tuplestore_gettupleslot(Tuplestorestate
*state
, bool forward
,
74 bool copy
, TupleTableSlot
*slot
);
75 extern bool tuplestore_advance(Tuplestorestate
*state
, bool forward
);
77 extern bool tuplestore_ateof(Tuplestorestate
*state
);
79 extern void tuplestore_rescan(Tuplestorestate
*state
);
81 extern void tuplestore_clear(Tuplestorestate
*state
);
83 extern void tuplestore_end(Tuplestorestate
*state
);
85 #endif /* TUPLESTORE_H */