PostgreSQL Source Code git master
Loading...
Searching...
No Matches
execProcnode.c File Reference
#include "postgres.h"
#include "executor/executor.h"
#include "executor/instrument.h"
#include "executor/nodeAgg.h"
#include "executor/nodeAppend.h"
#include "executor/nodeBitmapAnd.h"
#include "executor/nodeBitmapHeapscan.h"
#include "executor/nodeBitmapIndexscan.h"
#include "executor/nodeBitmapOr.h"
#include "executor/nodeCtescan.h"
#include "executor/nodeCustom.h"
#include "executor/nodeForeignscan.h"
#include "executor/nodeFunctionscan.h"
#include "executor/nodeGather.h"
#include "executor/nodeGatherMerge.h"
#include "executor/nodeGroup.h"
#include "executor/nodeHash.h"
#include "executor/nodeHashjoin.h"
#include "executor/nodeIncrementalSort.h"
#include "executor/nodeIndexonlyscan.h"
#include "executor/nodeIndexscan.h"
#include "executor/nodeLimit.h"
#include "executor/nodeLockRows.h"
#include "executor/nodeMaterial.h"
#include "executor/nodeMemoize.h"
#include "executor/nodeMergeAppend.h"
#include "executor/nodeMergejoin.h"
#include "executor/nodeModifyTable.h"
#include "executor/nodeNamedtuplestorescan.h"
#include "executor/nodeNestloop.h"
#include "executor/nodeProjectSet.h"
#include "executor/nodeRecursiveunion.h"
#include "executor/nodeResult.h"
#include "executor/nodeSamplescan.h"
#include "executor/nodeSeqscan.h"
#include "executor/nodeSetOp.h"
#include "executor/nodeSort.h"
#include "executor/nodeSubplan.h"
#include "executor/nodeSubqueryscan.h"
#include "executor/nodeTableFuncscan.h"
#include "executor/nodeTidrangescan.h"
#include "executor/nodeTidscan.h"
#include "executor/nodeUnique.h"
#include "executor/nodeValuesscan.h"
#include "executor/nodeWindowAgg.h"
#include "executor/nodeWorktablescan.h"
#include "miscadmin.h"
#include "nodes/nodeFuncs.h"
Include dependency graph for execProcnode.c:

Go to the source code of this file.

Functions

static TupleTableSlotExecProcNodeFirst (PlanState *node)
 
static bool ExecShutdownNode_walker (PlanState *node, void *context)
 
PlanStateExecInitNode (Plan *node, EState *estate, int eflags)
 
void ExecSetExecProcNode (PlanState *node, ExecProcNodeMtd function)
 
NodeMultiExecProcNode (PlanState *node)
 
void ExecEndNode (PlanState *node)
 
void ExecShutdownNode (PlanState *node)
 
void ExecSetTupleBound (int64 tuples_needed, PlanState *child_node)
 

Function Documentation

◆ ExecEndNode()

void ExecEndNode ( PlanState node)

Definition at line 543 of file execProcnode.c.

