1 /*-------------------------------------------------------------------------
4 * definitions for executor state nodes
7 * Copyright (c) 1994, Regents of the University of California
9 * $Id: execnodes.h,v 1.13 1998/02/13 03:45:22 vadim Exp $
11 *-------------------------------------------------------------------------
16 #include <nodes/memnodes.h>
17 #include <nodes/primnodes.h>
18 #include <executor/hashjoin.h>
19 #include <access/relscan.h>
20 #include <access/sdir.h>
21 #include <nodes/params.h>
22 #include <executor/tuptable.h>
23 #include <access/funcindex.h>
26 * IndexInfo information
28 * this class holds the information saying what attributes
29 * are the key attributes for this index. -cim 10/15/89
31 * NumKeyAttributes number of key attributes for this index
32 * KeyAttributeNumbers array of attribute numbers used as keys
33 * Predicate partial-index predicate for this index
36 typedef struct IndexInfo
39 int ii_NumKeyAttributes;
40 AttrNumber *ii_KeyAttributeNumbers;
41 FuncIndexInfoPtr ii_FuncIndexInfo;
46 * RelationInfo information
48 * whenever we update an existing relation, we have to
49 * update indices on the relation. The RelationInfo class
50 * is used to hold all the information on result relations,
51 * including indices.. -cim 10/15/89
53 * RangeTableIndex result relation's range table index
54 * RelationDesc relation descriptor for result relation
55 * NumIndices number indices existing on result relation
56 * IndexRelationDescs array of relation descriptors for indices
57 * IndexRelationInfo array of key/attr info for indices
60 typedef struct RelationInfo
63 Index ri_RangeTableIndex;
64 Relation ri_RelationDesc;
66 RelationPtr ri_IndexRelationDescs;
67 IndexInfo **ri_IndexRelationInfo;
73 * This class holds the "current context" information
74 * needed to evaluate expressions for doing tuple qualifications
75 * and tuple projections. For example, if an expression refers
76 * to an attribute in the current inner tuple then we need to know
77 * what the current inner tuple is and so we look at the expression
81 typedef struct ExprContext
84 TupleTableSlot *ecxt_scantuple;
85 TupleTableSlot *ecxt_innertuple;
86 TupleTableSlot *ecxt_outertuple;
87 Relation ecxt_relation;
89 ParamListInfo ecxt_param_list_info;
90 ParamExecData *ecxt_param_exec_vals; /* this is for subselects */
91 List *ecxt_range_table;
92 Datum *ecxt_values; /* precomputed values for aggreg */
93 char *ecxt_nulls; /* null flags for aggreg values */
97 * ProjectionInfo node information
99 * This is all the information needed to preform projections
100 * on a tuple. Nodes which need to do projections create one
101 * of these. In theory, when a node wants to preform a projection
102 * it should just update this information as necessary and then
103 * call ExecProject(). -cim 6/3/91
105 * targetlist target list for projection
106 * len length of target list
107 * tupValue array of pointers to projection results
108 * exprContext expression context for ExecTargetList
109 * slot slot to place projection result in
112 typedef struct ProjectionInfo
118 ExprContext *pi_exprContext;
119 TupleTableSlot *pi_slot;
125 * this class is used to store information regarding junk attributes.
126 * A junk attribute is an attribute in a tuple that is needed only for
127 * storing intermediate information in the executor, and does not belong
128 * in the tuple proper. For example, when we do a delete or replace
129 * query, the planner adds an entry to the targetlist so that the tuples
130 * returned to ExecutePlan() contain an extra attribute: the t_ctid of
131 * the tuple to be deleted/replaced. This is needed for amdelete() and
132 * amreplace(). In doing a delete this does not make much of a
133 * difference, but in doing a replace we have to make sure we disgard
134 * all the junk in a tuple before calling amreplace(). Otherwise the
135 * inserted tuple will not have the correct schema. This solves a
136 * problem with hash-join and merge-sort replace plans. -cim 10/10/90
138 * targetList: the original target list (including junk attributes).
139 * length: the length of 'targetList'.
140 * tupType: the tuple descriptor for the "original" tuple
141 * (including the junk attributes).
142 * cleanTargetList: the "clean" target list (junk attributes removed).
143 * cleanLength: the length of 'cleanTargetList'
144 * cleanTupTyp: the tuple descriptor of the "clean" tuple (with
145 * junk attributes removed).
146 * cleanMap: A map with the correspondance between the non junk
147 * attributes of the "original" tuple and the
148 * attributes of the "clean" tuple.
151 typedef struct JunkFilter
156 TupleDesc jf_tupType;
157 List *jf_cleanTargetList;
159 TupleDesc jf_cleanTupType;
160 AttrNumber *jf_cleanMap;
166 * direction direction of the scan
168 * range_table array of scan relation information
170 * result_relation_information for update queries
172 * into_relation_descriptor relation being retrieved "into"
174 * param_list_info information needed to transform
175 * Param nodes into Const nodes
177 * BaseId during InitPlan(), each node is
178 * given a number. this is the next
179 * number to be assigned.
181 * tupleTable this is a pointer to an array
182 * of pointers to tuples used by
183 * the executor at any given moment.
185 * junkFilter contains information used to
186 * extract junk attributes from a tuple.
187 * (see JunkFilter above)
189 * refcount local buffer refcounts used in
190 * an ExecMain cycle. this is introduced
191 * to avoid ExecStart's unpinning each
192 * other's buffers when called recursively
195 typedef struct EState
198 ScanDirection es_direction;
199 List *es_range_table;
200 RelationInfo *es_result_relation_info;
201 Relation es_into_relation_descriptor;
202 ParamListInfo es_param_list_info;
203 ParamExecData *es_param_exec_vals; /* this is for subselects */
205 TupleTable es_tupleTable;
206 JunkFilter *es_junkFilter;
208 uint32 es_processed; /* # of tuples processed */
209 Oid es_lastoid; /* last oid processed (by INSERT) */
213 * Executor Type information needed by plannodes.h
215 *| Note: the bogus classes CommonState and CommonScanState exist only
216 *| because our inheritance system only allows single inheritance
217 *| and we have to have unique slot names. Hence two or more
218 *| classes which want to have a common slot must ALL inherit
219 *| the slot from some other class. (This is a big hack to
220 *| allow our classes to share slot names..)
223 *| the class Result and the class NestLoop nodes both want
224 *| a slot called "OuterTuple" so they both have to inherit
225 *| it from some other class. In this case they inherit
226 *| it from CommonState. "CommonState" and "CommonScanState" are
227 *| the best names I could come up with for this sort of
230 *| As a result, many classes have extra slots which they
231 *| don't use. These slots are denoted (unused) in the
232 *| comment preceeding the class definition. If you
233 *| comes up with a better idea of a way of doing things
234 *| along these lines, then feel free to make your idea
235 *| known to me.. -cim 10/15/89
239 /* ----------------------------------------------------------------
240 * Common Executor State Information
241 * ----------------------------------------------------------------
244 /* BaseNode removed -- base_id moved into CommonState - jolly */
247 * CommonState information
249 *| this is a bogus class used to hold slots so other
250 *| nodes can inherit them...
252 * OuterTupleSlot pointer to slot containing current "outer" tuple
253 * ResultTupleSlot pointer to slot in tuple table for projected tuple
254 * ExprContext node's current expression context
255 * ProjInfo info this node uses to form tuple projections
256 * NumScanAttributes size of ScanAttributes array
257 * ScanAttributes attribute numbers of interest in this tuple
261 typedef struct CommonState
263 NodeTag type; /* its first field is NodeTag */
265 TupleTableSlot *cs_OuterTupleSlot;
266 TupleTableSlot *cs_ResultTupleSlot;
267 ExprContext *cs_ExprContext;
268 ProjectionInfo *cs_ProjInfo;
269 bool cs_TupFromTlist;
273 /* ----------------------------------------------------------------
274 * Control Node State Information
275 * ----------------------------------------------------------------
279 * ResultState information
281 * done flag which tells us to quit when we
282 * have already returned a constant tuple.
284 * CommonState information
286 * OuterTupleSlot pointer to slot containing current "outer" tuple
287 * ResultTupleSlot pointer to slot in tuple table for projected tuple
288 * ExprContext node's current expression context
289 * ProjInfo info this node uses to form tuple projections
290 * NumScanAttributes size of ScanAttributes array
291 * ScanAttributes attribute numbers of interest in this tuple
294 typedef struct ResultState
296 CommonState cstate; /* its first field is NodeTag */
302 * AppendState information
304 * append nodes have this field "unionplans" which is this
305 * list of plans to execute in sequence.. these variables
306 * keep track of things..
308 * whichplan which plan is being executed
309 * nplans how many plans are in the list
310 * initialized array of ExecInitNode() results
311 * rtentries range table for the current plan
312 * result_relation_info_list array of each subplan's result relation info
313 * junkFilter_list array of each subplan's junk filter
315 * CommonState information
317 * OuterTupleSlot pointer to slot containing current "outer" tuple
318 * ResultTupleSlot pointer to slot in tuple table for projected tuple
319 * ExprContext node's current expression context
320 * ProjInfo info this node uses to form tuple projections
321 * NumScanAttributes size of ScanAttributes array
322 * ScanAttributes attribute numbers of interest in this tuple
325 typedef struct AppendState
327 CommonState cstate; /* its first field is NodeTag */
330 bool *as_initialized;
332 List *as_result_relation_info_list;
333 List *as_junkFilter_list;
336 /* ----------------------------------------------------------------
337 * Scan State Information
338 * ----------------------------------------------------------------
342 * CommonScanState information
344 * CommonScanState is a class like CommonState, but is used more
345 * by the nodes like SeqScan and Sort which want to
346 * keep track of an underlying relation.
348 * currentRelation relation being scanned
349 * currentScanDesc current scan descriptor for scan
350 * ScanTupleSlot pointer to slot in tuple table holding scan tuple
352 * CommonState information
354 * OuterTupleSlot pointer to slot containing current "outer" tuple
355 * ResultTupleSlot pointer to slot in tuple table for projected tuple
356 * ExprContext node's current expression context
357 * ProjInfo info this node uses to form tuple projections
358 * NumScanAttributes size of ScanAttributes array
359 * ScanAttributes attribute numbers of interest in this tuple
362 typedef struct CommonScanState
364 CommonState cstate; /* its first field is NodeTag */
365 Relation css_currentRelation;
366 HeapScanDesc css_currentScanDesc;
367 TupleTableSlot *css_ScanTupleSlot;
371 * IndexScanState information
373 *| index scans don't use CommonScanState because
374 *| the underlying AM abstractions for heap scans and
375 *| index scans are too different.. It would be nice
376 *| if the current abstraction was more useful but ... -cim 10/15/89
378 * IndexPtr current index in use
379 * NumIndices number of indices in this scan
380 * ScanKeys Skey structures to scan index rels
381 * NumScanKeys array of no of keys in each Skey struct
382 * RuntimeKeyInfo array of array of flags for Skeys evaled at runtime
383 * RelationDescs ptr to array of relation descriptors
384 * ScanDescs ptr to array of scan descriptors
386 * CommonState information
388 * OuterTupleSlot pointer to slot containing current "outer" tuple
389 * ResultTupleSlot pointer to slot in tuple table for projected tuple
390 * ExprContext node's current expression context
391 * ProjInfo info this node uses to form tuple projections
392 * NumScanAttributes size of ScanAttributes array
393 * ScanAttributes attribute numbers of interest in this tuple
396 typedef struct IndexScanState
398 CommonState cstate; /* its first field is NodeTag */
401 ScanKey *iss_ScanKeys;
402 int *iss_NumScanKeys;
403 Pointer iss_RuntimeKeyInfo;
404 RelationPtr iss_RelationDescs;
405 IndexScanDescPtr iss_ScanDescs;
409 /* ----------------------------------------------------------------
410 * Join State Information
411 * ----------------------------------------------------------------
415 * JoinState information
417 * CommonState information
419 * OuterTupleSlot pointer to slot containing current "outer" tuple
420 * ResultTupleSlot pointer to slot in tuple table for projected tuple
421 * ExprContext node's current expression context
422 * ProjInfo info this node uses to form tuple projections
423 * NumScanAttributes size of ScanAttributes array
424 * ScanAttributes attribute numbers of interest in this tuple
427 typedef CommonState JoinState;
430 * NestLoopState information
432 * PortalFlag Set to enable portals to work.
434 * JoinState information
436 * CommonState information
438 * OuterTupleSlot pointer to slot containing current "outer" tuple
439 * ResultTupleSlot pointer to slot in tuple table for projected tuple
440 * ExprContext node's current expression context
441 * ProjInfo info this node uses to form tuple projections
442 * NumScanAttributes size of ScanAttributes array
443 * ScanAttributes attribute numbers of interest in this tuple
446 typedef struct NestLoopState
448 JoinState jstate; /* its first field is NodeTag */
453 * MergeJoinState information
455 * OSortopI outerKey1 sortOp innerKey1 ...
456 * ISortopO innerkey1 sortOp outerkey1 ...
457 * JoinState current "state" of join. see executor.h
458 * MarkedTupleSlot pointer to slot in tuple table for marked tuple
460 * JoinState information
462 * CommonState information
464 * OuterTupleSlot pointer to slot containing current "outer" tuple
465 * ResultTupleSlot pointer to slot in tuple table for projected tuple
466 * ExprContext node's current expression context
467 * ProjInfo info this node uses to form tuple projections
468 * NumScanAttributes size of ScanAttributes array
469 * ScanAttributes attribute numbers of interest in this tuple
472 typedef struct MergeJoinState
474 JoinState jstate; /* its first field is NodeTag */
478 TupleTableSlot *mj_MarkedTupleSlot;
482 * HashJoinState information
484 * hj_HashTable address of the hash table for the hashjoin
485 * hj_HashTableShmId shared memory id of hash table
486 * hj_CurBucket the current hash bucket that we are searching
487 * for matches of the current outer tuple
488 * hj_CurTuple the current matching inner tuple in the
489 * current hash bucket
490 * hj_CurOTuple the current matching inner tuple in the
491 * current hash overflow chain
492 * hj_InnerHashKey the inner hash key in the hashjoin condition
493 * hj_OuterBatches file descriptors for outer batches
494 * hj_InnerBatches file descriptors for inner batches
495 * hj_OuterReadPos current read position of outer batch
496 * hj_OuterReadBlk current read block of outer batch
497 * hj_OuterTupleSlot tuple slot for outer tuples
498 * hj_HashTupleSlot tuple slot for hashed tuples
502 * JoinState information
504 * CommonState information
506 * OuterTupleSlot pointer to slot containing current "outer" tuple
507 * ResultTupleSlot pointer to slot in tuple table for projected tuple
508 * ExprContext node's current expression context
509 * ProjInfo info this node uses to form tuple projections
510 * NumScanAttributes size of ScanAttributes array
511 * ScanAttributes attribute numbers of interest in this tuple
514 typedef struct HashJoinState
516 JoinState jstate; /* its first field is NodeTag */
517 HashJoinTable hj_HashTable;
518 IpcMemoryId hj_HashTableShmId;
519 HashBucket hj_CurBucket;
520 HeapTuple hj_CurTuple;
521 OverflowTuple hj_CurOTuple;
522 Var *hj_InnerHashKey;
523 File *hj_OuterBatches;
524 File *hj_InnerBatches;
525 char *hj_OuterReadPos;
527 TupleTableSlot *hj_OuterTupleSlot;
528 TupleTableSlot *hj_HashTupleSlot;
532 /* ----------------------------------------------------------------
533 * Materialization State Information
534 * ----------------------------------------------------------------
538 * MaterialState information
540 * materialize nodes are used to materialize the results
541 * of a subplan into a temporary relation.
543 * Flag indicated whether subplan has been materialized
544 * TempRelation temporary relation containing result of executing
547 * CommonScanState information
549 * currentRelation relation descriptor of sorted relation
550 * currentScanDesc current scan descriptor for scan
551 * ScanTupleSlot pointer to slot in tuple table holding scan tuple
553 * CommonState information
555 * OuterTupleSlot pointer to slot containing current "outer" tuple
556 * ResultTupleSlot pointer to slot in tuple table for projected tuple
557 * ExprContext node's current expression context
558 * ProjInfo info this node uses to form tuple projections
559 * NumScanAttributes size of ScanAttributes array
560 * ScanAttributes attribute numbers of interest in this tuple
563 typedef struct MaterialState
565 CommonScanState csstate; /* its first field is NodeTag */
567 Relation mat_TempRelation;
570 /* ---------------------
571 * AggregateState information
573 * done indicated whether aggregate has been materialized
574 * -------------------------
576 typedef struct AggState
578 CommonScanState csstate; /* its first field is NodeTag */
582 /* ---------------------
583 * GroupState information
585 * -------------------------
587 typedef struct GroupState
589 CommonScanState csstate; /* its first field is NodeTag */
590 bool grp_useLastTuple; /* last tuple not processed yet */
592 TupleTableSlot *grp_lastSlot;
596 * SortState information
598 *| sort nodes are really just a kind of a scan since
599 *| we implement sorts by retrieveing the entire subplan
600 *| into a temp relation, sorting the temp relation into
601 *| another sorted relation, and then preforming a simple
602 *| unqualified sequential scan on the sorted relation..
605 * Flag indicated whether relation has been sorted
606 * Keys scan key structures used to keep info on sort keys
607 * TempRelation temporary relation containing result of executing
610 * CommonScanState information
612 * currentRelation relation descriptor of sorted relation
613 * currentScanDesc current scan descriptor for scan
614 * ScanTupleSlot pointer to slot in tuple table holding scan tuple
616 * CommonState information
618 * OuterTupleSlot pointer to slot containing current "outer" tuple
619 * ResultTupleSlot pointer to slot in tuple table for projected tuple
620 * ExprContext node's current expression context
621 * ProjInfo info this node uses to form tuple projections
622 * NumScanAttributes size of ScanAttributes array
623 * ScanAttributes attribute numbers of interest in this tuple
626 typedef struct SortState
628 CommonScanState csstate; /* its first field is NodeTag */
635 * UniqueState information
637 * Unique nodes are used "on top of" sort nodes to discard
638 * duplicate tuples returned from the sort phase. Basically
639 * all it does is compare the current tuple from the subplan
640 * with the previously fetched tuple stored in OuterTuple and
641 * if the two are identical, then we just fetch another tuple
642 * from the sort and try again.
644 * CommonState information
646 * OuterTupleSlot pointer to slot containing current "outer" tuple
647 * ResultTupleSlot pointer to slot in tuple table for projected tuple
648 * ExprContext node's current expression context
649 * ProjInfo info this node uses to form tuple projections
650 * NumScanAttributes size of ScanAttributes array
651 * ScanAttributes attribute numbers of interest in this tuple
654 typedef CommonState UniqueState;
658 * HashState information
660 * hashBatches file descriptors for the batches
662 * CommonState information
664 * OuterTupleSlot pointer to slot containing current "outer" tuple
665 * ResultTupleSlot pointer to slot in tuple table for projected tuple
666 * ExprContext node's current expression context
667 * ProjInfo info this node uses to form tuple projections
668 * NumScanAttributes size of ScanAttributes array
669 * ScanAttributes attribute numbers of interest in this tuple
672 typedef struct HashState
674 CommonState cstate; /* its first field is NodeTag */
678 /* -----------------------
679 * TeeState information
680 * leftPlace : next item in the queue unseen by the left parent
681 * rightPlace : next item in the queue unseen by the right parent
682 * lastPlace : last item in the queue
683 * bufferRelname : name of the relation used as the buffer queue
684 * bufferRel : the relation used as the buffer queue
685 * mcxt : for now, tee's have their own memory context
686 * may be cleaned up later if portals are cleaned up
688 * initially, a Tee starts with [left/right]Place variables set to -1.
689 * on cleanup, queue is free'd when both leftPlace and rightPlace = -1
690 * -------------------------
692 typedef struct TeeState
694 CommonState cstate; /* its first field is NodeTag */
698 char *tee_bufferRelname;
699 Relation tee_bufferRel;
700 MemoryContext tee_mcxt;
701 HeapScanDesc tee_leftScanDesc;
702 HeapScanDesc tee_rightScanDesc;
705 #endif /* EXECNODES_H */