diff --git a/src/backend/nodes/parsenodes.h b/src/backend/nodes/parsenodes.h index ff5baea9f1..07f86b252e 100644 --- a/src/backend/nodes/parsenodes.h +++ b/src/backend/nodes/parsenodes.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: parsenodes.h,v 1.2 1996/08/06 16:27:48 scrappy Exp $ + * $Id: parsenodes.h,v 1.3 1996/08/06 16:37:53 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -631,6 +631,7 @@ typedef struct RelExpr { */ typedef struct SortBy { NodeTag type; + char *range; char *name; /* name of column to sort on */ char *useOp; /* operator to use */ } SortBy; diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index a99bd780fa..a9426c96aa 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.4 1996/08/06 16:27:56 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.5 1996/08/06 16:37:58 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -62,7 +62,8 @@ static TargetEntry *make_targetlist_expr(ParseState *pstate, bool ResdomNoIsAttrNo); static Node *transformWhereClause(ParseState *pstate, Node *a_expr); static List *transformGroupClause(ParseState *pstate, List *grouplist); -static List *transformSortClause(List *orderlist, List *targetlist, +static List *transformSortClause(ParseState *pstate, + List *orderlist, List *targetlist, char* uniqueFlag); static void parseFromClause(ParseState *pstate, List *frmList); @@ -418,7 +419,8 @@ transformSelectStmt(ParseState *pstate, RetrieveStmt *stmt) qry->qual = transformWhereClause(pstate,stmt->whereClause); /* fix order clause */ - qry->sortClause = transformSortClause(stmt->orderClause, + qry->sortClause = transformSortClause(pstate, + stmt->orderClause, qry->targetList, qry->uniqueFlag); @@ -506,7 +508,8 @@ transformCursorStmt(ParseState *pstate, CursorStmt *stmt) qry->qual = transformWhereClause(pstate,stmt->whereClause); /* fix order clause */ - qry->sortClause = transformSortClause(stmt->orderClause, + qry->sortClause = transformSortClause(pstate, + stmt->orderClause, qry->targetList, qry->uniqueFlag); /* fix group by clause */ @@ -1512,20 +1515,35 @@ transformWhereClause(ParseState *pstate, Node *a_expr) /* * find_tl_elt - * returns the Resdom in the target list matching the specified varname + * and range * */ static Resdom * -find_tl_elt(char *varname, List *tlist) +find_tl_elt(ParseState *pstate, char *range, char *varname, List *tlist) { List *i; - + int real_rtable_pos; + + if(range) { + real_rtable_pos = RangeTablePosn(pstate->p_rtable, range); + } + foreach(i, tlist) { TargetEntry *target = (TargetEntry *)lfirst(i); Resdom *resnode = target->resdom; + Var *var = (Var *)target->expr; char *resname = resnode->resname; - - if (!strcmp(resname, varname)) - return (resnode); + int test_rtable_pos = var->varno; + + if (!strcmp(resname, varname)) { + if(range) { + if(real_rtable_pos == test_rtable_pos) { + return (resnode); + } + } else { + return (resnode); + } + } } return ((Resdom *)NULL); } @@ -1579,7 +1597,8 @@ transformGroupClause(ParseState *pstate, List *grouplist) * */ static List * -transformSortClause(List *orderlist, List *targetlist, +transformSortClause(ParseState *pstate, + List *orderlist, List *targetlist, char* uniqueFlag) { List *sortlist = NIL; @@ -1590,7 +1609,7 @@ transformSortClause(List *orderlist, List *targetlist, SortClause *sortcl = makeNode(SortClause); Resdom *resdom; - resdom = find_tl_elt(sortby->name, targetlist); + resdom = find_tl_elt(pstate, sortby->range, sortby->name, targetlist); if (resdom == NULL) elog(WARN,"The field being sorted by must appear in the target list"); diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index a40a2caff8..702766db3b 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.3 1996/08/06 16:27:59 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.4 1996/08/06 16:38:03 scrappy Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -1426,12 +1426,20 @@ sortby_list: sortby sortby: Id OptUseOp { $$ = makeNode(SortBy); + $$->range = NULL; $$->name = $1; $$->useOp = $2; } - | attr OptUseOp + | Id '.' Id OptUseOp + { + $$ = makeNode(SortBy); + $$->range = $1; + $$->name = $3; + $$->useOp = $4; + } + | /*EMPTY*/ { - yyerror("parse error: use 'sort by attribute_name'"); + yyerror("parse error: use 'order by attribute_name'"); } ;