123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058 |
- /*-------------------------------------------------------------------------
- *
- * execnodes.h
- * definitions for executor state nodes
- *
- *
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * src/include/nodes/execnodes.h
- *
- *-------------------------------------------------------------------------
- */
- #ifndef EXECNODES_H
- #define EXECNODES_H
- #include "access/genam.h"
- #include "access/heapam.h"
- #include "executor/instrument.h"
- #include "lib/pairingheap.h"
- #include "nodes/params.h"
- #include "nodes/plannodes.h"
- #include "utils/reltrigger.h"
- #include "utils/sortsupport.h"
- #include "utils/tuplestore.h"
- #include "utils/tuplesort.h"
- /* ----------------
- * IndexInfo information
- *
- * this struct holds the information needed to construct new index
- * entries for a particular index. Used for both index_build and
- * retail creation of index entries.
- *
- * NumIndexAttrs number of columns in this index
- * KeyAttrNumbers underlying-rel attribute numbers used as keys
- * (zeroes indicate expressions)
- * Expressions expr trees for expression entries, or NIL if none
- * ExpressionsState exec state for expressions, or NIL if none
- * Predicate partial-index predicate, or NIL if none
- * PredicateState exec state for predicate, or NIL if none
- * ExclusionOps Per-column exclusion operators, or NULL if none
- * ExclusionProcs Underlying function OIDs for ExclusionOps
- * ExclusionStrats Opclass strategy numbers for ExclusionOps
- * UniqueOps Theses are like Exclusion*, but for unique indexes
- * UniqueProcs
- * UniqueStrats
- * Unique is it a unique index?
- * ReadyForInserts is it valid for inserts?
- * Concurrent are we doing a concurrent index build?
- * BrokenHotChain did we detect any broken HOT chains?
- *
- * ii_Concurrent and ii_BrokenHotChain are used only during index build;
- * they're conventionally set to false otherwise.
- * ----------------
- */
- typedef struct IndexInfo
- {
- NodeTag type;
- int ii_NumIndexAttrs;
- AttrNumber ii_KeyAttrNumbers[INDEX_MAX_KEYS];
- List *ii_Expressions; /* list of Expr */
- List *ii_ExpressionsState; /* list of ExprState */
- List *ii_Predicate; /* list of Expr */
- List *ii_PredicateState; /* list of ExprState */
- Oid *ii_ExclusionOps; /* array with one entry per column */
- Oid *ii_ExclusionProcs; /* array with one entry per column */
- uint16 *ii_ExclusionStrats; /* array with one entry per column */
- Oid *ii_UniqueOps; /* array with one entry per column */
- Oid *ii_UniqueProcs; /* array with one entry per column */
- uint16 *ii_UniqueStrats; /* array with one entry per column */
- bool ii_Unique;
- bool ii_ReadyForInserts;
- bool ii_Concurrent;
- bool ii_BrokenHotChain;
- } IndexInfo;
- /* ----------------
- * ExprContext_CB
- *
- * List of callbacks to be called at ExprContext shutdown.
- * ----------------
- */
- typedef void (*ExprContextCallbackFunction) (Datum arg);
- typedef struct ExprContext_CB
- {
- struct ExprContext_CB *next;
- ExprContextCallbackFunction function;
- Datum arg;
- } ExprContext_CB;
- /* ----------------
- * ExprContext
- *
- * This class holds the "current context" information
- * needed to evaluate expressions for doing tuple qualifications
- * and tuple projections. For example, if an expression refers
- * to an attribute in the current inner tuple then we need to know
- * what the current inner tuple is and so we look at the expression
- * context.
- *
- * There are two memory contexts associated with an ExprContext:
- * * ecxt_per_query_memory is a query-lifespan context, typically the same
- * context the ExprContext node itself is allocated in. This context
- * can be used for purposes such as storing function call cache info.
- * * ecxt_per_tuple_memory is a short-term context for expression results.
- * As the name suggests, it will typically be reset once per tuple,
- * before we begin to evaluate expressions for that tuple. Each
- * ExprContext normally has its very own per-tuple memory context.
- *
- * CurrentMemoryContext should be set to ecxt_per_tuple_memory before
- * calling ExecEvalExpr() --- see ExecEvalExprSwitchContext().
- * ----------------
- */
- typedef struct ExprContext
- {
- NodeTag type;
- /* Tuples that Var nodes in expression may refer to */
- TupleTableSlot *ecxt_scantuple;
- TupleTableSlot *ecxt_innertuple;
- TupleTableSlot *ecxt_outertuple;
- /* Memory contexts for expression evaluation --- see notes above */
- MemoryContext ecxt_per_query_memory;
- MemoryContext ecxt_per_tuple_memory;
- /* Values to substitute for Param nodes in expression */
- ParamExecData *ecxt_param_exec_vals; /* for PARAM_EXEC params */
- ParamListInfo ecxt_param_list_info; /* for other param types */
- /*
- * Values to substitute for Aggref nodes in the expressions of an Agg
- * node, or for WindowFunc nodes within a WindowAgg node.
- */
- Datum *ecxt_aggvalues; /* precomputed values for aggs/windowfuncs */
- bool *ecxt_aggnulls; /* null flags for aggs/windowfuncs */
- /* Value to substitute for CaseTestExpr nodes in expression */
- Datum caseValue_datum;
- bool caseValue_isNull;
- /* Value to substitute for CoerceToDomainValue nodes in expression */
- Datum domainValue_datum;
- bool domainValue_isNull;
- /* Link to containing EState (NULL if a standalone ExprContext) */
- struct EState *ecxt_estate;
- /* Functions to call back when ExprContext is shut down or rescanned */
- ExprContext_CB *ecxt_callbacks;
- } ExprContext;
- /*
- * Set-result status returned by ExecEvalExpr()
- */
- typedef enum
- {
- ExprSingleResult, /* expression does not return a set */
- ExprMultipleResult, /* this result is an element of a set */
- ExprEndResult /* there are no more elements in the set */
- } ExprDoneCond;
- /*
- * Return modes for functions returning sets. Note values must be chosen
- * as separate bits so that a bitmask can be formed to indicate supported
- * modes. SFRM_Materialize_Random and SFRM_Materialize_Preferred are
- * auxiliary flags about SFRM_Materialize mode, rather than separate modes.
- */
- typedef enum
- {
- SFRM_ValuePerCall = 0x01, /* one value returned per call */
- SFRM_Materialize = 0x02, /* result set instantiated in Tuplestore */
- SFRM_Materialize_Random = 0x04, /* Tuplestore needs randomAccess */
- SFRM_Materialize_Preferred = 0x08 /* caller prefers Tuplestore */
- } SetFunctionReturnMode;
- /*
- * When calling a function that might return a set (multiple rows),
- * a node of this type is passed as fcinfo->resultinfo to allow
- * return status to be passed back. A function returning set should
- * raise an error if no such resultinfo is provided.
- */
- typedef struct ReturnSetInfo
- {
- NodeTag type;
- /* values set by caller: */
- ExprContext *econtext; /* context function is being called in */
- TupleDesc expectedDesc; /* tuple descriptor expected by caller */
- int allowedModes; /* bitmask: return modes caller can handle */
- /* result status from function (but pre-initialized by caller): */
- SetFunctionReturnMode returnMode; /* actual return mode */
- ExprDoneCond isDone; /* status for ValuePerCall mode */
- /* fields filled by function in Materialize return mode: */
- Tuplestorestate *setResult; /* holds the complete returned tuple set */
- TupleDesc setDesc; /* actual descriptor for returned tuples */
- } ReturnSetInfo;
- /* ----------------
- * ProjectionInfo node information
- *
- * This is all the information needed to perform projections ---
- * that is, form new tuples by evaluation of targetlist expressions.
- * Nodes which need to do projections create one of these.
- *
- * ExecProject() evaluates the tlist, forms a tuple, and stores it
- * in the given slot. Note that the result will be a "virtual" tuple
- * unless ExecMaterializeSlot() is then called to force it to be
- * converted to a physical tuple. The slot must have a tupledesc
- * that matches the output of the tlist!
- *
- * The planner very often produces tlists that consist entirely of
- * simple Var references (lower levels of a plan tree almost always
- * look like that). And top-level tlists are often mostly Vars too.
- * We therefore optimize execution of simple-Var tlist entries.
- * The pi_targetlist list actually contains only the tlist entries that
- * aren't simple Vars, while those that are Vars are processed using the
- * varSlotOffsets/varNumbers/varOutputCols arrays.
- *
- * The lastXXXVar fields are used to optimize fetching of fields from
- * input tuples: they let us do a slot_getsomeattrs() call to ensure
- * that all needed attributes are extracted in one pass.
- *
- * targetlist target list for projection (non-Var expressions only)
- * exprContext expression context in which to evaluate targetlist
- * slot slot to place projection result in
- * itemIsDone workspace array for ExecProject
- * directMap true if varOutputCols[] is an identity map
- * numSimpleVars number of simple Vars found in original tlist
- * varSlotOffsets array indicating which slot each simple Var is from
- * varNumbers array containing input attr numbers of simple Vars
- * varOutputCols array containing output attr numbers of simple Vars
- * lastInnerVar highest attnum from inner tuple slot (0 if none)
- * lastOuterVar highest attnum from outer tuple slot (0 if none)
- * lastScanVar highest attnum from scan tuple slot (0 if none)
- * ----------------
- */
- typedef struct ProjectionInfo
- {
- NodeTag type;
- List *pi_targetlist;
- ExprContext *pi_exprContext;
- TupleTableSlot *pi_slot;
- ExprDoneCond *pi_itemIsDone;
- bool pi_directMap;
- int pi_numSimpleVars;
- int *pi_varSlotOffsets;
- int *pi_varNumbers;
- int *pi_varOutputCols;
- int pi_lastInnerVar;
- int pi_lastOuterVar;
- int pi_lastScanVar;
- } ProjectionInfo;
- /* ----------------
- * JunkFilter
- *
- * This class is used to store information regarding junk attributes.
- * A junk attribute is an attribute in a tuple that is needed only for
- * storing intermediate information in the executor, and does not belong
- * in emitted tuples. For example, when we do an UPDATE query,
- * the planner adds a "junk" entry to the targetlist so that the tuples
- * returned to ExecutePlan() contain an extra attribute: the ctid of
- * the tuple to be updated. This is needed to do the update, but we
- * don't want the ctid to be part of the stored new tuple! So, we
- * apply a "junk filter" to remove the junk attributes and form the
- * real output tuple. The junkfilter code also provides routines to
- * extract the values of the junk attribute(s) from the input tuple.
- *
- * targetList: the original target list (including junk attributes).
- * cleanTupType: the tuple descriptor for the "clean" tuple (with
- * junk attributes removed).
- * cleanMap: A map with the correspondence between the non-junk
- * attribute numbers of the "original" tuple and the
- * attribute numbers of the "clean" tuple.
- * resultSlot: tuple slot used to hold cleaned tuple.
- * junkAttNo: not used by junkfilter code. Can be used by caller
- * to remember the attno of a specific junk attribute
- * (nodeModifyTable.c keeps the "ctid" or "wholerow"
- * attno here).
- * ----------------
- */
- typedef struct JunkFilter
- {
- NodeTag type;
- List *jf_targetList;
- TupleDesc jf_cleanTupType;
- AttrNumber *jf_cleanMap;
- TupleTableSlot *jf_resultSlot;
- AttrNumber jf_junkAttNo;
- } JunkFilter;
- /* ----------------
- * ResultRelInfo information
- *
- * Whenever we update an existing relation, we have to
- * update indices on the relation, and perhaps also fire triggers.
- * The ResultRelInfo class is used to hold all the information needed
- * about a result relation, including indices.. -cim 10/15/89
- *
- * RangeTableIndex result relation's range table index
- * RelationDesc relation descriptor for result relation
- * NumIndices # of indices existing on result relation
- * IndexRelationDescs array of relation descriptors for indices
- * IndexRelationInfo array of key/attr info for indices
- * TrigDesc triggers to be fired, if any
- * TrigFunctions cached lookup info for trigger functions
- * TrigWhenExprs array of trigger WHEN expr states
- * TrigInstrument optional runtime measurements for triggers
- * FdwRoutine FDW callback functions, if foreign table
- * FdwState available to save private state of FDW
- * usesFdwDirectModify true when modifying foreign table directly
- * WithCheckOptions list of WithCheckOption's to be checked
- * WithCheckOptionExprs list of WithCheckOption expr states
- * ConstraintExprs array of constraint-checking expr states
- * junkFilter for removing junk attributes from tuples
- * projectReturning for computing a RETURNING list
- * onConflictSetProj for computing ON CONFLICT DO UPDATE SET
- * onConflictSetWhere list of ON CONFLICT DO UPDATE exprs (qual)
- * ----------------
- */
- typedef struct ResultRelInfo
- {
- NodeTag type;
- Index ri_RangeTableIndex;
- Relation ri_RelationDesc;
- int ri_NumIndices;
- RelationPtr ri_IndexRelationDescs;
- IndexInfo **ri_IndexRelationInfo;
- TriggerDesc *ri_TrigDesc;
- FmgrInfo *ri_TrigFunctions;
- List **ri_TrigWhenExprs;
- Instrumentation *ri_TrigInstrument;
- struct FdwRoutine *ri_FdwRoutine;
- void *ri_FdwState;
- bool ri_usesFdwDirectModify;
- List *ri_WithCheckOptions;
- List *ri_WithCheckOptionExprs;
- List **ri_ConstraintExprs;
- JunkFilter *ri_junkFilter;
- ProjectionInfo *ri_projectReturning;
- ProjectionInfo *ri_onConflictSetProj;
- List *ri_onConflictSetWhere;
- } ResultRelInfo;
- /* ----------------
- * EState information
- *
- * Master working state for an Executor invocation
- * ----------------
- */
- typedef struct EState
- {
- NodeTag type;
- /* Basic state for all query types: */
- ScanDirection es_direction; /* current scan direction */
- Snapshot es_snapshot; /* time qual to use */
- Snapshot es_crosscheck_snapshot; /* crosscheck time qual for RI */
- List *es_range_table; /* List of RangeTblEntry */
- PlannedStmt *es_plannedstmt; /* link to top of plan tree */
- JunkFilter *es_junkFilter; /* top-level junk filter, if any */
- /* If query can insert/delete tuples, the command ID to mark them with */
- CommandId es_output_cid;
- /* Info about target table(s) for insert/update/delete queries: */
- ResultRelInfo *es_result_relations; /* array of ResultRelInfos */
- int es_num_result_relations; /* length of array */
- ResultRelInfo *es_result_relation_info; /* currently active array elt */
- /* Stuff used for firing triggers: */
- List *es_trig_target_relations; /* trigger-only ResultRelInfos */
- TupleTableSlot *es_trig_tuple_slot; /* for trigger output tuples */
- TupleTableSlot *es_trig_oldtup_slot; /* for TriggerEnabled */
- TupleTableSlot *es_trig_newtup_slot; /* for TriggerEnabled */
- /* Parameter info: */
- ParamListInfo es_param_list_info; /* values of external params */
- ParamExecData *es_param_exec_vals; /* values of internal params */
- /* Other working state: */
- MemoryContext es_query_cxt; /* per-query context in which EState lives */
- List *es_tupleTable; /* List of TupleTableSlots */
- List *es_rowMarks; /* List of ExecRowMarks */
- uint64 es_processed; /* # of tuples processed */
- Oid es_lastoid; /* last oid processed (by INSERT) */
- int es_top_eflags; /* eflags passed to ExecutorStart */
- int es_instrument; /* OR of InstrumentOption flags */
- bool es_finished; /* true when ExecutorFinish is done */
- List *es_exprcontexts; /* List of ExprContexts within EState */
- List *es_subplanstates; /* List of PlanState for SubPlans */
- List *es_auxmodifytables; /* List of secondary ModifyTableStates */
- /*
- * this ExprContext is for per-output-tuple operations, such as constraint
- * checks and index-value computations. It will be reset for each output
- * tuple. Note that it will be created only if needed.
- */
- ExprContext *es_per_tuple_exprcontext;
- /*
- * These fields are for re-evaluating plan quals when an updated tuple is
- * substituted in READ COMMITTED mode. es_epqTuple[] contains tuples that
- * scan plan nodes should return instead of whatever they'd normally
- * return, or NULL if nothing to return; es_epqTupleSet[] is true if a
- * particular array entry is valid; and es_epqScanDone[] is state to
- * remember if the tuple has been returned already. Arrays are of size
- * list_length(es_range_table) and are indexed by scan node scanrelid - 1.
- */
- HeapTuple *es_epqTuple; /* array of EPQ substitute tuples */
- bool *es_epqTupleSet; /* true if EPQ tuple is provided */
- bool *es_epqScanDone; /* true if EPQ tuple has been fetched */
- } EState;
- /*
- * ExecRowMark -
- * runtime representation of FOR [KEY] UPDATE/SHARE clauses
- *
- * When doing UPDATE, DELETE, or SELECT FOR [KEY] UPDATE/SHARE, we will have an
- * ExecRowMark for each non-target relation in the query (except inheritance
- * parent RTEs, which can be ignored at runtime). Virtual relations such as
- * subqueries-in-FROM will have an ExecRowMark with relation == NULL. See
- * PlanRowMark for details about most of the fields. In addition to fields
- * directly derived from PlanRowMark, we store an activity flag (to denote
- * inactive children of inheritance trees), curCtid, which is used by the
- * WHERE CURRENT OF code, and ermExtra, which is available for use by the plan
- * node that sources the relation (e.g., for a foreign table the FDW can use
- * ermExtra to hold information).
- *
- * EState->es_rowMarks is a list of these structs.
- */
- typedef struct ExecRowMark
- {
- Relation relation; /* opened and suitably locked relation */
- Oid relid; /* its OID (or InvalidOid, if subquery) */
- Index rti; /* its range table index */
- Index prti; /* parent range table index, if child */
- Index rowmarkId; /* unique identifier for resjunk columns */
- RowMarkType markType; /* see enum in nodes/plannodes.h */
- LockClauseStrength strength; /* LockingClause's strength, or LCS_NONE */
- LockWaitPolicy waitPolicy; /* NOWAIT and SKIP LOCKED */
- bool ermActive; /* is this mark relevant for current tuple? */
- ItemPointerData curCtid; /* ctid of currently locked tuple, if any */
- void *ermExtra; /* available for use by relation source node */
- } ExecRowMark;
- /*
- * ExecAuxRowMark -
- * additional runtime representation of FOR [KEY] UPDATE/SHARE clauses
- *
- * Each LockRows and ModifyTable node keeps a list of the rowmarks it needs to
- * deal with. In addition to a pointer to the related entry in es_rowMarks,
- * this struct carries the column number(s) of the resjunk columns associated
- * with the rowmark (see comments for PlanRowMark for more detail). In the
- * case of ModifyTable, there has to be a separate ExecAuxRowMark list for
- * each child plan, because the resjunk columns could be at different physical
- * column positions in different subplans.
- */
- typedef struct ExecAuxRowMark
- {
- ExecRowMark *rowmark; /* related entry in es_rowMarks */
- AttrNumber ctidAttNo; /* resno of ctid junk attribute, if any */
- AttrNumber toidAttNo; /* resno of tableoid junk attribute, if any */
- AttrNumber wholeAttNo; /* resno of whole-row junk attribute, if any */
- } ExecAuxRowMark;
- /* ----------------------------------------------------------------
- * Tuple Hash Tables
- *
- * All-in-memory tuple hash tables are used for a number of purposes.
- *
- * Note: tab_hash_funcs are for the key datatype(s) stored in the table,
- * and tab_eq_funcs are non-cross-type equality operators for those types.
- * Normally these are the only functions used, but FindTupleHashEntry()
- * supports searching a hashtable using cross-data-type hashing. For that,
- * the caller must supply hash functions for the LHS datatype as well as
- * the cross-type equality operators to use. in_hash_funcs and cur_eq_funcs
- * are set to point to the caller's function arrays while doing such a search.
- * During LookupTupleHashEntry(), they point to tab_hash_funcs and
- * tab_eq_funcs respectively.
- * ----------------------------------------------------------------
- */
- typedef struct TupleHashEntryData *TupleHashEntry;
- typedef struct TupleHashTableData *TupleHashTable;
- typedef struct TupleHashEntryData
- {
- /* firstTuple must be the first field in this struct! */
- MinimalTuple firstTuple; /* copy of first tuple in this group */
- /* there may be additional data beyond the end of this struct */
- } TupleHashEntryData; /* VARIABLE LENGTH STRUCT */
- typedef struct TupleHashTableData
- {
- HTAB *hashtab; /* underlying dynahash table */
- int numCols; /* number of columns in lookup key */
- AttrNumber *keyColIdx; /* attr numbers of key columns */
- FmgrInfo *tab_hash_funcs; /* hash functions for table datatype(s) */
- FmgrInfo *tab_eq_funcs; /* equality functions for table datatype(s) */
- MemoryContext tablecxt; /* memory context containing table */
- MemoryContext tempcxt; /* context for function evaluations */
- Size entrysize; /* actual size to make each hash entry */
- TupleTableSlot *tableslot; /* slot for referencing table entries */
- /* The following fields are set transiently for each table search: */
- TupleTableSlot *inputslot; /* current input tuple's slot */
- FmgrInfo *in_hash_funcs; /* hash functions for input datatype(s) */
- FmgrInfo *cur_eq_funcs; /* equality functions for input vs. table */
- } TupleHashTableData;
- typedef HASH_SEQ_STATUS TupleHashIterator;
- /*
- * Use InitTupleHashIterator/TermTupleHashIterator for a read/write scan.
- * Use ResetTupleHashIterator if the table can be frozen (in this case no
- * explicit scan termination is needed).
- */
- #define InitTupleHashIterator(htable, iter) \
- hash_seq_init(iter, (htable)->hashtab)
- #define TermTupleHashIterator(iter) \
- hash_seq_term(iter)
- #define ResetTupleHashIterator(htable, iter) \
- do { \
- hash_freeze((htable)->hashtab); \
- hash_seq_init(iter, (htable)->hashtab); \
- } while (0)
- #define ScanTupleHashTable(iter) \
- ((TupleHashEntry) hash_seq_search(iter))
- /* ----------------------------------------------------------------
- * Expression State Trees
- *
- * Each executable expression tree has a parallel ExprState tree.
- *
- * Unlike PlanState, there is not an exact one-for-one correspondence between
- * ExprState node types and Expr node types. Many Expr node types have no
- * need for node-type-specific run-time state, and so they can use plain
- * ExprState or GenericExprState as their associated ExprState node type.
- * ----------------------------------------------------------------
- */
- /* ----------------
- * ExprState node
- *
- * ExprState is the common superclass for all ExprState-type nodes.
- *
- * It can also be instantiated directly for leaf Expr nodes that need no
- * local run-time state (such as Var, Const, or Param).
- *
- * To save on dispatch overhead, each ExprState node contains a function
- * pointer to the routine to execute to evaluate the node.
- * ----------------
- */
- typedef struct ExprState ExprState;
- typedef Datum (*ExprStateEvalFunc) (ExprState *expression,
- ExprContext *econtext,
- bool *isNull,
- ExprDoneCond *isDone);
- struct ExprState
- {
- NodeTag type;
- Expr *expr; /* associated Expr node */
- ExprStateEvalFunc evalfunc; /* routine to run to execute node */
- };
- /* ----------------
- * GenericExprState node
- *
- * This is used for Expr node types that need no local run-time state,
- * but have one child Expr node.
- * ----------------
- */
- typedef struct GenericExprState
- {
- ExprState xprstate;
- ExprState *arg; /* state of my child node */
- } GenericExprState;
- /* ----------------
- * WholeRowVarExprState node
- * ----------------
- */
- typedef struct WholeRowVarExprState
- {
- ExprState xprstate;
- struct PlanState *parent; /* parent PlanState, or NULL if none */
- TupleDesc wrv_tupdesc; /* descriptor for resulting tuples */
- JunkFilter *wrv_junkFilter; /* JunkFilter to remove resjunk cols */
- } WholeRowVarExprState;
- /* ----------------
- * AggrefExprState node
- * ----------------
- */
- typedef struct AggrefExprState
- {
- ExprState xprstate;
- int aggno; /* ID number for agg within its plan node */
- } AggrefExprState;
- /* ----------------
- * GroupingFuncExprState node
- *
- * The list of column numbers refers to the input tuples of the Agg node to
- * which the GroupingFunc belongs, and may contain 0 for references to columns
- * that are only present in grouping sets processed by different Agg nodes (and
- * which are therefore always considered "grouping" here).
- * ----------------
- */
- typedef struct GroupingFuncExprState
- {
- ExprState xprstate;
- struct AggState *aggstate;
- List *clauses; /* integer list of column numbers */
- } GroupingFuncExprState;
- /* ----------------
- * WindowFuncExprState node
- * ----------------
- */
- typedef struct WindowFuncExprState
- {
- ExprState xprstate;
- List *args; /* states of argument expressions */
- ExprState *aggfilter; /* FILTER expression */
- int wfuncno; /* ID number for wfunc within its plan node */
- } WindowFuncExprState;
- /* ----------------
- * ArrayRefExprState node
- *
- * Note: array types can be fixed-length (typlen > 0), but only when the
- * element type is itself fixed-length. Otherwise they are varlena structures
- * and have typlen = -1. In any case, an array type is never pass-by-value.
- * ----------------
- */
- typedef struct ArrayRefExprState
- {
- ExprState xprstate;
- List *refupperindexpr; /* states for child nodes */
- List *reflowerindexpr;
- ExprState *refexpr;
- ExprState *refassgnexpr;
- int16 refattrlength; /* typlen of array type */
- int16 refelemlength; /* typlen of the array element type */
- bool refelembyval; /* is the element type pass-by-value? */
- char refelemalign; /* typalign of the element type */
- } ArrayRefExprState;
- /* ----------------
- * FuncExprState node
- *
- * Although named for FuncExpr, this is also used for OpExpr, DistinctExpr,
- * and NullIf nodes; be careful to check what xprstate.expr is actually
- * pointing at!
- * ----------------
- */
- typedef struct FuncExprState
- {
- ExprState xprstate;
- List *args; /* states of argument expressions */
- /*
- * Function manager's lookup info for the target function. If func.fn_oid
- * is InvalidOid, we haven't initialized it yet (nor any of the following
- * fields).
- */
- FmgrInfo func;
- /*
- * For a set-returning function (SRF) that returns a tuplestore, we keep
- * the tuplestore here and dole out the result rows one at a time. The
- * slot holds the row currently being returned.
- */
- Tuplestorestate *funcResultStore;
- TupleTableSlot *funcResultSlot;
- /*
- * In some cases we need to compute a tuple descriptor for the function's
- * output. If so, it's stored here.
- */
- TupleDesc funcResultDesc;
- bool funcReturnsTuple; /* valid when funcResultDesc isn't
- * NULL */
- /*
- * setArgsValid is true when we are evaluating a set-returning function
- * that uses value-per-call mode and we are in the middle of a call
- * series; we want to pass the same argument values to the function again
- * (and again, until it returns ExprEndResult). This indicates that
- * fcinfo_data already contains valid argument data.
- */
- bool setArgsValid;
- /*
- * Flag to remember whether we found a set-valued argument to the
- * function. This causes the function result to be a set as well. Valid
- * only when setArgsValid is true or funcResultStore isn't NULL.
- */
- bool setHasSetArg; /* some argument returns a set */
- /*
- * Flag to remember whether we have registered a shutdown callback for
- * this FuncExprState. We do so only if funcResultStore or setArgsValid
- * has been set at least once (since all the callback is for is to release
- * the tuplestore or clear setArgsValid).
- */
- bool shutdown_reg; /* a shutdown callback is registered */
- /*
- * Call parameter structure for the function. This has been initialized
- * (by InitFunctionCallInfoData) if func.fn_oid is valid. It also saves
- * argument values between calls, when setArgsValid is true.
- */
- FunctionCallInfoData fcinfo_data;
- } FuncExprState;
- /* ----------------
- * ScalarArrayOpExprState node
- *
- * This is a FuncExprState plus some additional data.
- * ----------------
- */
- typedef struct ScalarArrayOpExprState
- {
- FuncExprState fxprstate;
- /* Cached info about array element type */
- Oid element_type;
- int16 typlen;
- bool typbyval;
- char typalign;
- } ScalarArrayOpExprState;
- /* ----------------
- * BoolExprState node
- * ----------------
- */
- typedef struct BoolExprState
- {
- ExprState xprstate;
- List *args; /* states of argument expression(s) */
- } BoolExprState;
- /* ----------------
- * SubPlanState node
- * ----------------
- */
- typedef struct SubPlanState
- {
- ExprState xprstate;
- struct PlanState *planstate; /* subselect plan's state tree */
- struct PlanState *parent; /* parent plan node's state tree */
- ExprState *testexpr; /* state of combining expression */
- List *args; /* states of argument expression(s) */
- HeapTuple curTuple; /* copy of most recent tuple from subplan */
- Datum curArray; /* most recent array from ARRAY() subplan */
- /* these are used when hashing the subselect's output: */
- ProjectionInfo *projLeft; /* for projecting lefthand exprs */
- ProjectionInfo *projRight; /* for projecting subselect output */
- TupleHashTable hashtable; /* hash table for no-nulls subselect rows */
- TupleHashTable hashnulls; /* hash table for rows with null(s) */
- bool havehashrows; /* TRUE if hashtable is not empty */
- bool havenullrows; /* TRUE if hashnulls is not empty */
- MemoryContext hashtablecxt; /* memory context containing hash tables */
- MemoryContext hashtempcxt; /* temp memory context for hash tables */
- ExprContext *innerecontext; /* econtext for computing inner tuples */
- AttrNumber *keyColIdx; /* control data for hash tables */
- FmgrInfo *tab_hash_funcs; /* hash functions for table datatype(s) */
- FmgrInfo *tab_eq_funcs; /* equality functions for table datatype(s) */
- FmgrInfo *lhs_hash_funcs; /* hash functions for lefthand datatype(s) */
- FmgrInfo *cur_eq_funcs; /* equality functions for LHS vs. table */
- } SubPlanState;
- /* ----------------
- * AlternativeSubPlanState node
- * ----------------
- */
- typedef struct AlternativeSubPlanState
- {
- ExprState xprstate;
- List *subplans; /* states of alternative subplans */
- int active; /* list index of the one we're using */
- } AlternativeSubPlanState;
- /* ----------------
- * FieldSelectState node
- * ----------------
- */
- typedef struct FieldSelectState
- {
- ExprState xprstate;
- ExprState *arg; /* input expression */
- TupleDesc argdesc; /* tupdesc for most recent input */
- } FieldSelectState;
- /* ----------------
- * FieldStoreState node
- * ----------------
- */
- typedef struct FieldStoreState
- {
- ExprState xprstate;
- ExprState *arg; /* input tuple value */
- List *newvals; /* new value(s) for field(s) */
- TupleDesc argdesc; /* tupdesc for most recent input */
- } FieldStoreState;
- /* ----------------
- * CoerceViaIOState node
- * ----------------
- */
- typedef struct CoerceViaIOState
- {
- ExprState xprstate;
- ExprState *arg; /* input expression */
- FmgrInfo outfunc; /* lookup info for source output function */
- FmgrInfo infunc; /* lookup info for result input function */
- Oid intypioparam; /* argument needed for input function */
- } CoerceViaIOState;
- /* ----------------
- * ArrayCoerceExprState node
- * ----------------
- */
- typedef struct ArrayCoerceExprState
- {
- ExprState xprstate;
- ExprState *arg; /* input array value */
- Oid resultelemtype; /* element type of result array */
- FmgrInfo elemfunc; /* lookup info for element coercion function */
- /* use struct pointer to avoid including array.h here */
- struct ArrayMapState *amstate; /* workspace for array_map */
- } ArrayCoerceExprState;
- /* ----------------
- * ConvertRowtypeExprState node
- * ----------------
- */
- typedef struct ConvertRowtypeExprState
- {
- ExprState xprstate;
- ExprState *arg; /* input tuple value */
- TupleDesc indesc; /* tupdesc for source rowtype */
- TupleDesc outdesc; /* tupdesc for result rowtype */
- /* use "struct" so we needn't include tupconvert.h here */
- struct TupleConversionMap *map;
- bool initialized;
- } ConvertRowtypeExprState;
- /* ----------------
- * CaseExprState node
- * ----------------
- */
- typedef struct CaseExprState
- {
- ExprState xprstate;
- ExprState *arg; /* implicit equality comparison argument */
- List *args; /* the arguments (list of WHEN clauses) */
- ExprState *defresult; /* the default result (ELSE clause) */
- int16 argtyplen; /* if arg is provided, its typlen */
- } CaseExprState;
- /* ----------------
- * CaseWhenState node
- * ----------------
- */
- typedef struct CaseWhenState
- {
- ExprState xprstate;
- ExprState *expr; /* condition expression */
- ExprState *result; /* substitution result */
- } CaseWhenState;
- /* ----------------
- * ArrayExprState node
- *
- * Note: ARRAY[] expressions always produce varlena arrays, never fixed-length
- * arrays.
- * ----------------
- */
- typedef struct ArrayExprState
- {
- ExprState xprstate;
- List *elements; /* states for child nodes */
- int16 elemlength; /* typlen of the array element type */
- bool elembyval; /* is the element type pass-by-value? */
- char elemalign; /* typalign of the element type */
- } ArrayExprState;
- /* ----------------
- * RowExprState node
- * ----------------
- */
- typedef struct RowExprState
- {
- ExprState xprstate;
- List *args; /* the arguments */
- TupleDesc tupdesc; /* descriptor for result tuples */
- } RowExprState;
- /* ----------------
- * RowCompareExprState node
- * ----------------
- */
- typedef struct RowCompareExprState
- {
- ExprState xprstate;
- List *largs; /* the left-hand input arguments */
- List *rargs; /* the right-hand input arguments */
- FmgrInfo *funcs; /* array of comparison function info */
- Oid *collations; /* array of collations to use */
- } RowCompareExprState;
- /* ----------------
- * CoalesceExprState node
- * ----------------
- */
- typedef struct CoalesceExprState
- {
- ExprState xprstate;
- List *args; /* the arguments */
- } CoalesceExprState;
- /* ----------------
- * MinMaxExprState node
- * ----------------
- */
- typedef struct MinMaxExprState
- {
- ExprState xprstate;
- List *args; /* the arguments */
- FmgrInfo cfunc; /* lookup info for comparison func */
- } MinMaxExprState;
- /* ----------------
- * XmlExprState node
- * ----------------
- */
- typedef struct XmlExprState
- {
- ExprState xprstate;
- List *named_args; /* ExprStates for named arguments */
- List *args; /* ExprStates for other arguments */
- } XmlExprState;
- /* ----------------
- * NullTestState node
- * ----------------
- */
- typedef struct NullTestState
- {
- ExprState xprstate;
- ExprState *arg; /* input expression */
- /* used only if input is of composite type: */
- TupleDesc argdesc; /* tupdesc for most recent input */
- } NullTestState;
- /* ----------------
- * CoerceToDomainState node
- * ----------------
- */
- typedef struct CoerceToDomainState
- {
- ExprState xprstate;
- ExprState *arg; /* input expression */
- /* Cached set of constraints that need to be checked */
- /* use struct pointer to avoid including typcache.h here */
- struct DomainConstraintRef *constraint_ref;
- } CoerceToDomainState;
- /*
- * DomainConstraintState - one item to check during CoerceToDomain
- *
- * Note: this is just a Node, and not an ExprState, because it has no
- * corresponding Expr to link to. Nonetheless it is part of an ExprState
- * tree, so we give it a name following the xxxState convention.
- */
- typedef enum DomainConstraintType
- {
- DOM_CONSTRAINT_NOTNULL,
- DOM_CONSTRAINT_CHECK
- } DomainConstraintType;
- typedef struct DomainConstraintState
- {
- NodeTag type;
- DomainConstraintType constrainttype; /* constraint type */
- char *name; /* name of constraint (for error msgs) */
- ExprState *check_expr; /* for CHECK, a boolean expression */
- } DomainConstraintState;
- /* ----------------------------------------------------------------
- * Executor State Trees
- *
- * An executing query has a PlanState tree paralleling the Plan tree
- * that describes the plan.
- * ----------------------------------------------------------------
- */
- /* ----------------
- * PlanState node
- *
- * We never actually instantiate any PlanState nodes; this is just the common
- * abstract superclass for all PlanState-type nodes.
- * ----------------
- */
- typedef struct PlanState
- {
- NodeTag type;
- Plan *plan; /* associated Plan node */
- EState *state; /* at execution time, states of individual
- * nodes point to one EState for the whole
- * top-level plan */
- Instrumentation *instrument; /* Optional runtime stats for this node */
- WorkerInstrumentation *worker_instrument; /* per-worker instrumentation */
- /*
- * Common structural data for all Plan types. These links to subsidiary
- * state trees parallel links in the associated plan tree (except for the
- * subPlan list, which does not exist in the plan tree).
- */
- List *targetlist; /* target list to be computed at this node */
- List *qual; /* implicitly-ANDed qual conditions */
- struct PlanState *lefttree; /* input plan tree(s) */
- struct PlanState *righttree;
- List *initPlan; /* Init SubPlanState nodes (un-correlated expr
- * subselects) */
- List *subPlan; /* SubPlanState nodes in my expressions */
- /*
- * State for management of parameter-change-driven rescanning
- */
- Bitmapset *chgParam; /* set of IDs of changed Params */
- /*
- * Other run-time state needed by most if not all node types.
- */
- TupleTableSlot *ps_ResultTupleSlot; /* slot for my result tuples */
- ExprContext *ps_ExprContext; /* node's expression-evaluation context */
- ProjectionInfo *ps_ProjInfo; /* info for doing tuple projection */
- bool ps_TupFromTlist;/* state flag for processing set-valued
- * functions in targetlist */
- } PlanState;
- /* ----------------
- * these are defined to avoid confusion problems with "left"
- * and "right" and "inner" and "outer". The convention is that
- * the "left" plan is the "outer" plan and the "right" plan is
- * the inner plan, but these make the code more readable.
- * ----------------
- */
- #define innerPlanState(node) (((PlanState *)(node))->righttree)
- #define outerPlanState(node) (((PlanState *)(node))->lefttree)
- /* Macros for inline access to certain instrumentation counters */
- #define InstrCountFiltered1(node, delta) \
- do { \
- if (((PlanState *)(node))->instrument) \
- ((PlanState *)(node))->instrument->nfiltered1 += (delta); \
- } while(0)
- #define InstrCountFiltered2(node, delta) \
- do { \
- if (((PlanState *)(node))->instrument) \
- ((PlanState *)(node))->instrument->nfiltered2 += (delta); \
- } while(0)
- /*
- * EPQState is state for executing an EvalPlanQual recheck on a candidate
- * tuple in ModifyTable or LockRows. The estate and planstate fields are
- * NULL if inactive.
- */
- typedef struct EPQState
- {
- EState *estate; /* subsidiary EState */
- PlanState *planstate; /* plan state tree ready to be executed */
- TupleTableSlot *origslot; /* original output tuple to be rechecked */
- Plan *plan; /* plan tree to be executed */
- List *arowMarks; /* ExecAuxRowMarks (non-locking only) */
- int epqParam; /* ID of Param to force scan node re-eval */
- } EPQState;
- /* ----------------
- * ResultState information
- * ----------------
- */
- typedef struct ResultState
- {
- PlanState ps; /* its first field is NodeTag */
- ExprState *resconstantqual;
- bool rs_done; /* are we done? */
- bool rs_checkqual; /* do we need to check the qual? */
- } ResultState;
- /* ----------------
- * ModifyTableState information
- * ----------------
- */
- typedef struct ModifyTableState
- {
- PlanState ps; /* its first field is NodeTag */
- CmdType operation; /* INSERT, UPDATE, or DELETE */
- bool canSetTag; /* do we set the command tag/es_processed? */
- bool mt_done; /* are we done? */
- PlanState **mt_plans; /* subplans (one per target rel) */
- int mt_nplans; /* number of plans in the array */
- int mt_whichplan; /* which one is being executed (0..n-1) */
- ResultRelInfo *resultRelInfo; /* per-subplan target relations */
- List **mt_arowmarks; /* per-subplan ExecAuxRowMark lists */
- EPQState mt_epqstate; /* for evaluating EvalPlanQual rechecks */
- bool fireBSTriggers; /* do we need to fire stmt triggers? */
- OnConflictAction mt_onconflict; /* ON CONFLICT type */
- List *mt_arbiterindexes; /* unique index OIDs to arbitrate
- * taking alt path */
- TupleTableSlot *mt_existing; /* slot to store existing target tuple in */
- List *mt_excludedtlist; /* the excluded pseudo relation's
- * tlist */
- TupleTableSlot *mt_conflproj; /* CONFLICT ... SET ... projection
- * target */
- } ModifyTableState;
- /* ----------------
- * AppendState information
- *
- * nplans how many plans are in the array
- * whichplan which plan is being executed (0 .. n-1)
- * ----------------
- */
- typedef struct AppendState
- {
- PlanState ps; /* its first field is NodeTag */
- PlanState **appendplans; /* array of PlanStates for my inputs */
- int as_nplans;
- int as_whichplan;
- } AppendState;
- /* ----------------
- * MergeAppendState information
- *
- * nplans how many plans are in the array
- * nkeys number of sort key columns
- * sortkeys sort keys in SortSupport representation
- * slots current output tuple of each subplan
- * heap heap of active tuples
- * initialized true if we have fetched first tuple from each subplan
- * ----------------
- */
- typedef struct MergeAppendState
- {
- PlanState ps; /* its first field is NodeTag */
- PlanState **mergeplans; /* array of PlanStates for my inputs */
- int ms_nplans;
- int ms_nkeys;
- SortSupport ms_sortkeys; /* array of length ms_nkeys */
- TupleTableSlot **ms_slots; /* array of length ms_nplans */
- struct binaryheap *ms_heap; /* binary heap of slot indices */
- bool ms_initialized; /* are subplans started? */
- } MergeAppendState;
- /* ----------------
- * RecursiveUnionState information
- *
- * RecursiveUnionState is used for performing a recursive union.
- *
- * recursing T when we're done scanning the non-recursive term
- * intermediate_empty T if intermediate_table is currently empty
- * working_table working table (to be scanned by recursive term)
- * intermediate_table current recursive output (next generation of WT)
- * ----------------
- */
- typedef struct RecursiveUnionState
- {
- PlanState ps; /* its first field is NodeTag */
- bool recursing;
- bool intermediate_empty;
- Tuplestorestate *working_table;
- Tuplestorestate *intermediate_table;
- /* Remaining fields are unused in UNION ALL case */
- FmgrInfo *eqfunctions; /* per-grouping-field equality fns */
- FmgrInfo *hashfunctions; /* per-grouping-field hash fns */
- MemoryContext tempContext; /* short-term context for comparisons */
- TupleHashTable hashtable; /* hash table for tuples already seen */
- MemoryContext tableContext; /* memory context containing hash table */
- } RecursiveUnionState;
- /* ----------------
- * BitmapAndState information
- * ----------------
- */
- typedef struct BitmapAndState
- {
- PlanState ps; /* its first field is NodeTag */
- PlanState **bitmapplans; /* array of PlanStates for my inputs */
- int nplans; /* number of input plans */
- } BitmapAndState;
- /* ----------------
- * BitmapOrState information
- * ----------------
- */
- typedef struct BitmapOrState
- {
- PlanState ps; /* its first field is NodeTag */
- PlanState **bitmapplans; /* array of PlanStates for my inputs */
- int nplans; /* number of input plans */
- } BitmapOrState;
- /* ----------------------------------------------------------------
- * Scan State Information
- * ----------------------------------------------------------------
- */
- /* ----------------
- * ScanState information
- *
- * ScanState extends PlanState for node types that represent
- * scans of an underlying relation. It can also be used for nodes
- * that scan the output of an underlying plan node --- in that case,
- * only ScanTupleSlot is actually useful, and it refers to the tuple
- * retrieved from the subplan.
- *
- * currentRelation relation being scanned (NULL if none)
- * currentScanDesc current scan descriptor for scan (NULL if none)
- * ScanTupleSlot pointer to slot in tuple table holding scan tuple
- * ----------------
- */
- typedef struct ScanState
- {
- PlanState ps; /* its first field is NodeTag */
- Relation ss_currentRelation;
- HeapScanDesc ss_currentScanDesc;
- TupleTableSlot *ss_ScanTupleSlot;
- } ScanState;
- /* ----------------
- * SeqScanState information
- * ----------------
- */
- typedef struct SeqScanState
- {
- ScanState ss; /* its first field is NodeTag */
- Size pscan_len; /* size of parallel heap scan descriptor */
- } SeqScanState;
- /* ----------------
- * SampleScanState information
- * ----------------
- */
- typedef struct SampleScanState
- {
- ScanState ss;
- List *args; /* expr states for TABLESAMPLE params */
- ExprState *repeatable; /* expr state for REPEATABLE expr */
- /* use struct pointer to avoid including tsmapi.h here */
- struct TsmRoutine *tsmroutine; /* descriptor for tablesample method */
- void *tsm_state; /* tablesample method can keep state here */
- bool use_bulkread; /* use bulkread buffer access strategy? */
- bool use_pagemode; /* use page-at-a-time visibility checking? */
- bool begun; /* false means need to call BeginSampleScan */
- uint32 seed; /* random seed */
- } SampleScanState;
- /*
- * These structs store information about index quals that don't have simple
- * constant right-hand sides. See comments for ExecIndexBuildScanKeys()
- * for discussion.
- */
- typedef struct
- {
- ScanKey scan_key; /* scankey to put value into */
- ExprState *key_expr; /* expr to evaluate to get value */
- bool key_toastable; /* is expr's result a toastable datatype? */
- } IndexRuntimeKeyInfo;
- typedef struct
- {
- ScanKey scan_key; /* scankey to put value into */
- ExprState *array_expr; /* expr to evaluate to get array value */
- int next_elem; /* next array element to use */
- int num_elems; /* number of elems in current array value */
- Datum *elem_values; /* array of num_elems Datums */
- bool *elem_nulls; /* array of num_elems is-null flags */
- } IndexArrayKeyInfo;
- /* ----------------
- * IndexScanState information
- *
- * indexqualorig execution state for indexqualorig expressions
- * indexorderbyorig execution state for indexorderbyorig expressions
- * ScanKeys Skey structures for index quals
- * NumScanKeys number of ScanKeys
- * OrderByKeys Skey structures for index ordering operators
- * NumOrderByKeys number of OrderByKeys
- * RuntimeKeys info about Skeys that must be evaluated at runtime
- * NumRuntimeKeys number of RuntimeKeys
- * RuntimeKeysReady true if runtime Skeys have been computed
- * RuntimeContext expr context for evaling runtime Skeys
- * RelationDesc index relation descriptor
- * ScanDesc index scan descriptor
- *
- * ReorderQueue tuples that need reordering due to re-check
- * ReachedEnd have we fetched all tuples from index already?
- * OrderByValues values of ORDER BY exprs of last fetched tuple
- * OrderByNulls null flags for OrderByValues
- * SortSupport for reordering ORDER BY exprs
- * OrderByTypByVals is the datatype of order by expression pass-by-value?
- * OrderByTypLens typlens of the datatypes of order by expressions
- * ----------------
- */
- typedef struct IndexScanState
- {
- ScanState ss; /* its first field is NodeTag */
- List *indexqualorig;
- List *indexorderbyorig;
- ScanKey iss_ScanKeys;
- int iss_NumScanKeys;
- ScanKey iss_OrderByKeys;
- int iss_NumOrderByKeys;
- IndexRuntimeKeyInfo *iss_RuntimeKeys;
- int iss_NumRuntimeKeys;
- bool iss_RuntimeKeysReady;
- ExprContext *iss_RuntimeContext;
- Relation iss_RelationDesc;
- IndexScanDesc iss_ScanDesc;
- /* These are needed for re-checking ORDER BY expr ordering */
- pairingheap *iss_ReorderQueue;
- bool iss_ReachedEnd;
- Datum *iss_OrderByValues;
- bool *iss_OrderByNulls;
- SortSupport iss_SortSupport;
- bool *iss_OrderByTypByVals;
- int16 *iss_OrderByTypLens;
- } IndexScanState;
- /* ----------------
- * IndexOnlyScanState information
- *
- * indexqual execution state for indexqual expressions
- * ScanKeys Skey structures for index quals
- * NumScanKeys number of ScanKeys
- * OrderByKeys Skey structures for index ordering operators
- * NumOrderByKeys number of OrderByKeys
- * RuntimeKeys info about Skeys that must be evaluated at runtime
- * NumRuntimeKeys number of RuntimeKeys
- * RuntimeKeysReady true if runtime Skeys have been computed
- * RuntimeContext expr context for evaling runtime Skeys
- * RelationDesc index relation descriptor
- * ScanDesc index scan descriptor
- * VMBuffer buffer in use for visibility map testing, if any
- * HeapFetches number of tuples we were forced to fetch from heap
- * ----------------
- */
- typedef struct IndexOnlyScanState
- {
- ScanState ss; /* its first field is NodeTag */
- List *indexqual;
- ScanKey ioss_ScanKeys;
- int ioss_NumScanKeys;
- ScanKey ioss_OrderByKeys;
- int ioss_NumOrderByKeys;
- IndexRuntimeKeyInfo *ioss_RuntimeKeys;
- int ioss_NumRuntimeKeys;
- bool ioss_RuntimeKeysReady;
- ExprContext *ioss_RuntimeContext;
- Relation ioss_RelationDesc;
- IndexScanDesc ioss_ScanDesc;
- Buffer ioss_VMBuffer;
- long ioss_HeapFetches;
- } IndexOnlyScanState;
- /* ----------------
- * BitmapIndexScanState information
- *
- * result bitmap to return output into, or NULL
- * ScanKeys Skey structures for index quals
- * NumScanKeys number of ScanKeys
- * RuntimeKeys info about Skeys that must be evaluated at runtime
- * NumRuntimeKeys number of RuntimeKeys
- * ArrayKeys info about Skeys that come from ScalarArrayOpExprs
- * NumArrayKeys number of ArrayKeys
- * RuntimeKeysReady true if runtime Skeys have been computed
- * RuntimeContext expr context for evaling runtime Skeys
- * RelationDesc index relation descriptor
- * ScanDesc index scan descriptor
- * ----------------
- */
- typedef struct BitmapIndexScanState
- {
- ScanState ss; /* its first field is NodeTag */
- TIDBitmap *biss_result;
- ScanKey biss_ScanKeys;
- int biss_NumScanKeys;
- IndexRuntimeKeyInfo *biss_RuntimeKeys;
- int biss_NumRuntimeKeys;
- IndexArrayKeyInfo *biss_ArrayKeys;
- int biss_NumArrayKeys;
- bool biss_RuntimeKeysReady;
- ExprContext *biss_RuntimeContext;
- Relation biss_RelationDesc;
- IndexScanDesc biss_ScanDesc;
- } BitmapIndexScanState;
- /* ----------------
- * BitmapHeapScanState information
- *
- * bitmapqualorig execution state for bitmapqualorig expressions
- * tbm bitmap obtained from child index scan(s)
- * tbmiterator iterator for scanning current pages
- * tbmres current-page data
- * exact_pages total number of exact pages retrieved
- * lossy_pages total number of lossy pages retrieved
- * prefetch_iterator iterator for prefetching ahead of current page
- * prefetch_pages # pages prefetch iterator is ahead of current
- * prefetch_target current target prefetch distance
- * prefetch_maximum maximum value for prefetch_target
- * ----------------
- */
- typedef struct BitmapHeapScanState
- {
- ScanState ss; /* its first field is NodeTag */
- List *bitmapqualorig;
- TIDBitmap *tbm;
- TBMIterator *tbmiterator;
- TBMIterateResult *tbmres;
- long exact_pages;
- long lossy_pages;
- TBMIterator *prefetch_iterator;
- int prefetch_pages;
- int prefetch_target;
- int prefetch_maximum;
- } BitmapHeapScanState;
- /* ----------------
- * TidScanState information
- *
- * isCurrentOf scan has a CurrentOfExpr qual
- * NumTids number of tids in this scan
- * TidPtr index of currently fetched tid
- * TidList evaluated item pointers (array of size NumTids)
- * ----------------
- */
- typedef struct TidScanState
- {
- ScanState ss; /* its first field is NodeTag */
- List *tss_tidquals; /* list of ExprState nodes */
- bool tss_isCurrentOf;
- int tss_NumTids;
- int tss_TidPtr;
- ItemPointerData *tss_TidList;
- HeapTupleData tss_htup;
- } TidScanState;
- /* ----------------
- * SubqueryScanState information
- *
- * SubqueryScanState is used for scanning a sub-query in the range table.
- * ScanTupleSlot references the current output tuple of the sub-query.
- * ----------------
- */
- typedef struct SubqueryScanState
- {
- ScanState ss; /* its first field is NodeTag */
- PlanState *subplan;
- } SubqueryScanState;
- /* ----------------
- * FunctionScanState information
- *
- * Function nodes are used to scan the results of a
- * function appearing in FROM (typically a function returning set).
- *
- * eflags node's capability flags
- * ordinality is this scan WITH ORDINALITY?
- * simple true if we have 1 function and no ordinality
- * ordinal current ordinal column value
- * nfuncs number of functions being executed
- * funcstates per-function execution states (private in
- * nodeFunctionscan.c)
- * argcontext memory context to evaluate function arguments in
- * ----------------
- */
- struct FunctionScanPerFuncState;
- typedef struct FunctionScanState
- {
- ScanState ss; /* its first field is NodeTag */
- int eflags;
- bool ordinality;
- bool simple;
- int64 ordinal;
- int nfuncs;
- struct FunctionScanPerFuncState *funcstates; /* array of length
- * nfuncs */
- MemoryContext argcontext;
- } FunctionScanState;
- /* ----------------
- * ValuesScanState information
- *
- * ValuesScan nodes are used to scan the results of a VALUES list
- *
- * rowcontext per-expression-list context
- * exprlists array of expression lists being evaluated
- * array_len size of array
- * curr_idx current array index (0-based)
- *
- * Note: ss.ps.ps_ExprContext is used to evaluate any qual or projection
- * expressions attached to the node. We create a second ExprContext,
- * rowcontext, in which to build the executor expression state for each
- * Values sublist. Resetting this context lets us get rid of expression
- * state for each row, avoiding major memory leakage over a long values list.
- * ----------------
- */
- typedef struct ValuesScanState
- {
- ScanState ss; /* its first field is NodeTag */
- ExprContext *rowcontext;
- List **exprlists;
- int array_len;
- int curr_idx;
- } ValuesScanState;
- /* ----------------
- * CteScanState information
- *
- * CteScan nodes are used to scan a CommonTableExpr query.
- *
- * Multiple CteScan nodes can read out from the same CTE query. We use
- * a tuplestore to hold rows that have been read from the CTE query but
- * not yet consumed by all readers.
- * ----------------
- */
- typedef struct CteScanState
- {
- ScanState ss; /* its first field is NodeTag */
- int eflags; /* capability flags to pass to tuplestore */
- int readptr; /* index of my tuplestore read pointer */
- PlanState *cteplanstate; /* PlanState for the CTE query itself */
- /* Link to the "leader" CteScanState (possibly this same node) */
- struct CteScanState *leader;
- /* The remaining fields are only valid in the "leader" CteScanState */
- Tuplestorestate *cte_table; /* rows already read from the CTE query */
- bool eof_cte; /* reached end of CTE query? */
- } CteScanState;
- /* ----------------
- * WorkTableScanState information
- *
- * WorkTableScan nodes are used to scan the work table created by
- * a RecursiveUnion node. We locate the RecursiveUnion node
- * during executor startup.
- * ----------------
- */
- typedef struct WorkTableScanState
- {
- ScanState ss; /* its first field is NodeTag */
- RecursiveUnionState *rustate;
- } WorkTableScanState;
- /* ----------------
- * ForeignScanState information
- *
- * ForeignScan nodes are used to scan foreign-data tables.
- * ----------------
- */
- typedef struct ForeignScanState
- {
- ScanState ss; /* its first field is NodeTag */
- List *fdw_recheck_quals; /* original quals not in ss.ps.qual */
- Size pscan_len; /* size of parallel coordination information */
- /* use struct pointer to avoid including fdwapi.h here */
- struct FdwRoutine *fdwroutine;
- void *fdw_state; /* foreign-data wrapper can keep state here */
- } ForeignScanState;
- /* ----------------
- * CustomScanState information
- *
- * CustomScan nodes are used to execute custom code within executor.
- *
- * Core code must avoid assuming that the CustomScanState is only as large as
- * the structure declared here; providers are allowed to make it the first
- * element in a larger structure, and typically would need to do so. The
- * struct is actually allocated by the CreateCustomScanState method associated
- * with the plan node. Any additional fields can be initialized there, or in
- * the BeginCustomScan method.
- * ----------------
- */
- struct CustomExecMethods;
- typedef struct CustomScanState
- {
- ScanState ss;
- uint32 flags; /* mask of CUSTOMPATH_* flags, see
- * nodes/extensible.h */
- List *custom_ps; /* list of child PlanState nodes, if any */
- Size pscan_len; /* size of parallel coordination information */
- const struct CustomExecMethods *methods;
- } CustomScanState;
- /* ----------------------------------------------------------------
- * Join State Information
- * ----------------------------------------------------------------
- */
- /* ----------------
- * JoinState information
- *
- * Superclass for state nodes of join plans.
- * ----------------
- */
- typedef struct JoinState
- {
- PlanState ps;
- JoinType jointype;
- List *joinqual; /* JOIN quals (in addition to ps.qual) */
- } JoinState;
- /* ----------------
- * NestLoopState information
- *
- * NeedNewOuter true if need new outer tuple on next call
- * MatchedOuter true if found a join match for current outer tuple
- * NullInnerTupleSlot prepared null tuple for left outer joins
- * ----------------
- */
- typedef struct NestLoopState
- {
- JoinState js; /* its first field is NodeTag */
- bool nl_NeedNewOuter;
- bool nl_MatchedOuter;
- TupleTableSlot *nl_NullInnerTupleSlot;
- } NestLoopState;
- /* ----------------
- * MergeJoinState information
- *
- * NumClauses number of mergejoinable join clauses
- * Clauses info for each mergejoinable clause
- * JoinState current state of ExecMergeJoin state machine
- * ExtraMarks true to issue extra Mark operations on inner scan
- * ConstFalseJoin true if we have a constant-false joinqual
- * FillOuter true if should emit unjoined outer tuples anyway
- * FillInner true if should emit unjoined inner tuples anyway
- * MatchedOuter true if found a join match for current outer tuple
- * MatchedInner true if found a join match for current inner tuple
- * OuterTupleSlot slot in tuple table for cur outer tuple
- * InnerTupleSlot slot in tuple table for cur inner tuple
- * MarkedTupleSlot slot in tuple table for marked tuple
- * NullOuterTupleSlot prepared null tuple for right outer joins
- * NullInnerTupleSlot prepared null tuple for left outer joins
- * OuterEContext workspace for computing outer tuple's join values
- * InnerEContext workspace for computing inner tuple's join values
- * ----------------
- */
- /* private in nodeMergejoin.c: */
- typedef struct MergeJoinClauseData *MergeJoinClause;
- typedef struct MergeJoinState
- {
- JoinState js; /* its first field is NodeTag */
- int mj_NumClauses;
- MergeJoinClause mj_Clauses; /* array of length mj_NumClauses */
- int mj_JoinState;
- bool mj_ExtraMarks;
- bool mj_ConstFalseJoin;
- bool mj_FillOuter;
- bool mj_FillInner;
- bool mj_MatchedOuter;
- bool mj_MatchedInner;
- TupleTableSlot *mj_OuterTupleSlot;
- TupleTableSlot *mj_InnerTupleSlot;
- TupleTableSlot *mj_MarkedTupleSlot;
- TupleTableSlot *mj_NullOuterTupleSlot;
- TupleTableSlot *mj_NullInnerTupleSlot;
- ExprContext *mj_OuterEContext;
- ExprContext *mj_InnerEContext;
- } MergeJoinState;
- /* ----------------
- * HashJoinState information
- *
- * hashclauses original form of the hashjoin condition
- * hj_OuterHashKeys the outer hash keys in the hashjoin condition
- * hj_InnerHashKeys the inner hash keys in the hashjoin condition
- * hj_HashOperators the join operators in the hashjoin condition
- * hj_HashTable hash table for the hashjoin
- * (NULL if table not built yet)
- * hj_CurHashValue hash value for current outer tuple
- * hj_CurBucketNo regular bucket# for current outer tuple
- * hj_CurSkewBucketNo skew bucket# for current outer tuple
- * hj_CurTuple last inner tuple matched to current outer
- * tuple, or NULL if starting search
- * (hj_CurXXX variables are undefined if
- * OuterTupleSlot is empty!)
- * hj_OuterTupleSlot tuple slot for outer tuples
- * hj_HashTupleSlot tuple slot for inner (hashed) tuples
- * hj_NullOuterTupleSlot prepared null tuple for right/full outer joins
- * hj_NullInnerTupleSlot prepared null tuple for left/full outer joins
- * hj_FirstOuterTupleSlot first tuple retrieved from outer plan
- * hj_JoinState current state of ExecHashJoin state machine
- * hj_MatchedOuter true if found a join match for current outer
- * hj_OuterNotEmpty true if outer relation known not empty
- * ----------------
- */
- /* these structs are defined in executor/hashjoin.h: */
- typedef struct HashJoinTupleData *HashJoinTuple;
- typedef struct HashJoinTableData *HashJoinTable;
- typedef struct HashJoinState
- {
- JoinState js; /* its first field is NodeTag */
- List *hashclauses; /* list of ExprState nodes */
- List *hj_OuterHashKeys; /* list of ExprState nodes */
- List *hj_InnerHashKeys; /* list of ExprState nodes */
- List *hj_HashOperators; /* list of operator OIDs */
- HashJoinTable hj_HashTable;
- uint32 hj_CurHashValue;
- int hj_CurBucketNo;
- int hj_CurSkewBucketNo;
- HashJoinTuple hj_CurTuple;
- TupleTableSlot *hj_OuterTupleSlot;
- TupleTableSlot *hj_HashTupleSlot;
- TupleTableSlot *hj_NullOuterTupleSlot;
- TupleTableSlot *hj_NullInnerTupleSlot;
- TupleTableSlot *hj_FirstOuterTupleSlot;
- int hj_JoinState;
- bool hj_MatchedOuter;
- bool hj_OuterNotEmpty;
- } HashJoinState;
- /* ----------------------------------------------------------------
- * Materialization State Information
- * ----------------------------------------------------------------
- */
- /* ----------------
- * MaterialState information
- *
- * materialize nodes are used to materialize the results
- * of a subplan into a temporary file.
- *
- * ss.ss_ScanTupleSlot refers to output of underlying plan.
- * ----------------
- */
- typedef struct MaterialState
- {
- ScanState ss; /* its first field is NodeTag */
- int eflags; /* capability flags to pass to tuplestore */
- bool eof_underlying; /* reached end of underlying plan? */
- Tuplestorestate *tuplestorestate;
- } MaterialState;
- /* ----------------
- * SortState information
- * ----------------
- */
- typedef struct SortState
- {
- ScanState ss; /* its first field is NodeTag */
- bool randomAccess; /* need random access to sort output? */
- bool bounded; /* is the result set bounded? */
- int64 bound; /* if bounded, how many tuples are needed */
- bool sort_Done; /* sort completed yet? */
- bool bounded_Done; /* value of bounded we did the sort with */
- int64 bound_Done; /* value of bound we did the sort with */
- void *tuplesortstate; /* private state of tuplesort.c */
- } SortState;
- /* ---------------------
- * GroupState information
- * -------------------------
- */
- typedef struct GroupState
- {
- ScanState ss; /* its first field is NodeTag */
- FmgrInfo *eqfunctions; /* per-field lookup data for equality fns */
- bool grp_done; /* indicates completion of Group scan */
- } GroupState;
- /* ---------------------
- * AggState information
- *
- * ss.ss_ScanTupleSlot refers to output of underlying plan.
- *
- * Note: ss.ps.ps_ExprContext contains ecxt_aggvalues and
- * ecxt_aggnulls arrays, which hold the computed agg values for the current
- * input group during evaluation of an Agg node's output tuple(s). We
- * create a second ExprContext, tmpcontext, in which to evaluate input
- * expressions and run the aggregate transition functions.
- * -------------------------
- */
- /* these structs are private in nodeAgg.c: */
- typedef struct AggStatePerAggData *AggStatePerAgg;
- typedef struct AggStatePerTransData *AggStatePerTrans;
- typedef struct AggStatePerGroupData *AggStatePerGroup;
- typedef struct AggStatePerPhaseData *AggStatePerPhase;
- typedef struct AggState
- {
- ScanState ss; /* its first field is NodeTag */
- List *aggs; /* all Aggref nodes in targetlist & quals */
- int numaggs; /* length of list (could be zero!) */
- int numtrans; /* number of pertrans items */
- AggSplit aggsplit; /* agg-splitting mode, see nodes.h */
- AggStatePerPhase phase; /* pointer to current phase data */
- int numphases; /* number of phases */
- int current_phase; /* current phase number */
- FmgrInfo *hashfunctions; /* per-grouping-field hash fns */
- AggStatePerAgg peragg; /* per-Aggref information */
- AggStatePerTrans pertrans; /* per-Trans state information */
- ExprContext **aggcontexts; /* econtexts for long-lived data (per GS) */
- ExprContext *tmpcontext; /* econtext for input expressions */
- AggStatePerTrans curpertrans; /* currently active trans state */
- bool input_done; /* indicates end of input */
- bool agg_done; /* indicates completion of Agg scan */
- int projected_set; /* The last projected grouping set */
- int current_set; /* The current grouping set being evaluated */
- Bitmapset *grouped_cols; /* grouped cols in current projection */
- List *all_grouped_cols; /* list of all grouped cols in DESC
- * order */
- /* These fields are for grouping set phase data */
- int maxsets; /* The max number of sets in any phase */
- AggStatePerPhase phases; /* array of all phases */
- Tuplesortstate *sort_in; /* sorted input to phases > 0 */
- Tuplesortstate *sort_out; /* input is copied here for next phase */
- TupleTableSlot *sort_slot; /* slot for sort results */
- /* these fields are used in AGG_PLAIN and AGG_SORTED modes: */
- AggStatePerGroup pergroup; /* per-Aggref-per-group working state */
- HeapTuple grp_firstTuple; /* copy of first tuple of current group */
- /* these fields are used in AGG_HASHED mode: */
- TupleHashTable hashtable; /* hash table with one entry per group */
- TupleTableSlot *hashslot; /* slot for loading hash table */
- List *hash_needed; /* list of columns needed in hash table */
- bool table_filled; /* hash table filled yet? */
- TupleHashIterator hashiter; /* for iterating through hash table */
- } AggState;
- /* ----------------
- * WindowAggState information
- * ----------------
- */
- /* these structs are private in nodeWindowAgg.c: */
- typedef struct WindowStatePerFuncData *WindowStatePerFunc;
- typedef struct WindowStatePerAggData *WindowStatePerAgg;
- typedef struct WindowAggState
- {
- ScanState ss; /* its first field is NodeTag */
- /* these fields are filled in by ExecInitExpr: */
- List *funcs; /* all WindowFunc nodes in targetlist */
- int numfuncs; /* total number of window functions */
- int numaggs; /* number that are plain aggregates */
- WindowStatePerFunc perfunc; /* per-window-function information */
- WindowStatePerAgg peragg; /* per-plain-aggregate information */
- FmgrInfo *partEqfunctions; /* equality funcs for partition columns */
- FmgrInfo *ordEqfunctions; /* equality funcs for ordering columns */
- Tuplestorestate *buffer; /* stores rows of current partition */
- int current_ptr; /* read pointer # for current */
- int64 spooled_rows; /* total # of rows in buffer */
- int64 currentpos; /* position of current row in partition */
- int64 frameheadpos; /* current frame head position */
- int64 frametailpos; /* current frame tail position */
- /* use struct pointer to avoid including windowapi.h here */
- struct WindowObjectData *agg_winobj; /* winobj for aggregate
- * fetches */
- int64 aggregatedbase; /* start row for current aggregates */
- int64 aggregatedupto; /* rows before this one are aggregated */
- int frameOptions; /* frame_clause options, see WindowDef */
- ExprState *startOffset; /* expression for starting bound offset */
- ExprState *endOffset; /* expression for ending bound offset */
- Datum startOffsetValue; /* result of startOffset evaluation */
- Datum endOffsetValue; /* result of endOffset evaluation */
- MemoryContext partcontext; /* context for partition-lifespan data */
- MemoryContext aggcontext; /* shared context for aggregate working data */
- MemoryContext curaggcontext; /* current aggregate's working data */
- ExprContext *tmpcontext; /* short-term evaluation context */
- bool all_first; /* true if the scan is starting */
- bool all_done; /* true if the scan is finished */
- bool partition_spooled; /* true if all tuples in current
- * partition have been spooled into
- * tuplestore */
- bool more_partitions;/* true if there's more partitions after this
- * one */
- bool framehead_valid;/* true if frameheadpos is known up to date
- * for current row */
- bool frametail_valid;/* true if frametailpos is known up to date
- * for current row */
- TupleTableSlot *first_part_slot; /* first tuple of current or next
- * partition */
- /* temporary slots for tuples fetched back from tuplestore */
- TupleTableSlot *agg_row_slot;
- TupleTableSlot *temp_slot_1;
- TupleTableSlot *temp_slot_2;
- } WindowAggState;
- /* ----------------
- * UniqueState information
- *
- * Unique nodes are used "on top of" sort nodes to discard
- * duplicate tuples returned from the sort phase. Basically
- * all it does is compare the current tuple from the subplan
- * with the previously fetched tuple (stored in its result slot).
- * If the two are identical in all interesting fields, then
- * we just fetch another tuple from the sort and try again.
- * ----------------
- */
- typedef struct UniqueState
- {
- PlanState ps; /* its first field is NodeTag */
- FmgrInfo *eqfunctions; /* per-field lookup data for equality fns */
- MemoryContext tempContext; /* short-term context for comparisons */
- } UniqueState;
- /* ----------------
- * GatherState information
- *
- * Gather nodes launch 1 or more parallel workers, run a subplan
- * in those workers, and collect the results.
- * ----------------
- */
- typedef struct GatherState
- {
- PlanState ps; /* its first field is NodeTag */
- bool initialized;
- struct ParallelExecutorInfo *pei;
- int nreaders;
- int nextreader;
- int nworkers_launched;
- struct TupleQueueReader **reader;
- TupleTableSlot *funnel_slot;
- bool need_to_scan_locally;
- } GatherState;
- /* ----------------
- * HashState information
- * ----------------
- */
- typedef struct HashState
- {
- PlanState ps; /* its first field is NodeTag */
- HashJoinTable hashtable; /* hash table for the hashjoin */
- List *hashkeys; /* list of ExprState nodes */
- /* hashkeys is same as parent's hj_InnerHashKeys */
- } HashState;
- /* ----------------
- * SetOpState information
- *
- * Even in "sorted" mode, SetOp nodes are more complex than a simple
- * Unique, since we have to count how many duplicates to return. But
- * we also support hashing, so this is really more like a cut-down
- * form of Agg.
- * ----------------
- */
- /* this struct is private in nodeSetOp.c: */
- typedef struct SetOpStatePerGroupData *SetOpStatePerGroup;
- typedef struct SetOpState
- {
- PlanState ps; /* its first field is NodeTag */
- FmgrInfo *eqfunctions; /* per-grouping-field equality fns */
- FmgrInfo *hashfunctions; /* per-grouping-field hash fns */
- bool setop_done; /* indicates completion of output scan */
- long numOutput; /* number of dups left to output */
- MemoryContext tempContext; /* short-term context for comparisons */
- /* these fields are used in SETOP_SORTED mode: */
- SetOpStatePerGroup pergroup; /* per-group working state */
- HeapTuple grp_firstTuple; /* copy of first tuple of current group */
- /* these fields are used in SETOP_HASHED mode: */
- TupleHashTable hashtable; /* hash table with one entry per group */
- MemoryContext tableContext; /* memory context containing hash table */
- bool table_filled; /* hash table filled yet? */
- TupleHashIterator hashiter; /* for iterating through hash table */
- } SetOpState;
- /* ----------------
- * LockRowsState information
- *
- * LockRows nodes are used to enforce FOR [KEY] UPDATE/SHARE locking.
- * ----------------
- */
- typedef struct LockRowsState
- {
- PlanState ps; /* its first field is NodeTag */
- List *lr_arowMarks; /* List of ExecAuxRowMarks */
- EPQState lr_epqstate; /* for evaluating EvalPlanQual rechecks */
- HeapTuple *lr_curtuples; /* locked tuples (one entry per RT entry) */
- int lr_ntables; /* length of lr_curtuples[] array */
- } LockRowsState;
- /* ----------------
- * LimitState information
- *
- * Limit nodes are used to enforce LIMIT/OFFSET clauses.
- * They just select the desired subrange of their subplan's output.
- *
- * offset is the number of initial tuples to skip (0 does nothing).
- * count is the number of tuples to return after skipping the offset tuples.
- * If no limit count was specified, count is undefined and noCount is true.
- * When lstate == LIMIT_INITIAL, offset/count/noCount haven't been set yet.
- * ----------------
- */
- typedef enum
- {
- LIMIT_INITIAL, /* initial state for LIMIT node */
- LIMIT_RESCAN, /* rescan after recomputing parameters */
- LIMIT_EMPTY, /* there are no returnable rows */
- LIMIT_INWINDOW, /* have returned a row in the window */
- LIMIT_SUBPLANEOF, /* at EOF of subplan (within window) */
- LIMIT_WINDOWEND, /* stepped off end of window */
- LIMIT_WINDOWSTART /* stepped off beginning of window */
- } LimitStateCond;
- typedef struct LimitState
- {
- PlanState ps; /* its first field is NodeTag */
- ExprState *limitOffset; /* OFFSET parameter, or NULL if none */
- ExprState *limitCount; /* COUNT parameter, or NULL if none */
- int64 offset; /* current OFFSET value */
- int64 count; /* current COUNT, if any */
- bool noCount; /* if true, ignore count */
- LimitStateCond lstate; /* state machine status, as above */
- int64 position; /* 1-based index of last tuple returned */
- TupleTableSlot *subSlot; /* tuple last obtained from subplan */
- } LimitState;
- #endif /* EXECNODES_H */
|