diff options
Diffstat (limited to 'src/backend/executor/execExprInterp.c')
-rw-r--r-- | src/backend/executor/execExprInterp.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index b1f92e013e2..3c17cc6b1e1 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -4579,12 +4579,16 @@ ExecEvalPreOrderedDistinctSingle(AggState *aggstate, AggStatePerTrans pertrans) /* * ExecEvalPreOrderedDistinctMulti * Returns true when the aggregate input is distinct from the previous - * input and returns false when the input matches the previous input. + * input and returns false when the input matches the previous input, or + * when there was no previous input. */ bool ExecEvalPreOrderedDistinctMulti(AggState *aggstate, AggStatePerTrans pertrans) { ExprContext *tmpcontext = aggstate->tmpcontext; + bool isdistinct = false; /* for now */ + TupleTableSlot *save_outer; + TupleTableSlot *save_inner; for (int i = 0; i < pertrans->numTransInputs; i++) { @@ -4596,6 +4600,10 @@ ExecEvalPreOrderedDistinctMulti(AggState *aggstate, AggStatePerTrans pertrans) pertrans->sortslot->tts_nvalid = pertrans->numInputs; ExecStoreVirtualTuple(pertrans->sortslot); + /* save the previous slots before we overwrite them */ + save_outer = tmpcontext->ecxt_outertuple; + save_inner = tmpcontext->ecxt_innertuple; + tmpcontext->ecxt_outertuple = pertrans->sortslot; tmpcontext->ecxt_innertuple = pertrans->uniqslot; @@ -4607,9 +4615,15 @@ ExecEvalPreOrderedDistinctMulti(AggState *aggstate, AggStatePerTrans pertrans) pertrans->haslast = true; ExecCopySlot(pertrans->uniqslot, pertrans->sortslot); - return true; + + isdistinct = true; } - return false; + + /* restore the original slots */ + tmpcontext->ecxt_outertuple = save_outer; + tmpcontext->ecxt_innertuple = save_inner; + + return isdistinct; } /* |