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

Go to the source code of this file.

Functions

NestLoopStateExecInitNestLoop (NestLoop *node, EState *estate, int eflags)
 
void ExecEndNestLoop (NestLoopState *node)
 
void ExecReScanNestLoop (NestLoopState *node)
 

Function Documentation

◆ ExecEndNestLoop()

void ExecEndNestLoop ( NestLoopState node)
extern

Definition at line 362 of file nodeNestloop.c.

363{
364 NL1_printf("ExecEndNestLoop: %s\n",
365 "ending node processing");
366
367 /*
368 * close down subplans
369 */
372
373 NL1_printf("ExecEndNestLoop: %s\n",
374 "node processing ended");
375}
void ExecEndNode(PlanState *node)
#define NL1_printf(s, a)
Definition execdebug.h:77
#define outerPlanState(node)
Definition execnodes.h:1273
#define innerPlanState(node)
Definition execnodes.h:1272

References ExecEndNode(), innerPlanState, NL1_printf, and outerPlanState.

Referenced by ExecEndNode().

◆ ExecInitNestLoop()

NestLoopState * ExecInitNestLoop ( NestLoop node,
EState estate,
int  eflags 
)
extern

Definition at line 263 of file nodeNestloop.c.

264{
266
267 /* check for unsupported flags */
269
270 NL1_printf("ExecInitNestLoop: %s\n",
271 "initializing node");
272
273 /*
274 * create state structure
275 */
277 nlstate->js.ps.plan = (Plan *) node;
278 nlstate->js.ps.state = estate;
279 nlstate->js.ps.ExecProcNode = ExecNestLoop;
280
281 /*
282 * Miscellaneous initialization
283 *
284 * create expression context for node
285 */
286 ExecAssignExprContext(estate, &nlstate->js.ps);
287
288 /*
289 * initialize child nodes
290 *
291 * If we have no parameters to pass into the inner rel from the outer,
292 * tell the inner child that cheap rescans would be good. If we do have
293 * such parameters, then there is no point in REWIND support at all in the
294 * inner child, because it will always be rescanned with fresh parameter
295 * values.
296 */
297 outerPlanState(nlstate) = ExecInitNode(outerPlan(node), estate, eflags);
298 if (node->nestParams == NIL)
299 eflags |= EXEC_FLAG_REWIND;
300 else
301 eflags &= ~EXEC_FLAG_REWIND;
302 innerPlanState(nlstate) = ExecInitNode(innerPlan(node), estate, eflags);
303
304 /*
305 * Initialize result slot, type and projection.
306 */
309
310 /*
311 * initialize child expressions
312 */
313 nlstate->js.ps.qual =
314 ExecInitQual(node->join.plan.qual, (PlanState *) nlstate);
315 nlstate->js.jointype = node->join.jointype;
316 nlstate->js.joinqual =
318
319 /*
320 * detect whether we need only consider the first matching inner tuple
321 */
322 nlstate->js.single_match = (node->join.inner_unique ||
323 node->join.jointype == JOIN_SEMI);
324
325 /* set up null tuples for outer joins, if needed */
326 switch (node->join.jointype)
327 {
328 case JOIN_INNER:
329 case JOIN_SEMI:
330 break;
331 case JOIN_LEFT:
332 case JOIN_ANTI:
333 nlstate->nl_NullInnerTupleSlot =
337 break;
338 default:
339 elog(ERROR, "unrecognized join type: %d",
340 (int) node->join.jointype);
341 }
342
343 /*
344 * finally, wipe the current outer tuple clean.
345 */
346 nlstate->nl_NeedNewOuter = true;
347 nlstate->nl_MatchedOuter = false;
348
349 NL1_printf("ExecInitNestLoop: %s\n",
350 "node initialized");
351
352 return nlstate;
353}
#define Assert(condition)
Definition c.h:945
#define ERROR
Definition elog.h:39
#define elog(elevel,...)
Definition elog.h:226
ExprState * ExecInitQual(List *qual, PlanState *parent)
Definition execExpr.c:250
PlanState * ExecInitNode(Plan *node, EState *estate, int eflags)
const TupleTableSlotOps TTSOpsVirtual
Definition execTuples.c:84
void ExecInitResultTupleSlotTL(PlanState *planstate, const TupleTableSlotOps *tts_ops)
TupleTableSlot * ExecInitNullTupleSlot(EState *estate, TupleDesc tupType, const TupleTableSlotOps *tts_ops)
TupleDesc ExecGetResultType(PlanState *planstate)
Definition execUtils.c:500
void ExecAssignExprContext(EState *estate, PlanState *planstate)
Definition execUtils.c:490
void ExecAssignProjectionInfo(PlanState *planstate, TupleDesc inputDesc)
Definition execUtils.c:588
#define EXEC_FLAG_BACKWARD
Definition executor.h:70
#define EXEC_FLAG_REWIND
Definition executor.h:69
#define EXEC_FLAG_MARK
Definition executor.h:71
static TupleTableSlot * ExecNestLoop(PlanState *pstate)
#define makeNode(_type_)
Definition nodes.h:161
@ JOIN_SEMI
Definition nodes.h:317
@ JOIN_INNER
Definition nodes.h:303
@ JOIN_LEFT
Definition nodes.h:304
@ JOIN_ANTI
Definition nodes.h:318
#define NIL
Definition pg_list.h:68
#define innerPlan(node)
Definition plannodes.h:264
#define outerPlan(node)
Definition plannodes.h:265
static int fb(int x)
List * joinqual
Definition plannodes.h:988
JoinType jointype
Definition plannodes.h:985
bool inner_unique
Definition plannodes.h:986
List * nestParams
Definition plannodes.h:1006
Join join
Definition plannodes.h:1004

References Assert, elog, ERROR, EXEC_FLAG_BACKWARD, EXEC_FLAG_MARK, EXEC_FLAG_REWIND, ExecAssignExprContext(), ExecAssignProjectionInfo(), ExecGetResultType(), ExecInitNode(), ExecInitNullTupleSlot(), ExecInitQual(), ExecInitResultTupleSlotTL(), ExecNestLoop(), fb(), Join::inner_unique, innerPlan, innerPlanState, NestLoop::join, JOIN_ANTI, JOIN_INNER, JOIN_LEFT, JOIN_SEMI, Join::joinqual, Join::jointype, makeNode, NestLoop::nestParams, NIL, NL1_printf, outerPlan, outerPlanState, and TTSOpsVirtual.

Referenced by ExecInitNode().

◆ ExecReScanNestLoop()

void ExecReScanNestLoop ( NestLoopState node)
extern

Definition at line 382 of file nodeNestloop.c.

383{
385
386 /*
387 * If outerPlan->chgParam is not null then plan will be automatically
388 * re-scanned by first ExecProcNode.
389 */
390 if (outerPlan->chgParam == NULL)
392
393 /*
394 * innerPlan is re-scanned for each new outer tuple and MUST NOT be
395 * re-scanned from here or you'll get troubles from inner index scans when
396 * outer Vars are used as run-time keys...
397 */
398
399 node->nl_NeedNewOuter = true;
400 node->nl_MatchedOuter = false;
401}
void ExecReScan(PlanState *node)
Definition execAmi.c:78
bool nl_NeedNewOuter
Definition execnodes.h:2133
bool nl_MatchedOuter
Definition execnodes.h:2134

References ExecReScan(), fb(), NestLoopState::nl_MatchedOuter, NestLoopState::nl_NeedNewOuter, outerPlan, and outerPlanState.

Referenced by ExecReScan().