TupleTableSlot * ExecDynamicTableScan(DynamicTableScanState *node) { ScanState *scanState = (ScanState *)node; TupleTableSlot *slot = NULL; /* * If this is called the first time, find the pid index that contains all unique * partition pids for this node to scan. */ if (node->pidIndex == NULL) { setPidIndex(node); Assert(node->pidIndex != NULL); hash_seq_init(&node->pidStatus, node->pidIndex); node->shouldCallHashSeqTerm = true; } /* * Scan the table to find next tuple to return. If the current table * is finished, close it and open the next table for scan. */ while (TupIsNull(slot) && initNextTableToScan(node)) { slot = ExecTableScanRelation(scanState); #ifdef FAULT_INJECTOR FaultInjector_InjectFaultIfSet( FaultDuringExecDynamicTableScan, DDLNotSpecified, "", // databaseName ""); // tableName #endif if (!TupIsNull(slot)) { Gpmon_M_Incr_Rows_Out(GpmonPktFromDynamicTableScanState(node)); CheckSendPlanStateGpmonPkt(&scanState->ps); } else { CleanupOnePartition(scanState); } } return slot; }
/* * Execution of DynamicIndexScan */ TupleTableSlot * ExecDynamicIndexScan(DynamicIndexScanState *node) { Assert(node); IndexScanState *indexState = &(node->indexScanState); TupleTableSlot *slot = NULL; /* * If this is called the first time, find the pid index that contains all unique * partition pids for this node to scan. */ if (node->pidxIndex == NULL) { setPidIndex(node); Assert(node->pidxIndex != NULL); hash_seq_init(&node->pidxStatus, node->pidxIndex); node->shouldCallHashSeqTerm = true; } /* * Scan index to find next tuple to return. If the current index * is exhausted, close it and open the next index for scan. */ while (TupIsNull(slot) && initNextIndexToScan(node)) { slot = ExecScan(&indexState->ss, (ExecScanAccessMtd) IndexNext); if (!TupIsNull(slot)) { /* Report output rows to Gpmon */ Gpmon_M_Incr_Rows_Out(GpmonPktFromDynamicIndexScanState(node)); CheckSendPlanStateGpmonPkt(&indexState->ss.ps); } else { CleanupOnePartition(indexState); } } return slot; }