544{
545 /*
546 * do nothing when we get to the end of a leaf on tree.
547 */
548 if (node == NULL)
549 return;
550
551 /*
552 * Make sure there's enough stack available. Need to check here, in
553 * addition to ExecProcNode() (via ExecProcNodeFirst()), because it's not
554 * guaranteed that ExecProcNode() is reached for all nodes.
555 */
557
558 if (node->chgParam != NULL)
559 {
560 bms_free(node->chgParam);
561 node->chgParam = NULL;
562 }
563
564 switch (nodeTag(node))
565 {
566 /*
567 * control nodes
568 */
569 case T_ResultState:
570 ExecEndResult((ResultState *) node);
571 break;
572
575 break;
576
579 break;
580
581 case T_AppendState:
582 ExecEndAppend((AppendState *) node);
583 break;
584
587 break;
588
591 break;
592
593 case T_BitmapAndState:
595 break;
596
597 case T_BitmapOrState:
599 break;
600
601 /*
602 * scan nodes
603 */
604 case T_SeqScanState:
606 break;
607
610 break;
611
612 case T_GatherState:
613 ExecEndGather((GatherState *) node);
614 break;
615
618 break;
619
620 case T_IndexScanState:
622 break;
623
626 break;
627
630 break;
631
634 break;
635
636 case T_TidScanState:
638 break;
639
642 break;
643
646 break;
647
650 break;
651
654 break;
655
656 case T_CteScanState:
658 break;
659
662 break;
663
666 break;
667
668 /*
669 * join nodes
670 */
671 case T_NestLoopState:
673 break;
674
675 case T_MergeJoinState:
677 break;
678
679 case T_HashJoinState:
681 break;
682
683 /*
684 * materialization nodes
685 */
686 case T_MaterialState:
688 break;
689
690 case T_SortState:
691 ExecEndSort((SortState *) node);
692 break;
693
696 break;
697
698 case T_MemoizeState:
700 break;
701
702 case T_GroupState:
703 ExecEndGroup((GroupState *) node);
704 break;
705
706 case T_AggState:
707 ExecEndAgg((AggState *) node);
708 break;
709
710 case T_WindowAggState:
712 break;
713
714 case T_UniqueState:
715 ExecEndUnique((UniqueState *) node);
716 break;
717
718 case T_HashState:
719 ExecEndHash((HashState *) node);
720 break;
721
722 case T_SetOpState:
723 ExecEndSetOp((SetOpState *) node);
724 break;
725
726 case T_LockRowsState:
728 break;
729
730 case T_LimitState:
731 ExecEndLimit((LimitState *) node);
732 break;
733
734 /* No clean up actions for these nodes. */
738 break;
739
740 default:
741 elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node));
742 break;
743 }
744}
void bms_free(Bitmapset *a)
Definition bitmapset.c:239
#define ERROR
Definition elog.h:40
#define elog(elevel,...)
Definition elog.h:228
void ExecEndAgg(AggState *node)
Definition nodeAgg.c:4396
void ExecEndAppend(AppendState *node)
Definition nodeAppend.c:403
void ExecEndBitmapAnd(BitmapAndState *node)
void ExecEndBitmapHeapScan(BitmapHeapScanState *node)
void ExecEndBitmapIndexScan(BitmapIndexScanState *node)
void ExecEndBitmapOr(BitmapOrState *node)
void ExecEndCteScan(CteScanState *node)
void ExecEndCustomScan(CustomScanState *node)
Definition nodeCustom.c:125
void ExecEndForeignScan(ForeignScanState *node)
void ExecEndFunctionScan(FunctionScanState *node)
void ExecEndGatherMerge(GatherMergeState *node)
void ExecEndGather(GatherState *node)
Definition nodeGather.c:252
void ExecEndGroup(GroupState *node)
Definition nodeGroup.c:227
void ExecEndHash(HashState *node)
Definition nodeHash.c:452
void ExecEndHashJoin(HashJoinState *node)
void ExecEndIncrementalSort(IncrementalSortState *node)
void ExecEndIndexOnlyScan(IndexOnlyScanState *node)
void ExecEndIndexScan(IndexScanState *node)
void ExecEndLimit(LimitState *node)
Definition nodeLimit.c:534
void ExecEndLockRows(LockRowsState *node)
void ExecEndMaterial(MaterialState *node)
void ExecEndMemoize(MemoizeState *node)
void ExecEndMergeAppend(MergeAppendState *node)
void ExecEndMergeJoin(MergeJoinState *node)
void ExecEndModifyTable(ModifyTableState *node)
void ExecEndNestLoop(NestLoopState *node)
void ExecEndProjectSet(ProjectSetState *node)
void ExecEndRecursiveUnion(RecursiveUnionState *node)
void ExecEndResult(ResultState *node)
Definition nodeResult.c:240
void ExecEndSampleScan(SampleScanState *node)
void ExecEndSeqScan(SeqScanState *node)
void ExecEndSetOp(SetOpState *node)
Definition nodeSetOp.c:692
void ExecEndSort(SortState *node)
Definition nodeSort.c:301
void ExecEndSubqueryScan(SubqueryScanState *node)
void ExecEndTableFuncScan(TableFuncScanState *node)
void ExecEndTidRangeScan(TidRangeScanState *node)
void ExecEndTidScan(TidScanState *node)
void ExecEndUnique(UniqueState *node)
Definition nodeUnique.c:168
void ExecEndWindowAgg(WindowAggState *node)
#define nodeTag(nodeptr)
Definition nodes.h:139
static int fb(int x)
void check_stack_depth(void)
Definition stack_depth.c:95
Bitmapset * chgParam
Definition execnodes.h:1235

