/* ---------------------------------------------------------------- * ExecEndIndexScan * ---------------------------------------------------------------- */ void ExecEndIndexScan(IndexScanState *node) { Relation indexRelationDesc; IndexScanDesc indexScanDesc; Relation relation; /* * extract information from the node */ indexRelationDesc = node->iss_RelationDesc; indexScanDesc = node->iss_ScanDesc; relation = node->ss.ss_currentRelation; /* * Free the exprcontext(s) ... now dead code, see ExecFreeExprContext */ #ifdef NOT_USED ExecFreeExprContext(&node->ss.ps); if (node->iss_RuntimeContext) FreeExprContext(node->iss_RuntimeContext); #endif /* * clear out tuple table slots */ ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); ExecClearTuple(node->ss.ss_ScanTupleSlot); /* * close the index relation (no-op if we didn't open it) */ ExecEagerFreeIndexScan(node); if (indexRelationDesc) index_close(indexRelationDesc, NoLock); /* * close the heap relation. */ ExecCloseScanRelation(relation); FreeRuntimeKeysContext(node); EndPlanStateGpmonPkt(&node->ss.ps); }
/* ------------------------------------------------------------------ * ExecEndShareInputScan * ------------------------------------------------------------------ */ void ExecEndShareInputScan(ShareInputScanState *node) { /* clean up tuple table */ ExecClearTuple(node->ss.ss_ScanTupleSlot); ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); ShareInputScan * sisc = (ShareInputScan *) node->ss.ps.plan; if(node->share_lk_ctxt) shareinput_reader_notifydone(node->share_lk_ctxt, sisc->share_id); ExecEagerFreeShareInputScan(node); /* * shutdown subplan. First scanner of underlying share input will * do the shutdown, all other scanners are no-op because outerPlanState * is NULL */ ExecEndNode(outerPlanState(node)); EndPlanStateGpmonPkt(&node->ss.ps); }