mirror of
https://github.com/postgres/postgres.git
synced 2025-11-16 15:02:33 +03:00
Rearrange the querytree representation of ORDER BY/GROUP BY/DISTINCT items
as per my recent proposal: 1. Fold SortClause and GroupClause into a single node type SortGroupClause. We were already relying on them to be struct-equivalent, so using two node tags wasn't accomplishing much except to get in the way of comparing items with equal(). 2. Add an "eqop" field to SortGroupClause to carry the associated equality operator. This is cheap for the parser to get at the same time it's looking up the sort operator, and storing it eliminates the need for repeated not-so-cheap lookups during planning. In future this will also let us represent GROUP/DISTINCT operations on datatypes that have hash opclasses but no btree opclasses (ie, they have equality but no natural sort order). The previous representation simply didn't work for that, since its only indicator of comparison semantics was a sort operator. 3. Add a hasDistinctOn boolean to struct Query to explicitly record whether the distinctClause came from DISTINCT or DISTINCT ON. This allows removing some complicated and not 100% bulletproof code that attempted to figure that out from the distinctClause alone. This patch doesn't in itself create any new capability, but it's necessary infrastructure for future attempts to use hash-based grouping for DISTINCT and UNION/INTERSECT/EXCEPT.
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/nodes/primnodes.h,v 1.137 2008/01/01 19:45:58 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/include/nodes/primnodes.h,v 1.138 2008/08/02 21:32:00 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -969,14 +969,14 @@ typedef struct CurrentOfExpr
|
||||
* a specific system-generated name (such as "ctid") or NULL; anything else
|
||||
* risks confusing ExecGetJunkAttribute!
|
||||
*
|
||||
* ressortgroupref is used in the representation of ORDER BY and
|
||||
* GROUP BY items. Targetlist entries with ressortgroupref=0 are not
|
||||
* sort/group items. If ressortgroupref>0, then this item is an ORDER BY or
|
||||
* GROUP BY value. No two entries in a targetlist may have the same nonzero
|
||||
* ressortgroupref --- but there is no particular meaning to the nonzero
|
||||
* values, except as tags. (For example, one must not assume that lower
|
||||
* ressortgroupref means a more significant sort key.) The order of the
|
||||
* associated SortClause or GroupClause lists determine the semantics.
|
||||
* ressortgroupref is used in the representation of ORDER BY, GROUP BY, and
|
||||
* DISTINCT items. Targetlist entries with ressortgroupref=0 are not
|
||||
* sort/group items. If ressortgroupref>0, then this item is an ORDER BY,
|
||||
* GROUP BY, and/or DISTINCT target value. No two entries in a targetlist
|
||||
* may have the same nonzero ressortgroupref --- but there is no particular
|
||||
* meaning to the nonzero values, except as tags. (For example, one must
|
||||
* not assume that lower ressortgroupref means a more significant sort key.)
|
||||
* The order of the associated SortGroupClause lists determine the semantics.
|
||||
*
|
||||
* resorigtbl/resorigcol identify the source of the column, if it is a
|
||||
* simple reference to a column of a base table (or view). If it is not
|
||||
|
||||
Reference in New Issue
Block a user