mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +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:
		@@ -635,6 +635,8 @@ typedef struct TupleHashTableData
 | 
			
		||||
	FmgrInfo   *in_hash_funcs;	/* hash functions for input datatype(s) */
 | 
			
		||||
	FmgrInfo   *cur_eq_funcs;	/* equality functions for input vs. table */
 | 
			
		||||
	uint32		hash_iv;		/* hash-function IV */
 | 
			
		||||
	ExprState  *eq_func;		/* tuple equality comparator */
 | 
			
		||||
	ExprContext *exprcontext;	/* expression context */
 | 
			
		||||
}			TupleHashTableData;
 | 
			
		||||
 | 
			
		||||
typedef tuplehash_iterator TupleHashIterator;
 | 
			
		||||
@@ -781,6 +783,7 @@ typedef struct SubPlanState
 | 
			
		||||
	HeapTuple	curTuple;		/* copy of most recent tuple from subplan */
 | 
			
		||||
	Datum		curArray;		/* most recent array from ARRAY() subplan */
 | 
			
		||||
	/* these are used when hashing the subselect's output: */
 | 
			
		||||
	TupleDesc	descRight;		/* subselect desc after projection */
 | 
			
		||||
	ProjectionInfo *projLeft;	/* for projecting lefthand exprs */
 | 
			
		||||
	ProjectionInfo *projRight;	/* for projecting subselect output */
 | 
			
		||||
	TupleHashTable hashtable;	/* hash table for no-nulls subselect rows */
 | 
			
		||||
@@ -1795,7 +1798,7 @@ typedef struct SortState
 | 
			
		||||
typedef struct GroupState
 | 
			
		||||
{
 | 
			
		||||
	ScanState	ss;				/* its first field is NodeTag */
 | 
			
		||||
	FmgrInfo   *eqfunctions;	/* per-field lookup data for equality fns */
 | 
			
		||||
	ExprState  *eqfunction;		/* equality function */
 | 
			
		||||
	bool		grp_done;		/* indicates completion of Group scan */
 | 
			
		||||
} GroupState;
 | 
			
		||||
 | 
			
		||||
@@ -1885,8 +1888,8 @@ typedef struct WindowAggState
 | 
			
		||||
 | 
			
		||||
	WindowStatePerFunc perfunc; /* per-window-function information */
 | 
			
		||||
	WindowStatePerAgg peragg;	/* per-plain-aggregate information */
 | 
			
		||||
	FmgrInfo   *partEqfunctions;	/* equality funcs for partition columns */
 | 
			
		||||
	FmgrInfo   *ordEqfunctions; /* equality funcs for ordering columns */
 | 
			
		||||
	ExprState  *partEqfunction;	/* equality funcs for partition columns */
 | 
			
		||||
	ExprState  *ordEqfunction; /* equality funcs for ordering columns */
 | 
			
		||||
	Tuplestorestate *buffer;	/* stores rows of current partition */
 | 
			
		||||
	int			current_ptr;	/* read pointer # for current row */
 | 
			
		||||
	int			framehead_ptr;	/* read pointer # for frame head, if used */
 | 
			
		||||
@@ -1964,8 +1967,7 @@ typedef struct WindowAggState
 | 
			
		||||
typedef struct UniqueState
 | 
			
		||||
{
 | 
			
		||||
	PlanState	ps;				/* its first field is NodeTag */
 | 
			
		||||
	FmgrInfo   *eqfunctions;	/* per-field lookup data for equality fns */
 | 
			
		||||
	MemoryContext tempContext;	/* short-term context for comparisons */
 | 
			
		||||
	ExprState   *eqfunction;		/* tuple equality qual */
 | 
			
		||||
} UniqueState;
 | 
			
		||||
 | 
			
		||||
/* ----------------
 | 
			
		||||
@@ -2079,11 +2081,11 @@ typedef struct SetOpStatePerGroupData *SetOpStatePerGroup;
 | 
			
		||||
typedef struct SetOpState
 | 
			
		||||
{
 | 
			
		||||
	PlanState	ps;				/* its first field is NodeTag */
 | 
			
		||||
	ExprState  *eqfunction;		/* equality comparator */
 | 
			
		||||
	FmgrInfo   *eqfunctions;	/* per-grouping-field equality fns */
 | 
			
		||||
	FmgrInfo   *hashfunctions;	/* per-grouping-field hash fns */
 | 
			
		||||
	bool		setop_done;		/* indicates completion of output scan */
 | 
			
		||||
	long		numOutput;		/* number of dups left to output */
 | 
			
		||||
	MemoryContext tempContext;	/* short-term context for comparisons */
 | 
			
		||||
	/* these fields are used in SETOP_SORTED mode: */
 | 
			
		||||
	SetOpStatePerGroup pergroup;	/* per-group working state */
 | 
			
		||||
	HeapTuple	grp_firstTuple; /* copy of first tuple of current group */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user