PostgreSQL Source Code git master
nodeMaterial.h File Reference
#include "nodes/execnodes.h"
Include dependency graph for nodeMaterial.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

MaterialStateExecInitMaterial (Material *node, EState *estate, int eflags)
 
void ExecEndMaterial (MaterialState *node)
 
void ExecMaterialMarkPos (MaterialState *node)
 
void ExecMaterialRestrPos (MaterialState *node)
 
void ExecReScanMaterial (MaterialState *node)
 

Function Documentation

◆ ExecEndMaterial()

void ExecEndMaterial ( MaterialState node)

Definition at line 240 of file nodeMaterial.c.

241{
242 /*
243 * Release tuplestore resources
244 */
245 if (node->tuplestorestate != NULL)
247 node->tuplestorestate = NULL;
248
249 /*
250 * shut down the subplan
251 */
253}
void ExecEndNode(PlanState *node)
Definition: execProcnode.c:562
#define outerPlanState(node)
Definition: execnodes.h:1237
Tuplestorestate * tuplestorestate
Definition: execnodes.h:2275
void tuplestore_end(Tuplestorestate *state)
Definition: tuplestore.c:492

References ExecEndNode(), outerPlanState, tuplestore_end(), and MaterialState::tuplestorestate.

Referenced by ExecEndNode().

◆ ExecInitMaterial()

MaterialState * ExecInitMaterial ( Material node,
EState estate,
int  eflags 
)

Definition at line 164 of file nodeMaterial.c.