References bms_free(), check_stack_depth(), PlanState::chgParam, elog, ERROR, ExecEndAgg(), ExecEndAppend(), ExecEndBitmapAnd(), ExecEndBitmapHeapScan(), ExecEndBitmapIndexScan(), ExecEndBitmapOr(), ExecEndCteScan(), ExecEndCustomScan(), ExecEndForeignScan(), ExecEndFunctionScan(), ExecEndGather(), ExecEndGatherMerge(), ExecEndGroup(), ExecEndHash(), ExecEndHashJoin(), ExecEndIncrementalSort(), ExecEndIndexOnlyScan(), ExecEndIndexScan(), ExecEndLimit(), ExecEndLockRows(), ExecEndMaterial(), ExecEndMemoize(), ExecEndMergeAppend(), ExecEndMergeJoin(), ExecEndModifyTable(), ExecEndNestLoop(), ExecEndProjectSet(), ExecEndRecursiveUnion(), ExecEndResult(), ExecEndSampleScan(), ExecEndSeqScan(), ExecEndSetOp(), ExecEndSort(), ExecEndSubqueryScan(), ExecEndTableFuncScan(), ExecEndTidRangeScan(), ExecEndTidScan(), ExecEndUnique(), ExecEndWindowAgg(), fb(), and nodeTag.

Referenced by EvalPlanQualEnd(), ExecEndAgg(), ExecEndAppend(), ExecEndBitmapAnd(), ExecEndBitmapHeapScan(), ExecEndBitmapOr(), ExecEndForeignScan(), ExecEndGather(), ExecEndGatherMerge(), ExecEndGroup(), ExecEndHash(), ExecEndHashJoin(), ExecEndIncrementalSort(), ExecEndLimit(), ExecEndLockRows(), ExecEndMaterial(), ExecEndMemoize(), ExecEndMergeAppend(), ExecEndMergeJoin(), ExecEndModifyTable(), ExecEndNestLoop(), ExecEndPlan(), ExecEndProjectSet(), ExecEndRecursiveUnion(), ExecEndResult(), ExecEndSetOp(), ExecEndSort(), ExecEndSubqueryScan(), ExecEndUnique(), and ExecEndWindowAgg().

◆ ExecInitNode()

PlanState * ExecInitNode ( Plan node,
EState estate,
int  eflags 
)

Definition at line 142 of file execProcnode.c.

