diff options
Diffstat (limited to 'src/backend/optimizer/prep')
-rw-r--r-- | src/backend/optimizer/prep/prepkeyset.c | 4 | ||||
-rw-r--r-- | src/backend/optimizer/prep/prepunion.c | 32 |
2 files changed, 23 insertions, 13 deletions
diff --git a/src/backend/optimizer/prep/prepkeyset.c b/src/backend/optimizer/prep/prepkeyset.c index 127505597a4..fc192e6f28b 100644 --- a/src/backend/optimizer/prep/prepkeyset.c +++ b/src/backend/optimizer/prep/prepkeyset.c @@ -104,9 +104,7 @@ transformKeySetQuery(Query *origNode) unionNode->isPortal = origNode->isPortal; unionNode->isBinary = origNode->isBinary; - if (origNode->uniqueFlag) - unionNode->uniqueFlag = pstrdup(origNode->uniqueFlag); - + Node_Copy(origNode, unionNode, distinctClause); Node_Copy(origNode, unionNode, sortClause); Node_Copy(origNode, unionNode, rtable); Node_Copy(origNode, unionNode, targetList); diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c index a27305ef3e8..4323b652e8d 100644 --- a/src/backend/optimizer/prep/prepunion.c +++ b/src/backend/optimizer/prep/prepunion.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.41 2000/01/26 05:56:39 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.42 2000/01/27 18:11:32 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -21,6 +21,7 @@ #include "optimizer/planmain.h" #include "optimizer/planner.h" #include "optimizer/prep.h" +#include "optimizer/tlist.h" #include "parser/parse_clause.h" #include "parser/parsetree.h" #include "utils/lsyscache.h" @@ -131,7 +132,7 @@ plan_union_queries(Query *parse) !last_union_all_flag) { parse->sortClause = NIL; - parse->uniqueFlag = NULL; + parse->distinctClause = NIL; } parse->unionClause = NIL; /* prevent recursion */ @@ -183,17 +184,28 @@ plan_union_queries(Query *parse) if (!last_union_all_flag) { /* Need SELECT DISTINCT behavior to implement UNION. - * Set uniqueFlag properly, put back the held sortClause, - * and add any missing columns to the sort clause. + * Put back the held sortClause, add any missing columns to the + * sort clause, and set distinctClause properly. */ - parse->uniqueFlag = "*"; + List *slitem; + parse->sortClause = addAllTargetsToSortList(hold_sortClause, parse->targetList); + parse->distinctClause = NIL; + foreach(slitem, parse->sortClause) + { + SortClause *scl = (SortClause *) lfirst(slitem); + TargetEntry *tle = get_sortgroupclause_tle(scl, parse->targetList); + + if (! tle->resdom->resjunk) + parse->distinctClause = lappend(parse->distinctClause, + copyObject(scl)); + } } else { - /* needed so we don't take the flag from the first query */ - parse->uniqueFlag = NULL; + /* needed so we don't take SELECT DISTINCT from the first query */ + parse->distinctClause = NIL; } /* Make sure we don't try to apply the first query's grouping stuff @@ -314,9 +326,9 @@ plan_inherit_query(Relids relids, * Clear the sorting and grouping qualifications in the subquery, * so that sorting will only be done once after append */ - new_root->uniqueFlag = NULL; - new_root->sortClause = NULL; - new_root->groupClause = NULL; + new_root->distinctClause = NIL; + new_root->sortClause = NIL; + new_root->groupClause = NIL; new_root->havingQual = NULL; new_root->hasAggs = false; /* shouldn't be any left ... */ |