#include "postgres.h"
#include "access/relscan.h"
#include "executor/execdebug.h"
#include "executor/nodeSeqscan.h"
#include "utils/rel.h"
Go to the source code of this file.
Functions | |
static void | InitScanRelation (SeqScanState *node, EState *estate, int eflags) |
static TupleTableSlot * | SeqNext (SeqScanState *node) |
static bool | SeqRecheck (SeqScanState *node, TupleTableSlot *slot) |
TupleTableSlot * | ExecSeqScan (SeqScanState *node) |
SeqScanState * | ExecInitSeqScan (SeqScan *node, EState *estate, int eflags) |
void | ExecEndSeqScan (SeqScanState *node) |
void | ExecReScanSeqScan (SeqScanState *node) |
void | ExecSeqMarkPos (SeqScanState *node) |
void | ExecSeqRestrPos (SeqScanState *node) |
void ExecEndSeqScan | ( | SeqScanState * | node | ) |
Definition at line 221 of file nodeSeqscan.c.
References ExecClearTuple(), ExecCloseScanRelation(), ExecFreeExprContext(), heap_endscan(), ScanState::ps, PlanState::ps_ResultTupleSlot, ScanState::ss_currentRelation, ScanState::ss_currentScanDesc, and ScanState::ss_ScanTupleSlot.
Referenced by ExecEndNode().
{ Relation relation; HeapScanDesc scanDesc; /* * get information from node */ relation = node->ss_currentRelation; scanDesc = node->ss_currentScanDesc; /* * Free the exprcontext */ ExecFreeExprContext(&node->ps); /* * clean out the tuple table */ ExecClearTuple(node->ps.ps_ResultTupleSlot); ExecClearTuple(node->ss_ScanTupleSlot); /* * close heap scan */ heap_endscan(scanDesc); /* * close the heap relation. */ ExecCloseScanRelation(relation); }
SeqScanState* ExecInitSeqScan | ( | SeqScan * | node, | |
EState * | estate, | |||
int | eflags | |||
) |
Definition at line 157 of file nodeSeqscan.c.
References Assert, ExecAssignExprContext(), ExecAssignResultTypeFromTL(), ExecAssignScanProjectionInfo(), ExecInitExpr(), ExecInitResultTupleSlot(), ExecInitScanTupleSlot(), InitScanRelation(), innerPlan, makeNode, NULL, outerPlan, Scan::plan, PlanState::plan, ScanState::ps, PlanState::ps_TupFromTlist, Plan::qual, PlanState::qual, PlanState::state, Plan::targetlist, and PlanState::targetlist.
Referenced by ExecInitNode().
{ SeqScanState *scanstate; /* * Once upon a time it was possible to have an outerPlan of a SeqScan, but * not any more. */ Assert(outerPlan(node) == NULL); Assert(innerPlan(node) == NULL); /* * create state structure */ scanstate = makeNode(SeqScanState); scanstate->ps.plan = (Plan *) node; scanstate->ps.state = estate; /* * Miscellaneous initialization * * create expression context for node */ ExecAssignExprContext(estate, &scanstate->ps); /* * initialize child expressions */ scanstate->ps.targetlist = (List *) ExecInitExpr((Expr *) node->plan.targetlist, (PlanState *) scanstate); scanstate->ps.qual = (List *) ExecInitExpr((Expr *) node->plan.qual, (PlanState *) scanstate); /* * tuple table initialization */ ExecInitResultTupleSlot(estate, &scanstate->ps); ExecInitScanTupleSlot(estate, scanstate); /* * initialize scan relation */ InitScanRelation(scanstate, estate, eflags); scanstate->ps.ps_TupFromTlist = false; /* * Initialize result tuple type and projection info. */ ExecAssignResultTypeFromTL(&scanstate->ps); ExecAssignScanProjectionInfo(scanstate); return scanstate; }
void ExecReScanSeqScan | ( | SeqScanState * | node | ) |
Definition at line 266 of file nodeSeqscan.c.
References ExecScanReScan(), heap_rescan(), NULL, and ScanState::ss_currentScanDesc.
Referenced by ExecReScan().
{ HeapScanDesc scan; scan = node->ss_currentScanDesc; heap_rescan(scan, /* scan desc */ NULL); /* new scan keys */ ExecScanReScan((ScanState *) node); }
void ExecSeqMarkPos | ( | SeqScanState * | node | ) |
Definition at line 285 of file nodeSeqscan.c.
References heap_markpos(), and ScanState::ss_currentScanDesc.
Referenced by ExecMarkPos().
{ HeapScanDesc scan = node->ss_currentScanDesc; heap_markpos(scan); }
void ExecSeqRestrPos | ( | SeqScanState * | node | ) |
Definition at line 299 of file nodeSeqscan.c.
References ExecClearTuple(), heap_restrpos(), ScanState::ss_currentScanDesc, and ScanState::ss_ScanTupleSlot.
Referenced by ExecRestrPos().
{ HeapScanDesc scan = node->ss_currentScanDesc; /* * Clear any reference to the previously returned tuple. This is needed * because the slot is simply pointing at scan->rs_cbuf, which * heap_restrpos will change; we'd have an internally inconsistent slot if * we didn't do this. */ ExecClearTuple(node->ss_ScanTupleSlot); heap_restrpos(scan); }
TupleTableSlot* ExecSeqScan | ( | SeqScanState * | node | ) |
Definition at line 111 of file nodeSeqscan.c.
References ExecScan(), SeqNext(), and SeqRecheck().
Referenced by ExecProcNode().
{ return ExecScan((ScanState *) node, (ExecScanAccessMtd) SeqNext, (ExecScanRecheckMtd) SeqRecheck); }
static void InitScanRelation | ( | SeqScanState * | node, | |
EState * | estate, | |||
int | eflags | |||
) | [static] |
Definition at line 125 of file nodeSeqscan.c.
References EState::es_snapshot, ExecAssignScanType(), ExecOpenScanRelation(), heap_beginscan(), NULL, PlanState::plan, ScanState::ps, RelationGetDescr, ScanState::ss_currentRelation, and ScanState::ss_currentScanDesc.
Referenced by ExecInitSeqScan().
{ Relation currentRelation; HeapScanDesc currentScanDesc; /* * get the relation object id from the relid'th entry in the range table, * open that relation and acquire appropriate lock on it. */ currentRelation = ExecOpenScanRelation(estate, ((SeqScan *) node->ps.plan)->scanrelid, eflags); /* initialize a heapscan */ currentScanDesc = heap_beginscan(currentRelation, estate->es_snapshot, 0, NULL); node->ss_currentRelation = currentRelation; node->ss_currentScanDesc = currentScanDesc; /* and report the scan tuple slot's rowtype */ ExecAssignScanType(node, RelationGetDescr(currentRelation)); }
static TupleTableSlot * SeqNext | ( | SeqScanState * | node | ) | [static] |
Definition at line 47 of file nodeSeqscan.c.
References EState::es_direction, ExecClearTuple(), ExecStoreTuple(), heap_getnext(), ScanState::ps, HeapScanDescData::rs_cbuf, ScanState::ss_currentScanDesc, ScanState::ss_ScanTupleSlot, and PlanState::state.
Referenced by ExecSeqScan().
{ HeapTuple tuple; HeapScanDesc scandesc; EState *estate; ScanDirection direction; TupleTableSlot *slot; /* * get information from the estate and scan state */ scandesc = node->ss_currentScanDesc; estate = node->ps.state; direction = estate->es_direction; slot = node->ss_ScanTupleSlot; /* * get the next tuple from the table */ tuple = heap_getnext(scandesc, direction); /* * save the tuple and the buffer returned to us by the access methods in * our scan tuple slot and return the slot. Note: we pass 'false' because * tuples returned by heap_getnext() are pointers onto disk pages and were * not created with palloc() and so should not be pfree()'d. Note also * that ExecStoreTuple will increment the refcount of the buffer; the * refcount will not be dropped until the tuple table slot is cleared. */ if (tuple) ExecStoreTuple(tuple, /* tuple to store */ slot, /* slot to store in */ scandesc->rs_cbuf, /* buffer associated with this * tuple */ false); /* don't pfree this pointer */ else ExecClearTuple(slot); return slot; }
static bool SeqRecheck | ( | SeqScanState * | node, | |
TupleTableSlot * | slot | |||
) | [static] |
Definition at line 92 of file nodeSeqscan.c.
Referenced by ExecSeqScan().
{ /* * Note that unlike IndexScan, SeqScan never use keys in heap_beginscan * (and this is very bad) - so, here we do not check are keys ok or not. */ return true; }