143{
145 List *subps;
146 ListCell *l;
147
148 /*
149 * do nothing when we get to the end of a leaf on tree.
150 */
151 if (node == NULL)
152 return NULL;
153
154 /*
155 * Make sure there's enough stack available. Need to check here, in
156 * addition to ExecProcNode() (via ExecProcNodeFirst()), to ensure the
157 * stack isn't overrun while initializing the node tree.
158 */
160
161 switch (nodeTag(node))
162 {
163 /*
164 * control nodes
165 */
166 case T_Result:
167 result = (PlanState *) ExecInitResult((Result *) node,
168 estate, eflags);
169 break;
170
171 case T_ProjectSet:
173 estate, eflags);
174 break;
175
176 case T_ModifyTable:
178 estate, eflags);
179 break;
180
181 case T_Append:
182 result = (PlanState *) ExecInitAppend((Append *) node,
183 estate, eflags);
184 break;
185
186 case T_MergeAppend:
188 estate, eflags);
189 break;
190
191 case T_RecursiveUnion:
193 estate, eflags);
194 break;
195
196 case T_BitmapAnd:
198 estate, eflags);
199 break;
200
201 case T_BitmapOr:
203 estate, eflags);
204 break;
205
206 /*
207 * scan nodes
208 */
209 case T_SeqScan:
211 estate, eflags);
212 break;
213
214 case T_SampleScan:
216 estate, eflags);
217 break;
218
219 case T_IndexScan:
221 estate, eflags);
222 break;
223
224 case T_IndexOnlyScan:
226 estate, eflags);
227 break;
228
231 estate, eflags);
232 break;
233
234 case T_BitmapHeapScan:
236 estate, eflags);
237 break;
238
239 case T_TidScan:
241 estate, eflags);
242 break;
243
244 case T_TidRangeScan:
246 estate, eflags);
247 break;
248
249 case T_SubqueryScan:
251 estate, eflags);
252 break;
253
254 case T_FunctionScan:
256 estate, eflags);
257 break;
258
259 case T_TableFuncScan:
261 estate, eflags);
262 break;
263
264 case T_ValuesScan:
266 estate, eflags);
267 break;
268
269 case T_CteScan:
271 estate, eflags);
272 break;
273
276 estate, eflags);
277 break;
278
279 case T_WorkTableScan:
281 estate, eflags);
282 break;
283
284 case T_ForeignScan:
286 estate, eflags);
287 break;
288
289 case T_CustomScan:
291 estate, eflags);
292 break;
293
294 /*
295 * join nodes
296 */
297 case T_NestLoop:
299 estate, eflags);
300 break;
301
302 case T_MergeJoin:
304 estate, eflags);
305 break;
306
307 case T_HashJoin:
309 estate, eflags);
310 break;
311
312 /*
313 * materialization nodes
314 */
315 case T_Material:
317 estate, eflags);
318 break;
319
320 case T_Sort:
321 result = (PlanState *) ExecInitSort((Sort *) node,
322 estate, eflags);
323 break;
324
327 estate, eflags);
328 break;
329
330 case T_Memoize:
331 result = (PlanState *) ExecInitMemoize((Memoize *) node, estate,
332 eflags);
333 break;
334
335 case T_Group:
336 result = (PlanState *) ExecInitGroup((Group *) node,
337 estate, eflags);
338 break;
339
340 case T_Agg:
341 result = (PlanState *) ExecInitAgg((Agg *) node,
342 estate, eflags);
343 break;
344
345 case T_WindowAgg:
347 estate, eflags);
348 break;
349
350 case T_Unique:
351 result = (PlanState *) ExecInitUnique((Unique *) node,
352 estate, eflags);
353 break;
354
355 case T_Gather:
356 result = (PlanState *) ExecInitGather((Gather *) node,
357 estate, eflags);
358 break;
359
360 case T_GatherMerge:
362 estate, eflags);
363 break;
364
365 case T_Hash:
366 result = (PlanState *) ExecInitHash((Hash *) node,
367 estate, eflags);
368 break;
369
370 case T_SetOp:
371 result = (PlanState *) ExecInitSetOp((SetOp *) node,
372 estate, eflags);
373 break;
374
375 case T_LockRows:
377 estate, eflags);
378 break;
379
380 case T_Limit:
381 result = (PlanState *) ExecInitLimit((Limit *) node,
382 estate, eflags);
383 break;
384
385 default:
386 elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node));
387 result = NULL; /* keep compiler quiet */
388 break;
389 }
390
391 ExecSetExecProcNode(result, result->ExecProcNode);
392
393 /*
394 * Initialize any initPlans present in this node. The planner put them in
395 * a separate list for us.
396 *
397 * The defining characteristic of initplans is that they don't have
398 * arguments, so we don't need to evaluate them (in contrast to
399 * ExecInitSubPlanExpr()).
400 */
401 subps = NIL;
402 foreach(l, node->initPlan)
403 {
404 SubPlan *subplan = (SubPlan *) lfirst(l);
405 SubPlanState *sstate;
406
407 Assert(IsA(subplan, SubPlan));
408 Assert(subplan->args == NIL);
409 sstate = ExecInitSubPlan(subplan, result);
410 subps = lappend(subps, sstate);
411 }
412 result->initPlan = subps;
413
414 /* Set up instrumentation for this node if requested */
415 if (estate->es_instrument)
416 result->instrument = InstrAllocNode(estate->es_instrument,
417 result->async_capable);
418
419 return result;
420}
#define Assert(condition)
Definition c.h:943
uint32 result
void ExecSetExecProcNode(PlanState *node, ExecProcNodeMtd function)
NodeInstrumentation * InstrAllocNode(int instrument_options, bool async_mode)
Definition instrument.c:112
List * lappend(List *list, void *datum)
Definition list.c:339
AggState * ExecInitAgg(Agg *node, EState *estate, int eflags)
Definition nodeAgg.c:3281
AppendState * ExecInitAppend(Append *node, EState *estate, int eflags)
Definition nodeAppend.c:111
BitmapAndState * ExecInitBitmapAnd(BitmapAnd *node, EState *estate, int eflags)
BitmapHeapScanState * ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
BitmapIndexScanState * ExecInitBitmapIndexScan(BitmapIndexScan *node, EState *estate, int eflags)
BitmapOrState * ExecInitBitmapOr(BitmapOr *node, EState *estate, int eflags)
CteScanState * ExecInitCteScan(CteScan *node, EState *estate, int eflags)
CustomScanState * ExecInitCustomScan(CustomScan *cscan, EState *estate, int eflags)
Definition nodeCustom.c:26
ForeignScanState * ExecInitForeignScan(ForeignScan *node, EState *estate, int eflags)
FunctionScanState * ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags)
GatherMergeState * ExecInitGatherMerge(GatherMerge *node, EState *estate, int eflags)
GatherState * ExecInitGather(Gather *node, EState *estate, int eflags)
Definition nodeGather.c:54
GroupState * ExecInitGroup(Group *node, EState *estate, int eflags)
Definition nodeGroup.c:162
HashState * ExecInitHash(Hash *node, EState *estate, int eflags)
Definition nodeHash.c:399
HashJoinState * ExecInitHashJoin(HashJoin *node, EState *estate, int eflags)
IncrementalSortState * ExecInitIncrementalSort(IncrementalSort *node, EState *estate, int eflags)
IndexOnlyScanState * ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags)
IndexScanState * ExecInitIndexScan(IndexScan *node, EState *estate, int eflags)
LimitState * ExecInitLimit(Limit *node, EState *estate, int eflags)
Definition nodeLimit.c:447
LockRowsState * ExecInitLockRows(LockRows *node, EState *estate, int eflags)
MaterialState * ExecInitMaterial(Material *node, EState *estate, int eflags)
MemoizeState * ExecInitMemoize(Memoize *node, EState *estate, int eflags)
MergeAppendState * ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
MergeJoinState * ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
ModifyTableState * ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
NamedTuplestoreScanState * ExecInitNamedTuplestoreScan(NamedTuplestoreScan *node, EState *estate, int eflags)
NestLoopState * ExecInitNestLoop(NestLoop *node, EState *estate, int eflags)
ProjectSetState * ExecInitProjectSet(ProjectSet *node, EState *estate, int eflags)
RecursiveUnionState * ExecInitRecursiveUnion(RecursiveUnion *node, EState *estate, int eflags)
ResultState * ExecInitResult(Result *node, EState *estate, int eflags)
Definition nodeResult.c:180
SampleScanState * ExecInitSampleScan(SampleScan *node, EState *estate, int eflags)
SeqScanState * ExecInitSeqScan(SeqScan *node, EState *estate, int eflags)
SetOpState * ExecInitSetOp(SetOp *node, EState *estate, int eflags)
Definition nodeSetOp.c:573
SortState * ExecInitSort(Sort *node, EState *estate, int eflags)
Definition nodeSort.c:221
SubPlanState * ExecInitSubPlan(SubPlan *subplan, PlanState *parent)
SubqueryScanState * ExecInitSubqueryScan(SubqueryScan *node, EState *estate, int eflags)
TableFuncScanState * ExecInitTableFuncScan(TableFuncScan *node, EState *estate, int eflags)
TidRangeScanState * ExecInitTidRangeScan(TidRangeScan *node, EState *estate, int eflags)
TidScanState * ExecInitTidScan(TidScan *node, EState *estate, int eflags)
UniqueState * ExecInitUnique(Unique *node, EState *estate, int eflags)
Definition nodeUnique.c:114
ValuesScanState * ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags)
WindowAggState * ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
WorkTableScanState * ExecInitWorkTableScan(WorkTableScan *node, EState *estate, int eflags)
#define IsA(nodeptr, _type_)
Definition nodes.h:164
#define lfirst(lc)
Definition pg_list.h:172
#define NIL
Definition pg_list.h:68
Definition pg_list.h:54
List * initPlan
Definition plannodes.h:242
List * args
Definition primnodes.h:1125

