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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 30 additions & 11 deletions
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

Lines changed: 11 additions & 3 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy