mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +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:
@ -25,6 +25,7 @@
|
||||
#include "executor/executor.h"
|
||||
#include "executor/nodeGroup.h"
|
||||
#include "miscadmin.h"
|
||||
#include "utils/memutils.h"
|
||||
|
||||
|
||||
/*
|
||||
@ -37,8 +38,6 @@ ExecGroup(PlanState *pstate)
|
||||
{
|
||||
GroupState *node = castNode(GroupState, pstate);
|
||||
ExprContext *econtext;
|
||||
int numCols;
|
||||
AttrNumber *grpColIdx;
|
||||
TupleTableSlot *firsttupleslot;
|
||||
TupleTableSlot *outerslot;
|
||||
|
||||
@ -50,8 +49,6 @@ ExecGroup(PlanState *pstate)
|
||||
if (node->grp_done)
|
||||
return NULL;
|
||||
econtext = node->ss.ps.ps_ExprContext;
|
||||
numCols = ((Group *) node->ss.ps.plan)->numCols;
|
||||
grpColIdx = ((Group *) node->ss.ps.plan)->grpColIdx;
|
||||
|
||||
/*
|
||||
* The ScanTupleSlot holds the (copied) first tuple of each group.
|
||||
@ -59,7 +56,7 @@ ExecGroup(PlanState *pstate)
|
||||
firsttupleslot = node->ss.ss_ScanTupleSlot;
|
||||
|
||||
/*
|
||||
* We need not call ResetExprContext here because execTuplesMatch will
|
||||
* We need not call ResetExprContext here because ExecQualAndReset() will
|
||||
* reset the per-tuple memory context once per input tuple.
|
||||
*/
|
||||
|
||||
@ -124,10 +121,9 @@ ExecGroup(PlanState *pstate)
|
||||
* Compare with first tuple and see if this tuple is of the same
|
||||
* group. If so, ignore it and keep scanning.
|
||||
*/
|
||||
if (!execTuplesMatch(firsttupleslot, outerslot,
|
||||
numCols, grpColIdx,
|
||||
node->eqfunctions,
|
||||
econtext->ecxt_per_tuple_memory))
|
||||
econtext->ecxt_innertuple = firsttupleslot;
|
||||
econtext->ecxt_outertuple = outerslot;
|
||||
if (!ExecQualAndReset(node->eqfunction, econtext))
|
||||
break;
|
||||
}
|
||||
|
||||
@ -166,6 +162,7 @@ GroupState *
|
||||
ExecInitGroup(Group *node, EState *estate, int eflags)
|
||||
{
|
||||
GroupState *grpstate;
|
||||
AttrNumber *grpColIdx = grpColIdx = node->grpColIdx;
|
||||
|
||||
/* check for unsupported flags */
|
||||
Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)));
|
||||
@ -215,9 +212,12 @@ ExecInitGroup(Group *node, EState *estate, int eflags)
|
||||
/*
|
||||
* Precompute fmgr lookup data for inner loop
|
||||
*/
|
||||
grpstate->eqfunctions =
|
||||
execTuplesMatchPrepare(node->numCols,
|
||||
node->grpOperators);
|
||||
grpstate->eqfunction =
|
||||
execTuplesMatchPrepare(ExecGetResultType(outerPlanState(grpstate)),
|
||||
node->numCols,
|
||||
grpColIdx,
|
||||
node->grpOperators,
|
||||
&grpstate->ss.ps);
|
||||
|
||||
return grpstate;
|
||||
}
|
||||
|
Reference in New Issue
Block a user