References SubPlan::args, Assert, check_stack_depth(), elog, ERROR, EState::es_instrument, ExecInitAgg(), ExecInitAppend(), ExecInitBitmapAnd(), ExecInitBitmapHeapScan(), ExecInitBitmapIndexScan(), ExecInitBitmapOr(), ExecInitCteScan(), ExecInitCustomScan(), ExecInitForeignScan(), ExecInitFunctionScan(), ExecInitGather(), ExecInitGatherMerge(), ExecInitGroup(), ExecInitHash(), ExecInitHashJoin(), ExecInitIncrementalSort(), ExecInitIndexOnlyScan(), ExecInitIndexScan(), ExecInitLimit(), ExecInitLockRows(), ExecInitMaterial(), ExecInitMemoize(), ExecInitMergeAppend(), ExecInitMergeJoin(), ExecInitModifyTable(), ExecInitNamedTuplestoreScan(), ExecInitNestLoop(), ExecInitProjectSet(), ExecInitRecursiveUnion(), ExecInitResult(), ExecInitSampleScan(), ExecInitSeqScan(), ExecInitSetOp(), ExecInitSort(), ExecInitSubPlan(), ExecInitSubqueryScan(), ExecInitTableFuncScan(), ExecInitTidRangeScan(), ExecInitTidScan(), ExecInitUnique(), ExecInitValuesScan(), ExecInitWindowAgg(), ExecInitWorkTableScan(), ExecSetExecProcNode(), fb(), Plan::initPlan, InstrAllocNode(), IsA, lappend(), lfirst, NIL, nodeTag, and result.

