diff options
Diffstat (limited to 'src/backend/executor/nodeUnique.c')
-rw-r--r-- | src/backend/executor/nodeUnique.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/src/backend/executor/nodeUnique.c b/src/backend/executor/nodeUnique.c index 9f823c58e1a..e330650593a 100644 --- a/src/backend/executor/nodeUnique.c +++ b/src/backend/executor/nodeUnique.c @@ -47,7 +47,7 @@ static TupleTableSlot * /* return: a tuple or NULL */ ExecUnique(PlanState *pstate) { UniqueState *node = castNode(UniqueState, pstate); - ExprContext *econtext = node->ps.ps_ExprContext; + Unique *plannode = (Unique *) node->ps.plan; TupleTableSlot *resultTupleSlot; TupleTableSlot *slot; PlanState *outerPlan; @@ -89,9 +89,10 @@ ExecUnique(PlanState *pstate) * If so then we loop back and fetch another new tuple from the * subplan. */ - econtext->ecxt_innertuple = slot; - econtext->ecxt_outertuple = resultTupleSlot; - if (!ExecQualAndReset(node->eqfunction, econtext)) + if (!execTuplesMatch(slot, resultTupleSlot, + plannode->numCols, plannode->uniqColIdx, + node->eqfunctions, + node->tempContext)) break; } @@ -128,9 +129,16 @@ ExecInitUnique(Unique *node, EState *estate, int eflags) uniquestate->ps.ExecProcNode = ExecUnique; /* - * create expression context + * Miscellaneous initialization + * + * Unique nodes have no ExprContext initialization because they never call + * ExecQual or ExecProject. But they do need a per-tuple memory context + * anyway for calling execTuplesMatch. */ - ExecAssignExprContext(estate, &uniquestate->ps); + uniquestate->tempContext = + AllocSetContextCreate(CurrentMemoryContext, + "Unique", + ALLOCSET_DEFAULT_SIZES); /* * Tuple table initialization @@ -152,12 +160,9 @@ ExecInitUnique(Unique *node, EState *estate, int eflags) /* * Precompute fmgr lookup data for inner loop */ - uniquestate->eqfunction = - execTuplesMatchPrepare(ExecGetResultType(outerPlanState(uniquestate)), - node->numCols, - node->uniqColIdx, - node->uniqOperators, - &uniquestate->ps); + uniquestate->eqfunctions = + execTuplesMatchPrepare(node->numCols, + node->uniqOperators); return uniquestate; } @@ -175,7 +180,7 @@ ExecEndUnique(UniqueState *node) /* clean up tuple table */ ExecClearTuple(node->ps.ps_ResultTupleSlot); - ExecFreeExprContext(&node->ps); + MemoryContextDelete(node->tempContext); ExecEndNode(outerPlanState(node)); } |