Commit a1dd4090 authored by Bruce Momjian's avatar Bruce Momjian

Fix for ORDER BY in UNION.

parent 499b13c9
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.16 1997/12/29 01:12:48 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.17 1997/12/29 04:31:23 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -177,14 +177,12 @@ plan_union_queries(Query *parse) ...@@ -177,14 +177,12 @@ plan_union_queries(Query *parse)
{ {
parse->uniqueFlag = "*"; parse->uniqueFlag = "*";
parse->sortClause = transformSortClause(NULL, NIL, parse->sortClause = transformSortClause(NULL, NIL,
((Plan *) lfirst(union_plans))->targetlist, "*"); parse->sortClause,
parse->targetList, "*");
} }
else else
{
/* needed so we don't take the flag from the first query */ /* needed so we don't take the flag from the first query */
parse->uniqueFlag = NULL; parse->uniqueFlag = NULL;
parse->sortClause = NIL;
}
parse->havingQual = NULL; parse->havingQual = NULL;
parse->qry_numAgg = 0; parse->qry_numAgg = 0;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.58 1997/12/29 01:12:55 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.59 1997/12/29 04:31:28 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -828,6 +828,7 @@ transformSelectStmt(ParseState *pstate, RetrieveStmt *stmt) ...@@ -828,6 +828,7 @@ transformSelectStmt(ParseState *pstate, RetrieveStmt *stmt)
/* fix order clause */ /* fix order clause */
qry->sortClause = transformSortClause(pstate, qry->sortClause = transformSortClause(pstate,
stmt->sortClause, stmt->sortClause,
NIL,
qry->targetList, qry->targetList,
qry->uniqueFlag); qry->uniqueFlag);
...@@ -842,9 +843,6 @@ transformSelectStmt(ParseState *pstate, RetrieveStmt *stmt) ...@@ -842,9 +843,6 @@ transformSelectStmt(ParseState *pstate, RetrieveStmt *stmt)
qry->unionall = stmt->unionall; /* in child, so unionClause may be false */ qry->unionall = stmt->unionall; /* in child, so unionClause may be false */
qry->unionClause = transformUnionClause(stmt->unionClause, qry->targetList); qry->unionClause = transformUnionClause(stmt->unionClause, qry->targetList);
if (qry->unionClause && stmt->sortClause)
elog(WARN, "You can not use ORDER BY with UNION", NULL);
return (Query *) qry; return (Query *) qry;
} }
...@@ -918,6 +916,7 @@ transformCursorStmt(ParseState *pstate, CursorStmt *stmt) ...@@ -918,6 +916,7 @@ transformCursorStmt(ParseState *pstate, CursorStmt *stmt)
/* fix order clause */ /* fix order clause */
qry->sortClause = transformSortClause(pstate, qry->sortClause = transformSortClause(pstate,
stmt->sortClause, stmt->sortClause,
NIL,
qry->targetList, qry->targetList,
qry->uniqueFlag); qry->uniqueFlag);
/* fix group by clause */ /* fix group by clause */
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.5 1997/12/29 02:09:54 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.6 1997/12/29 04:31:31 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -249,10 +249,11 @@ transformGroupClause(ParseState *pstate, List *grouplist, List *targetlist) ...@@ -249,10 +249,11 @@ transformGroupClause(ParseState *pstate, List *grouplist, List *targetlist)
*/ */
List * List *
transformSortClause(ParseState *pstate, transformSortClause(ParseState *pstate,
List *orderlist, List *targetlist, List *orderlist,
List *sortlist,
List *targetlist,
char *uniqueFlag) char *uniqueFlag)
{ {
List *sortlist = NIL;
List *s = NIL; List *s = NIL;
while (orderlist != NIL) while (orderlist != NIL)
...@@ -262,6 +263,8 @@ transformSortClause(ParseState *pstate, ...@@ -262,6 +263,8 @@ transformSortClause(ParseState *pstate,
TargetEntry *restarget; TargetEntry *restarget;
Resdom *resdom; Resdom *resdom;
sortlist = NIL; /* we create it on the fly here */
restarget = find_targetlist_entry(pstate, sortby, targetlist); restarget = find_targetlist_entry(pstate, sortby, targetlist);
if (restarget == NULL) if (restarget == NULL)
elog(WARN, "The field being ordered by must appear in the target list"); elog(WARN, "The field being ordered by must appear in the target list");
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: parse_clause.h,v 1.4 1997/12/29 01:13:28 momjian Exp $ * $Id: parse_clause.h,v 1.5 1997/12/29 04:31:50 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -24,8 +24,8 @@ extern Node *transformWhereClause(ParseState *pstate, Node *a_expr); ...@@ -24,8 +24,8 @@ extern Node *transformWhereClause(ParseState *pstate, Node *a_expr);
extern List *transformGroupClause(ParseState *pstate, List *grouplist, extern List *transformGroupClause(ParseState *pstate, List *grouplist,
List *targetlist); List *targetlist);
extern List *transformSortClause(ParseState *pstate, extern List *transformSortClause(ParseState *pstate,
List *orderlist, List *targetlist, List *orderlist, List *sortClause,
char *uniqueFlag); List *targetlist, char *uniqueFlag);
extern List *transformUnionClause(List *unionClause, List *targetlist); extern List *transformUnionClause(List *unionClause, List *targetlist);
#endif /* PARSE_CLAUSE_H */ #endif /* PARSE_CLAUSE_H */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment