PostgreSQL Source Code: src/include/executor/executor.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef EXECUTOR_H
15#define EXECUTOR_H
16
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66#define EXEC_FLAG_EXPLAIN_ONLY 0x0001
67#define EXEC_FLAG_EXPLAIN_GENERIC 0x0002
68#define EXEC_FLAG_REWIND 0x0004
69#define EXEC_FLAG_BACKWARD 0x0008
70#define EXEC_FLAG_MARK 0x0010
71#define EXEC_FLAG_SKIP_TRIGGERS 0x0020
72#define EXEC_FLAG_WITH_NO_DATA 0x0040
73
74
75
78
79
84
85
88
89
92
93
95 List *rtePermInfos,
96 bool ereport_on_violation);
98
99
100
101
102
103struct Path;
104
111
112
113
114
117 Oid table_oid,
119
120
121
122
124 int numCols,
126 const Oid *eqOperators,
127 const Oid *collations,
130 const Oid *eqOperators,
131 Oid **eqFuncOids,
136 int numCols,
138 const Oid *eqfuncoids,
140 Oid *collations,
141 long nbuckets,
142 Size additionalsize,
146 bool use_variable_hash_iv);
160
161#ifndef FRONTEND
162
163
164
165static inline size_t
167{
169}
170
171
172
173
176{
178}
179
180
181
182
183
184
185
186
187
188static inline void *
190{
193 else
194 return NULL;
195}
196#endif
197
198
199
200
207 const char *attrName);
209 const char *attrName);
212
213
214
215
216
217
218
219
220#ifndef FRONTEND
221static inline Datum
223{
226}
227#endif
228
229
230
231
235 int query_index);
247 List *rteperminfos, bool ereport_on_violation);
249 List *mergeActions);
252 Index resultRelationIndex,
254 int instrument_options);
263 List *notnull_virtual_attrs);
273 int maxfieldlen);
280 Plan *subplan, List *auxrowmarks,
281 int epqParam, List *resultRelations);
283 Plan *subplan, List *auxrowmarks);
286
287#define EvalPlanQualSetSlot(epqstate, slot) ((epqstate)->origslot = (slot))
292
293
294
295
302
303
304
305
306
307
308
309
310static inline bool
312{
315}
316
317
318
319
320
321static inline bool
323{
326}
327
328
329
330
331
332
333
334#ifndef FRONTEND
337{
338 if (node->chgParam != NULL)
339 ExecReScan(node);
340
342}
343#endif
344
345
346
347
354 bool doSort, bool doHash, bool nullcheck);
358 Oid *collations,
359 int numCols,
365 const Oid *hashfunc_oids,
366 const List *collations,
367 const List *hash_exprs,
368 const bool *opstrict, PlanState *parent,
369 uint32 init_value, bool keep_nulls);
372 int numCols,
374 const Oid *eqfunctions,
375 const Oid *collations,
380 const Oid *eqfunctions,
381 const Oid *collations,
382 const List *param_exprs,
390 bool evalTargetList,
391 List *targetColnos,
400
401
402
403
404
405
406
407
408
409
410
411
412
413#ifndef FRONTEND
414static inline Datum
417 bool *isNull)
418{
419 return state->evalfunc(state, econtext, isNull);
420}
421#endif
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438#ifndef FRONTEND
439static inline void
442{
444
445 retDatum = state->evalfunc(state, econtext, NULL);
446
448}
449#endif
450
451
452
453
454
455
456#ifndef FRONTEND
457static inline Datum
460 bool *isNull)
461{
464
466 retDatum = state->evalfunc(state, econtext, isNull);
468 return retDatum;
469}
470#endif
471
472
473
474
475
476
477
478#ifndef FRONTEND
479static inline void
482{
484
488}
489#endif
490
491
492
493
494
495
496
497
498
499
500
501
502
503#ifndef FRONTEND
506{
510
511
512
513
514
516
517
519
520
521
522
523
524 slot->tts_flags &= ~TTS_FLAG_EMPTY;
526
527 return slot;
528}
529#endif
530
531
532
533
534
535
536
537
538
539#ifndef FRONTEND
540static inline bool
542{
544 bool isnull;
545
546
547 if (state == NULL)
548 return true;
549
550
552
554
555
557
559}
560#endif
561
562
563
564
565
566#ifndef FRONTEND
567static inline bool
569{
571
572
574 return ret;
575}
576#endif
577
579
580
581
582
589 bool randomAccess);
595 bool *isNull,
597
598
599
600
603
609
610
611
612
631
633{
637
644
645
646
647
648
649
650#define do_text_output_oneline(tstate, str_to_emit) \
651 do { \
652 Datum values_[1]; \
653 bool isnull_[1]; \
654 values_[0] = PointerGetDatum(cstring_to_text(str_to_emit)); \
655 isnull_[0] = false; \
656 do_tup_output(tstate, values_, isnull_); \
657 pfree(DatumGetPointer(values_[0])); \
658 } while (0)
659
660
661
662
663
671
672#define ResetExprContext(econtext) \
673 MemoryContextReset((econtext)->ecxt_per_tuple_memory)
674
676
677
678#define GetPerTupleExprContext(estate) \
679 ((estate)->es_per_tuple_exprcontext ? \
680 (estate)->es_per_tuple_exprcontext : \
681 MakePerTupleExprContext(estate))
682
683#define GetPerTupleMemoryContext(estate) \
684 (GetPerTupleExprContext(estate)->ecxt_per_tuple_memory)
685
686
687#define ResetPerTupleExprContext(estate) \
688 do { \
689 if ((estate)->es_per_tuple_exprcontext) \
690 ResetExprContext((estate)->es_per_tuple_exprcontext); \
691 } while (0)
692
696 bool *isfixed);
698 int nplans);
708
710
712
717
720{
722}
723
725 bool isResultRel);
728
730
737
739 bool *isNull);
741 bool *isNull);
742
745
752
758
759
760
761
766 bool update,
767 bool noDupErr,
768 bool *specConflict, List *arbiterIndexes,
769 bool onlySummarizing);
774 List *arbiterIndexes);
779 EState *estate, bool newIndex);
780
781
782
783
790
800
803
804
805
806
811 Oid resultoid,
812 bool missing_ok,
813 bool update_cache);
814
815#endif
static Datum values[MAXATTR]
#define PG_USED_FOR_ASSERTS_ONLY
void(* ExprContextCallbackFunction)(Datum arg)
TupleTableSlot *(* ExecProcNodeMtd)(struct PlanState *pstate)
struct TupleHashEntryData TupleHashEntryData
static MinimalTuple TupleHashEntryGetTuple(TupleHashEntry entry)
TupleDesc ExecGetResultType(PlanState *planstate)
Relation ExecGetRangeTableRelation(EState *estate, Index rti, bool isResultRel)
bool RelationFindReplTupleSeq(Relation rel, LockTupleMode lockmode, TupleTableSlot *searchslot, TupleTableSlot *outslot)
bool RelationFindReplTupleByIndex(Relation rel, Oid idxoid, LockTupleMode lockmode, TupleTableSlot *searchslot, TupleTableSlot *outslot)
LockTupleMode ExecUpdateLockMode(EState *estate, ResultRelInfo *relinfo)
ResultRelInfo * ExecLookupResultRelByOid(ModifyTableState *node, Oid resultoid, bool missing_ok, bool update_cache)
ExprState * execTuplesMatchPrepare(TupleDesc desc, int numCols, const AttrNumber *keyColIdx, const Oid *eqOperators, const Oid *collations, PlanState *parent)
ExecRowMark * ExecFindRowMark(EState *estate, Index rti, bool missing_ok)
TupleConversionMap * ExecGetRootToChildMap(ResultRelInfo *resultRelInfo, EState *estate)
ExecAuxRowMark * ExecBuildAuxRowMark(ExecRowMark *erm, List *targetlist)
ResultRelInfo * ExecGetTriggerResultRel(EState *estate, Oid relid, ResultRelInfo *rootRelInfo)
void CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation, List *mergeActions)
void ExecAssignScanProjectionInfoWithVarno(ScanState *node, int varno)
PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook
TupleTableSlot * EvalPlanQualSlot(EPQState *epqstate, Relation relation, Index rti)
Bitmapset * ExecGetExtraUpdatedCols(ResultRelInfo *relinfo, EState *estate)
void ExecSimpleRelationDelete(ResultRelInfo *resultRelInfo, EState *estate, EPQState *epqstate, TupleTableSlot *searchslot)
void CheckSubscriptionRelkind(char relkind, const char *nspname, const char *relname)
void EvalPlanQualBegin(EPQState *epqstate)
Bitmapset * ExecGetInsertedCols(ResultRelInfo *relinfo, EState *estate)
TupleTableSlot * ExecGetTriggerNewSlot(EState *estate, ResultRelInfo *relInfo)
PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook
char * ExecBuildSlotValueDescription(Oid reloid, TupleTableSlot *slot, TupleDesc tupdesc, Bitmapset *modifiedCols, int maxfieldlen)
ExprState * ExecBuildHash32FromAttrs(TupleDesc desc, const TupleTableSlotOps *ops, FmgrInfo *hashfunctions, Oid *collations, int numCols, AttrNumber *keyColIdx, PlanState *parent, uint32 init_value)
bool ExecutorStart(QueryDesc *queryDesc, int eflags)
void ReScanExprContext(ExprContext *econtext)
static TupleTableSlot * ExecProject(ProjectionInfo *projInfo)
bool ExecPartitionCheck(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, bool emitError)
static void * TupleHashEntryGetAdditional(TupleHashTable hashtable, TupleHashEntry entry)
ExprState * ExecInitExpr(Expr *node, PlanState *parent)
JunkFilter * ExecInitJunkFilterConversion(List *targetList, TupleDesc cleanTupType, TupleTableSlot *slot)
void do_tup_output(TupOutputState *tstate, const Datum *values, const bool *isnull)
ExprState * ExecPrepareExpr(Expr *node, EState *estate)
static bool ExecShouldLockRelations(EState *estate)
bool ExecCheck(ExprState *state, ExprContext *econtext)
ExprContext * CreateExprContext(EState *estate)
ExprState * ExecInitCheck(List *qual, PlanState *parent)
SetExprState * ExecInitFunctionResultSet(Expr *expr, ExprContext *econtext, PlanState *parent)
void ExecutorStartCachedPlan(QueryDesc *queryDesc, int eflags, CachedPlanSource *plansource, int query_index)
void execTuplesHashPrepare(int numCols, const Oid *eqOperators, Oid **eqFuncOids, FmgrInfo **hashFunctions)
void(* ExecutorFinish_hook_type)(QueryDesc *queryDesc)
TupleConversionMap * ExecGetChildToRootMap(ResultRelInfo *resultRelInfo)
ExprContext * CreateStandaloneExprContext(void)
void ExecutorEnd(QueryDesc *queryDesc)
void EvalPlanQualInit(EPQState *epqstate, EState *parentestate, Plan *subplan, List *auxrowmarks, int epqParam, List *resultRelations)
TupleTableSlot * ExecGetTriggerOldSlot(EState *estate, ResultRelInfo *relInfo)
TupleDesc ExecCleanTypeFromTL(List *targetList)
void ExecWithCheckOptions(WCOKind kind, ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate)
int executor_errposition(EState *estate, int location)
void ExecInitResultSlot(PlanState *planstate, const TupleTableSlotOps *tts_ops)
ProjectionInfo * ExecBuildProjectionInfo(List *targetList, ExprContext *econtext, TupleTableSlot *slot, PlanState *parent, TupleDesc inputDesc)
void ExecTypeSetColNames(TupleDesc typeInfo, List *namesList)
TupleHashEntry LookupTupleHashEntryHash(TupleHashTable hashtable, TupleTableSlot *slot, bool *isnew, uint32 hash)
bool ExecSupportsMarkRestore(struct Path *pathnode)
static RangeTblEntry * exec_rt_fetch(Index rti, EState *estate)
Tuplestorestate * ExecMakeTableFunctionResult(SetExprState *setexpr, ExprContext *econtext, MemoryContext argContext, TupleDesc expectedDesc, bool randomAccess)
Datum GetAttributeByNum(HeapTupleHeader tuple, AttrNumber attrno, bool *isNull)
void FreeExprContext(ExprContext *econtext, bool isCommit)
void ExecInitRangeTable(EState *estate, List *rangeTable, List *permInfos, Bitmapset *unpruned_relids)
TupleTableSlot * ExecFilterJunk(JunkFilter *junkfilter, TupleTableSlot *slot)
Node * MultiExecProcNode(PlanState *node)
AttrNumber ExecFindJunkAttributeInTlist(List *targetlist, const char *attrName)
Bitmapset * ExecGetUpdatedCols(ResultRelInfo *relinfo, EState *estate)
TupleTableSlot * ExecGetUpdateNewTuple(ResultRelInfo *relinfo, TupleTableSlot *planSlot, TupleTableSlot *oldSlot)
const TupleTableSlotOps * ExecGetCommonSlotOps(PlanState **planstates, int nplans)
void ExecInitResultRelation(EState *estate, ResultRelInfo *resultRelInfo, Index rti)
void end_tup_output(TupOutputState *tstate)
void InitResultRelInfo(ResultRelInfo *resultRelInfo, Relation resultRelationDesc, Index resultRelationIndex, ResultRelInfo *partition_root_rri, int instrument_options)
void ExecMarkPos(PlanState *node)
void ExecSetTupleBound(int64 tuples_needed, PlanState *child_node)
TupleTableSlot * ExecScan(ScanState *node, ExecScanAccessMtd accessMtd, ExecScanRecheckMtd recheckMtd)
Datum ExecMakeFunctionResultSet(SetExprState *fcache, ExprContext *econtext, MemoryContext argContext, bool *isNull, ExprDoneCond *isDone)
void ExecCreateScanSlotFromOuterPlan(EState *estate, ScanState *scanstate, const TupleTableSlotOps *tts_ops)
void ExecutorFinish(QueryDesc *queryDesc)
void ExecEndNode(PlanState *node)
JunkFilter * ExecInitJunkFilter(List *targetList, TupleTableSlot *slot)
void ExecSimpleRelationUpdate(ResultRelInfo *resultRelInfo, EState *estate, EPQState *epqstate, TupleTableSlot *searchslot, TupleTableSlot *slot)
void ExecInitScanTupleSlot(EState *estate, ScanState *scanstate, TupleDesc tupledesc, const TupleTableSlotOps *tts_ops)
TupleHashEntry LookupTupleHashEntry(TupleHashTable hashtable, TupleTableSlot *slot, bool *isnew, uint32 *hash)
void EvalPlanQualEnd(EPQState *epqstate)
void ExecInitResultTypeTL(PlanState *planstate)
void EvalPlanQualSetPlan(EPQState *epqstate, Plan *subplan, List *auxrowmarks)
void CheckCmdReplicaIdentity(Relation rel, CmdType cmd)
PlanState * ExecInitNode(Plan *node, EState *estate, int eflags)
ExprState * ExecBuildAggTrans(AggState *aggstate, struct AggStatePerPhaseData *phase, bool doSort, bool doHash, bool nullcheck)
void(* ExecutorRun_hook_type)(QueryDesc *queryDesc, ScanDirection direction, uint64 count)
void ExecSimpleRelationInsert(ResultRelInfo *resultRelInfo, EState *estate, TupleTableSlot *slot)
AttrNumber ExecFindJunkAttribute(JunkFilter *junkfilter, const char *attrName)
PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook
void ExecutorRewind(QueryDesc *queryDesc)
void do_text_output_multiline(TupOutputState *tstate, const char *txt)
void ExecShutdownNode(PlanState *node)
void ExecAssignExprContext(EState *estate, PlanState *planstate)
ExprState * ExecPrepareQual(List *qual, EState *estate)
AttrNumber ExecRelGenVirtualNotNull(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, List *notnull_virtual_attrs)
SetExprState * ExecInitTableFunctionResult(Expr *expr, ExprContext *econtext, PlanState *parent)
ExprState * ExecInitQual(List *qual, PlanState *parent)
TupleTableSlot * EvalPlanQual(EPQState *epqstate, Relation relation, Index rti, TupleTableSlot *inputslot)
void ExecAssignProjectionInfo(PlanState *planstate, TupleDesc inputDesc)
static bool ExecQual(ExprState *state, ExprContext *econtext)
ExprContext * MakePerTupleExprContext(EState *estate)
void UnregisterExprContextCallback(ExprContext *econtext, ExprContextCallbackFunction function, Datum arg)
void ExecAssignScanType(ScanState *scanstate, TupleDesc tupDesc)
bool(* ExecScanRecheckMtd)(ScanState *node, TupleTableSlot *slot)
const TupleTableSlotOps * ExecGetCommonChildSlotOps(PlanState *ps)
TupleTableSlot * ExecInitExtraTupleSlot(EState *estate, TupleDesc tupledesc, const TupleTableSlotOps *tts_ops)
bool(* ExecutorCheckPerms_hook_type)(List *rangeTable, List *rtePermInfos, bool ereport_on_violation)
bool(* ExecutorStart_hook_type)(QueryDesc *queryDesc, int eflags)
uint32 TupleHashTableHash(TupleHashTable hashtable, TupleTableSlot *slot)
bool EvalPlanQualFetchRowMark(EPQState *epqstate, Index rti, TupleTableSlot *slot)
List * ExecInitExprList(List *nodes, PlanState *parent)
void ExecConditionalAssignProjectionInfo(PlanState *planstate, TupleDesc inputDesc, int varno)
bool standard_ExecutorStart(QueryDesc *queryDesc, int eflags)
void(* ExecutorEnd_hook_type)(QueryDesc *queryDesc)
void ExecInitResultTupleSlotTL(PlanState *planstate, const TupleTableSlotOps *tts_ops)
void ExecCloseIndices(ResultRelInfo *resultRelInfo)
void RegisterExprContextCallback(ExprContext *econtext, ExprContextCallbackFunction function, Datum arg)
static bool ExecQualAndReset(ExprState *state, ExprContext *econtext)
ExprState * ExecInitExprWithParams(Expr *node, ParamListInfo ext_params)
void ExecAssignScanProjectionInfo(ScanState *node)
int ExecTargetListLength(List *targetlist)
ProjectionInfo * ExecBuildUpdateProjection(List *targetList, bool evalTargetList, List *targetColnos, TupleDesc relDesc, ExprContext *econtext, TupleTableSlot *slot, PlanState *parent)
void FreeExecutorState(EState *estate)
struct TupOutputState TupOutputState
static size_t TupleHashEntrySize(void)
bool ExecRelationIsTargetRelation(EState *estate, Index scanrelid)
ExprState * ExecBuildGroupingEqual(TupleDesc ldesc, TupleDesc rdesc, const TupleTableSlotOps *lops, const TupleTableSlotOps *rops, int numCols, const AttrNumber *keyColIdx, const Oid *eqfunctions, const Oid *collations, PlanState *parent)
TupleHashEntry FindTupleHashEntry(TupleHashTable hashtable, TupleTableSlot *slot, ExprState *eqcomp, ExprState *hashexpr)
void ExecCloseResultRelations(EState *estate)
static TupleTableSlot * ExecProcNode(PlanState *node)
TupleTableSlot * ExecGetAllNullSlot(EState *estate, ResultRelInfo *relInfo)
bool ExecMaterializesOutput(NodeTag plantype)
void ExecOpenIndices(ResultRelInfo *resultRelInfo, bool speculative)
int ExecCleanTargetListLength(List *targetlist)
ExprContext * CreateWorkExprContext(EState *estate)
static bool ExecPlanStillValid(EState *estate)
TupOutputState * begin_tup_output_tupdesc(DestReceiver *dest, TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
TupleTableSlot *(* ExecScanAccessMtd)(ScanState *node)
void UpdateChangedParamSet(PlanState *node, Bitmapset *newchg)
void ExecScanReScan(ScanState *node)
bool ExecSupportsBackwardScan(Plan *node)
const TupleTableSlotOps * ExecGetResultSlotOps(PlanState *planstate, bool *isfixed)
Datum GetAttributeByName(HeapTupleHeader tuple, const char *attname, bool *isNull)
TupleHashTable BuildTupleHashTable(PlanState *parent, TupleDesc inputDesc, const TupleTableSlotOps *inputOps, int numCols, AttrNumber *keyColIdx, const Oid *eqfuncoids, FmgrInfo *hashfunctions, Oid *collations, long nbuckets, Size additionalsize, MemoryContext metacxt, MemoryContext tablecxt, MemoryContext tempcxt, bool use_variable_hash_iv)
PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook
bool ExecCheckIndexConstraints(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, ItemPointer conflictTid, ItemPointer tupleid, List *arbiterIndexes)
Bitmapset * ExecGetAllUpdatedCols(ResultRelInfo *relinfo, EState *estate)
void ExecReScan(PlanState *node)
static void ExecEvalExprNoReturn(ExprState *state, ExprContext *econtext)
PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook
TupleDesc ExecTypeFromExprList(List *exprList)
List * ExecInsertIndexTuples(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, bool update, bool noDupErr, bool *specConflict, List *arbiterIndexes, bool onlySummarizing)
TupleDesc ExecTypeFromTL(List *targetList)
void standard_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count)
static Datum ExecEvalExpr(ExprState *state, ExprContext *econtext, bool *isNull)
bool execCurrentOf(CurrentOfExpr *cexpr, ExprContext *econtext, Oid table_oid, ItemPointer current_tid)
void ResetTupleHashTable(TupleHashTable hashtable)
List * ExecPrepareExprList(List *nodes, EState *estate)
void standard_ExecutorEnd(QueryDesc *queryDesc)
void ExecRestrPos(PlanState *node)
static void ExecEvalExprNoReturnSwitchContext(ExprState *state, ExprContext *econtext)
void ExecCloseRangeTableRelations(EState *estate)
static Datum ExecEvalExprSwitchContext(ExprState *state, ExprContext *econtext, bool *isNull)
void check_exclusion_constraint(Relation heap, Relation index, IndexInfo *indexInfo, ItemPointer tupleid, const Datum *values, const bool *isnull, EState *estate, bool newIndex)
void ExecSetExecProcNode(PlanState *node, ExecProcNodeMtd function)
void ExecPartitionCheckEmitError(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate)
ExprState * ExecBuildParamSetEqual(TupleDesc desc, const TupleTableSlotOps *lops, const TupleTableSlotOps *rops, const Oid *eqfunctions, const Oid *collations, const List *param_exprs, PlanState *parent)
void ExecConstraints(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate)
TupleTableSlot * ExecInitNullTupleSlot(EState *estate, TupleDesc tupType, const TupleTableSlotOps *tts_ops)
TupleTableSlot * ExecGetReturningSlot(EState *estate, ResultRelInfo *relInfo)
Relation ExecOpenScanRelation(EState *estate, Index scanrelid, int eflags)
bool ExecCheckPermissions(List *rangeTable, List *rteperminfos, bool ereport_on_violation)
static Datum ExecGetJunkAttribute(TupleTableSlot *slot, AttrNumber attno, bool *isNull)
void ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count)
Oid ExecGetResultRelCheckAsUser(ResultRelInfo *relInfo, EState *estate)
ExprState * ExecBuildHash32Expr(TupleDesc desc, const TupleTableSlotOps *ops, const Oid *hashfunc_oids, const List *collations, const List *hash_exprs, const bool *opstrict, PlanState *parent, uint32 init_value, bool keep_nulls)
EState * CreateExecutorState(void)
ExprState * ExecPrepareCheck(List *qual, EState *estate)
List * ExecGetAncestorResultRels(EState *estate, ResultRelInfo *resultRelInfo)
TupleTableSlot * EvalPlanQualNext(EPQState *epqstate)
void standard_ExecutorFinish(QueryDesc *queryDesc)
Assert(PointerIsAligned(start, uint64))
void MemoryContextReset(MemoryContext context)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
on_exit_nicely_callback function
static void * list_nth(const List *list, int n)
static bool CachedPlanRequiresLocking(CachedPlan *cplan)
static bool CachedPlanValid(CachedPlan *cplan)
static bool DatumGetBool(Datum X)
static unsigned hash(unsigned *uv, int n)
CachedPlan * es_cachedplan
MemoryContext ecxt_per_tuple_memory
ExecProcNodeMtd ExecProcNode
ExprContext * pi_exprContext
TupleDesc tts_tupleDescriptor
static Datum slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)