Fix oversight in construction of sort/unique plans for UniquePaths.
If the original IN operator is cross-type, for example int8 = int4, we need to use int4 < int4 to sort the inner data and int4 = int4 to unique-ify it. We got the first part of that right, but tried to use the original IN operator for the equality checks. Per bug #5472 from Vlad Romascanu. Backpatch to 8.4, where the bug was introduced by the patch that unified SortClause and GroupClause. I was able to take out a whole lot of on-the-fly calls of get_equality_op_for_ordering_op(), but failed to realize that I needed to put one back in right here :-(
This commit is contained in:
parent
0870648c2f
commit
bb6e270ae3
@ -10,7 +10,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.260.2.1 2009/07/17 23:19:59 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.260.2.2 2010/05/25 17:44:47 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -784,6 +784,7 @@ create_unique_plan(PlannerInfo *root, UniquePath *best_path)
|
|||||||
{
|
{
|
||||||
Oid in_oper = lfirst_oid(l);
|
Oid in_oper = lfirst_oid(l);
|
||||||
Oid sortop;
|
Oid sortop;
|
||||||
|
Oid eqop;
|
||||||
TargetEntry *tle;
|
TargetEntry *tle;
|
||||||
SortGroupClause *sortcl;
|
SortGroupClause *sortcl;
|
||||||
|
|
||||||
@ -791,13 +792,26 @@ create_unique_plan(PlannerInfo *root, UniquePath *best_path)
|
|||||||
if (!OidIsValid(sortop)) /* shouldn't happen */
|
if (!OidIsValid(sortop)) /* shouldn't happen */
|
||||||
elog(ERROR, "could not find ordering operator for equality operator %u",
|
elog(ERROR, "could not find ordering operator for equality operator %u",
|
||||||
in_oper);
|
in_oper);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The Unique node will need equality operators. Normally these
|
||||||
|
* are the same as the IN clause operators, but if those are
|
||||||
|
* cross-type operators then the equality operators are the ones
|
||||||
|
* for the IN clause operators' RHS datatype.
|
||||||
|
*/
|
||||||
|
eqop = get_equality_op_for_ordering_op(sortop, NULL);
|
||||||
|
if (!OidIsValid(eqop)) /* shouldn't happen */
|
||||||
|
elog(ERROR, "could not find equality operator for ordering operator %u",
|
||||||
|
sortop);
|
||||||
|
|
||||||
tle = get_tle_by_resno(subplan->targetlist,
|
tle = get_tle_by_resno(subplan->targetlist,
|
||||||
groupColIdx[groupColPos]);
|
groupColIdx[groupColPos]);
|
||||||
Assert(tle != NULL);
|
Assert(tle != NULL);
|
||||||
|
|
||||||
sortcl = makeNode(SortGroupClause);
|
sortcl = makeNode(SortGroupClause);
|
||||||
sortcl->tleSortGroupRef = assignSortGroupRef(tle,
|
sortcl->tleSortGroupRef = assignSortGroupRef(tle,
|
||||||
subplan->targetlist);
|
subplan->targetlist);
|
||||||
sortcl->eqop = in_oper;
|
sortcl->eqop = eqop;
|
||||||
sortcl->sortop = sortop;
|
sortcl->sortop = sortop;
|
||||||
sortcl->nulls_first = false;
|
sortcl->nulls_first = false;
|
||||||
sortList = lappend(sortList, sortcl);
|
sortList = lappend(sortList, sortcl);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user