mirror of
https://github.com/postgres/postgres.git
synced 2025-11-12 05:01:15 +03:00
Refactor planner's pathkeys data structure to create a separate, explicit
representation of equivalence classes of variables. This is an extensive rewrite, but it brings a number of benefits: * planner no longer fails in the presence of "incomplete" operator families that don't offer operators for every possible combination of datatypes. * avoid generating and then discarding redundant equality clauses. * remove bogus assumption that derived equalities always use operators named "=". * mergejoins can work with a variety of sort orders (e.g., descending) now, instead of tying each mergejoinable operator to exactly one sort order. * better recognition of redundant sort columns. * can make use of equalities appearing underneath an outer join.
This commit is contained in:
@@ -18,7 +18,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.295 2007/01/10 18:06:03 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.296 2007/01/20 20:45:38 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -596,11 +596,27 @@ _equalFromExpr(FromExpr *a, FromExpr *b)
|
||||
*/
|
||||
|
||||
static bool
|
||||
_equalPathKeyItem(PathKeyItem *a, PathKeyItem *b)
|
||||
_equalPathKey(PathKey *a, PathKey *b)
|
||||
{
|
||||
COMPARE_NODE_FIELD(key);
|
||||
COMPARE_SCALAR_FIELD(sortop);
|
||||
COMPARE_SCALAR_FIELD(nulls_first);
|
||||
/*
|
||||
* This is normally used on non-canonicalized PathKeys, so must chase
|
||||
* up to the topmost merged EquivalenceClass and see if those are the
|
||||
* same (by pointer equality).
|
||||
*/
|
||||
EquivalenceClass *a_eclass;
|
||||
EquivalenceClass *b_eclass;
|
||||
|
||||
a_eclass = a->pk_eclass;
|
||||
while (a_eclass->ec_merged)
|
||||
a_eclass = a_eclass->ec_merged;
|
||||
b_eclass = b->pk_eclass;
|
||||
while (b_eclass->ec_merged)
|
||||
b_eclass = b_eclass->ec_merged;
|
||||
if (a_eclass != b_eclass)
|
||||
return false;
|
||||
COMPARE_SCALAR_FIELD(pk_opfamily);
|
||||
COMPARE_SCALAR_FIELD(pk_strategy);
|
||||
COMPARE_SCALAR_FIELD(pk_nulls_first);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -2016,8 +2032,8 @@ equal(void *a, void *b)
|
||||
/*
|
||||
* RELATION NODES
|
||||
*/
|
||||
case T_PathKeyItem:
|
||||
retval = _equalPathKeyItem(a, b);
|
||||
case T_PathKey:
|
||||
retval = _equalPathKey(a, b);
|
||||
break;
|
||||
case T_RestrictInfo:
|
||||
retval = _equalRestrictInfo(a, b);
|
||||
|
||||
Reference in New Issue
Block a user