Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit6c684b1

Browse files
committed
Fixes:
Previously Postgres95 wouldn't accept 'order by' clauses with fieldsreferred 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 parentab22b34 commit6c684b1

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
typedefstructSortBy {
633633
NodeTagtype;
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
boolResdomNoIsAttrNo);
6363
staticNode*transformWhereClause(ParseState*pstate,Node*a_expr);
6464
staticList*transformGroupClause(ParseState*pstate,List*grouplist);
65-
staticList*transformSortClause(List*orderlist,List*targetlist,
65+
staticList*transformSortClause(ParseState*pstate,
66+
List*orderlist,List*targetlist,
6667
char*uniqueFlag);
6768

6869
staticvoidparseFromClause(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
staticResdom*
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+
intreal_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+
inttest_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
staticList*
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
* AUTHORDATEMAJOR 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)

[8]ページ先頭

©2009-2025 Movatter.jp