PostgreSQL Source Code git master
Loading...
Searching...
No Matches
execnodes.h File Reference
#include "access/htup.h"
#include "executor/instrument_node.h"
#include "fmgr.h"
#include "lib/ilist.h"
#include "nodes/miscnodes.h"
#include "nodes/params.h"
#include "nodes/plannodes.h"
#include "partitioning/partdefs.h"
#include "storage/buf.h"
#include "utils/reltrigger.h"
#include "utils/typcache.h"
#include "lib/simplehash.h"
Include dependency graph for execnodes.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ExprState
 
struct  IndexInfo
 
struct  ExprContext_CB
 
struct  ExprContext
 
struct  ReturnSetInfo
 
struct  ProjectionInfo
 
struct  JunkFilter
 
struct  OnConflictActionState
 
struct  MergeActionState
 
struct  ForPortionOfState
 
struct  ResultRelInfo
 
struct  AsyncRequest
 
struct  EState
 
struct  ExecRowMark
 
struct  ExecAuxRowMark
 
struct  TupleHashEntryData
 
struct  TupleHashTableData
 
struct  WindowFuncExprState
 
struct  SetExprState
 
struct  SubPlanState
 
struct  DomainConstraintState
 
struct  JsonExprState
 
struct  PlanState
 
struct  EPQState
 
struct  ResultState
 
struct  ProjectSetState
 
struct  ModifyTableState
 
struct  AppendState
 
struct  MergeAppendState
 
struct  RecursiveUnionState
 
struct  BitmapAndState
 
struct  BitmapOrState
 
struct  ScanState
 
struct  SeqScanState
 
struct  SampleScanState
 
struct  IndexRuntimeKeyInfo
 
struct  IndexArrayKeyInfo
 
struct  IndexScanState
 
struct  IndexOnlyScanState
 
struct  BitmapIndexScanState
 
struct  BitmapHeapScanState
 
struct  TidScanState
 
struct  TidRangeScanState
 
struct  SubqueryScanState
 
struct  FunctionScanState
 
struct  ValuesScanState
 
struct  TableFuncScanState
 
struct  CteScanState
 
struct  NamedTuplestoreScanState
 
struct  WorkTableScanState
 
struct  ForeignScanState
 
struct  CustomScanState
 
struct  JoinState
 
struct  NestLoopState
 
struct  MergeJoinState
 
struct  HashJoinState
 
struct  MaterialState
 
struct  MemoizeState
 
struct  PresortedKeyData
 
struct  SortState
 
struct  IncrementalSortState
 
struct  GroupState
 
struct  AggState
 
struct  WindowAggState
 
struct  UniqueState
 
struct  GatherState
 
struct  GatherMergeState
 
struct  HashState
 
struct  SetOpStatePerInput
 
struct  SetOpState
 
struct  LockRowsState
 
struct  LimitState
 

Macros

#define EEO_FLAG_IS_QUAL   (1 << 0)
 
#define EEO_FLAG_HAS_OLD   (1 << 1)
 
#define EEO_FLAG_HAS_NEW   (1 << 2)
 
#define EEO_FLAG_OLD_IS_NULL   (1 << 3)
 
#define EEO_FLAG_NEW_IS_NULL   (1 << 4)
 
#define FIELDNO_EXPRSTATE_FLAGS   1
 
#define FIELDNO_EXPRSTATE_RESNULL   2
 
#define FIELDNO_EXPRSTATE_RESVALUE   3
 
#define FIELDNO_EXPRSTATE_RESULTSLOT   4
 
#define FIELDNO_EXPRSTATE_PARENT   11
 
#define FIELDNO_EXPRCONTEXT_SCANTUPLE   1
 
#define FIELDNO_EXPRCONTEXT_INNERTUPLE   2
 
#define FIELDNO_EXPRCONTEXT_OUTERTUPLE   3
 
#define FIELDNO_EXPRCONTEXT_AGGVALUES   8
 
#define FIELDNO_EXPRCONTEXT_AGGNULLS   9
 
#define FIELDNO_EXPRCONTEXT_CASEDATUM   10
 
#define FIELDNO_EXPRCONTEXT_CASENULL   11
 
#define FIELDNO_EXPRCONTEXT_DOMAINDATUM   12
 
#define FIELDNO_EXPRCONTEXT_DOMAINNULL   13
 
#define FIELDNO_EXPRCONTEXT_OLDTUPLE   14
 
#define FIELDNO_EXPRCONTEXT_NEWTUPLE   15
 
#define SH_PREFIX   tuplehash
 
#define SH_ELEMENT_TYPE   TupleHashEntryData
 
#define SH_KEY_TYPE   MinimalTuple
 
#define SH_SCOPE   extern
 
#define SH_DECLARE
 
#define InitTupleHashIterator(htable, iter)    tuplehash_start_iterate(htable->hashtab, iter)
 
#define TermTupleHashIterator(iter)    ((void) 0)
 
#define ResetTupleHashIterator(htable, iter)    InitTupleHashIterator(htable, iter)
 
#define ScanTupleHashTable(htable, iter)    tuplehash_iterate(htable->hashtab, iter)
 
#define innerPlanState(node)   (((PlanState *)(node))->righttree)
 
#define outerPlanState(node)   (((PlanState *)(node))->lefttree)
 
#define InstrCountTuples2(node, delta)
 
#define InstrCountFiltered1(node, delta)
 
#define InstrCountFiltered2(node, delta)
 
#define MERGE_INSERT   0x01
 
#define MERGE_UPDATE   0x02
 
#define MERGE_DELETE   0x04
 
#define FIELDNO_AGGSTATE_CURAGGCONTEXT   14
 
#define FIELDNO_AGGSTATE_CURPERTRANS   16
 
#define FIELDNO_AGGSTATE_CURRENT_SET   20
 
#define FIELDNO_AGGSTATE_ALL_PERGROUPS   54
 

Typedefs

typedef struct BufferUsage BufferUsage
 
typedef struct ExecRowMark ExecRowMark
 
typedef struct ExprState ExprState
 
typedef struct ExprContext ExprContext
 
typedef struct HTAB HTAB
 
typedef struct Instrumentation Instrumentation
 
typedef struct pairingheap pairingheap
 
typedef struct PlanState PlanState
 
typedef struct QueryEnvironment QueryEnvironment
 
typedef struct RelationDataRelation
 
typedef RelationRelationPtr
 
typedef struct ScanKeyData ScanKeyData
 
typedef struct SnapshotDataSnapshot
 
typedef struct SortSupportDataSortSupport
 
typedef struct TIDBitmap TIDBitmap
 
typedef struct NodeInstrumentation NodeInstrumentation
 
typedef struct TriggerInstrumentation TriggerInstrumentation
 
typedef struct TupleConversionMap TupleConversionMap
 
typedef struct TupleDescDataTupleDesc
 
typedef struct Tuplesortstate Tuplesortstate
 
typedef struct Tuplestorestate Tuplestorestate
 
typedef struct TupleTableSlot TupleTableSlot
 
typedef struct TupleTableSlotOps TupleTableSlotOps
 
typedef struct WalUsage WalUsage
 
typedef struct WorkerNodeInstrumentation WorkerNodeInstrumentation
 
typedef Datum(* ExprStateEvalFunc) (ExprState *expression, ExprContext *econtext, bool *isNull)
 
typedef struct IndexInfo IndexInfo
 
typedef void(* ExprContextCallbackFunction) (Datum arg)
 
typedef struct ExprContext_CB ExprContext_CB
 
typedef struct ReturnSetInfo ReturnSetInfo
 
typedef struct ProjectionInfo ProjectionInfo
 
typedef struct JunkFilter JunkFilter
 
typedef struct OnConflictActionState OnConflictActionState
 
typedef struct MergeActionState MergeActionState
 
typedef struct ForPortionOfState ForPortionOfState
 
typedef struct ResultRelInfo ResultRelInfo
 
typedef struct AsyncRequest AsyncRequest
 
typedef struct EState EState
 
typedef struct ExecAuxRowMark ExecAuxRowMark
 
typedef struct TupleHashEntryDataTupleHashEntry
 
typedef struct TupleHashTableDataTupleHashTable
 
typedef struct TupleHashEntryData TupleHashEntryData
 
typedef struct TupleHashTableData TupleHashTableData
 
typedef tuplehash_iterator TupleHashIterator
 
typedef struct WindowFuncExprState WindowFuncExprState
 
typedef struct SetExprState SetExprState
 
typedef struct SubPlanState SubPlanState
 
typedef enum DomainConstraintType DomainConstraintType
 
typedef struct DomainConstraintState DomainConstraintState
 
typedef struct JsonExprState JsonExprState
 
typedef TupleTableSlot *(* ExecProcNodeMtd) (PlanState *pstate)
 
typedef struct EPQState EPQState
 
typedef struct ResultState ResultState
 
typedef struct ProjectSetState ProjectSetState
 
typedef struct ModifyTableState ModifyTableState
 
typedef struct AppendState AppendState
 
typedef struct ParallelAppendState ParallelAppendState
 
typedef struct MergeAppendState MergeAppendState
 
typedef struct RecursiveUnionState RecursiveUnionState
 
typedef struct BitmapAndState BitmapAndState
 
typedef struct BitmapOrState BitmapOrState
 
typedef struct ScanState ScanState
 
typedef struct SeqScanState SeqScanState
 
typedef struct SampleScanState SampleScanState
 
typedef struct IndexScanState IndexScanState
 
typedef struct IndexOnlyScanState IndexOnlyScanState
 
typedef struct BitmapIndexScanState BitmapIndexScanState
 
typedef struct ParallelBitmapHeapState ParallelBitmapHeapState
 
typedef struct BitmapHeapScanState BitmapHeapScanState
 
typedef struct TidScanState TidScanState
 
typedef struct TidRangeScanState TidRangeScanState
 
typedef struct SubqueryScanState SubqueryScanState
 
typedef struct FunctionScanState FunctionScanState
 
typedef struct ValuesScanState ValuesScanState
 
typedef struct TableFuncScanState TableFuncScanState
 
typedef struct CteScanState CteScanState
 
typedef struct NamedTuplestoreScanState NamedTuplestoreScanState
 
typedef struct WorkTableScanState WorkTableScanState
 
typedef struct ForeignScanState ForeignScanState
 
typedef struct CustomScanState CustomScanState
 
typedef struct JoinState JoinState
 
typedef struct NestLoopState NestLoopState
 
typedef struct MergeJoinClauseDataMergeJoinClause
 
typedef struct MergeJoinState MergeJoinState
 
typedef struct HashJoinTupleDataHashJoinTuple
 
typedef struct HashJoinTableDataHashJoinTable
 
typedef struct HashJoinState HashJoinState
 
typedef struct MaterialState MaterialState
 
typedef struct MemoizeState MemoizeState
 
typedef struct PresortedKeyData PresortedKeyData
 
typedef struct SortState SortState
 
typedef struct IncrementalSortState IncrementalSortState
 
typedef struct GroupState GroupState
 
typedef struct AggStatePerAggDataAggStatePerAgg
 
typedef struct AggStatePerTransDataAggStatePerTrans
 
typedef struct AggStatePerGroupDataAggStatePerGroup
 
typedef struct AggStatePerPhaseDataAggStatePerPhase
 
typedef struct AggStatePerHashDataAggStatePerHash
 
typedef struct AggState AggState
 
typedef struct WindowStatePerFuncDataWindowStatePerFunc
 
typedef struct WindowStatePerAggDataWindowStatePerAgg
 
typedef enum WindowAggStatus WindowAggStatus
 
typedef struct WindowAggState WindowAggState
 
typedef struct UniqueState UniqueState
 
typedef struct GatherState GatherState
 
typedef struct GatherMergeState GatherMergeState
 
typedef struct HashState HashState
 
typedef struct SetOpStatePerInput SetOpStatePerInput
 
typedef struct SetOpState SetOpState
 
typedef struct LockRowsState LockRowsState
 
typedef struct LimitState LimitState
 

Enumerations

enum  ExprDoneCond { ExprSingleResult , ExprMultipleResult , ExprEndResult }
 
enum  SetFunctionReturnMode { SFRM_ValuePerCall = 0x01 , SFRM_Materialize = 0x02 , SFRM_Materialize_Random = 0x04 , SFRM_Materialize_Preferred = 0x08 }
 
enum  DomainConstraintType { DOM_CONSTRAINT_NOTNULL , DOM_CONSTRAINT_CHECK }
 
enum  IncrementalSortExecutionStatus { INCSORT_LOADFULLSORT , INCSORT_LOADPREFIXSORT , INCSORT_READFULLSORT , INCSORT_READPREFIXSORT }
 
enum  WindowAggStatus { WINDOWAGG_DONE , WINDOWAGG_RUN , WINDOWAGG_PASSTHROUGH , WINDOWAGG_PASSTHROUGH_STRICT }
 
enum  LimitStateCond {
  LIMIT_INITIAL , LIMIT_RESCAN , LIMIT_EMPTY , LIMIT_INWINDOW ,
  LIMIT_WINDOWEND_TIES , LIMIT_SUBPLANEOF , LIMIT_WINDOWEND , LIMIT_WINDOWSTART
}
 

Macro Definition Documentation

◆ EEO_FLAG_HAS_NEW

#define EEO_FLAG_HAS_NEW   (1 << 2)

Definition at line 92 of file execnodes.h.

◆ EEO_FLAG_HAS_OLD

#define EEO_FLAG_HAS_OLD   (1 << 1)

Definition at line 90 of file execnodes.h.

◆ EEO_FLAG_IS_QUAL

#define EEO_FLAG_IS_QUAL   (1 << 0)

Definition at line 88 of file execnodes.h.

◆ EEO_FLAG_NEW_IS_NULL

#define EEO_FLAG_NEW_IS_NULL   (1 << 4)

Definition at line 96 of file execnodes.h.

◆ EEO_FLAG_OLD_IS_NULL

#define EEO_FLAG_OLD_IS_NULL   (1 << 3)

Definition at line 94 of file execnodes.h.

◆ FIELDNO_AGGSTATE_ALL_PERGROUPS

#define FIELDNO_AGGSTATE_ALL_PERGROUPS   54

Definition at line 2501 of file execnodes.h.

◆ FIELDNO_AGGSTATE_CURAGGCONTEXT

#define FIELDNO_AGGSTATE_CURAGGCONTEXT   14

Definition at line 2446 of file execnodes.h.

