mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Fix for ORDER BY in UNION.
This commit is contained in:
@ -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)
|
|||||||
{
|
{
|
||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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)
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
/* 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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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)
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
* 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);
|
|||||||
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 */
|
||||||
|
Reference in New Issue
Block a user