Referenced by EvalPlanQualStart(), ExecInitAgg(), ExecInitAppend(), ExecInitBitmapAnd(), ExecInitBitmapHeapScan(), ExecInitBitmapOr(), ExecInitForeignScan(), ExecInitGather(), ExecInitGatherMerge(), ExecInitGroup(), ExecInitHash(), ExecInitHashJoin(), ExecInitIncrementalSort(), ExecInitLimit(), ExecInitLockRows(), ExecInitMaterial(), ExecInitMemoize(), ExecInitMergeAppend(), ExecInitMergeJoin(), ExecInitModifyTable(), ExecInitNestLoop(), ExecInitProjectSet(), ExecInitRecursiveUnion(), ExecInitResult(), ExecInitSetOp(), ExecInitSort(), ExecInitSubqueryScan(), ExecInitUnique(), ExecInitWindowAgg(), and InitPlan().

◆ ExecProcNodeFirst()

static TupleTableSlot * ExecProcNodeFirst ( PlanState node)
static

Definition at line 448 of file execProcnode.c.

449{
450 /*
451 * Perform stack depth check during the first execution of the node. We
452 * only do so the first time round because it turns out to not be cheap on
453 * some common architectures (eg. x86). This relies on the assumption
454 * that ExecProcNode calls for a given plan node will always be made at
455 * roughly the same stack depth.
456 */
458
459 /*
460 * If instrumentation is required, change the wrapper to one that just
461 * does instrumentation. Otherwise we can dispense with all wrappers and
462 * have ExecProcNode() directly call the relevant function from now on.
463 */
464 if (node->instrument)
466 else
467 node->ExecProcNode = node->ExecProcNodeReal;
468
469 return node->ExecProcNode(node);
470}
TupleTableSlot * ExecProcNodeInstr(PlanState *node)
Definition instrument.c:181
ExecProcNodeMtd ExecProcNodeReal
Definition execnodes.h:1208
NodeInstrumentation * instrument
Definition execnodes.h:1211
ExecProcNodeMtd ExecProcNode
Definition execnodes.h:1207

References check_stack_depth(), PlanState::ExecProcNode, ExecProcNodeInstr(), PlanState::ExecProcNodeReal, and PlanState::instrument.

Referenced by ExecSetExecProcNode().

◆ ExecSetExecProcNode()

void ExecSetExecProcNode ( PlanState node,
ExecProcNodeMtd  function 
)

Definition at line 430 of file execProcnode.c.

431{
432 /*
433 * Add a wrapper around the ExecProcNode callback that checks stack depth
434 * during the first execution and maybe adds an instrumentation wrapper.
435 * When the callback is changed after execution has already begun that
436 * means we'll superfluously execute ExecProcNodeFirst, but that seems ok.
437 */
440}
static TupleTableSlot * ExecProcNodeFirst(PlanState *node)
on_exit_nicely_callback function

References PlanState::ExecProcNode, ExecProcNodeFirst(), PlanState::ExecProcNodeReal, and function.

Referenced by ExecHashJoinInitializeDSM(), ExecHashJoinInitializeWorker(), and ExecInitNode().

◆ ExecSetTupleBound()

void ExecSetTupleBound ( int64  tuples_needed,
PlanState child_node 
)

Definition at line 829 of file execProcnode.c.

