/* * Allow rescanning an index. */ void ExecDynamicIndexReScan(DynamicIndexScanState *node, ExprContext *exprCtxt) { DynamicIndexScanEndCurrentScan(node); /* Force reloading the hash table */ node->pidxIndex = NULL; /* Context for runtime keys */ ExprContext *econtext = node->indexScanState.iss_RuntimeContext; if (econtext) { /* * If we are being passed an outer tuple, save it for runtime key * calc. We also need to link it into the "regular" per-tuple * econtext, so it can be used during indexqualorig evaluations. */ if (exprCtxt != NULL) { econtext->ecxt_outertuple = exprCtxt->ecxt_outertuple; ExprContext *stdecontext = node->indexScanState.ss.ps.ps_ExprContext; stdecontext->ecxt_outertuple = exprCtxt->ecxt_outertuple; } /* * Reset the runtime-key context so we don't leak memory as each outer * tuple is scanned. Note this assumes that we will recalculate *all* * runtime keys on each call. */ ResetExprContext(econtext); } CheckSendPlanStateGpmonPkt(&node->indexScanState.ss.ps); }
/* * Release resources of DynamicIndexScan */ void ExecEndDynamicIndexScan(DynamicIndexScanState *node) { DynamicIndexScanEndCurrentScan(node); IndexScanState *indexState = &(node->indexScanState); FreeRuntimeKeysContext((IndexScanState *) node); EndPlanStateGpmonPkt(&indexState->ss.ps); MemoryContextDelete(node->partitionMemoryContext); }