Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 6c684b1

Browse files
committed
Fixes:
Previously Postgres95 wouldn't accept 'order by' clauses with fields referred to as '<table>.<field>', e.g.: select t1.field1, t2.field2 from table1 t1, table2 t2 order by t2.field2; This syntax is required by the ODBC SQL spec. Submitted by: Dan McGuirk <mcguirk@indirect.com>
1 parent ab22b34 commit 6c684b1

File tree

3 files changed

+43
-15
lines changed

3 files changed

+43
-15
lines changed

src/backend/nodes/parsenodes.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Id: parsenodes.h,v 1.2 1996/08/06 16:27:48 scrappy Exp $
9+
* $Id: parsenodes.h,v 1.3 1996/08/06 16:37:53 scrappy Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -631,6 +631,7 @@ typedef struct RelExpr {
631631
*/
632632
typedef struct SortBy {
633633
NodeTag type;
634+
char *range;
634635
char *name; /* name of column to sort on */
635636
char *useOp; /* operator to use */
636637
} SortBy;

src/backend/parser/analyze.c

+30-11
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.4 1996/08/06 16:27:56 scrappy Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.5 1996/08/06 16:37:58 scrappy Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -62,7 +62,8 @@ static TargetEntry *make_targetlist_expr(ParseState *pstate,
6262
bool ResdomNoIsAttrNo);
6363
static Node *transformWhereClause(ParseState *pstate, Node *a_expr);
6464
static List *transformGroupClause(ParseState *pstate, List *grouplist);
65-
static List *transformSortClause(List *orderlist, List *targetlist,
65+
static List *transformSortClause(ParseState *pstate,
66+
List *orderlist, List *targetlist,
6667
char* uniqueFlag);
6768

6869
static void parseFromClause(ParseState *pstate, List *frmList);
@@ -418,7 +419,8 @@ transformSelectStmt(ParseState *pstate, RetrieveStmt *stmt)
418419
qry->qual = transformWhereClause(pstate,stmt->whereClause);
419420

420421
/* fix order clause */
421-
qry->sortClause = transformSortClause(stmt->orderClause,
422+
qry->sortClause = transformSortClause(pstate,
423+
stmt->orderClause,
422424
qry->targetList,
423425
qry->uniqueFlag);
424426

@@ -506,7 +508,8 @@ transformCursorStmt(ParseState *pstate, CursorStmt *stmt)
506508
qry->qual = transformWhereClause(pstate,stmt->whereClause);
507509

508510
/* fix order clause */
509-
qry->sortClause = transformSortClause(stmt->orderClause,
511+
qry->sortClause = transformSortClause(pstate,
512+
stmt->orderClause,
510513
qry->targetList,
511514
qry->uniqueFlag);
512515
/* fix group by clause */
@@ -1512,20 +1515,35 @@ transformWhereClause(ParseState *pstate, Node *a_expr)
15121515
/*
15131516
* find_tl_elt -
15141517
* returns the Resdom in the target list matching the specified varname
1518+
* and range
15151519
*
15161520
*/
15171521
static Resdom *
1518-
find_tl_elt(char *varname, List *tlist)
1522+
find_tl_elt(ParseState *pstate, char *range, char *varname, List *tlist)
15191523
{
15201524
List *i;
1521-
1525+
int real_rtable_pos;
1526+
1527+
if(range) {
1528+
real_rtable_pos = RangeTablePosn(pstate->p_rtable, range);
1529+
}
1530+
15221531
foreach(i, tlist) {
15231532
TargetEntry *target = (TargetEntry *)lfirst(i);
15241533
Resdom *resnode = target->resdom;
1534+
Var *var = (Var *)target->expr;
15251535
char *resname = resnode->resname;
1526-
1527-
if (!strcmp(resname, varname))
1528-
return (resnode);
1536+
int test_rtable_pos = var->varno;
1537+
1538+
if (!strcmp(resname, varname)) {
1539+
if(range) {
1540+
if(real_rtable_pos == test_rtable_pos) {
1541+
return (resnode);
1542+
}
1543+
} else {
1544+
return (resnode);
1545+
}
1546+
}
15291547
}
15301548
return ((Resdom *)NULL);
15311549
}
@@ -1579,7 +1597,8 @@ transformGroupClause(ParseState *pstate, List *grouplist)
15791597
*
15801598
*/
15811599
static List *
1582-
transformSortClause(List *orderlist, List *targetlist,
1600+
transformSortClause(ParseState *pstate,
1601+
List *orderlist, List *targetlist,
15831602
char* uniqueFlag)
15841603
{
15851604
List *sortlist = NIL;
@@ -1590,7 +1609,7 @@ transformSortClause(List *orderlist, List *targetlist,
15901609
SortClause *sortcl = makeNode(SortClause);
15911610
Resdom *resdom;
15921611

1593-
resdom = find_tl_elt(sortby->name, targetlist);
1612+
resdom = find_tl_elt(pstate, sortby->range, sortby->name, targetlist);
15941613
if (resdom == NULL)
15951614
elog(WARN,"The field being sorted by must appear in the target list");
15961615

src/backend/parser/gram.y

+11-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*
1212
* IDENTIFICATION
13-
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.3 1996/08/06 16:27:59 scrappy Exp $
13+
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.4 1996/08/06 16:38:03 scrappy Exp $
1414
*
1515
* HISTORY
1616
* AUTHOR DATE MAJOR EVENT
@@ -1426,12 +1426,20 @@ sortby_list: sortby
14261426
sortby: Id OptUseOp
14271427
{
14281428
$$ = makeNode(SortBy);
1429+
$$->range = NULL;
14291430
$$->name = $1;
14301431
$$->useOp = $2;
14311432
}
1432-
| attr OptUseOp
1433+
| Id '.' Id OptUseOp
1434+
{
1435+
$$ = makeNode(SortBy);
1436+
$$->range = $1;
1437+
$$->name = $3;
1438+
$$->useOp = $4;
1439+
}
1440+
| /*EMPTY*/
14331441
{
1434-
yyerror("parse error: use 'sort by attribute_name'");
1442+
yyerror("parse error: use 'order by attribute_name'");
14351443
}
14361444
;
14371445

0 commit comments

Comments
 (0)