aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/prep/prepunion.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/prep/prepunion.c')
-rw-r--r--src/backend/optimizer/prep/prepunion.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c
index e821f20a963..e1c620956a4 100644
--- a/src/backend/optimizer/prep/prepunion.c
+++ b/src/backend/optimizer/prep/prepunion.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.21 1998/03/30 19:04:41 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.22 1998/03/31 04:43:49 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -64,12 +64,13 @@ plan_union_queries(Query *parse)
{
List *union_plans = NIL,
*ulist,
- *unionall_queries,
+ *union_all_queries,
*union_rts,
- *last_union = NIL;
+ *last_union = NIL,
+ *hold_sortClause = parse->sortClause;
bool union_all_found = false,
union_found = false,
- last_unionall_flag = false;
+ last_union_all_flag = false;
/*------------------------------------------------------------------
*
@@ -120,17 +121,25 @@ plan_union_queries(Query *parse)
union_found = true;
last_union = ulist;
}
- last_unionall_flag = union_query->unionall;
+ last_union_all_flag = union_query->unionall;
}
/* Is this a simple one */
if (!union_all_found ||
!union_found ||
/* A trailing UNION negates the affect of earlier UNION ALLs */
- !last_unionall_flag)
+ !last_union_all_flag)
{
List *hold_unionClause = parse->unionClause;
+ /* we will do this later, so don't do it now */
+ if (!union_all_found ||
+ !last_union_all_flag)
+ {
+ parse->sortClause = NIL;
+ parse->uniqueFlag = NULL;
+ }
+
parse->unionClause = NIL; /* prevent recursion */
union_plans = lcons(union_planner(parse), NIL);
union_rts = lcons(parse->rtable, NIL);
@@ -154,7 +163,7 @@ plan_union_queries(Query *parse)
*/
/* save off everthing past the last UNION */
- unionall_queries = lnext(last_union);
+ union_all_queries = lnext(last_union);
/* clip off the list to remove the trailing UNION ALLs */
lnext(last_union) = NIL;
@@ -167,21 +176,21 @@ plan_union_queries(Query *parse)
union_rts = lcons(parse->rtable, NIL);
/* Append the remainging UNION ALLs */
- foreach(ulist, unionall_queries)
+ foreach(ulist, union_all_queries)
{
- Query *unionall_query = lfirst(ulist);
+ Query *union_all_query = lfirst(ulist);
- union_plans = lappend(union_plans, union_planner(unionall_query));
- union_rts = lappend(union_rts, unionall_query->rtable);
+ union_plans = lappend(union_plans, union_planner(union_all_query));
+ union_rts = lappend(union_rts, union_all_query->rtable);
}
}
/* We have already split UNION and UNION ALL and we made it consistent */
- if (!last_unionall_flag)
+ if (!last_union_all_flag)
{
parse->uniqueFlag = "*";
parse->sortClause = transformSortClause(NULL, NIL,
- parse->sortClause,
+ hold_sortClause,
parse->targetList, "*");
}
else
@@ -195,7 +204,7 @@ plan_union_queries(Query *parse)
union_rts,
0,
NULL,
- ((Plan *) lfirst(union_plans))->targetlist));
+ parse->targetList));
}