◆ FIELDNO_AGGSTATE_CURPERTRANS

#define FIELDNO_AGGSTATE_CURPERTRANS   16

Definition at line 2449 of file execnodes.h.

◆ FIELDNO_AGGSTATE_CURRENT_SET

#define FIELDNO_AGGSTATE_CURRENT_SET   20

Definition at line 2454 of file execnodes.h.

◆ FIELDNO_EXPRCONTEXT_AGGNULLS

#define FIELDNO_EXPRCONTEXT_AGGNULLS   9

Definition at line 307 of file execnodes.h.

◆ FIELDNO_EXPRCONTEXT_AGGVALUES

#define FIELDNO_EXPRCONTEXT_AGGVALUES   8

Definition at line 305 of file execnodes.h.

◆ FIELDNO_EXPRCONTEXT_CASEDATUM

#define FIELDNO_EXPRCONTEXT_CASEDATUM   10

Definition at line 311 of file execnodes.h.

◆ FIELDNO_EXPRCONTEXT_CASENULL

#define FIELDNO_EXPRCONTEXT_CASENULL   11

Definition at line 313 of file execnodes.h.

◆ FIELDNO_EXPRCONTEXT_DOMAINDATUM

#define FIELDNO_EXPRCONTEXT_DOMAINDATUM   12

Definition at line 317 of file execnodes.h.

◆ FIELDNO_EXPRCONTEXT_DOMAINNULL

#define FIELDNO_EXPRCONTEXT_DOMAINNULL   13

Definition at line 319 of file execnodes.h.

◆ FIELDNO_EXPRCONTEXT_INNERTUPLE

#define FIELDNO_EXPRCONTEXT_INNERTUPLE   2

Definition at line 288 of file execnodes.h.

◆ FIELDNO_EXPRCONTEXT_NEWTUPLE

#define FIELDNO_EXPRCONTEXT_NEWTUPLE   15

Definition at line 325 of file execnodes.h.

◆ FIELDNO_EXPRCONTEXT_OLDTUPLE

#define FIELDNO_EXPRCONTEXT_OLDTUPLE   14

Definition at line 323 of file execnodes.h.

◆ FIELDNO_EXPRCONTEXT_OUTERTUPLE

#define FIELDNO_EXPRCONTEXT_OUTERTUPLE   3

Definition at line 290 of file execnodes.h.

◆ FIELDNO_EXPRCONTEXT_SCANTUPLE

#define FIELDNO_EXPRCONTEXT_SCANTUPLE   1

Definition at line 286 of file execnodes.h.

◆ FIELDNO_EXPRSTATE_FLAGS

#define FIELDNO_EXPRSTATE_FLAGS   1

Definition at line 102 of file execnodes.h.

◆ FIELDNO_EXPRSTATE_PARENT

#define FIELDNO_EXPRSTATE_PARENT   11

Definition at line 145 of file execnodes.h.

◆ FIELDNO_EXPRSTATE_RESNULL

#define FIELDNO_EXPRSTATE_RESNULL   2

Definition at line 109 of file execnodes.h.

◆ FIELDNO_EXPRSTATE_RESULTSLOT

#define FIELDNO_EXPRSTATE_RESULTSLOT   4

Definition at line 117 of file execnodes.h.

◆ FIELDNO_EXPRSTATE_RESVALUE

#define FIELDNO_EXPRSTATE_RESVALUE   3

Definition at line 111 of file execnodes.h.

◆ InitTupleHashIterator

#define InitTupleHashIterator (   htable,
  iter 
)     tuplehash_start_iterate(htable->hashtab, iter)

Definition at line 930 of file execnodes.h.

