mirror of
https://github.com/postgres/postgres.git
synced 2025-07-21 16:02:15 +03:00
Do execGrouping.c via expression eval machinery.
This has a performance benefit on own, although not hugely so. The primary benefit is that it will allow for to JIT tuple deforming and comparator invocations. Author: Andres Freund Discussion: https://postgr.es/m/20171129080934.amqqkke2zjtekd4t@alap3.anarazel.de
This commit is contained in:
@ -1272,12 +1272,13 @@ spool_tuples(WindowAggState *winstate, int64 pos)
|
||||
|
||||
if (node->partNumCols > 0)
|
||||
{
|
||||
ExprContext *econtext = winstate->tmpcontext;
|
||||
|
||||
econtext->ecxt_innertuple = winstate->first_part_slot;
|
||||
econtext->ecxt_outertuple = outerslot;
|
||||
|
||||
/* Check if this tuple still belongs to the current partition */
|
||||
if (!execTuplesMatch(winstate->first_part_slot,
|
||||
outerslot,
|
||||
node->partNumCols, node->partColIdx,
|
||||
winstate->partEqfunctions,
|
||||
winstate->tmpcontext->ecxt_per_tuple_memory))
|
||||
if (!ExecQualAndReset(winstate->partEqfunction, econtext))
|
||||
{
|
||||
/*
|
||||
* end of partition; copy the tuple for the next cycle.
|
||||
@ -2245,6 +2246,7 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
|
||||
wfuncno,
|
||||
numaggs,
|
||||
aggno;
|
||||
TupleDesc scanDesc;
|
||||
ListCell *l;
|
||||
|
||||
/* check for unsupported flags */
|
||||
@ -2327,6 +2329,7 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
|
||||
* store in the tuplestore and use in all our working slots).
|
||||
*/
|
||||
ExecAssignScanTypeFromOuterPlan(&winstate->ss);
|
||||
scanDesc = winstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor;
|
||||
|
||||
ExecSetSlotDescriptor(winstate->first_part_slot,
|
||||
winstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor);
|
||||
@ -2351,11 +2354,20 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
|
||||
|
||||
/* Set up data for comparing tuples */
|
||||
if (node->partNumCols > 0)
|
||||
winstate->partEqfunctions = execTuplesMatchPrepare(node->partNumCols,
|
||||
node->partOperators);
|
||||
winstate->partEqfunction =
|
||||
execTuplesMatchPrepare(scanDesc,
|
||||
node->partNumCols,
|
||||
node->partColIdx,
|
||||
node->partOperators,
|
||||
&winstate->ss.ps);
|
||||
|
||||
if (node->ordNumCols > 0)
|
||||
winstate->ordEqfunctions = execTuplesMatchPrepare(node->ordNumCols,
|
||||
node->ordOperators);
|
||||
winstate->ordEqfunction =
|
||||
execTuplesMatchPrepare(scanDesc,
|
||||
node->ordNumCols,
|
||||
node->ordColIdx,
|
||||
node->ordOperators,
|
||||
&winstate->ss.ps);
|
||||
|
||||
/*
|
||||
* WindowAgg nodes use aggvalues and aggnulls as well as Agg nodes.
|
||||
@ -2879,15 +2891,15 @@ are_peers(WindowAggState *winstate, TupleTableSlot *slot1,
|
||||
TupleTableSlot *slot2)
|
||||
{
|
||||
WindowAgg *node = (WindowAgg *) winstate->ss.ps.plan;
|
||||
ExprContext *econtext = winstate->tmpcontext;
|
||||
|
||||
/* If no ORDER BY, all rows are peers with each other */
|
||||
if (node->ordNumCols == 0)
|
||||
return true;
|
||||
|
||||
return execTuplesMatch(slot1, slot2,
|
||||
node->ordNumCols, node->ordColIdx,
|
||||
winstate->ordEqfunctions,
|
||||
winstate->tmpcontext->ecxt_per_tuple_memory);
|
||||
econtext->ecxt_outertuple = slot1;
|
||||
econtext->ecxt_innertuple = slot2;
|
||||
return ExecQualAndReset(winstate->ordEqfunction, econtext);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user