* Initialize ScanState in DynamicIndexScan. */
| 37 | * Initialize ScanState in DynamicIndexScan. |
| 38 | */ |
| 39 | DynamicIndexScanState * |
| 40 | ExecInitDynamicIndexScan(DynamicIndexScan *node, EState *estate, int eflags) |
| 41 | { |
| 42 | DynamicIndexScanState *dynamicIndexScanState; |
| 43 | ListCell *lc; |
| 44 | int i; |
| 45 | |
| 46 | /* check for unsupported flags */ |
| 47 | Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK))); |
| 48 | |
| 49 | dynamicIndexScanState = makeNode(DynamicIndexScanState); |
| 50 | dynamicIndexScanState->ss.ps.plan = (Plan *) node; |
| 51 | dynamicIndexScanState->ss.ps.state = estate; |
| 52 | dynamicIndexScanState->ss.ps.ExecProcNode = ExecDynamicIndexScan; |
| 53 | dynamicIndexScanState->eflags = eflags; |
| 54 | |
| 55 | dynamicIndexScanState->scan_state = SCAN_INIT; |
| 56 | dynamicIndexScanState->whichPart = -1; |
| 57 | dynamicIndexScanState->nOids = list_length(node->partOids); |
| 58 | dynamicIndexScanState->partOids = palloc(sizeof(Oid) * dynamicIndexScanState->nOids); |
| 59 | foreach_with_count(lc, node->partOids, i) |
| 60 | dynamicIndexScanState->partOids[i] = lfirst_oid(lc); |
| 61 | |
| 62 | /* |
| 63 | * Initialize child expressions |
| 64 | * |
| 65 | * These are not used for anything, we rely on the child IndexScan node to |
| 66 | * do all evaluation for us. But I think this is still needed to find and |
| 67 | * process any SubPlans. See comment in ExecInitIndexScan. |
| 68 | */ |
| 69 | dynamicIndexScanState->ss.ps.qual = ExecInitQual(node->indexscan.scan.plan.qual, |
| 70 | (PlanState *) dynamicIndexScanState); |
| 71 | |
| 72 | /* |
| 73 | * tuple table initialization |
| 74 | */ |
| 75 | Relation scanRel = ExecOpenScanRelation(estate, node->indexscan.scan.scanrelid, eflags); |
| 76 | |
| 77 | ExecInitScanTupleSlot(estate, &dynamicIndexScanState->ss, RelationGetDescr(scanRel), table_slot_callbacks(scanRel)); |
| 78 | |
| 79 | /* Dynamic table/index/bitmap scan can't tell the ops of tupleslot */ |
| 80 | dynamicIndexScanState->ss.ps.scanopsfixed = false; |
| 81 | dynamicIndexScanState->ss.ps.scanopsset = true; |
| 82 | |
| 83 | /* |
| 84 | * Initialize result tuple type and projection info. |
| 85 | */ |
| 86 | ExecInitResultTypeTL(&dynamicIndexScanState->ss.ps); |
| 87 | |
| 88 | /* |
| 89 | * This context will be reset per-partition to free up per-partition copy |
| 90 | * of LogicalIndexInfo |
| 91 | */ |
| 92 | dynamicIndexScanState->partitionMemoryContext = AllocSetContextCreate(CurrentMemoryContext, |
| 93 | "DynamicIndexScanPerPartition", |
| 94 | ALLOCSET_DEFAULT_MINSIZE, |
| 95 | ALLOCSET_DEFAULT_INITSIZE, |
| 96 | ALLOCSET_DEFAULT_MAXSIZE); |
no test coverage detected