165{
166 MaterialState *matstate;
168
169 /*
170 * create state structure
171 */
172 matstate = makeNode(MaterialState);
173 matstate->ss.ps.plan = (Plan *) node;
174 matstate->ss.ps.state = estate;
175 matstate->ss.ps.ExecProcNode = ExecMaterial;
176
177 /*
178 * We must have a tuplestore buffering the subplan output to do backward
179 * scan or mark/restore. We also prefer to materialize the subplan output
180 * if we might be called on to rewind and replay it many times. However,
181 * if none of these cases apply, we can skip storing the data.
182 */
183 matstate->eflags = (eflags & (EXEC_FLAG_REWIND |
186
187 /*
188 * Tuplestore's interpretation of the flag bits is subtly different from
189 * the general executor meaning: it doesn't think BACKWARD necessarily
190 * means "backwards all the way to start". If told to support BACKWARD we
191 * must include REWIND in the tuplestore eflags, else tuplestore_trim
192 * might throw away too much.
193 */
194 if (eflags & EXEC_FLAG_BACKWARD)
195 matstate->eflags |= EXEC_FLAG_REWIND;
196
197 matstate->eof_underlying = false;
198 matstate->tuplestorestate = NULL;
199
200 /*
201 * Miscellaneous initialization
202 *
203 * Materialization nodes don't need ExprContexts because they never call
204 * ExecQual or ExecProject.
205 */
206
207 /*
208 * initialize child nodes
209 *
210 * We shield the child node from the need to support REWIND, BACKWARD, or
211 * MARK/RESTORE.
212 */
214
215 outerPlan = outerPlan(node);
216 outerPlanState(matstate) = ExecInitNode(outerPlan, estate, eflags);
217
218 /*
219 * Initialize result type and slot. No need to initialize projection info
220 * because this node doesn't do projections.
221 *
222 * material nodes only return tuples from their materialized relation.
223 */
225 matstate->ss.ps.ps_ProjInfo = NULL;
226
227 /*
228 * initialize tuple type.
229 */
231
232 return matstate;
233}
PlanState * ExecInitNode(Plan *node, EState *estate, int eflags)
Definition: execProcnode.c:142
void ExecInitResultTupleSlotTL(PlanState *planstate, const TupleTableSlotOps *tts_ops)
Definition: execTuples.c:1986
const TupleTableSlotOps TTSOpsMinimalTuple
Definition: execTuples.c:86
void ExecCreateScanSlotFromOuterPlan(EState *estate, ScanState *scanstate, const TupleTableSlotOps *tts_ops)
Definition: execUtils.c:704
#define EXEC_FLAG_BACKWARD
Definition: executor.h:68
#define EXEC_FLAG_REWIND
Definition: executor.h:67
#define EXEC_FLAG_MARK
Definition: executor.h:69
static TupleTableSlot * ExecMaterial(PlanState *pstate)
Definition: nodeMaterial.c:39
#define makeNode(_type_)
Definition: nodes.h:155
#define outerPlan(node)
Definition: plannodes.h:183
bool eof_underlying
Definition: execnodes.h:2274
ScanState ss
Definition: execnodes.h:2272
Plan * plan
Definition: execnodes.h:1141
EState * state
Definition: execnodes.h:1143
ProjectionInfo * ps_ProjInfo
Definition: execnodes.h:1181
ExecProcNodeMtd ExecProcNode
Definition: execnodes.h:1147
PlanState ps
Definition: execnodes.h:1588

References MaterialState::eflags, MaterialState::eof_underlying, EXEC_FLAG_BACKWARD, EXEC_FLAG_MARK, EXEC_FLAG_REWIND, ExecCreateScanSlotFromOuterPlan(), ExecInitNode(), ExecInitResultTupleSlotTL(), ExecMaterial(), PlanState::ExecProcNode, makeNode, outerPlan, outerPlanState, PlanState::plan, ScanState::ps, PlanState::ps_ProjInfo, MaterialState::ss, PlanState::state, TTSOpsMinimalTuple, and MaterialState::tuplestorestate.

Referenced by ExecInitNode().

◆ ExecMaterialMarkPos()

void ExecMaterialMarkPos ( MaterialState node)

Definition at line 262 of file nodeMaterial.c.

263{
265
266 /*
267 * if we haven't materialized yet, just return.
268 */
269 if (!node->tuplestorestate)
270 return;
271
272 /*
273 * copy the active read pointer to the mark.
274 */
276
277 /*
278 * since we may have advanced the mark, try to truncate the tuplestore.
279 */
281}
#define Assert(condition)
Definition: c.h:815
void tuplestore_trim(Tuplestorestate *state)
Definition: tuplestore.c:1412
void tuplestore_copy_read_pointer(Tuplestorestate *state, int srcptr, int destptr)
Definition: tuplestore.c:1320

References Assert, MaterialState::eflags, EXEC_FLAG_MARK, tuplestore_copy_read_pointer(), tuplestore_trim(), and MaterialState::tuplestorestate.

Referenced by ExecMarkPos().

◆ ExecMaterialRestrPos()

void ExecMaterialRestrPos ( MaterialState node)

Definition at line 290 of file nodeMaterial.c.

291{
293
294 /*
295 * if we haven't materialized yet, just return.
296 */
297 if (!node->tuplestorestate)
298 return;
299
300 /*
301 * copy the mark to the active read pointer.
302 */
304}

References Assert, MaterialState::eflags, EXEC_FLAG_MARK, tuplestore_copy_read_pointer(), and MaterialState::tuplestorestate.

Referenced by ExecRestrPos().

◆ ExecReScanMaterial()

void ExecReScanMaterial ( MaterialState node)

Definition at line 313 of file nodeMaterial.c.

314{
316
318
319 if (node->eflags != 0)
320 {
321 /*
322 * If we haven't materialized yet, just return. If outerplan's
323 * chgParam is not NULL then it will be re-scanned by ExecProcNode,
324 * else no reason to re-scan it at all.
325 */
326 if (!node->tuplestorestate)
327 return;
328
329 /*
330 * If subnode is to be rescanned then we forget previous stored
331 * results; we have to re-read the subplan and re-store. Also, if we
332 * told tuplestore it needn't support rescan, we lose and must
333 * re-read. (This last should not happen in common cases; else our
334 * caller lied by not passing EXEC_FLAG_REWIND to us.)
335 *
336 * Otherwise we can just rewind and rescan the stored output. The
337 * state of the subnode does not change.
338 */
339 if (outerPlan->chgParam != NULL ||
340 (node->eflags & EXEC_FLAG_REWIND) == 0)
341 {
343 node->tuplestorestate = NULL;
344 if (outerPlan->chgParam == NULL)
346 node->eof_underlying = false;
347 }
348 else
350 }
351 else
352 {
353 /* In this case we are just passing on the subquery's output */
354
355 /*
356 * if chgParam of subnode is not null then plan will be re-scanned by
357 * first ExecProcNode.
358 */
359 if (outerPlan->chgParam == NULL)
361 node->eof_underlying = false;
362 }
363}
void ExecReScan(PlanState *node)
Definition: execAmi.c:76
TupleTableSlot * ps_ResultTupleSlot
Definition: execnodes.h:1179
void tuplestore_rescan(Tuplestorestate *state)
Definition: tuplestore.c:1285
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
Definition: tuptable.h:454

References MaterialState::eflags, MaterialState::eof_underlying, EXEC_FLAG_REWIND, ExecClearTuple(), ExecReScan(), outerPlan, outerPlanState, ScanState::ps, PlanState::ps_ResultTupleSlot, MaterialState::ss, tuplestore_end(), tuplestore_rescan(), and MaterialState::tuplestorestate.

Referenced by ExecReScan().