void ExecReScanSort(SortState *node, ExprContext *exprCtxt) { /* * If we haven't sorted yet, just return. If outerplan' chgParam is not * NULL then it will be re-scanned by ExecProcNode, else - no reason to * re-scan it at all. */ if (!node->sort_Done) return; /* must drop pointer to sort result tuple */ ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); /* * If subnode is to be rescanned then we forget previous sort results; we * have to re-read the subplan and re-sort. * * Otherwise we can just rewind and rescan the sorted output. */ if (((PlanState *) node)->lefttree->chgParam != NULL || !node->randomAccess || (NULL == node->tuplesortstate->sortstore_mk && NULL == node->tuplesortstate->sortstore)) { node->sort_Done = false; if (gp_enable_mk_sort && NULL != node->tuplesortstate->sortstore_mk) { tuplesort_end_mk(node->tuplesortstate->sortstore_mk); } if (!gp_enable_mk_sort && NULL != node->tuplesortstate->sortstore) { tuplesort_end(node->tuplesortstate->sortstore); } /* * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ if (((PlanState *) node)->lefttree->chgParam == NULL) { ExecReScan(((PlanState *) node)->lefttree, exprCtxt); } } else { if(gp_enable_mk_sort) { tuplesort_rescan_mk(node->tuplesortstate->sortstore_mk); } else { tuplesort_rescan(node->tuplesortstate->sortstore); } } }
void ExecReScanSort(SortState *node) { PlanState *outerPlan = outerPlanState(node); /* * If we haven't sorted yet, just return. If outerplan's chgParam is not * NULL then it will be re-scanned by ExecProcNode, else no reason to * re-scan it at all. */ if (!node->sort_Done) return; /* must drop pointer to sort result tuple */ ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); /* * If subnode is to be rescanned then we forget previous sort results; we * have to re-read the subplan and re-sort. Also must re-sort if the * bounded-sort parameters changed or we didn't select randomAccess. * * Otherwise we can just rewind and rescan the sorted output. */ if (outerPlan->chgParam != NULL || node->bounded != node->bounded_Done || node->bound != node->bound_Done || !node->randomAccess) { node->sort_Done = false; tuplesort_end((Tuplesortstate *) node->tuplesortstate); node->tuplesortstate = NULL; /* * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ if (outerPlan->chgParam == NULL) ExecReScan(outerPlan); } else tuplesort_rescan((Tuplesortstate *) node->tuplesortstate); }