957{
959 WindowFunc *wfunc; /* expression plan node */
960 List *args; /* ExprStates for argument expressions */
961 ExprState *aggfilter; /* FILTER expression */
962 int wfuncno; /* ID number for wfunc within its plan node */
964
965
966/* ----------------
967 * SetExprState node
968 *
969 * State for evaluating a potentially set-returning expression (like FuncExpr
970 * or OpExpr). In some cases, like some of the expressions in ROWS FROM(...)
971 * the expression might not be a SRF, but nonetheless it uses the same
972 * machinery as SRFs; it will be treated as a SRF returning a single row.
973 * ----------------
974 */
975typedef struct SetExprState
976{
978 Expr *expr; /* expression plan node */
979 List *args; /* ExprStates for argument expressions */
980
981 /*
982 * In ROWS FROM, functions can be inlined, removing the FuncExpr normally
983 * inside. In such a case this is the compiled expression (which cannot
984 * return a set), which'll be evaluated using regular ExecEvalExpr().
985 */
987
988 /*
989 * Function manager's lookup info for the target function. If func.fn_oid
990 * is InvalidOid, we haven't initialized it yet (nor any of the following
991 * fields, except funcReturnsSet).
992 */
994
995 /*
996 * For a set-returning function (SRF) that returns a tuplestore, we keep
997 * the tuplestore here and dole out the result rows one at a time. The
998 * slot holds the row currently being returned.
999 */
1002
1003 /*
1004 * In some cases we need to compute a tuple descriptor for the function's
1005 * output. If so, it's stored here.
1006 */
1008 bool funcReturnsTuple; /* valid when funcResultDesc isn't NULL */
1009
1010 /*
1011 * Remember whether the function is declared to return a set. This is set
1012 * by ExecInitExpr, and is valid even before the FmgrInfo is set up.
1013 */
1014 bool funcReturnsSet;
1015
1016 /*
1017 * setArgsValid is true when we are evaluating a set-returning function
1018 * that uses value-per-call mode and we are in the middle of a call
1019 * series; we want to pass the same argument values to the function again
1020 * (and again, until it returns ExprEndResult). This indicates that
1021 * fcinfo_data already contains valid argument data.
1022 */
1023 bool setArgsValid;
1024
1025 /*
1026 * Flag to remember whether we have registered a shutdown callback for
1027 * this SetExprState. We do so only if funcResultStore or setArgsValid
1028 * has been set at least once (since all the callback is for is to release
1029 * the tuplestore or clear setArgsValid).
1030 */
1031 bool shutdown_reg; /* a shutdown callback is registered */
1032
1033 /*
1034 * Call parameter structure for the function. This has been initialized
1035 * (by InitFunctionCallInfoData) if func.fn_oid is valid. It also saves
1036 * argument values between calls, when setArgsValid is true.
1037 */
1039} SetExprState;
1040
1041/* ----------------
1042 * SubPlanState node
1043 * ----------------
1044 */
1045typedef struct SubPlanState
1046{
1047 NodeTag type;
1048 SubPlan *subplan; /* expression plan node */
1049 PlanState *planstate; /* subselect plan's state tree */
1050 PlanState *parent; /* parent plan node's state tree */
1051 ExprState *testexpr; /* state of combining expression */
1052 HeapTuple curTuple; /* copy of most recent tuple from subplan */
1053 Datum curArray; /* most recent array from ARRAY() subplan */
1054 /* these are used when hashing the subselect's output: */
1055 TupleDesc descRight; /* subselect desc after projection */
1056 ProjectionInfo *projLeft; /* for projecting lefthand exprs */
1057 ProjectionInfo *projRight; /* for projecting subselect output */
1058 TupleHashTable hashtable; /* hash table for no-nulls subselect rows */
1059 TupleHashTable hashnulls; /* hash table for rows with null(s) */
1060 bool havehashrows; /* true if hashtable is not empty */
1061 bool havenullrows; /* true if hashnulls is not empty */
1062 MemoryContext tuplesContext; /* context containing hash tables' tuples */
1063 ExprContext *innerecontext; /* econtext for computing inner tuples */
1064 int numCols; /* number of columns being hashed */
1065 /* each of the remaining fields is an array of length numCols: */
1066 AttrNumber *keyColIdx; /* control data for hash tables */
1067 Oid *tab_eq_funcoids; /* equality func oids for table
1068 * datatype(s) */
1069 Oid *tab_collations; /* collations for hash and comparison */
1070 FmgrInfo *tab_hash_funcs; /* hash functions for table datatype(s) */
1071 ExprState *lhs_hash_expr; /* hash expr for lefthand datatype(s) */
1072 FmgrInfo *cur_eq_funcs; /* equality functions for LHS vs. table */
1073 ExprState *cur_eq_comp; /* equality comparator for LHS vs. table */
1074} SubPlanState;
1075
1076/*
1077 * DomainConstraintState - one item to check during CoerceToDomain
1078 *
1079 * Note: we consider this to be part of an ExprState tree, so we give it
1080 * a name following the xxxState convention. But there's no directly
1081 * associated plan-tree node.
1082 */
1083typedef enum DomainConstraintType
1084{
1088
1089typedef struct DomainConstraintState
1090{
1091 NodeTag type;
1092 DomainConstraintType constrainttype; /* constraint type */
1093 char *name; /* name of constraint (for error msgs) */
1094 Expr *check_expr; /* for CHECK, a boolean expression */
1095 ExprState *check_exprstate; /* check_expr's eval state, or NULL */
1097
1098/*
1099 * State for JsonExpr evaluation, too big to inline.
1100 *
1101 * This contains the information going into and coming out of the
1102 * EEOP_JSONEXPR_PATH eval step.
1103 */
1104typedef struct JsonExprState
1105{
1106 /* original expression node */
1108
1109 /* value/isnull for formatted_expr */
1111
1112 /* value/isnull for pathspec */
1114
1115 /* JsonPathVariable entries for passing_values */
1116 List *args;
1117
1118 /*
1119 * Output variables that drive the EEOP_JUMP_IF_NOT_TRUE steps that are
1120 * added for ON ERROR and ON EMPTY expressions, if any.
1121 *
1122 * Reset for each evaluation of EEOP_JSONEXPR_PATH.
1123 */
1124
1125 /* Set to true if jsonpath evaluation cause an error. */
1127
1128 /* Set to true if the jsonpath evaluation returned 0 items. */
1130
1131 /*
1132 * Addresses of steps that implement the non-ERROR variant of ON EMPTY and
1133 * ON ERROR behaviors, respectively.
1134 */
1135 int jump_empty;
1136 int jump_error;
1137
1138 /*
1139 * Address of the step to coerce the result value of jsonpath evaluation
1140 * to the RETURNING type. -1 if no coercion if JsonExpr.use_io_coercion
1141 * is true.
1142 */
1144
1145 /*
1146 * Address to jump to when skipping all the steps after performing
1147 * ExecEvalJsonExprPath() so as to return whatever the JsonPath* function
1148 * returned as is, that is, in the cases where there's no error and no
1149 * coercion is necessary.
1150 */
1151 int jump_end;
1152
1153 /*
1154 * RETURNING type input function invocation info when
1155 * JsonExpr.use_io_coercion is true.
1156 */
1158
1159 /*
1160 * For error-safe evaluation of coercions. When the ON ERROR behavior is
1161 * not ERROR, a pointer to this is passed to ExecInitExprRec() when
1162 * initializing the coercion expressions or to ExecInitJsonCoercion().
1163 *
1164 * Reset for each evaluation of EEOP_JSONEXPR_PATH.
1165 */
1168
1169
1170/* ----------------------------------------------------------------
1171 * Executor State Trees
1172 *
1173 * An executing query has a PlanState tree paralleling the Plan tree
1174 * that describes the plan.
1175 * ----------------------------------------------------------------
1176 */
1177
1178/* ----------------
1179 * ExecProcNodeMtd
1180 *
1181 * This is the method called by ExecProcNode to return the next tuple
1182 * from an executor node. It returns NULL, or an empty TupleTableSlot,
1183 * if no more tuples are available.
1184 * ----------------
1185 */
1186typedef TupleTableSlot *(*ExecProcNodeMtd) (PlanState *pstate);
1187
1188/* ----------------
1189 * PlanState node
1190 *
1191 * We never actually instantiate any PlanState nodes; this is just the common
1192 * abstract superclass for all PlanState-type nodes.
1193 * ----------------
1194 */
1195typedef struct PlanState
1196{
1197 pg_node_attr(abstract)
1198
1199 NodeTag type;
1200
1201 Plan *plan; /* associated Plan node */
1202
1203 EState *state; /* at execution time, states of individual
1204 * nodes point to one EState for the whole
1205 * top-level plan */
1206
1207 ExecProcNodeMtd ExecProcNode; /* function to return next tuple */
1208 ExecProcNodeMtd ExecProcNodeReal; /* actual function, if above is a
1209 * wrapper */
1210
1211 NodeInstrumentation *instrument; /* Optional runtime stats for this
1212 * node */
1214 * instrumentation */
1215
1216 /* Per-worker JIT instrumentation */
1218
1219 /*
1220 * Common structural data for all Plan types. These links to subsidiary
1221 * state trees parallel links in the associated plan tree (except for the
1222 * subPlan list, which does not exist in the plan tree).
1223 */
1224 ExprState *qual; /* boolean qual condition */
1225 PlanState *lefttree; /* input plan tree(s) */
1227
1228 List *initPlan; /* Init SubPlanState nodes (un-correlated expr
1229 * subselects) */
1230 List *subPlan; /* SubPlanState nodes in my expressions */
1231
1232 /*
1233 * State for management of parameter-change-driven rescanning
1234 */
1235 Bitmapset *chgParam; /* set of IDs of changed Params */
1236
1237 /*
1238 * Other run-time state needed by most if not all node types.
1239 */
1240 TupleDesc ps_ResultTupleDesc; /* node's return type */
1241 TupleTableSlot *ps_ResultTupleSlot; /* slot for my result tuples */
1242 ExprContext *ps_ExprContext; /* node's expression-evaluation context */
1243 ProjectionInfo *ps_ProjInfo; /* info for doing tuple projection */
1244
1245 bool async_capable; /* true if node is async-capable */
1246
1247 /*
1248 * Scanslot's descriptor if known. This is a bit of a hack, but otherwise
1249 * it's hard for expression compilation to optimize based on the
1250 * descriptor, without encoding knowledge about all executor nodes.
1251 */
1253
1254 /*
1255 * Define the slot types for inner, outer and scanslots for expression
1256 * contexts with this state as a parent. If *opsset is set, then
1257 * *opsfixed indicates whether *ops is guaranteed to be the type of slot
1258 * used. That means that every slot in the corresponding
1259 * ExprContext.ecxt_*tuple will point to a slot of that type, while
1260 * evaluating the expression. If *opsfixed is false, but *ops is set,
1261 * that indicates the most likely type of slot.
1262 *
1263 * The scan* fields are set by ExecInitScanTupleSlot(). If that's not
1264 * called, nodes can initialize the fields themselves.
1265 *
1266 * If outer/inneropsset is false, the information is inferred on-demand
1267 * using ExecGetResultSlotOps() on ->righttree/lefttree, using the
1268 * corresponding node's resultops* fields.
1269 *
1270 * The result* fields are automatically set when ExecInitResultSlot is
1271 * used (be it directly or when the slot is created by
1272 * ExecAssignScanProjectionInfo() /
1273 * ExecConditionalAssignProjectionInfo()). If no projection is necessary
1274 * ExecConditionalAssignProjectionInfo() defaults those fields to the scan
1275 * operations.
1276 */
1281 bool scanopsfixed;
1282 bool outeropsfixed;
1283 bool inneropsfixed;
1284 bool resultopsfixed;
1285 bool scanopsset;
1286 bool outeropsset;
1287 bool inneropsset;
1288 bool resultopsset;
1289} PlanState;
1290
1291/* ----------------
1292 * these are defined to avoid confusion problems with "left"
1293 * and "right" and "inner" and "outer". The convention is that
1294 * the "left" plan is the "outer" plan and the "right" plan is
1295 * the inner plan, but these make the code more readable.
1296 * ----------------
1297 */
1298#define innerPlanState(node) (((PlanState *)(node))->righttree)
1299#define outerPlanState(node) (((PlanState *)(node))->lefttree)
1300
1301/* Macros for inline access to certain instrumentation counters */
1302#define InstrCountTuples2(node, delta) \
1303 do { \
1304 if (((PlanState *)(node))->instrument) \
1305 ((PlanState *)(node))->instrument->ntuples2 += (delta); \
1306 } while (0)
1307#define InstrCountFiltered1(node, delta) \
1308 do { \
1309 if (((PlanState *)(node))->instrument) \
1310 ((PlanState *)(node))->instrument->nfiltered1 += (delta); \
1311 } while(0)
1312#define InstrCountFiltered2(node, delta) \
1313 do { \
1314 if (((PlanState *)(node))->instrument) \
1315 ((PlanState *)(node))->instrument->nfiltered2 += (delta); \
1316 } while(0)
1317
1318/*
1319 * EPQState is state for executing an EvalPlanQual recheck on a candidate
1320 * tuples e.g. in ModifyTable or LockRows.
1321 *
1322 * To execute EPQ a separate EState is created (stored in ->recheckestate),
1323 * which shares some resources, like the rangetable, with the main query's
1324 * EState (stored in ->parentestate). The (sub-)tree of the plan that needs to
1325 * be rechecked (in ->plan), is separately initialized (into
1326 * ->recheckplanstate), but shares plan nodes with the corresponding nodes in
1327 * the main query. The scan nodes in that separate executor tree are changed
1328 * to return only the current tuple of interest for the respective
1329 * table. Those tuples are either provided by the caller (using
1330 * EvalPlanQualSlot), and/or found using the rowmark mechanism (non-locking
1331 * rowmarks by the EPQ machinery itself, locking ones by the caller).
1332 *
1333 * While the plan to be checked may be changed using EvalPlanQualSetPlan(),
1334 * all such plans need to share the same EState.
1335 */
1336typedef struct EPQState
1337{
1338 /* These are initialized by EvalPlanQualInit() and do not change later: */
1339 EState *parentestate; /* main query's EState */
1340 int epqParam; /* ID of Param to force scan node re-eval */
1341 List *resultRelations; /* integer list of RT indexes, or NIL */
1342
1343 /*
1344 * relsubs_slot[scanrelid - 1] holds the EPQ test tuple to be returned by
1345 * the scan node for the scanrelid'th RT index, in place of performing an
1346 * actual table scan. Callers should use EvalPlanQualSlot() to fetch
1347 * these slots.
1348 */
1349 List *tuple_table; /* tuple table for relsubs_slot */
1350 TupleTableSlot **relsubs_slot;
1351
1352 /*
1353 * Initialized by EvalPlanQualInit(), may be changed later with
1354 * EvalPlanQualSetPlan():
1355 */
1356
1357 Plan *plan; /* plan tree to be executed */
1358 List *arowMarks; /* ExecAuxRowMarks (non-locking only) */
1359
1360
1361 /*
1362 * The original output tuple to be rechecked. Set by
1363 * EvalPlanQualSetSlot(), before EvalPlanQualNext() or EvalPlanQual() may
1364 * be called.
1365 */
1366 TupleTableSlot *origslot;
1367
1368
1369 /* Initialized or reset by EvalPlanQualBegin(): */
1370
1371 EState *recheckestate; /* EState for EPQ execution, see above */
1372
1373 /*
1374 * Rowmarks that can be fetched on-demand using
1375 * EvalPlanQualFetchRowMark(), indexed by scanrelid - 1. Only non-locking
1376 * rowmarks.
1377 */
1378 ExecAuxRowMark **relsubs_rowmark;
1379
1380 /*
1381 * relsubs_done[scanrelid - 1] is true if there is no EPQ tuple for this
1382 * target relation or it has already been fetched in the current scan of
1383 * this target relation within the current EvalPlanQual test.
1384 */
1385 bool *relsubs_done;
1386
1387 /*
1388 * relsubs_blocked[scanrelid - 1] is true if there is no EPQ tuple for
1389 * this target relation during the current EvalPlanQual test. We keep
1390 * these flags set for all relids listed in resultRelations, but
1391 * transiently clear the one for the relation whose tuple is actually
1392 * passed to EvalPlanQual().
1393 */
1394 bool *relsubs_blocked;
1395
1396 PlanState *recheckplanstate; /* EPQ specific exec nodes, for ->plan */
1397} EPQState;
1398
1399
1400/* ----------------
1401 * ResultState information
1402 * ----------------
1403 */
1404typedef struct ResultState
1405{
1406 PlanState ps; /* its first field is NodeTag */
1407 ExprState *resconstantqual;
1408 bool rs_done; /* are we done? */
1409 bool rs_checkqual; /* do we need to check the qual? */
1410} ResultState;
1411
1412/* ----------------
1413 * ProjectSetState information
1414 *
1415 * Note: at least one of the "elems" will be a SetExprState; the rest are
1416 * regular ExprStates.
1417 * ----------------
1418 */
1419typedef struct ProjectSetState
1420{
1421 PlanState ps; /* its first field is NodeTag */
1422 Node **elems; /* array of expression states */
1423 ExprDoneCond *elemdone; /* array of per-SRF is-done states */
1424 int nelems; /* length of elemdone[] array */
1425 bool pending_srf_tuples; /* still evaluating srfs in tlist? */
1426 MemoryContext argcontext; /* context for SRF arguments */
1428
1429
1430/* flags for mt_merge_subcommands */
1431#define MERGE_INSERT 0x01
1432#define MERGE_UPDATE 0x02
1433#define MERGE_DELETE 0x04
1434
1435/* ----------------
1436 * ModifyTableState information
1437 * ----------------
1438 */
1439typedef struct ModifyTableState
1440{
1441 PlanState ps; /* its first field is NodeTag */
1442 CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */
1443 bool canSetTag; /* do we set the command tag/es_processed? */
1444 bool mt_done; /* are we done? */
1445 int mt_nrels; /* number of entries in resultRelInfo[] */
1446 ResultRelInfo *resultRelInfo; /* info about target relation(s) */
1447
1448 /*
1449 * Target relation mentioned in the original statement, used to fire
1450 * statement-level triggers and as the root for tuple routing. (This
1451 * might point to one of the resultRelInfo[] entries, but it can also be a
1452 * distinct struct.)
1453 */
1454 ResultRelInfo *rootResultRelInfo;
1455
1456 EPQState mt_epqstate; /* for evaluating EvalPlanQual rechecks */
1457 bool fireBSTriggers; /* do we need to fire stmt triggers? */
1458
1459 /*
1460 * These fields are used for inherited UPDATE and DELETE, to track which
1461 * target relation a given tuple is from. If there are a lot of target
1462 * relations, we use a hash table to translate table OIDs to
1463 * resultRelInfo[] indexes; otherwise mt_resultOidHash is NULL.
1464 */
1465 int mt_resultOidAttno; /* resno of "tableoid" junk attr */
1466 Oid mt_lastResultOid; /* last-seen value of tableoid */
1467 int mt_lastResultIndex; /* corresponding index in resultRelInfo[] */
1468 HTAB *mt_resultOidHash; /* optional hash table to speed lookups */
1469
1470 /*
1471 * Slot for storing tuples in the root partitioned table's rowtype during
1472 * an UPDATE of a partitioned table.
1473 */
1474 TupleTableSlot *mt_root_tuple_slot;
1475
1476 /* Tuple-routing support info */
1477 struct PartitionTupleRouting *mt_partition_tuple_routing;
1478
1479 /* controls transition table population for specified operation */
1480 struct TransitionCaptureState *mt_transition_capture;
1481
1482 /* controls transition table population for INSERT...ON CONFLICT UPDATE */
1483 struct TransitionCaptureState *mt_oc_transition_capture;
1484
1485 /* Flags showing which subcommands are present INS/UPD/DEL/DO NOTHING */
1486 int mt_merge_subcommands;
1487
1488 /* For MERGE, the action currently being executed */
1489 MergeActionState *mt_merge_action;
1490
1491 /*
1492 * For MERGE, if there is a pending NOT MATCHED [BY TARGET] action to be
1493 * performed, this will be the last tuple read from the subplan; otherwise
1494 * it will be NULL --- see the comments in ExecMerge().
1495 */
1496 TupleTableSlot *mt_merge_pending_not_matched;
1497
1498 /* tuple counters for MERGE */
1499 double mt_merge_inserted;
1500 double mt_merge_updated;
1501 double mt_merge_deleted;
1502
1503 /*
1504 * Lists of valid updateColnosLists, mergeActionLists, and
1505 * mergeJoinConditions. These contain only entries for unpruned
1506 * relations, filtered from the corresponding lists in ModifyTable.
1507 */
1508 List *mt_updateColnosLists;
1509 List *mt_mergeActionLists;
1510 List *mt_mergeJoinConditions;
1512
1513/* ----------------
1514 * AppendState information
1515 *
1516 * nplans how many plans are in the array
1517 * whichplan which synchronous plan is being executed (0 .. n-1)
1518 * or a special negative value. See nodeAppend.c.
1519 * prune_state details required to allow partitions to be
1520 * eliminated from the scan, or NULL if not possible.
1521 * valid_subplans for runtime pruning, valid synchronous appendplans
1522 * indexes to scan.
1523 * ----------------
1524 */
1525
1526struct AppendState;
1527typedef struct AppendState AppendState;
1528struct ParallelAppendState;
1530struct PartitionPruneState;
1531
1532struct AppendState
1533{
1534 PlanState ps; /* its first field is NodeTag */
1535 PlanState **appendplans; /* array of PlanStates for my inputs */
1536 int as_nplans;
1537 int as_whichplan;
1538 bool as_begun; /* false means need to initialize */
1539 Bitmapset *as_asyncplans; /* asynchronous plans indexes */
1540 int as_nasyncplans; /* # of asynchronous plans */
1541 AsyncRequest **as_asyncrequests; /* array of AsyncRequests */
1542 TupleTableSlot **as_asyncresults; /* unreturned results of async plans */
1543 int as_nasyncresults; /* # of valid entries in as_asyncresults */
1544 bool as_syncdone; /* true if all synchronous plans done in
1545 * asynchronous mode, else false */
1546 int as_nasyncremain; /* # of remaining asynchronous plans */
1547 Bitmapset *as_needrequest; /* asynchronous plans needing a new request */
1548 struct WaitEventSet *as_eventset; /* WaitEventSet used to configure file
1549 * descriptor wait events */
1550 int as_first_partial_plan; /* Index of 'appendplans' containing
1551 * the first partial plan */
1552 ParallelAppendState *as_pstate; /* parallel coordination info */
1553 Size pstate_len; /* size of parallel coordination info */
1554 struct PartitionPruneState *as_prune_state;
1555 bool as_valid_subplans_identified; /* is as_valid_subplans valid? */
1556 Bitmapset *as_valid_subplans;
1557 Bitmapset *as_valid_asyncplans; /* valid asynchronous plans indexes */
1558 bool (*choose_next_subplan) (AppendState *);
1559};
1560
1561/* ----------------
1562 * MergeAppendState information
1563 *
1564 * nplans how many plans are in the array
1565 * nkeys number of sort key columns
1566 * sortkeys sort keys in SortSupport representation
1567 * slots current output tuple of each subplan
1568 * heap heap of active tuples
1569 * initialized true if we have fetched first tuple from each subplan
1570 * prune_state details required to allow partitions to be
1571 * eliminated from the scan, or NULL if not possible.
1572 * valid_subplans for runtime pruning, valid mergeplans indexes to
1573 * scan.
1574 * ----------------
1575 */
1576typedef struct MergeAppendState
1577{
1578 PlanState ps; /* its first field is NodeTag */
1579 PlanState **mergeplans; /* array of PlanStates for my inputs */
1580 int ms_nplans;
1581 int ms_nkeys;
1582 SortSupport ms_sortkeys; /* array of length ms_nkeys */
1583 TupleTableSlot **ms_slots; /* array of length ms_nplans */
1584 struct binaryheap *ms_heap; /* binary heap of slot indices */
1585 bool ms_initialized; /* are subplans started? */
1586 struct PartitionPruneState *ms_prune_state;
1587 Bitmapset *ms_valid_subplans;
1589
1590/* ----------------
1591 * RecursiveUnionState information
1592 *
1593 * RecursiveUnionState is used for performing a recursive union.
1594 *
1595 * recursing T when we're done scanning the non-recursive term
1596 * intermediate_empty T if intermediate_table is currently empty
1597 * working_table working table (to be scanned by recursive term)
1598 * intermediate_table current recursive output (next generation of WT)
1599 * ----------------
1600 */
1601typedef struct RecursiveUnionState
1602{
1603 PlanState ps; /* its first field is NodeTag */
1604 bool recursing;
1605 bool intermediate_empty;
1606 Tuplestorestate *working_table;
1607 Tuplestorestate *intermediate_table;
1608 /* Remaining fields are unused in UNION ALL case */
1609 Oid *eqfuncoids; /* per-grouping-field equality fns */
1610 FmgrInfo *hashfunctions; /* per-grouping-field hash fns */
1611 MemoryContext tempContext; /* short-term context for comparisons */
1612 TupleHashTable hashtable; /* hash table for tuples already seen */
1613 MemoryContext tuplesContext; /* context containing hash table's tuples */
1615
1616/* ----------------
1617 * BitmapAndState information
1618 * ----------------
1619 */
1620typedef struct BitmapAndState
1621{
1622 PlanState ps; /* its first field is NodeTag */
1623 PlanState **bitmapplans; /* array of PlanStates for my inputs */
1624 int nplans; /* number of input plans */
1626
1627/* ----------------
1628 * BitmapOrState information
1629 * ----------------
1630 */
1631typedef struct BitmapOrState
1632{
1633 PlanState ps; /* its first field is NodeTag */
1634 PlanState **bitmapplans; /* array of PlanStates for my inputs */
1635 int nplans; /* number of input plans */
1637
1638/* ----------------------------------------------------------------
1639 * Scan State Information
1640 * ----------------------------------------------------------------
1641 */
1642
1643/* ----------------
1644 * ScanState information
1645 *
1646 * ScanState extends PlanState for node types that represent
1647 * scans of an underlying relation. It can also be used for nodes
1648 * that scan the output of an underlying plan node --- in that case,
1649 * only ScanTupleSlot is actually useful, and it refers to the tuple
1650 * retrieved from the subplan.
1651 *
1652 * currentRelation relation being scanned (NULL if none)
1653 * currentScanDesc current scan descriptor for scan (NULL if none)
1654 * ScanTupleSlot pointer to slot in tuple table holding scan tuple
1655 * ----------------
1656 */
1657typedef struct ScanState
1658{
1659 PlanState ps; /* its first field is NodeTag */
1660 Relation ss_currentRelation;
1661 struct TableScanDescData *ss_currentScanDesc;
1662 TupleTableSlot *ss_ScanTupleSlot;
1663} ScanState;
1664
1665/* ----------------
1666 * SeqScanState information
1667 * ----------------
1668 */
1669typedef struct SeqScanState
1670{
1671 ScanState ss; /* its first field is NodeTag */
1672 Size pscan_len; /* size of parallel heap scan descriptor */
1673 struct SharedSeqScanInstrumentation *sinstrument;
1674} SeqScanState;
1675
1676/* ----------------
1677 * SampleScanState information
1678 * ----------------
1679 */
1680typedef struct SampleScanState
1681{
1682 ScanState ss;
1683 List *args; /* expr states for TABLESAMPLE params */
1684 ExprState *repeatable; /* expr state for REPEATABLE expr */
1685 /* use struct pointer to avoid including tsmapi.h here */
1686 struct TsmRoutine *tsmroutine; /* descriptor for tablesample method */
1687 void *tsm_state; /* tablesample method can keep state here */
1688 bool use_bulkread; /* use bulkread buffer access strategy? */
1689 bool use_pagemode; /* use page-at-a-time visibility checking? */
1690 bool begun; /* false means need to call BeginSampleScan */
1691 uint32 seed; /* random seed */
1692 int64 donetuples; /* number of tuples already returned */
1693 bool haveblock; /* has a block for sampling been determined */
1694 bool done; /* exhausted all tuples? */
1696
1697/*
1698 * These structs store information about index quals that don't have simple
1699 * constant right-hand sides. See comments for ExecIndexBuildScanKeys()
1700 * for discussion.
1701 */
1702typedef struct
1703{
1704 ScanKeyData *scan_key; /* scankey to put value into */
1705 ExprState *key_expr; /* expr to evaluate to get value */
1706 bool key_toastable; /* is expr's result a toastable datatype? */
1708
1709typedef struct
1710{
1711 ScanKeyData *scan_key; /* scankey to put value into */
1712 ExprState *array_expr; /* expr to evaluate to get array value */
1713 int next_elem; /* next array element to use */
1714 int num_elems; /* number of elems in current array value */
1715 Datum *elem_values; /* array of num_elems Datums */
1716 bool *elem_nulls; /* array of num_elems is-null flags */
1718
1719/* ----------------
1720 * IndexScanState information
1721 *
1722 * indexqualorig execution state for indexqualorig expressions
1723 * indexorderbyorig execution state for indexorderbyorig expressions
1724 * ScanKeys Skey structures for index quals
1725 * NumScanKeys number of ScanKeys
1726 * OrderByKeys Skey structures for index ordering operators
1727 * NumOrderByKeys number of OrderByKeys
1728 * RuntimeKeys info about Skeys that must be evaluated at runtime
1729 * NumRuntimeKeys number of RuntimeKeys
1730 * RuntimeKeysReady true if runtime Skeys have been computed
1731 * RuntimeContext expr context for evaling runtime Skeys
1732 * RelationDesc index relation descriptor
1733 * ScanDesc index scan descriptor
1734 * Instrument local index scan instrumentation
1735 * SharedInfo parallel worker instrumentation (no leader entry)
1736 *
1737 * ReorderQueue tuples that need reordering due to re-check
1738 * ReachedEnd have we fetched all tuples from index already?
1739 * OrderByValues values of ORDER BY exprs of last fetched tuple
1740 * OrderByNulls null flags for OrderByValues
1741 * SortSupport for reordering ORDER BY exprs
1742 * OrderByTypByVals is the datatype of order by expression pass-by-value?
1743 * OrderByTypLens typlens of the datatypes of order by expressions
1744 * PscanLen size of parallel index scan descriptor
1745 * ----------------
1746 */
1747typedef struct IndexScanState
1748{
1749 ScanState ss; /* its first field is NodeTag */
1750 ExprState *indexqualorig;
1751 List *indexorderbyorig;
1752 ScanKeyData *iss_ScanKeys;
1753 int iss_NumScanKeys;
1754 ScanKeyData *iss_OrderByKeys;
1755 int iss_NumOrderByKeys;
1756 IndexRuntimeKeyInfo *iss_RuntimeKeys;
1757 int iss_NumRuntimeKeys;
1758 bool iss_RuntimeKeysReady;
1759 ExprContext *iss_RuntimeContext;
1760 Relation iss_RelationDesc;
1761 struct IndexScanDescData *iss_ScanDesc;
1762 IndexScanInstrumentation *iss_Instrument;
1763 SharedIndexScanInstrumentation *iss_SharedInfo;
1764
1765 /* These are needed for re-checking ORDER BY expr ordering */
1766 pairingheap *iss_ReorderQueue;
1767 bool iss_ReachedEnd;
1768 Datum *iss_OrderByValues;
1769 bool *iss_OrderByNulls;
1770 SortSupport iss_SortSupport;
1771 bool *iss_OrderByTypByVals;
1772 int16 *iss_OrderByTypLens;
1773 Size iss_PscanLen;
1775
1776/* ----------------
1777 * IndexOnlyScanState information
1778 *
1779 * recheckqual execution state for recheckqual expressions
1780 * ScanKeys Skey structures for index quals
1781 * NumScanKeys number of ScanKeys
1782 * OrderByKeys Skey structures for index ordering operators
1783 * NumOrderByKeys number of OrderByKeys
1784 * RuntimeKeys info about Skeys that must be evaluated at runtime
1785 * NumRuntimeKeys number of RuntimeKeys
1786 * RuntimeKeysReady true if runtime Skeys have been computed
1787 * RuntimeContext expr context for evaling runtime Skeys
1788 * RelationDesc index relation descriptor
1789 * ScanDesc index scan descriptor
1790 * Instrument local index scan instrumentation
1791 * SharedInfo parallel worker instrumentation (no leader entry)
1792 * TableSlot slot for holding tuples fetched from the table
1793 * VMBuffer buffer in use for visibility map testing, if any
1794 * PscanLen size of parallel index-only scan descriptor
1795 * NameCStringAttNums attnums of name typed columns to pad to NAMEDATALEN
1796 * NameCStringCount number of elements in the NameCStringAttNums array
1797 * ----------------
1798 */
1799typedef struct IndexOnlyScanState
1800{
1801 ScanState ss; /* its first field is NodeTag */
1802 ExprState *recheckqual;
1803 ScanKeyData *ioss_ScanKeys;
1804 int ioss_NumScanKeys;
1805 ScanKeyData *ioss_OrderByKeys;
1806 int ioss_NumOrderByKeys;
1807 IndexRuntimeKeyInfo *ioss_RuntimeKeys;
1808 int ioss_NumRuntimeKeys;
1809 bool ioss_RuntimeKeysReady;
1810 ExprContext *ioss_RuntimeContext;
1811 Relation ioss_RelationDesc;
1812 struct IndexScanDescData *ioss_ScanDesc;
1813 IndexScanInstrumentation *ioss_Instrument;
1814 SharedIndexScanInstrumentation *ioss_SharedInfo;
1815 TupleTableSlot *ioss_TableSlot;
1816 Buffer ioss_VMBuffer;
1817 Size ioss_PscanLen;
1818 AttrNumber *ioss_NameCStringAttNums;
1819 int ioss_NameCStringCount;
1821
1822/* ----------------
1823 * BitmapIndexScanState information
1824 *
1825 * result bitmap to return output into, or NULL
1826 * ScanKeys Skey structures for index quals
1827 * NumScanKeys number of ScanKeys
1828 * RuntimeKeys info about Skeys that must be evaluated at runtime
1829 * NumRuntimeKeys number of RuntimeKeys
1830 * ArrayKeys info about Skeys that come from ScalarArrayOpExprs
1831 * NumArrayKeys number of ArrayKeys
1832 * RuntimeKeysReady true if runtime Skeys have been computed
1833 * RuntimeContext expr context for evaling runtime Skeys
1834 * RelationDesc index relation descriptor
1835 * ScanDesc index scan descriptor
1836 * Instrument local index scan instrumentation
1837 * SharedInfo parallel worker instrumentation (no leader entry)
1838 * ----------------
1839 */
1840typedef struct BitmapIndexScanState
1841{
1842 ScanState ss; /* its first field is NodeTag */
1843 TIDBitmap *biss_result;
1844 ScanKeyData *biss_ScanKeys;
1845 int biss_NumScanKeys;
1846 IndexRuntimeKeyInfo *biss_RuntimeKeys;
1847 int biss_NumRuntimeKeys;
1848 IndexArrayKeyInfo *biss_ArrayKeys;
1849 int biss_NumArrayKeys;
1850 bool biss_RuntimeKeysReady;
1851 ExprContext *biss_RuntimeContext;
1852 Relation biss_RelationDesc;
1853 struct IndexScanDescData *biss_ScanDesc;
1854 IndexScanInstrumentation *biss_Instrument;
1855 SharedIndexScanInstrumentation *biss_SharedInfo;
1857
1858
1859/* ----------------
1860 * BitmapHeapScanState information
1861 *
1862 * bitmapqualorig execution state for bitmapqualorig expressions
1863 * tbm bitmap obtained from child index scan(s)
1864 * stats execution statistics
1865 * initialized is node is ready to iterate
1866 * pstate shared state for parallel bitmap scan
1867 * sinstrument statistics for parallel workers
1868 * recheck do current page's tuples need recheck
1869 * ----------------
1870 */
1871
1872/* this struct is defined in nodeBitmapHeapscan.c */
1874
1875typedef struct BitmapHeapScanState
1876{
1877 ScanState ss; /* its first field is NodeTag */
1878 ExprState *bitmapqualorig;
1879 TIDBitmap *tbm;
1881 bool initialized;
1884 bool recheck;
1886
1887/* ----------------
1888 * TidScanState information
1889 *
1890 * tidexprs list of TidExpr structs (see nodeTidscan.c)
1891 * isCurrentOf scan has a CurrentOfExpr qual
1892 * NumTids number of tids in this scan
1893 * TidPtr index of currently fetched tid
1894 * TidList evaluated item pointers (array of size NumTids)
1895 * ----------------
1896 */
1897typedef struct TidScanState
1898{
1899 ScanState ss; /* its first field is NodeTag */
1900 List *tss_tidexprs;
1901 bool tss_isCurrentOf;
1902 int tss_NumTids;
1903 int tss_TidPtr;
1904 ItemPointerData *tss_TidList;
1905} TidScanState;
1906
1907/* ----------------
1908 * TidRangeScanState information
1909 *
1910 * trss_tidexprs list of TidOpExpr structs (see nodeTidrangescan.c)
1911 * trss_mintid the lowest TID in the scan range
1912 * trss_maxtid the highest TID in the scan range
1913 * trss_inScan is a scan currently in progress?
1914 * trss_pscanlen size of parallel heap scan descriptor
1915 * ----------------
1916 */
1917typedef struct TidRangeScanState
1918{
1919 ScanState ss; /* its first field is NodeTag */
1920 List *trss_tidexprs;
1921 ItemPointerData trss_mintid;
1922 ItemPointerData trss_maxtid;
1923 bool trss_inScan;
1924 Size trss_pscanlen;
1925 struct SharedTidRangeScanInstrumentation *trss_sinstrument;
1927
1928/* ----------------
1929 * SubqueryScanState information
1930 *
1931 * SubqueryScanState is used for scanning a sub-query in the range table.
1932 * ScanTupleSlot references the current output tuple of the sub-query.
1933 * ----------------
1934 */
1935typedef struct SubqueryScanState
1936{
1937 ScanState ss; /* its first field is NodeTag */
1938 PlanState *subplan;
1940
1941/* ----------------
1942 * FunctionScanState information
1943 *
1944 * Function nodes are used to scan the results of a
1945 * function appearing in FROM (typically a function returning set).
1946 *
1947 * eflags node's capability flags
1948 * ordinality is this scan WITH ORDINALITY?
1949 * simple true if we have 1 function and no ordinality
1950 * ordinal current ordinal column value
1951 * nfuncs number of functions being executed
1952 * funcstates per-function execution states (private in
1953 * nodeFunctionscan.c)
1954 * argcontext memory context to evaluate function arguments in
1955 * ----------------
1956 */
1958
1959typedef struct FunctionScanState
1960{
1961 ScanState ss; /* its first field is NodeTag */
1962 int eflags;
1963 bool ordinality;
1964 bool simple;
1965 int64 ordinal;
1966 int nfuncs;
1967 struct FunctionScanPerFuncState *funcstates; /* array of length nfuncs */
1968 MemoryContext argcontext;
1970
1971/* ----------------
1972 * ValuesScanState information
1973 *
1974 * ValuesScan nodes are used to scan the results of a VALUES list
1975 *
1976 * rowcontext per-expression-list context
1977 * exprlists array of expression lists being evaluated
1978 * exprstatelists array of expression state lists, for SubPlans only
1979 * array_len size of above arrays
1980 * curr_idx current array index (0-based)
1981 *
1982 * Note: ss.ps.ps_ExprContext is used to evaluate any qual or projection
1983 * expressions attached to the node. We create a second ExprContext,
1984 * rowcontext, in which to build the executor expression state for each
1985 * Values sublist. Resetting this context lets us get rid of expression
1986 * state for each row, avoiding major memory leakage over a long values list.
1987 * However, that doesn't work for sublists containing SubPlans, because a
1988 * SubPlan has to be connected up to the outer plan tree to work properly.
1989 * Therefore, for only those sublists containing SubPlans, we do expression
1990 * state construction at executor start, and store those pointers in
1991 * exprstatelists[]. NULL entries in that array correspond to simple
1992 * subexpressions that are handled as described above.
1993 * ----------------
1994 */
1995typedef struct ValuesScanState
1996{
1997 ScanState ss; /* its first field is NodeTag */
1998 ExprContext *rowcontext;
1999 List **exprlists;
2000 List **exprstatelists;
2001 int array_len;
2002 int curr_idx;
2004
2005/* ----------------
2006 * TableFuncScanState node
2007 *
2008 * Used in table-expression functions like XMLTABLE.
2009 * ----------------
2010 */
2011typedef struct TableFuncScanState
2012{
2013 ScanState ss; /* its first field is NodeTag */
2014 ExprState *docexpr; /* state for document expression */
2015 ExprState *rowexpr; /* state for row-generating expression */
2016 List *colexprs; /* state for column-generating expression */
2017 List *coldefexprs; /* state for column default expressions */
2018 List *colvalexprs; /* state for column value expressions */
2019 List *passingvalexprs; /* state for PASSING argument expressions */
2020 List *ns_names; /* same as TableFunc.ns_names */
2021 List *ns_uris; /* list of states of namespace URI exprs */
2022 Bitmapset *notnulls; /* nullability flag for each output column */
2023 void *opaque; /* table builder private space */
2024 const struct TableFuncRoutine *routine; /* table builder methods */
2025 FmgrInfo *in_functions; /* input function for each column */
2026 Oid *typioparams; /* typioparam for each column */
2027 int64 ordinal; /* row number to be output next */
2028 MemoryContext perTableCxt; /* per-table context */
2029 Tuplestorestate *tupstore; /* output tuple store */
2031
2032/* ----------------
2033 * CteScanState information
2034 *
2035 * CteScan nodes are used to scan a CommonTableExpr query.
2036 *
2037 * Multiple CteScan nodes can read out from the same CTE query. We use
2038 * a tuplestore to hold rows that have been read from the CTE query but
2039 * not yet consumed by all readers.
2040 * ----------------
2041 */
2042typedef struct CteScanState
2043{
2044 ScanState ss; /* its first field is NodeTag */
2045 int eflags; /* capability flags to pass to tuplestore */
2046 int readptr; /* index of my tuplestore read pointer */
2047 PlanState *cteplanstate; /* PlanState for the CTE query itself */
2048 /* Link to the "leader" CteScanState (possibly this same node) */
2049 struct CteScanState *leader;
2050 /* The remaining fields are only valid in the "leader" CteScanState */
2051 Tuplestorestate *cte_table; /* rows already read from the CTE query */
2052 bool eof_cte; /* reached end of CTE query? */
2053} CteScanState;
2054
2055/* ----------------
2056 * NamedTuplestoreScanState information
2057 *
2058 * NamedTuplestoreScan nodes are used to scan a Tuplestore created and
2059 * named prior to execution of the query. An example is a transition
2060 * table for an AFTER trigger.
2061 *
2062 * Multiple NamedTuplestoreScan nodes can read out from the same Tuplestore.
2063 * ----------------
2064 */
2065typedef struct NamedTuplestoreScanState
2066{
2067 ScanState ss; /* its first field is NodeTag */
2068 int readptr; /* index of my tuplestore read pointer */
2069 TupleDesc tupdesc; /* format of the tuples in the tuplestore */
2070 Tuplestorestate *relation; /* the rows */
2072
2073/* ----------------
2074 * WorkTableScanState information
2075 *
2076 * WorkTableScan nodes are used to scan the work table created by
2077 * a RecursiveUnion node. We locate the RecursiveUnion node
2078 * during executor startup.
2079 * ----------------
2080 */
2081typedef struct WorkTableScanState
2082{
2083 ScanState ss; /* its first field is NodeTag */
2084 RecursiveUnionState *rustate;
2086
2087/* ----------------
2088 * ForeignScanState information
2089 *
2090 * ForeignScan nodes are used to scan foreign-data tables.
2091 * ----------------
2092 */
2093typedef struct ForeignScanState
2094{
2095 ScanState ss; /* its first field is NodeTag */
2096 ExprState *fdw_recheck_quals; /* original quals not in ss.ps.qual */
2097 Size pscan_len; /* size of parallel coordination information */
2098 ResultRelInfo *resultRelInfo; /* result rel info, if UPDATE or DELETE */
2099 /* use struct pointer to avoid including fdwapi.h here */
2100 struct FdwRoutine *fdwroutine;
2101 void *fdw_state; /* foreign-data wrapper can keep state here */
2103
2104/* ----------------
2105 * CustomScanState information
2106 *
2107 * CustomScan nodes are used to execute custom code within executor.
2108 *
2109 * Core code must avoid assuming that the CustomScanState is only as large as
2110 * the structure declared here; providers are allowed to make it the first
2111 * element in a larger structure, and typically would need to do so. The
2112 * struct is actually allocated by the CreateCustomScanState method associated
2113 * with the plan node. Any additional fields can be initialized there, or in
2114 * the BeginCustomScan method.
2115 * ----------------
2116 */
2117struct CustomExecMethods;
2118
2119typedef struct CustomScanState
2120{
2121 ScanState ss;
2122 uint32 flags; /* mask of CUSTOMPATH_* flags, see
2123 * nodes/extensible.h */
2124 List *custom_ps; /* list of child PlanState nodes, if any */
2125 Size pscan_len; /* size of parallel coordination information */
2126 const struct CustomExecMethods *methods;
2127 const struct TupleTableSlotOps *slotOps;
2129
2130/* ----------------------------------------------------------------
2131 * Join State Information
2132 * ----------------------------------------------------------------
2133 */
2134
2135/* ----------------
2136 * JoinState information
2137 *
2138 * Superclass for state nodes of join plans.
2139 * ----------------
2140 */
2141typedef struct JoinState
2142{
2143 PlanState ps;
2144 JoinType jointype;
2145 bool single_match; /* True if we should skip to next outer tuple
2146 * after finding one inner match */
2147 ExprState *joinqual; /* JOIN quals (in addition to ps.qual) */
2148} JoinState;
2149
2150/* ----------------
2151 * NestLoopState information
2152 *
2153 * NeedNewOuter true if need new outer tuple on next call
2154 * MatchedOuter true if found a join match for current outer tuple
2155 * NullInnerTupleSlot prepared null tuple for left outer joins
2156 * ----------------
2157 */
2158typedef struct NestLoopState
2159{
2160 JoinState js; /* its first field is NodeTag */
2161 bool nl_NeedNewOuter;
2162 bool nl_MatchedOuter;
2163 TupleTableSlot *nl_NullInnerTupleSlot;
2165
2166/* ----------------
2167 * MergeJoinState information
2168 *
2169 * NumClauses number of mergejoinable join clauses
2170 * Clauses info for each mergejoinable clause
2171 * JoinState current state of ExecMergeJoin state machine
2172 * SkipMarkRestore true if we may skip Mark and Restore operations
2173 * ExtraMarks true to issue extra Mark operations on inner scan
2174 * ConstFalseJoin true if we have a constant-false joinqual
2175 * FillOuter true if should emit unjoined outer tuples anyway
2176 * FillInner true if should emit unjoined inner tuples anyway
2177 * MatchedOuter true if found a join match for current outer tuple
2178 * MatchedInner true if found a join match for current inner tuple
2179 * OuterTupleSlot slot in tuple table for cur outer tuple
2180 * InnerTupleSlot slot in tuple table for cur inner tuple
2181 * MarkedTupleSlot slot in tuple table for marked tuple
2182 * NullOuterTupleSlot prepared null tuple for right outer joins
2183 * NullInnerTupleSlot prepared null tuple for left outer joins
2184 * OuterEContext workspace for computing outer tuple's join values
2185 * InnerEContext workspace for computing inner tuple's join values
2186 * ----------------
2187 */
2188/* private in nodeMergejoin.c: */
2189typedef struct MergeJoinClauseData *MergeJoinClause;
2190
2191typedef struct MergeJoinState
2192{
2193 JoinState js; /* its first field is NodeTag */
2194 int mj_NumClauses;
2195 MergeJoinClause mj_Clauses; /* array of length mj_NumClauses */
2196 int mj_JoinState;
2197 bool mj_SkipMarkRestore;
2198 bool mj_ExtraMarks;
2199 bool mj_ConstFalseJoin;
2200 bool mj_FillOuter;
2201 bool mj_FillInner;
2202 bool mj_MatchedOuter;
2203 bool mj_MatchedInner;
2204 TupleTableSlot *mj_OuterTupleSlot;
2205 TupleTableSlot *mj_InnerTupleSlot;
2206 TupleTableSlot *mj_MarkedTupleSlot;
2207 TupleTableSlot *mj_NullOuterTupleSlot;
2208 TupleTableSlot *mj_NullInnerTupleSlot;
2209 ExprContext *mj_OuterEContext;
2210 ExprContext *mj_InnerEContext;
2212
2213/* ----------------
2214 * HashJoinState information
2215 *
2216 * hashclauses original form of the hashjoin condition
2217 * hj_OuterHash ExprState for hashing outer keys
2218 * hj_HashTable hash table for the hashjoin
2219 * (NULL if table not built yet)
2220 * hj_CurHashValue hash value for current outer tuple
2221 * hj_CurBucketNo regular bucket# for current outer tuple
2222 * hj_CurSkewBucketNo skew bucket# for current outer tuple
2223 * hj_CurTuple last inner tuple matched to current outer
2224 * tuple, or NULL if starting search
2225 * (hj_CurXXX variables are undefined if
2226 * OuterTupleSlot is empty!)
2227 * hj_OuterTupleSlot tuple slot for outer tuples
2228 * hj_HashTupleSlot tuple slot for inner (hashed) tuples
2229 * hj_NullOuterTupleSlot prepared null tuple for right/right-anti/full
2230 * outer joins
2231 * hj_NullInnerTupleSlot prepared null tuple for left/full outer joins
2232 * hj_NullOuterTupleStore tuplestore holding outer tuples that have
2233 * null join keys (but must be emitted anyway)
2234 * hj_FirstOuterTupleSlot first tuple retrieved from outer plan
2235 * hj_JoinState current state of ExecHashJoin state machine
2236 * hj_KeepNullTuples true to keep outer tuples with null join keys
2237 * hj_MatchedOuter true if found a join match for current outer
2238 * hj_OuterNotEmpty true if outer relation known not empty
2239 * ----------------
2240 */
2241
2242/* these structs are defined in executor/hashjoin.h: */
2243typedef struct HashJoinTupleData *HashJoinTuple;
2244typedef struct HashJoinTableData *HashJoinTable;
2245
2246typedef struct HashJoinState
2247{
2248 JoinState js; /* its first field is NodeTag */
2249 ExprState *hashclauses;
2250 ExprState *hj_OuterHash;
2251 HashJoinTable hj_HashTable;
2252 uint32 hj_CurHashValue;
2253 int hj_CurBucketNo;
2254 int hj_CurSkewBucketNo;
2255 HashJoinTuple hj_CurTuple;
2256 TupleTableSlot *hj_OuterTupleSlot;
2257 TupleTableSlot *hj_HashTupleSlot;
2258 TupleTableSlot *hj_NullOuterTupleSlot;
2259 TupleTableSlot *hj_NullInnerTupleSlot;
2260 Tuplestorestate *hj_NullOuterTupleStore;
2261 TupleTableSlot *hj_FirstOuterTupleSlot;
2262 int hj_JoinState;
2263 bool hj_KeepNullTuples;
2264 bool hj_MatchedOuter;
2265 bool hj_OuterNotEmpty;
2267
2268
2269/* ----------------------------------------------------------------
2270 * Materialization State Information
2271 * ----------------------------------------------------------------
2272 */
2273
2274/* ----------------
2275 * MaterialState information
2276 *
2277 * materialize nodes are used to materialize the results
2278 * of a subplan into a temporary file.
2279 *
2280 * ss.ss_ScanTupleSlot refers to output of underlying plan.
2281 * ----------------
2282 */
2283typedef struct MaterialState
2284{
2285 ScanState ss; /* its first field is NodeTag */
2286 int eflags; /* capability flags to pass to tuplestore */
2287 bool eof_underlying; /* reached end of underlying plan? */
2288 Tuplestorestate *tuplestorestate;
2290
2291struct MemoizeEntry;
2292struct MemoizeTuple;
2293struct MemoizeKey;
2294
2295/* ----------------
2296 * MemoizeState information
2297 *
2298 * memoize nodes are used to cache recent and commonly seen results from
2299 * a parameterized scan.
2300 * ----------------
2301 */
2302typedef struct MemoizeState
2303{
2304 ScanState ss; /* its first field is NodeTag */
2305 int mstatus; /* value of ExecMemoize state machine */
2306 int nkeys; /* number of cache keys */
2307 struct memoize_hash *hashtable; /* hash table for cache entries */
2308 TupleDesc hashkeydesc; /* tuple descriptor for cache keys */
2309 TupleTableSlot *tableslot; /* min tuple slot for existing cache entries */
2310 TupleTableSlot *probeslot; /* virtual slot used for hash lookups */
2311 ExprState *cache_eq_expr; /* Compare exec params to hash key */
2312 ExprState **param_exprs; /* exprs containing the parameters to this
2313 * node */
2314 FmgrInfo *hashfunctions; /* lookup data for hash funcs nkeys in size */
2315 Oid *collations; /* collation for comparisons nkeys in size */
2316 uint64 mem_used; /* bytes of memory used by cache */
2317 uint64 mem_limit; /* memory limit in bytes for the cache */
2318 MemoryContext tableContext; /* memory context to store cache data */
2319 dlist_head lru_list; /* least recently used entry list */
2320 struct MemoizeTuple *last_tuple; /* Used to point to the last tuple
2321 * returned during a cache hit and the
2322 * tuple we last stored when
2323 * populating the cache. */
2324 struct MemoizeEntry *entry; /* the entry that 'last_tuple' belongs to or
2325 * NULL if 'last_tuple' is NULL. */
2326 bool singlerow; /* true if the cache entry is to be marked as
2327 * complete after caching the first tuple. */
2328 bool binary_mode; /* true when cache key should be compared bit
2329 * by bit, false when using hash equality ops */
2330 MemoizeInstrumentation stats; /* execution statistics */
2331 SharedMemoizeInfo *shared_info; /* statistics for parallel workers */
2332 Bitmapset *keyparamids; /* Param->paramids of expressions belonging to
2333 * param_exprs */
2334} MemoizeState;
2335
2336/* ----------------
2337 * When performing sorting by multiple keys, it's possible that the input
2338 * dataset is already sorted on a prefix of those keys. We call these
2339 * "presorted keys".
2340 * PresortedKeyData represents information about one such key.
2341 * ----------------
2342 */
2343typedef struct PresortedKeyData
2344{
2345 FmgrInfo flinfo; /* comparison function info */
2346 FunctionCallInfo fcinfo; /* comparison function call info */
2347 OffsetNumber attno; /* attribute number in tuple */
2349
2350/* ----------------
2351 * SortState information
2352 * ----------------
2353 */
2354typedef struct SortState
2355{
2356 ScanState ss; /* its first field is NodeTag */
2357 bool randomAccess; /* need random access to sort output? */
2358 bool bounded; /* is the result set bounded? */
2359 int64 bound; /* if bounded, how many tuples are needed */
2360 bool sort_Done; /* sort completed yet? */
2361 bool bounded_Done; /* value of bounded we did the sort with */
2362 int64 bound_Done; /* value of bound we did the sort with */
2363 void *tuplesortstate; /* private state of tuplesort.c */
2364 bool am_worker; /* are we a worker? */
2365 bool datumSort; /* Datum sort instead of tuple sort? */
2366 SharedSortInfo *shared_info; /* one entry per worker */
2367} SortState;
2368
2369typedef enum
2370{
2376
2377typedef struct IncrementalSortState
2378{
2379 ScanState ss; /* its first field is NodeTag */
2380 bool bounded; /* is the result set bounded? */
2381 int64 bound; /* if bounded, how many tuples are needed */
2382 bool outerNodeDone; /* finished fetching tuples from outer node */
2383 int64 bound_Done; /* value of bound we did the sort with */
2384 IncrementalSortExecutionStatus execution_status;
2385 int64 n_fullsort_remaining;
2386 Tuplesortstate *fullsort_state; /* private state of tuplesort.c */
2387 Tuplesortstate *prefixsort_state; /* private state of tuplesort.c */
2388 /* the keys by which the input path is already sorted */
2389 PresortedKeyData *presorted_keys;
2390
2391 IncrementalSortInfo incsort_info;
2392
2393 /* slot for pivot tuple defining values of presorted keys within group */
2394 TupleTableSlot *group_pivot;
2395 TupleTableSlot *transfer_tuple;
2396 bool am_worker; /* are we a worker? */
2397 SharedIncrementalSortInfo *shared_info; /* one entry per worker */
2399
2400/* ---------------------
2401 * GroupState information
2402 * ---------------------
2403 */
2404typedef struct GroupState
2405{
2406 ScanState ss; /* its first field is NodeTag */
2407 ExprState *eqfunction; /* equality function */
2408 bool grp_done; /* indicates completion of Group scan */
2409} GroupState;
2410
2411/* ---------------------
2412 * AggState information
2413 *
2414 * ss.ss_ScanTupleSlot refers to output of underlying plan.
2415 *
2416 * Note: ss.ps.ps_ExprContext contains ecxt_aggvalues and
2417 * ecxt_aggnulls arrays, which hold the computed agg values for the current
2418 * input group during evaluation of an Agg node's output tuple(s). We
2419 * create a second ExprContext, tmpcontext, in which to evaluate input
2420 * expressions and run the aggregate transition functions.
2421 * ---------------------
2422 */
2423/* these structs are private in nodeAgg.c: */
2424typedef struct AggStatePerAggData *AggStatePerAgg;
2428typedef struct AggStatePerHashData *AggStatePerHash;
2429
2430typedef struct AggState
2431{
2432 ScanState ss; /* its first field is NodeTag */
2433 List *aggs; /* all Aggref nodes in targetlist & quals */
2434 int numaggs; /* length of list (could be zero!) */
2435 int numtrans; /* number of pertrans items */
2436 AggStrategy aggstrategy; /* strategy mode */
2437 AggSplit aggsplit; /* agg-splitting mode, see nodes.h */
2438 AggStatePerPhase phase; /* pointer to current phase data */
2439 int numphases; /* number of phases (including phase 0) */
2440 int current_phase; /* current phase number */
2441 AggStatePerAgg peragg; /* per-Aggref information */
2442 AggStatePerTrans pertrans; /* per-Trans state information */
2443 ExprContext *hashcontext; /* econtexts for long-lived data (hashtable) */
2444 ExprContext **aggcontexts; /* econtexts for long-lived data (per GS) */
2445 ExprContext *tmpcontext; /* econtext for input expressions */
2446#define FIELDNO_AGGSTATE_CURAGGCONTEXT 14
2447 ExprContext *curaggcontext; /* currently active aggcontext */
2448 AggStatePerAgg curperagg; /* currently active aggregate, if any */
2449#define FIELDNO_AGGSTATE_CURPERTRANS 16
2450 AggStatePerTrans curpertrans; /* currently active trans state, if any */
2451 bool input_done; /* indicates end of input */
2452 bool agg_done; /* indicates completion of Agg scan */
2453 int projected_set; /* The last projected grouping set */
2454#define FIELDNO_AGGSTATE_CURRENT_SET 20
2455 int current_set; /* The current grouping set being evaluated */
2456 Bitmapset *grouped_cols; /* grouped cols in current projection */
2457 List *all_grouped_cols; /* list of all grouped cols in DESC order */
2458 Bitmapset *colnos_needed; /* all columns needed from the outer plan */
2459 int max_colno_needed; /* highest colno needed from outer plan */
2460 bool all_cols_needed; /* are all cols from outer plan needed? */
2461 /* These fields are for grouping set phase data */
2462 int maxsets; /* The max number of sets in any phase */
2463 AggStatePerPhase phases; /* array of all phases */
2464 Tuplesortstate *sort_in; /* sorted input to phases > 1 */
2465 Tuplesortstate *sort_out; /* input is copied here for next phase */
2466 TupleTableSlot *sort_slot; /* slot for sort results */
2467 /* these fields are used in AGG_PLAIN and AGG_SORTED modes: */
2468 AggStatePerGroup *pergroups; /* grouping set indexed array of per-group
2469 * pointers */
2470 HeapTuple grp_firstTuple; /* copy of first tuple of current group */
2471 /* these fields are used in AGG_HASHED and AGG_MIXED modes: */
2472 bool table_filled; /* hash table filled yet? */
2473 int num_hashes;
2474 MemoryContext hash_metacxt; /* memory for hash table bucket array */
2475 MemoryContext hash_tuplescxt; /* memory for hash table tuples */
2476 struct LogicalTapeSet *hash_tapeset; /* tape set for hash spill tapes */
2477 struct HashAggSpill *hash_spills; /* HashAggSpill for each grouping set,
2478 * exists only during first pass */
2479 TupleTableSlot *hash_spill_rslot; /* for reading spill files */
2480 TupleTableSlot *hash_spill_wslot; /* for writing spill files */
2481 List *hash_batches; /* hash batches remaining to be processed */
2482 bool hash_ever_spilled; /* ever spilled during this execution? */
2483 bool hash_spill_mode; /* we hit a limit during the current batch
2484 * and we must not create new groups */
2485 Size hash_mem_limit; /* limit before spilling hash table */
2486 uint64 hash_ngroups_limit; /* limit before spilling hash table */
2487 int hash_planned_partitions; /* number of partitions planned
2488 * for first pass */
2489 double hashentrysize; /* estimate revised during execution */
2490 Size hash_mem_peak; /* peak hash table memory usage */
2491 uint64 hash_ngroups_current; /* number of groups currently in
2492 * memory in all hash tables */
2493 uint64 hash_disk_used; /* kB of disk space used */
2494 int hash_batches_used; /* batches used during entire execution */
2495
2496 AggStatePerHash perhash; /* array of per-hashtable data */
2497 AggStatePerGroup *hash_pergroup; /* grouping set indexed array of
2498 * per-group pointers */
2499
2500 /* support for evaluation of agg input expressions: */
2501#define FIELDNO_AGGSTATE_ALL_PERGROUPS 54
2502 AggStatePerGroup *all_pergroups; /* array of first ->pergroups, than
2503 * ->hash_pergroup */
2504 SharedAggInfo *shared_info; /* one entry per worker */
2505} AggState;
2506
2507/* ----------------
2508 * WindowAggState information
2509 * ----------------
2510 */
2511/* these structs are private in nodeWindowAgg.c: */
2514
2515/*
2516 * WindowAggStatus -- Used to track the status of WindowAggState
2517 */
2518typedef enum WindowAggStatus
2519{
2520 WINDOWAGG_DONE, /* No more processing to do */
2521 WINDOWAGG_RUN, /* Normal processing of window funcs */
2522 WINDOWAGG_PASSTHROUGH, /* Don't eval window funcs */
2523 WINDOWAGG_PASSTHROUGH_STRICT, /* Pass-through plus don't store new
2524 * tuples during spool */
2526
2527typedef struct WindowAggState
2528{
2529 ScanState ss; /* its first field is NodeTag */
2530
2531 /* these fields are filled in by ExecInitExpr: */
2532 List *funcs; /* all WindowFunc nodes in targetlist */
2533 int numfuncs; /* total number of window functions */
2534 int numaggs; /* number that are plain aggregates */
2535
2536 WindowStatePerFunc perfunc; /* per-window-function information */
2537 WindowStatePerAgg peragg; /* per-plain-aggregate information */
2538 ExprState *partEqfunction; /* equality funcs for partition columns */
2539 ExprState *ordEqfunction; /* equality funcs for ordering columns */
2540 Tuplestorestate *buffer; /* stores rows of current partition */
2541 int current_ptr; /* read pointer # for current row */
2542 int framehead_ptr; /* read pointer # for frame head, if used */
2543 int frametail_ptr; /* read pointer # for frame tail, if used */
2544 int grouptail_ptr; /* read pointer # for group tail, if used */
2545 int64 spooled_rows; /* total # of rows in buffer */
2546 int64 currentpos; /* position of current row in partition */
2547 int64 frameheadpos; /* current frame head position */
2548 int64 frametailpos; /* current frame tail position (frame end+1) */
2549 /* use struct pointer to avoid including windowapi.h here */
2550 struct WindowObjectData *agg_winobj; /* winobj for aggregate fetches */
2551 int64 aggregatedbase; /* start row for current aggregates */
2552 int64 aggregatedupto; /* rows before this one are aggregated */
2553 WindowAggStatus status; /* run status of WindowAggState */
2554
2555 int frameOptions; /* frame_clause options, see WindowDef */
2556 ExprState *startOffset; /* expression for starting bound offset */
2557 ExprState *endOffset; /* expression for ending bound offset */
2558 Datum startOffsetValue; /* result of startOffset evaluation */
2559 Datum endOffsetValue; /* result of endOffset evaluation */
2560
2561 /* these fields are used with RANGE offset PRECEDING/FOLLOWING: */
2562 FmgrInfo startInRangeFunc; /* in_range function for startOffset */
2563 FmgrInfo endInRangeFunc; /* in_range function for endOffset */
2564 Oid inRangeColl; /* collation for in_range tests */
2565 bool inRangeAsc; /* use ASC sort order for in_range tests? */
2566 bool inRangeNullsFirst; /* nulls sort first for in_range tests? */
2567
2568 /* fields relating to runconditions */
2569 bool use_pass_through; /* When false, stop execution when
2570 * runcondition is no longer true. Else
2571 * just stop evaluating window funcs. */
2572 bool top_window; /* true if this is the top-most WindowAgg or
2573 * the only WindowAgg in this query level */
2574 ExprState *runcondition; /* Condition which must remain true otherwise
2575 * execution of the WindowAgg will finish or
2576 * go into pass-through mode. NULL when there
2577 * is no such condition. */
2578
2579 /* these fields are used in GROUPS mode: */
2580 int64 currentgroup; /* peer group # of current row in partition */
2581 int64 frameheadgroup; /* peer group # of frame head row */
2582 int64 frametailgroup; /* peer group # of frame tail row */
2583 int64 groupheadpos; /* current row's peer group head position */
2584 int64 grouptailpos; /* " " " " tail position (group end+1) */
2585
2586 MemoryContext partcontext; /* context for partition-lifespan data */
2587 MemoryContext aggcontext; /* shared context for aggregate working data */
2588 MemoryContext curaggcontext; /* current aggregate's working data */
2589 ExprContext *tmpcontext; /* short-term evaluation context */
2590
2591 bool all_first; /* true if the scan is starting */
2592 bool partition_spooled; /* true if all tuples in current partition
2593 * have been spooled into tuplestore */
2594 bool next_partition; /* true if begin_partition needs to be called */
2595 bool more_partitions; /* true if there's more partitions after
2596 * this one */
2597 bool framehead_valid; /* true if frameheadpos is known up to
2598 * date for current row */
2599 bool frametail_valid; /* true if frametailpos is known up to
2600 * date for current row */
2601 bool grouptail_valid; /* true if grouptailpos is known up to
2602 * date for current row */
2603
2604 TupleTableSlot *first_part_slot; /* first tuple of current or next
2605 * partition */
2606 TupleTableSlot *framehead_slot; /* first tuple of current frame */
2607 TupleTableSlot *frametail_slot; /* first tuple after current frame */
2608
2609 /* temporary slots for tuples fetched back from tuplestore */
2610 TupleTableSlot *agg_row_slot;
2611 TupleTableSlot *temp_slot_1;
2612 TupleTableSlot *temp_slot_2;
2614
2615/* ----------------
2616 * UniqueState information
2617 *
2618 * Unique nodes are used "on top of" sort nodes to discard
2619 * duplicate tuples returned from the sort phase. Basically
2620 * all it does is compare the current tuple from the subplan
2621 * with the previously fetched tuple (stored in its result slot).
2622 * If the two are identical in all interesting fields, then
2623 * we just fetch another tuple from the sort and try again.
2624 * ----------------
2625 */
2626typedef struct UniqueState
2627{
2628 PlanState ps; /* its first field is NodeTag */
2629 ExprState *eqfunction; /* tuple equality qual */
2630} UniqueState;
2631
2632/* ----------------
2633 * GatherState information
2634 *
2635 * Gather nodes launch 1 or more parallel workers, run a subplan
2636 * in those workers, and collect the results.
2637 * ----------------
2638 */
2639typedef struct GatherState
2640{
2641 PlanState ps; /* its first field is NodeTag */
2642 bool initialized; /* workers launched? */
2643 bool need_to_scan_locally; /* need to read from local plan? */
2644 int64 tuples_needed; /* tuple bound, see ExecSetTupleBound */
2645 /* these fields are set up once: */
2646 TupleTableSlot *funnel_slot;
2647 struct ParallelExecutorInfo *pei;
2648 /* all remaining fields are reinitialized during a rescan: */
2649 int nworkers_launched; /* original number of workers */
2650 int nreaders; /* number of still-active workers */
2651 int nextreader; /* next one to try to read from */
2652 struct TupleQueueReader **reader; /* array with nreaders active entries */
2653} GatherState;
2654
2655/* ----------------
2656 * GatherMergeState information
2657 *
2658 * Gather merge nodes launch 1 or more parallel workers, run a
2659 * subplan which produces sorted output in each worker, and then
2660 * merge the results into a single sorted stream.
2661 * ----------------
2662 */
2663struct GMReaderTupleBuffer; /* private in nodeGatherMerge.c */
2664
2665typedef struct GatherMergeState
2666{
2667 PlanState ps; /* its first field is NodeTag */
2668 bool initialized; /* workers launched? */
2669 bool gm_initialized; /* gather_merge_init() done? */
2670 bool need_to_scan_locally; /* need to read from local plan? */
2671 int64 tuples_needed; /* tuple bound, see ExecSetTupleBound */
2672 /* these fields are set up once: */
2673 TupleDesc tupDesc; /* descriptor for subplan result tuples */
2674 int gm_nkeys; /* number of sort columns */
2675 SortSupport gm_sortkeys; /* array of length gm_nkeys */
2676 struct ParallelExecutorInfo *pei;
2677 /* all remaining fields are reinitialized during a rescan */
2678 /* (but the arrays are not reallocated, just cleared) */
2679 int nworkers_launched; /* original number of workers */
2680 int nreaders; /* number of active workers */
2681 TupleTableSlot **gm_slots; /* array with nreaders+1 entries */
2682 struct TupleQueueReader **reader; /* array with nreaders active entries */
2683 struct GMReaderTupleBuffer *gm_tuple_buffers; /* nreaders tuple buffers */
2684 struct binaryheap *gm_heap; /* binary heap of slot indices */
2686
2687/* ----------------
2688 * HashState information
2689 * ----------------
2690 */
2691typedef struct HashState
2692{
2693 PlanState ps; /* its first field is NodeTag */
2694 HashJoinTable hashtable; /* hash table for the hashjoin */
2695 ExprState *hash_expr; /* ExprState to get hash value */
2696
2697 FmgrInfo *skew_hashfunction; /* lookup data for skew hash function */
2698 Oid skew_collation; /* collation to call skew_hashfunction with */
2699
2700 Tuplestorestate *null_tuple_store; /* where to put null-keyed tuples */
2701 bool keep_null_tuples; /* do we need to save such tuples? */
2702
2703 /*
2704 * In a parallelized hash join, the leader retains a pointer to the
2705 * shared-memory stats area in its shared_info field, and then copies the
2706 * shared-memory info back to local storage before DSM shutdown. The
2707 * shared_info field remains NULL in workers, or in non-parallel joins.
2708 */
2709 SharedHashInfo *shared_info;
2710
2711 /*
2712 * If we are collecting hash stats, this points to an initially-zeroed
2713 * collection area, which could be either local storage or in shared
2714 * memory; either way it's for just one process.
2715 */
2716 HashInstrumentation *hinstrument;
2717
2718 /* Parallel hash state. */
2719 struct ParallelHashJoinState *parallel_state;
2720} HashState;
2721
2722/* ----------------
2723 * SetOpState information
2724 *
2725 * SetOp nodes support either sorted or hashed de-duplication.
2726 * The sorted mode is a bit like MergeJoin, the hashed mode like Agg.
2727 * ----------------
2728 */
2729typedef struct SetOpStatePerInput
2730{
2731 TupleTableSlot *firstTupleSlot; /* first tuple of current group */
2732 int64 numTuples; /* number of tuples in current group */
2733 TupleTableSlot *nextTupleSlot; /* next input tuple, if already read */
2734 bool needGroup; /* do we need to load a new group? */
2736
2737typedef struct SetOpState
2738{
2739 PlanState ps; /* its first field is NodeTag */
2740 bool setop_done; /* indicates completion of output scan */
2741 int64 numOutput; /* number of dups left to output */
2742 int numCols; /* number of grouping columns */
2743
2744 /* these fields are used in SETOP_SORTED mode: */
2745 SortSupport sortKeys; /* per-grouping-field sort data */
2746 SetOpStatePerInput leftInput; /* current outer-relation input state */
2747 SetOpStatePerInput rightInput; /* current inner-relation input state */
2748 bool need_init; /* have we read the first tuples yet? */
2749
2750 /* these fields are used in SETOP_HASHED mode: */
2751 Oid *eqfuncoids; /* per-grouping-field equality fns */
2752 FmgrInfo *hashfunctions; /* per-grouping-field hash fns */
2753 TupleHashTable hashtable; /* hash table with one entry per group */
2754 MemoryContext tuplesContext; /* context containing hash table's tuples */
2755 bool table_filled; /* hash table filled yet? */
2756 TupleHashIterator hashiter; /* for iterating through hash table */
2757} SetOpState;
2758
2759/* ----------------
2760 * LockRowsState information
2761 *
2762 * LockRows nodes are used to enforce FOR [KEY] UPDATE/SHARE locking.
2763 * ----------------
2764 */
2765typedef struct LockRowsState
2766{
2767 PlanState ps; /* its first field is NodeTag */
2768 List *lr_arowMarks; /* List of ExecAuxRowMarks */
2769 EPQState lr_epqstate; /* for evaluating EvalPlanQual rechecks */
2771
2772/* ----------------
2773 * LimitState information
2774 *
2775 * Limit nodes are used to enforce LIMIT/OFFSET clauses.
2776 * They just select the desired subrange of their subplan's output.
2777 *
2778 * offset is the number of initial tuples to skip (0 does nothing).
2779 * count is the number of tuples to return after skipping the offset tuples.
2780 * If no limit count was specified, count is undefined and noCount is true.
2781 * When lstate == LIMIT_INITIAL, offset/count/noCount haven't been set yet.
2782 * ----------------
2783 */
2784typedef enum
2785{
2786 LIMIT_INITIAL, /* initial state for LIMIT node */
2787 LIMIT_RESCAN, /* rescan after recomputing parameters */
2788 LIMIT_EMPTY, /* there are no returnable rows */
2789 LIMIT_INWINDOW, /* have returned a row in the window */
2790 LIMIT_WINDOWEND_TIES, /* have returned a tied row */
2791 LIMIT_SUBPLANEOF, /* at EOF of subplan (within window) */
2792 LIMIT_WINDOWEND, /* stepped off end of window */
2793 LIMIT_WINDOWSTART, /* stepped off beginning of window */
2795
2796typedef struct LimitState
2797{
2798 PlanState ps; /* its first field is NodeTag */
2799 ExprState *limitOffset; /* OFFSET parameter, or NULL if none */
2800 ExprState *limitCount; /* COUNT parameter, or NULL if none */
2801 LimitOption limitOption; /* limit specification type */
2802 int64 offset; /* current OFFSET value */
2803 int64 count; /* current COUNT, if any */
2804 bool noCount; /* if true, ignore count */
2805 LimitStateCond lstate; /* state machine status, as above */
2806 int64 position; /* 1-based index of last tuple returned */
2807 TupleTableSlot *subSlot; /* tuple last obtained from subplan */
2808 ExprState *eqfunction; /* tuple equality qual in case of WITH TIES
2809 * option */
2810 TupleTableSlot *last_slot; /* slot for evaluation of ties */
2811} LimitState;
2812
2813#endif /* EXECNODES_H */
int16 AttrNumber
Definition attnum.h:21
int Buffer
Definition buf.h:23
int64_t int64
Definition c.h:621
int16_t int16
Definition c.h:619
uint64_t uint64
Definition c.h:625
uint32_t uint32
Definition c.h:624
size_t Size
Definition c.h:689
static DataChecksumsWorkerOperation operation
struct WindowStatePerAggData * WindowStatePerAgg
Definition execnodes.h:2513
IncrementalSortExecutionStatus
Definition execnodes.h:2370
@ INCSORT_READFULLSORT
Definition execnodes.h:2373
@ INCSORT_LOADPREFIXSORT
Definition execnodes.h:2372
@ INCSORT_READPREFIXSORT
Definition execnodes.h:2374
@ INCSORT_LOADFULLSORT
Definition execnodes.h:2371
WindowAggStatus
Definition execnodes.h:2519
@ WINDOWAGG_PASSTHROUGH
Definition execnodes.h:2522
@ WINDOWAGG_RUN
Definition execnodes.h:2521
@ WINDOWAGG_DONE
Definition execnodes.h:2520
@ WINDOWAGG_PASSTHROUGH_STRICT
Definition execnodes.h:2523
struct HashJoinTableData * HashJoinTable
Definition execnodes.h:2244
struct HashJoinTupleData * HashJoinTuple
Definition execnodes.h:2243
struct WindowStatePerFuncData * WindowStatePerFunc
Definition execnodes.h:2512
struct AggStatePerHashData * AggStatePerHash
Definition execnodes.h:2428
LimitStateCond
Definition execnodes.h:2785
@ LIMIT_WINDOWEND_TIES
Definition execnodes.h:2790
@ LIMIT_WINDOWEND
Definition execnodes.h:2792
@ LIMIT_INWINDOW
Definition execnodes.h:2789
@ LIMIT_SUBPLANEOF
Definition execnodes.h:2791
@ LIMIT_WINDOWSTART
Definition execnodes.h:2793
@ LIMIT_EMPTY
Definition execnodes.h:2788
@ LIMIT_INITIAL
Definition execnodes.h:2786
@ LIMIT_RESCAN
Definition execnodes.h:2787
struct MergeJoinClauseData * MergeJoinClause
Definition execnodes.h:2189
ExprDoneCond
Definition execnodes.h:340
struct AggStatePerGroupData * AggStatePerGroup
Definition execnodes.h:2426
struct AggStatePerPhaseData * AggStatePerPhase
Definition execnodes.h:2427
struct AggStatePerTransData * AggStatePerTrans
Definition execnodes.h:2425
DomainConstraintType
Definition execnodes.h:1084
@ DOM_CONSTRAINT_CHECK
Definition execnodes.h:1086
@ DOM_CONSTRAINT_NOTNULL
Definition execnodes.h:1085
tuplehash_iterator TupleHashIterator
Definition execnodes.h:923
struct AggStatePerAggData * AggStatePerAgg
Definition execnodes.h:2424
TupleTableSlot *(* ExecProcNodeMtd)(PlanState *pstate)
Definition execnodes.h:1186
struct parser_state ps
static void fireBSTriggers(ModifyTableState *node)
#define pg_node_attr(...)
Definition nodes.h:126
CmdType
Definition nodes.h:273
AggStrategy
Definition nodes.h:363
NodeTag
Definition nodes.h:27
AggSplit
Definition nodes.h:385
LimitOption
Definition nodes.h:441
JoinType
Definition nodes.h:298
uint16 OffsetNumber
Definition off.h:24
#define plan(x)
Definition pg_regress.c:164
uint64_t Datum
Definition postgres.h:70
unsigned int Oid
static int fb(int x)
DomainConstraintType constrainttype
Definition execnodes.h:1092
ExprState * check_exprstate
Definition execnodes.h:1095
int jump_eval_coercion
Definition execnodes.h:1143
NullableDatum empty
Definition execnodes.h:1129
FunctionCallInfo input_fcinfo
Definition execnodes.h:1157
JsonExpr * jsexpr
Definition execnodes.h:1107
NullableDatum error
Definition execnodes.h:1126
NullableDatum pathspec
Definition execnodes.h:1113
ErrorSaveContext escontext
Definition execnodes.h:1166
NullableDatum formatted_expr
Definition execnodes.h:1110
Definition pg_list.h:54
Definition nodes.h:135
bool inneropsset
Definition execnodes.h:1287
const TupleTableSlotOps * resultops
Definition execnodes.h:1280
bool outeropsset
Definition execnodes.h:1286
struct SharedJitInstrumentation * worker_jit_instrument
Definition execnodes.h:1217
ExecProcNodeMtd ExecProcNodeReal
Definition execnodes.h:1208
const TupleTableSlotOps * outerops
Definition execnodes.h:1278
const TupleTableSlotOps * innerops
Definition execnodes.h:1279
bool resultopsset
Definition execnodes.h:1288
ExprState * qual
Definition execnodes.h:1224
const TupleTableSlotOps * scanops
Definition execnodes.h:1277
Plan * plan
Definition execnodes.h:1201
PlanState * righttree
Definition execnodes.h:1226
bool outeropsfixed
Definition execnodes.h:1282
List * subPlan
Definition execnodes.h:1230
TupleDesc ps_ResultTupleDesc
Definition execnodes.h:1240
NodeInstrumentation * instrument
Definition execnodes.h:1211
WorkerNodeInstrumentation * worker_instrument
Definition execnodes.h:1213
List * initPlan
Definition execnodes.h:1228
Bitmapset * chgParam
Definition execnodes.h:1235
bool scanopsset
Definition execnodes.h:1285
PlanState * lefttree
Definition execnodes.h:1225
ExprContext * ps_ExprContext
Definition execnodes.h:1242
TupleTableSlot * ps_ResultTupleSlot
Definition execnodes.h:1241
TupleDesc scandesc
Definition execnodes.h:1252
ProjectionInfo * ps_ProjInfo
Definition execnodes.h:1243
bool scanopsfixed
Definition execnodes.h:1281
bool async_capable
Definition execnodes.h:1245
bool resultopsfixed
Definition execnodes.h:1284
bool inneropsfixed
Definition execnodes.h:1283
ExecProcNodeMtd ExecProcNode
Definition execnodes.h:1207
Expr * expr
Definition execnodes.h:978
FunctionCallInfo fcinfo
Definition execnodes.h:1038
TupleTableSlot * funcResultSlot
Definition execnodes.h:1001
Tuplestorestate * funcResultStore
Definition execnodes.h:1000
bool funcReturnsSet
Definition execnodes.h:1014
bool shutdown_reg
Definition execnodes.h:1031
bool funcReturnsTuple
Definition execnodes.h:1008
ExprState * elidedFuncState
Definition execnodes.h:986
TupleDesc funcResultDesc
Definition execnodes.h:1007
FmgrInfo func
Definition execnodes.h:993
List * args
Definition execnodes.h:979
NodeTag type
Definition execnodes.h:977
bool setArgsValid
Definition execnodes.h:1023
TupleHashTable hashtable
Definition execnodes.h:1058
ExprState * lhs_hash_expr
Definition execnodes.h:1071
PlanState * parent
Definition execnodes.h:1050
ExprState * cur_eq_comp
Definition execnodes.h:1073
Oid * tab_eq_funcoids
Definition execnodes.h:1067
NodeTag type
Definition execnodes.h:1047
ExprContext * innerecontext
Definition execnodes.h:1063
FmgrInfo * tab_hash_funcs
Definition execnodes.h:1070
FmgrInfo * cur_eq_funcs
Definition execnodes.h:1072
PlanState * planstate
Definition execnodes.h:1049
HeapTuple curTuple
Definition execnodes.h:1052
AttrNumber * keyColIdx
Definition execnodes.h:1066
TupleDesc descRight
Definition execnodes.h:1055
SubPlan * subplan
Definition execnodes.h:1048
ProjectionInfo * projLeft
Definition execnodes.h:1056
ProjectionInfo * projRight
Definition execnodes.h:1057
bool havenullrows
Definition execnodes.h:1061
ExprState * testexpr
Definition execnodes.h:1051
MemoryContext tuplesContext
Definition execnodes.h:1062
Oid * tab_collations
Definition execnodes.h:1069
TupleHashTable hashnulls
Definition execnodes.h:1059
bool havehashrows
Definition execnodes.h:1060
const char * type
static bool initialized
Definition win32ntdll.c:36

◆ innerPlanState

#define innerPlanState (   node)    (((PlanState *)(node))->righttree)

Definition at line 1298 of file execnodes.h.

◆ InstrCountFiltered1

#define InstrCountFiltered1 (   node,
  delta 
)
Value:
do { \
if (((PlanState *)(node))->instrument) \
((PlanState *)(node))->instrument->nfiltered1 += (delta); \
} while(0)

Definition at line 1307 of file execnodes.h.

1308 { \
1309 if (((PlanState *)(node))->instrument) \
1310 ((PlanState *)(node))->instrument->nfiltered1 += (delta); \
1311 } while(0)

◆ InstrCountFiltered2

#define InstrCountFiltered2 (   node,
  delta 
)
Value:
do { \
if (((PlanState *)(node))->instrument) \
((PlanState *)(node))->instrument->nfiltered2 += (delta); \
} while(0)

Definition at line 1312 of file execnodes.h.

1313 { \
1314 if (((PlanState *)(node))->instrument) \
1315 ((PlanState *)(node))->instrument->nfiltered2 += (delta); \
1316 } while(0)

◆ InstrCountTuples2

#define InstrCountTuples2 (   node,
  delta 
)
Value:
do { \
if (((PlanState *)(node))->instrument) \
((PlanState *)(node))->instrument->ntuples2 += (delta); \
} while (0)

Definition at line 1302 of file execnodes.h.

1303 { \
1304 if (((PlanState *)(node))->instrument) \
1305 ((PlanState *)(node))->instrument->ntuples2 += (delta); \
1306 } while (0)

◆ MERGE_DELETE

#define MERGE_DELETE   0x04

Definition at line 1433 of file execnodes.h.

◆ MERGE_INSERT

#define MERGE_INSERT   0x01

Definition at line 1431 of file execnodes.h.

◆ MERGE_UPDATE

#define MERGE_UPDATE   0x02

Definition at line 1432 of file execnodes.h.

◆ outerPlanState

#define outerPlanState (   node)    (((PlanState *)(node))->lefttree)

Definition at line 1299 of file execnodes.h.

◆ ResetTupleHashIterator

#define ResetTupleHashIterator (   htable,
  iter 
)     InitTupleHashIterator(htable, iter)

Definition at line 934 of file execnodes.h.

◆ ScanTupleHashTable

#define ScanTupleHashTable (   htable,
  iter 
)     tuplehash_iterate(htable->hashtab, iter)

Definition at line 936 of file execnodes.h.

◆ SH_DECLARE

#define SH_DECLARE

Definition at line 901 of file execnodes.h.

◆ SH_ELEMENT_TYPE

#define SH_ELEMENT_TYPE   TupleHashEntryData

Definition at line 898 of file execnodes.h.

◆ SH_KEY_TYPE

#define SH_KEY_TYPE   MinimalTuple

Definition at line 899 of file execnodes.h.

◆ SH_PREFIX

#define SH_PREFIX   tuplehash

Definition at line 897 of file execnodes.h.

◆ SH_SCOPE

#define SH_SCOPE   extern

Definition at line 900 of file execnodes.h.

◆ TermTupleHashIterator

#define TermTupleHashIterator (   iter)     ((void) 0)

Definition at line 932 of file execnodes.h.

Typedef Documentation

◆ AggState

◆ AggStatePerAgg

Definition at line 2424 of file execnodes.h.

◆ AggStatePerGroup

Definition at line 2426 of file execnodes.h.

◆ AggStatePerHash

Definition at line 2428 of file execnodes.h.

◆ AggStatePerPhase

Definition at line 2427 of file execnodes.h.

◆ AggStatePerTrans

Definition at line 2425 of file execnodes.h.

◆ AppendState

Definition at line 1527 of file execnodes.h.

◆ AsyncRequest

◆ BitmapAndState

◆ BitmapHeapScanState

◆ BitmapIndexScanState

◆ BitmapOrState

◆ BufferUsage

Definition at line 48 of file execnodes.h.

◆ CteScanState

◆ CustomScanState

◆ DomainConstraintState

◆ DomainConstraintType

◆ EPQState

◆ EState

◆ ExecAuxRowMark

◆ ExecProcNodeMtd

typedef TupleTableSlot *(* ExecProcNodeMtd) (PlanState *pstate)

Definition at line 1186 of file execnodes.h.

◆ ExecRowMark

Definition at line 49 of file execnodes.h.

◆ ExprContext

Definition at line 51 of file execnodes.h.

◆ ExprContext_CB

◆ ExprContextCallbackFunction

typedef void(* ExprContextCallbackFunction) (Datum arg)

Definition at line 249 of file execnodes.h.

◆ ExprState

Definition at line 50 of file execnodes.h.

◆ ExprStateEvalFunc

typedef Datum(* ExprStateEvalFunc) (ExprState *expression, ExprContext *econtext, bool *isNull)

Definition at line 82 of file execnodes.h.

◆ ForeignScanState

◆ ForPortionOfState

◆ FunctionScanState

◆ GatherMergeState

◆ GatherState

◆ GroupState

◆ HashJoinState

◆ HashJoinTable

Definition at line 2244 of file execnodes.h.

◆ HashJoinTuple

Definition at line 2243 of file execnodes.h.

◆ HashState

◆ HTAB

typedef struct HTAB HTAB

Definition at line 52 of file execnodes.h.

◆ IncrementalSortState

◆ IndexInfo

◆ IndexOnlyScanState

◆ IndexScanState

◆ Instrumentation

Definition at line 53 of file execnodes.h.

◆ JoinState

◆ JsonExprState

◆ JunkFilter

◆ LimitState

◆ LockRowsState

◆ MaterialState

◆ MemoizeState

◆ MergeActionState

◆ MergeAppendState

◆ MergeJoinClause

Definition at line 2189 of file execnodes.h.

◆ MergeJoinState

◆ ModifyTableState

◆ NamedTuplestoreScanState

◆ NestLoopState

◆ NodeInstrumentation

Definition at line 63 of file execnodes.h.

◆ OnConflictActionState

◆ pairingheap

Definition at line 54 of file execnodes.h.

◆ ParallelAppendState

Definition at line 1529 of file execnodes.h.

◆ ParallelBitmapHeapState

◆ PlanState

Definition at line 55 of file execnodes.h.

◆ PresortedKeyData

◆ ProjectionInfo

◆ ProjectSetState

◆ QueryEnvironment

Definition at line 56 of file execnodes.h.

◆ RecursiveUnionState

◆ Relation

Definition at line 57 of file execnodes.h.

◆ RelationPtr

Definition at line 58 of file execnodes.h.

◆ ResultRelInfo

◆ ResultState

◆ ReturnSetInfo

◆ SampleScanState

◆ ScanKeyData

Definition at line 59 of file execnodes.h.

◆ ScanState

◆ SeqScanState

◆ SetExprState

◆ SetOpState

◆ SetOpStatePerInput

◆ Snapshot

Definition at line 60 of file execnodes.h.

◆ SortState

◆ SortSupport

Definition at line 61 of file execnodes.h.

◆ SubPlanState

◆ SubqueryScanState

◆ TableFuncScanState

◆ TIDBitmap

Definition at line 62 of file execnodes.h.

◆ TidRangeScanState

◆ TidScanState

◆ TriggerInstrumentation

◆ TupleConversionMap

Definition at line 65 of file execnodes.h.

◆ TupleDesc

Definition at line 66 of file execnodes.h.

◆ TupleHashEntry

Definition at line 880 of file execnodes.h.

◆ TupleHashEntryData

◆ TupleHashIterator

◆ TupleHashTable

Definition at line 881 of file execnodes.h.

◆ TupleHashTableData

◆ Tuplesortstate

Definition at line 67 of file execnodes.h.

◆ Tuplestorestate

Definition at line 68 of file execnodes.h.

◆ TupleTableSlot

Definition at line 69 of file execnodes.h.

◆ TupleTableSlotOps

Definition at line 70 of file execnodes.h.

◆ UniqueState

◆ ValuesScanState

◆ WalUsage

Definition at line 71 of file execnodes.h.

◆ WindowAggState

◆ WindowAggStatus

◆ WindowFuncExprState

◆ WindowStatePerAgg

Definition at line 2513 of file execnodes.h.

◆ WindowStatePerFunc

Definition at line 2512 of file execnodes.h.

◆ WorkerNodeInstrumentation

◆ WorkTableScanState

Enumeration Type Documentation

◆ DomainConstraintType

Enumerator
DOM_CONSTRAINT_NOTNULL 
DOM_CONSTRAINT_CHECK 

Definition at line 1083 of file execnodes.h.

◆ ExprDoneCond

Enumerator
ExprSingleResult 
ExprMultipleResult 
ExprEndResult 

Definition at line 339 of file execnodes.h.

340{
341 ExprSingleResult, /* expression does not return a set */
342 ExprMultipleResult, /* this result is an element of a set */
343 ExprEndResult, /* there are no more elements in the set */
@ ExprSingleResult
Definition execnodes.h:341
@ ExprMultipleResult
Definition execnodes.h:342
@ ExprEndResult
Definition execnodes.h:343

◆ IncrementalSortExecutionStatus

Enumerator
INCSORT_LOADFULLSORT 
INCSORT_LOADPREFIXSORT 
INCSORT_READFULLSORT 
INCSORT_READPREFIXSORT 

Definition at line 2369 of file execnodes.h.

◆ LimitStateCond

Enumerator
LIMIT_INITIAL 
LIMIT_RESCAN 
LIMIT_EMPTY 
LIMIT_INWINDOW 
LIMIT_WINDOWEND_TIES 
LIMIT_SUBPLANEOF 
LIMIT_WINDOWEND 
LIMIT_WINDOWSTART 

Definition at line 2784 of file execnodes.h.

2785{
2786 LIMIT_INITIAL, /* initial state for LIMIT node */
2787 LIMIT_RESCAN, /* rescan after recomputing parameters */
2788 LIMIT_EMPTY, /* there are no returnable rows */
2789 LIMIT_INWINDOW, /* have returned a row in the window */
2790 LIMIT_WINDOWEND_TIES, /* have returned a tied row */
2791 LIMIT_SUBPLANEOF, /* at EOF of subplan (within window) */
2792 LIMIT_WINDOWEND, /* stepped off end of window */
2793 LIMIT_WINDOWSTART, /* stepped off beginning of window */

◆ SetFunctionReturnMode

Enumerator
SFRM_ValuePerCall 
SFRM_Materialize 
SFRM_Materialize_Random 
SFRM_Materialize_Preferred 

Definition at line 352 of file execnodes.h.

353{
354 SFRM_ValuePerCall = 0x01, /* one value returned per call */
355 SFRM_Materialize = 0x02, /* result set instantiated in Tuplestore */
356 SFRM_Materialize_Random = 0x04, /* Tuplestore needs randomAccess */
357 SFRM_Materialize_Preferred = 0x08, /* caller prefers Tuplestore */
SetFunctionReturnMode
Definition execnodes.h:353
@ SFRM_Materialize_Preferred
Definition execnodes.h:357
@ SFRM_ValuePerCall
Definition execnodes.h:354
@ SFRM_Materialize_Random
Definition execnodes.h:356
@ SFRM_Materialize
Definition execnodes.h:355

◆ WindowAggStatus

Enumerator
WINDOWAGG_DONE 
WINDOWAGG_RUN 
WINDOWAGG_PASSTHROUGH 
WINDOWAGG_PASSTHROUGH_STRICT 

Definition at line 2518 of file execnodes.h.

2519{
2520 WINDOWAGG_DONE, /* No more processing to do */
2521 WINDOWAGG_RUN, /* Normal processing of window funcs */
2522 WINDOWAGG_PASSTHROUGH, /* Don't eval window funcs */
2523 WINDOWAGG_PASSTHROUGH_STRICT, /* Pass-through plus don't store new
2524 * tuples during spool */