830{
831 /*
832 * Since this function recurses, in principle we should check stack depth
833 * here. In practice, it's probably pointless since the earlier node
834 * initialization tree traversal would surely have consumed more stack.
835 */
836
838 {
839 /*
840 * If it is a Sort node, notify it that it can use bounded sort.
841 *
842 * Note: it is the responsibility of nodeSort.c to react properly to
843 * changes of these parameters. If we ever redesign this, it'd be a
844 * good idea to integrate this signaling with the parameter-change
845 * mechanism.
846 */
848
849 if (tuples_needed < 0)
850 {
851 /* make sure flag gets reset if needed upon rescan */
852 sortState->bounded = false;
853 }
854 else
855 {
856 sortState->bounded = true;
857 sortState->bound = tuples_needed;
858 }
859 }
861 {
862 /*
863 * If it is an IncrementalSort node, notify it that it can use bounded
864 * sort.
865 *
866 * Note: it is the responsibility of nodeIncrementalSort.c to react
867 * properly to changes of these parameters. If we ever redesign this,
868 * it'd be a good idea to integrate this signaling with the
869 * parameter-change mechanism.
870 */
872
873 if (tuples_needed < 0)
874 {
875 /* make sure flag gets reset if needed upon rescan */
876 sortState->bounded = false;
877 }
878 else
879 {
880 sortState->bounded = true;
881 sortState->bound = tuples_needed;
882 }
883 }
884 else if (IsA(child_node, AppendState))
885 {
886 /*
887 * If it is an Append, we can apply the bound to any nodes that are
888 * children of the Append, since the Append surely need read no more
889 * than that many tuples from any one input.
890 */
892 int i;
893
894 for (i = 0; i < aState->as_nplans; i++)
895 ExecSetTupleBound(tuples_needed, aState->appendplans[i]);
896 }
898 {
899 /*
900 * If it is a MergeAppend, we can apply the bound to any nodes that
901 * are children of the MergeAppend, since the MergeAppend surely need
902 * read no more than that many tuples from any one input.
903 */
905 int i;
906
907 for (i = 0; i < maState->ms_nplans; i++)
908 ExecSetTupleBound(tuples_needed, maState->mergeplans[i]);
909 }
910 else if (IsA(child_node, ResultState))
911 {
912 /*
913 * Similarly, for a projecting Result, we can apply the bound to its
914 * child node.
915 *
916 * If Result supported qual checking, we'd have to punt on seeing a
917 * qual. Note that having a resconstantqual is not a showstopper: if
918 * that condition succeeds it affects nothing, while if it fails, no
919 * rows will be demanded from the Result child anyway.
920 */
923 }
925 {
926 /*
927 * We can also descend through SubqueryScan, but only if it has no
928 * qual (otherwise it might discard rows).
929 */
931
932 if (subqueryState->ss.ps.qual == NULL)
933 ExecSetTupleBound(tuples_needed, subqueryState->subplan);
934 }
935 else if (IsA(child_node, GatherState))
936 {
937 /*
938 * A Gather node can propagate the bound to its workers. As with
939 * MergeAppend, no one worker could possibly need to return more
940 * tuples than the Gather itself needs to.
941 *
942 * Note: As with Sort, the Gather node is responsible for reacting
943 * properly to changes to this parameter.
944 */
946
947 gstate->tuples_needed = tuples_needed;
948
949 /* Also pass down the bound to our own copy of the child plan */
951 }
953 {
954 /* Same comments as for Gather */
956
957 gstate->tuples_needed = tuples_needed;
958
960 }
961
962 /*
963 * In principle we could descend through any plan node type that is
964 * certain not to discard or combine input rows; but on seeing a node that
965 * can do that, we can't propagate the bound any further. For the moment
966 * it's unclear that any other cases are worth checking here.
967 */
968}
void ExecSetTupleBound(int64 tuples_needed, PlanState *child_node)
#define outerPlanState(node)
Definition execnodes.h:1299
int i
Definition isn.c:77
int64 tuples_needed
Definition execnodes.h:2644
bool bounded
Definition execnodes.h:2358

References SortState::bounded, IncrementalSortState::bounded, ExecSetTupleBound(), fb(), i, IsA, outerPlanState, GatherState::tuples_needed, and GatherMergeState::tuples_needed.

Referenced by ExecSetTupleBound(), ParallelQueryMain(), and recompute_limits().

◆ ExecShutdownNode()

void ExecShutdownNode ( PlanState node)

