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 2504 of file execnodes.h.

◆ FIELDNO_AGGSTATE_CURAGGCONTEXT

#define FIELDNO_AGGSTATE_CURAGGCONTEXT   14

Definition at line 2449 of file execnodes.h.

◆ FIELDNO_AGGSTATE_CURPERTRANS

#define FIELDNO_AGGSTATE_CURPERTRANS   16

Definition at line 2452 of file execnodes.h.

◆ FIELDNO_AGGSTATE_CURRENT_SET

#define FIELDNO_AGGSTATE_CURRENT_SET   20

Definition at line 2457 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 931 of file execnodes.h.

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

◆ innerPlanState

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

Definition at line 1299 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 1308 of file execnodes.h.

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

◆ InstrCountFiltered2

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

Definition at line 1313 of file execnodes.h.

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

◆ InstrCountTuples2

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

Definition at line 1303 of file execnodes.h.

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

◆ MERGE_DELETE

#define MERGE_DELETE   0x04

Definition at line 1434 of file execnodes.h.

◆ MERGE_INSERT

#define MERGE_INSERT   0x01

Definition at line 1432 of file execnodes.h.

◆ MERGE_UPDATE

#define MERGE_UPDATE   0x02

Definition at line 1433 of file execnodes.h.

◆ outerPlanState

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

Definition at line 1300 of file execnodes.h.

◆ ResetTupleHashIterator

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

Definition at line 935 of file execnodes.h.

◆ ScanTupleHashTable

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

Definition at line 937 of file execnodes.h.

◆ SH_DECLARE

#define SH_DECLARE

Definition at line 902 of file execnodes.h.

◆ SH_ELEMENT_TYPE

#define SH_ELEMENT_TYPE   TupleHashEntryData

Definition at line 899 of file execnodes.h.

◆ SH_KEY_TYPE

#define SH_KEY_TYPE   MinimalTuple

Definition at line 900 of file execnodes.h.

◆ SH_PREFIX

#define SH_PREFIX   tuplehash

Definition at line 898 of file execnodes.h.

◆ SH_SCOPE

#define SH_SCOPE   extern

Definition at line 901 of file execnodes.h.

◆ TermTupleHashIterator

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

Definition at line 933 of file execnodes.h.

Typedef Documentation

◆ AggState

◆ AggStatePerAgg

Definition at line 2427 of file execnodes.h.

◆ AggStatePerGroup

Definition at line 2429 of file execnodes.h.

◆ AggStatePerHash

Definition at line 2431 of file execnodes.h.

◆ AggStatePerPhase

Definition at line 2430 of file execnodes.h.

◆ AggStatePerTrans

Definition at line 2428 of file execnodes.h.

◆ AppendState

Definition at line 1530 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 1187 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 2247 of file execnodes.h.

◆ HashJoinTuple

Definition at line 2246 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 2192 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 1532 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 881 of file execnodes.h.

◆ TupleHashEntryData

◆ TupleHashIterator

◆ TupleHashTable

Definition at line 882 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 2516 of file execnodes.h.

◆ WindowStatePerFunc

Definition at line 2515 of file execnodes.h.

◆ WorkerNodeInstrumentation

◆ WorkTableScanState

Enumeration Type Documentation

◆ DomainConstraintType

Enumerator
DOM_CONSTRAINT_NOTNULL 
DOM_CONSTRAINT_CHECK 

Definition at line 1084 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 2372 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 2787 of file execnodes.h.

2788{
2789 LIMIT_INITIAL, /* initial state for LIMIT node */
2790 LIMIT_RESCAN, /* rescan after recomputing parameters */
2791 LIMIT_EMPTY, /* there are no returnable rows */
2792 LIMIT_INWINDOW, /* have returned a row in the window */
2793 LIMIT_WINDOWEND_TIES, /* have returned a tied row */
2794 LIMIT_SUBPLANEOF, /* at EOF of subplan (within window) */
2795 LIMIT_WINDOWEND, /* stepped off end of window */
2796 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 2521 of file execnodes.h.

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