/* * InitScanStateInternal * Initialize ScanState common variables for various Scan node. */ void InitScanStateInternal(ScanState *scanState, Plan *plan, EState *estate, int eflags, bool initCurrentRelation) { Assert(IsA(plan, SeqScan) || IsA(plan, AppendOnlyScan) || IsA(plan, ParquetScan) || IsA(plan, TableScan) || IsA(plan, DynamicTableScan) || IsA(plan, BitmapTableScan)); PlanState *planState = &scanState->ps; planState->plan = plan; planState->state = estate; /* Create expression evaluation context */ ExecAssignExprContext(estate, planState); /* Initialize tuple table slot */ ExecInitResultTupleSlot(estate, planState); ExecInitScanTupleSlot(estate, scanState); /* * For dynamic table scan, We do not initialize expression states; instead * we wait until the first partition, and initialize the expression state * at that time. Also, for dynamic table scan, we do not need to open the * parent partition relation. */ if (initCurrentRelation) { InitScanStateRelationDetails(scanState, plan, estate); } /* Initialize result tuple type. */ ExecAssignResultTypeFromTL(planState); /* * If eflag contains EXEC_FLAG_REWIND or EXEC_FLAG_BACKWARD or EXEC_FLAG_MARK, * then this node is not eager free safe. */ scanState->ps.delayEagerFree = ((eflags & (EXEC_FLAG_REWIND | EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)) != 0); /* Currently, only SeqScan supports Mark/Restore. */ AssertImply((eflags & EXEC_FLAG_MARK) != 0, IsA(plan, SeqScan)); }
/* * DynamicScan_InitSingleRelation * Prepares a single relation for scanning by calling various * helper methods to open relation, initialize expressions etc. * * Note: this is for the non-partitioned relations. * * Returns true upon success. */ static bool DynamicScan_InitSingleRelation(ScanState *scanState, PartitionInitMethod *partitionInitMethod, PartitionReScanMethod *partitionReScanMethod) { Assert(!isDynamicScan((Scan *)scanState->ps.plan)); if (NULL == scanState->ss_currentRelation) { /* Open the relation and initalize the expressions (targetlist, qual etc.) */ InitScanStateRelationDetails(scanState, scanState->ps.plan, scanState->ps.state); partitionInitMethod(scanState, NULL /* No dropped column mapping */); } else { Insist(scanState->scan_state == SCAN_RESCAN); partitionReScanMethod(scanState); } return true; }