Definition at line 753 of file execProcnode.c.

754{
756}
static bool ExecShutdownNode_walker(PlanState *node, void *context)

References ExecShutdownNode_walker(), and fb().

Referenced by ExecutePlan().

◆ ExecShutdownNode_walker()

static bool ExecShutdownNode_walker ( PlanState node,
void context 
)
static

Definition at line 759 of file execProcnode.c.

760{
761 if (node == NULL)
762 return false;
763
765
766 /*
767 * Treat the node as running while we shut it down, but only if it's run
768 * at least once already. We don't expect much CPU consumption during
769 * node shutdown, but in the case of Gather or Gather Merge, we may shut
770 * down workers at this stage. If so, their buffer usage will get
771 * propagated into pgBufferUsage at this point, and we want to make sure
772 * that it gets associated with the Gather node. We skip this if the node
773 * has never been executed, so as to avoid incorrectly making it appear
774 * that it has.
775 */
776 if (node->instrument && node->instrument->running)
778
780
781 switch (nodeTag(node))
782 {
783 case T_GatherState:
785 break;
788 break;
791 break;
794 break;
795 case T_HashState:
796 ExecShutdownHash((HashState *) node);
797 break;
798 case T_HashJoinState:
800 break;
801 default:
802 break;
803 }
804
805 /* Stop the node if we started it above, reporting 0 tuples. */
806 if (node->instrument && node->instrument->running)
807 InstrStopNode(node->instrument, 0);
808
809 return false;
810}
void InstrStartNode(NodeInstrumentation *instr)
Definition instrument.c:132
void InstrStopNode(NodeInstrumentation *instr, double nTuples)
Definition instrument.c:139
void ExecShutdownCustomScan(CustomScanState *node)
Definition nodeCustom.c:221
void ExecShutdownForeignScan(ForeignScanState *node)
#define planstate_tree_walker(ps, w, c)
Definition nodeFuncs.h:179
void ExecShutdownGatherMerge(GatherMergeState *node)
void ExecShutdownGather(GatherState *node)
Definition nodeGather.c:419
void ExecShutdownHash(HashState *node)
Definition nodeHash.c:2889
void ExecShutdownHashJoin(HashJoinState *node)

References check_stack_depth(), ExecShutdownCustomScan(), ExecShutdownForeignScan(), ExecShutdownGather(), ExecShutdownGatherMerge(), ExecShutdownHash(), ExecShutdownHashJoin(), ExecShutdownNode_walker(), fb(), InstrStartNode(), InstrStopNode(), PlanState::instrument, nodeTag, planstate_tree_walker, and NodeInstrumentation::running.

Referenced by ExecShutdownNode(), and ExecShutdownNode_walker().

◆ MultiExecProcNode()

Node * MultiExecProcNode ( PlanState node)

Definition at line 488 of file execProcnode.c.

489{
490 Node *result;
491
493
495
496 if (node->chgParam != NULL) /* something changed */
497 ExecReScan(node); /* let ReScan handle this */
498
499 switch (nodeTag(node))
500 {
501 /*
502 * Only node types that actually support multiexec will be listed
503 */
504
505 case T_HashState:
506 result = MultiExecHash((HashState *) node);
507 break;
508
511 break;
512
513 case T_BitmapAndState:
515 break;
516
517 case T_BitmapOrState:
519 break;
520
521 default:
522 elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node));
523 result = NULL;
524 break;
525 }
526
527 return result;
528}
void ExecReScan(PlanState *node)
Definition execAmi.c:78
#define CHECK_FOR_INTERRUPTS()
Definition miscadmin.h:125
Node * MultiExecBitmapAnd(BitmapAndState *node)
Node * MultiExecBitmapIndexScan(BitmapIndexScanState *node)
Node * MultiExecBitmapOr(BitmapOrState *node)
Node * MultiExecHash(HashState *node)
Definition nodeHash.c:106
Definition nodes.h:135

References CHECK_FOR_INTERRUPTS, check_stack_depth(), PlanState::chgParam, elog, ERROR, ExecReScan(), fb(), MultiExecBitmapAnd(), MultiExecBitmapIndexScan(), MultiExecBitmapOr(), MultiExecHash(), nodeTag, and result.

Referenced by BitmapTableScanSetup(), ExecHashJoinImpl(), MultiExecBitmapAnd(), and MultiExecBitmapOr().