PostgreSQL Source Code git master
nodeWorktablescan.c File Reference
Include dependency graph for nodeWorktablescan.c:

Go to the source code of this file.

Functions

static TupleTableSlotWorkTableScanNext (WorkTableScanState *node)
 
static bool WorkTableScanRecheck (WorkTableScanState *node, TupleTableSlot *slot)
 
static TupleTableSlotExecWorkTableScan (PlanState *pstate)
 
WorkTableScanStateExecInitWorkTableScan (WorkTableScan *node, EState *estate, int eflags)
 
void ExecReScanWorkTableScan (WorkTableScanState *node)
 

Function Documentation

◆ ExecInitWorkTableScan()

WorkTableScanState * ExecInitWorkTableScan ( WorkTableScan node,
EState estate,
int  eflags 
)

Definition at line 130 of file nodeWorktablescan.c.

131{
132 WorkTableScanState *scanstate;
133
134 /* check for unsupported flags */
136
137 /*
138 * WorkTableScan should not have any children.
139 */
140 Assert(outerPlan(node) == NULL);
141 Assert(innerPlan(node) == NULL);
142
143 /*
144 * create new WorkTableScanState for node
145 */
146 scanstate = makeNode(WorkTableScanState);
147 scanstate->ss.ps.plan = (Plan *) node;
148 scanstate->ss.ps.state = estate;
149 scanstate->ss.ps.ExecProcNode = ExecWorkTableScan;
150 scanstate->rustate = NULL; /* we'll set this later */
151
152 /*
153 * Miscellaneous initialization
154 *
155 * create expression context for node
156 */
157 ExecAssignExprContext(estate, &scanstate->ss.ps);
158
159 /*
160 * tuple table initialization
161 */
162 ExecInitResultTypeTL(&scanstate->ss.ps);
163
164 /* signal that return type is not yet known */
165 scanstate->ss.ps.resultopsset = true;
166 scanstate->ss.ps.resultopsfixed = false;
167
168 ExecInitScanTupleSlot(estate, &scanstate->ss, NULL, &TTSOpsMinimalTuple);
169
170 /*
171 * initialize child expressions
172 */
173 scanstate->ss.ps.qual =
174 ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
175
176 /*
177 * Do not yet initialize projection info, see ExecWorkTableScan() for
178 * details.
179 */
180
181 return scanstate;
182}
#define Assert(condition)
Definition: c.h:815
ExprState * ExecInitQual(List *qual, PlanState *parent)
Definition: execExpr.c:229
void ExecInitScanTupleSlot(EState *estate, ScanState *scanstate, TupleDesc tupledesc, const TupleTableSlotOps *tts_ops)
Definition: execTuples.c:1998
void ExecInitResultTypeTL(PlanState *planstate)
Definition: execTuples.c:1942
const TupleTableSlotOps TTSOpsMinimalTuple
Definition: execTuples.c:86
void ExecAssignExprContext(EState *estate, PlanState *planstate)
Definition: execUtils.c:485
#define EXEC_FLAG_BACKWARD
Definition: executor.h:68
#define EXEC_FLAG_MARK
Definition: executor.h:69
static TupleTableSlot * ExecWorkTableScan(PlanState *pstate)
#define makeNode(_type_)
Definition: nodes.h:155
#define innerPlan(node)
Definition: plannodes.h:182
#define outerPlan(node)
Definition: plannodes.h:183
bool resultopsset
Definition: execnodes.h:1226
ExprState * qual
Definition: execnodes.h:1162
Plan * plan
Definition: execnodes.h:1141
EState * state
Definition: execnodes.h:1143
bool resultopsfixed
Definition: execnodes.h:1222
ExecProcNodeMtd ExecProcNode
Definition: execnodes.h:1147
PlanState ps
Definition: execnodes.h:1588
RecursiveUnionState * rustate
Definition: execnodes.h:2076

References Assert, EXEC_FLAG_BACKWARD, EXEC_FLAG_MARK, ExecAssignExprContext(), ExecInitQual(), ExecInitResultTypeTL(), ExecInitScanTupleSlot(), PlanState::ExecProcNode, ExecWorkTableScan(), innerPlan, makeNode, outerPlan, PlanState::plan, ScanState::ps, PlanState::qual, PlanState::resultopsfixed, PlanState::resultopsset, WorkTableScanState::rustate, WorkTableScan::scan, WorkTableScanState::ss, PlanState::state, and TTSOpsMinimalTuple.

Referenced by ExecInitNode().

◆ ExecReScanWorkTableScan()

void ExecReScanWorkTableScan ( WorkTableScanState node)

Definition at line 191 of file nodeWorktablescan.c.

192{
193 if (node->ss.ps.ps_ResultTupleSlot)
195
196 ExecScanReScan(&node->ss);
197
198 /* No need (or way) to rescan if ExecWorkTableScan not called yet */
199 if (node->rustate)
201}
void ExecScanReScan(ScanState *node)
Definition: execScan.c:108
TupleTableSlot * ps_ResultTupleSlot
Definition: execnodes.h:1179
Tuplestorestate * working_table
Definition: execnodes.h:1535
void tuplestore_rescan(Tuplestorestate *state)
Definition: tuplestore.c:1285
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
Definition: tuptable.h:454

References ExecClearTuple(), ExecScanReScan(), ScanState::ps, PlanState::ps_ResultTupleSlot, WorkTableScanState::rustate, WorkTableScanState::ss, tuplestore_rescan(), and RecursiveUnionState::working_table.

