diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c index 5cb89aac867f600aae446a67acc04f54fe2c9a65..e942173a74548b6bba658244c4158e2b89bd960d 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.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) { parse->uniqueFlag = "*"; parse->sortClause = transformSortClause(NULL, NIL, - ((Plan *) lfirst(union_plans))->targetlist, "*"); + parse->sortClause, + parse->targetList, "*"); } else - { /* needed so we don't take the flag from the first query */ parse->uniqueFlag = NULL; - parse->sortClause = NIL; - } parse->havingQual = NULL; parse->qry_numAgg = 0; diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 0d1d3dcb248dc7168aa85ffed8739879b8e8c713..5837fa8fb701ec9bd1dbf5256f37dfcb783bc3c4 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -7,7 +7,7 @@ * * * 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) /* fix order clause */ qry->sortClause = transformSortClause(pstate, stmt->sortClause, + NIL, qry->targetList, qry->uniqueFlag); @@ -842,9 +843,6 @@ transformSelectStmt(ParseState *pstate, RetrieveStmt *stmt) qry->unionall = stmt->unionall; /* in child, so unionClause may be false */ 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; } @@ -918,6 +916,7 @@ transformCursorStmt(ParseState *pstate, CursorStmt *stmt) /* fix order clause */ qry->sortClause = transformSortClause(pstate, stmt->sortClause, + NIL, qry->targetList, qry->uniqueFlag); /* fix group by clause */ diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index 8028329b437455550ba125977a70d250d538e179..204f45bb59f2502cc1db8d1519a6a21f7a2ee9de 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -7,7 +7,7 @@ * * * 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) */ List * transformSortClause(ParseState *pstate, - List *orderlist, List *targetlist, + List *orderlist, + List *sortlist, + List *targetlist, char *uniqueFlag) { - List *sortlist = NIL; List *s = NIL; while (orderlist != NIL) @@ -262,6 +263,8 @@ transformSortClause(ParseState *pstate, TargetEntry *restarget; Resdom *resdom; + sortlist = NIL; /* we create it on the fly here */ + restarget = find_targetlist_entry(pstate, sortby, targetlist); if (restarget == NULL) elog(WARN, "The field being ordered by must appear in the target list"); diff --git a/src/include/parser/parse_clause.h b/src/include/parser/parse_clause.h index d402faeb11af9ca14d20322ed51befe1303a15ad..4c04a41cb3be940ed1c5c5ba9f1e96a85d7bc519 100644 --- a/src/include/parser/parse_clause.h +++ b/src/include/parser/parse_clause.h @@ -6,7 +6,7 @@ * * 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); extern List *transformGroupClause(ParseState *pstate, List *grouplist, List *targetlist); extern List *transformSortClause(ParseState *pstate, - List *orderlist, List *targetlist, - char *uniqueFlag); + List *orderlist, List *sortClause, + List *targetlist, char *uniqueFlag); extern List *transformUnionClause(List *unionClause, List *targetlist); #endif /* PARSE_CLAUSE_H */