Referenced by ExecReScan().

◆ ExecWorkTableScan()

static TupleTableSlot * ExecWorkTableScan ( PlanState pstate)
static

Definition at line 81 of file nodeWorktablescan.c.

82{
84
85 /*
86 * On the first call, find the ancestor RecursiveUnion's state via the
87 * Param slot reserved for it. (We can't do this during node init because
88 * there are corner cases where we'll get the init call before the
89 * RecursiveUnion does.)
90 */
91 if (node->rustate == NULL)
92 {
94 EState *estate = node->ss.ps.state;
95 ParamExecData *param;
96
97 param = &(estate->es_param_exec_vals[plan->wtParam]);
98 Assert(param->execPlan == NULL);
99 Assert(!param->isnull);
100 node->rustate = castNode(RecursiveUnionState, DatumGetPointer(param->value));
101 Assert(node->rustate);
102
103 /*
104 * The scan tuple type (ie, the rowtype we expect to find in the work
105 * table) is the same as the result rowtype of the ancestor
106 * RecursiveUnion node. Note this depends on the assumption that
107 * RecursiveUnion doesn't allow projection.
108 */
109 ExecAssignScanType(&node->ss,
110 ExecGetResultType(&node->rustate->ps));
111
112 /*
113 * Now we can initialize the projection info. This must be completed
114 * before we can call ExecScan().
115 */
117 }
118
119 return ExecScan(&node->ss,
122}
TupleTableSlot * ExecScan(ScanState *node, ExecScanAccessMtd accessMtd, ExecScanRecheckMtd recheckMtd)
Definition: execScan.c:47
void ExecAssignScanProjectionInfo(ScanState *node)
Definition: execScan.c:81
TupleDesc ExecGetResultType(PlanState *planstate)
Definition: execUtils.c:495
void ExecAssignScanType(ScanState *scanstate, TupleDesc tupDesc)
Definition: execUtils.c:692
bool(* ExecScanRecheckMtd)(ScanState *node, TupleTableSlot *slot)
Definition: executor.h:487
TupleTableSlot *(* ExecScanAccessMtd)(ScanState *node)
Definition: executor.h:486
static TupleTableSlot * WorkTableScanNext(WorkTableScanState *node)
static bool WorkTableScanRecheck(WorkTableScanState *node, TupleTableSlot *slot)
#define castNode(_type_, nodeptr)
Definition: nodes.h:176
#define plan(x)
Definition: pg_regress.c:161
static Pointer DatumGetPointer(Datum X)
Definition: postgres.h:317

References Assert, castNode, DatumGetPointer(), ExecAssignScanProjectionInfo(), ExecAssignScanType(), ExecGetResultType(), ExecScan(), PlanState::plan, plan, RecursiveUnionState::ps, ScanState::ps, WorkTableScanState::rustate, WorkTableScanState::ss, PlanState::state, WorkTableScanNext(), and WorkTableScanRecheck().

Referenced by ExecInitWorkTableScan().

◆ WorkTableScanNext()

static TupleTableSlot * WorkTableScanNext ( WorkTableScanState node)
static

Definition at line 30 of file nodeWorktablescan.c.

31{
32 TupleTableSlot *slot;
33 Tuplestorestate *tuplestorestate;
34
35 /*
36 * get information from the estate and scan state
37 *
38 * Note: we intentionally do not support backward scan. Although it would
39 * take only a couple more lines here, it would force nodeRecursiveunion.c
40 * to create the tuplestore with backward scan enabled, which has a
41 * performance cost. In practice backward scan is never useful for a
42 * worktable plan node, since it cannot appear high enough in the plan
43 * tree of a scrollable cursor to be exposed to a backward-scan
44 * requirement. So it's not worth expending effort to support it.
45 *
46 * Note: we are also assuming that this node is the only reader of the
47 * worktable. Therefore, we don't need a private read pointer for the
48 * tuplestore, nor do we need to tell tuplestore_gettupleslot to copy.
49 */
51
52 tuplestorestate = node->rustate->working_table;
53
54 /*
55 * Get the next tuple from tuplestore. Return NULL if no more tuples.
56 */
57 slot = node->ss.ss_ScanTupleSlot;
58 (void) tuplestore_gettupleslot(tuplestorestate, true, false, slot);
59 return slot;
60}
#define ScanDirectionIsForward(direction)
Definition: sdir.h:64
ScanDirection es_direction
Definition: execnodes.h:647
TupleTableSlot * ss_ScanTupleSlot
Definition: execnodes.h:1591
bool tuplestore_gettupleslot(Tuplestorestate *state, bool forward, bool copy, TupleTableSlot *slot)
Definition: tuplestore.c:1130

References Assert, EState::es_direction, ScanState::ps, WorkTableScanState::rustate, ScanDirectionIsForward, WorkTableScanState::ss, ScanState::ss_ScanTupleSlot, PlanState::state, tuplestore_gettupleslot(), and RecursiveUnionState::working_table.

Referenced by ExecWorkTableScan().

◆ WorkTableScanRecheck()

static bool WorkTableScanRecheck ( WorkTableScanState node,
TupleTableSlot slot 
)
static

Definition at line 66 of file nodeWorktablescan.c.

67{
68 /* nothing to check */
69 return true;
70}

Referenced by ExecWorkTableScan().