7
7
*
8
8
*
9
9
* 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 $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
@@ -62,7 +62,8 @@ static TargetEntry *make_targetlist_expr(ParseState *pstate,
62
62
bool ResdomNoIsAttrNo );
63
63
static Node * transformWhereClause (ParseState * pstate , Node * a_expr );
64
64
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 ,
66
67
char * uniqueFlag );
67
68
68
69
static void parseFromClause (ParseState * pstate , List * frmList );
@@ -418,7 +419,8 @@ transformSelectStmt(ParseState *pstate, RetrieveStmt *stmt)
418
419
qry -> qual = transformWhereClause (pstate ,stmt -> whereClause );
419
420
420
421
/* fix order clause */
421
- qry -> sortClause = transformSortClause (stmt -> orderClause ,
422
+ qry -> sortClause = transformSortClause (pstate ,
423
+ stmt -> orderClause ,
422
424
qry -> targetList ,
423
425
qry -> uniqueFlag );
424
426
@@ -506,7 +508,8 @@ transformCursorStmt(ParseState *pstate, CursorStmt *stmt)
506
508
qry -> qual = transformWhereClause (pstate ,stmt -> whereClause );
507
509
508
510
/* fix order clause */
509
- qry -> sortClause = transformSortClause (stmt -> orderClause ,
511
+ qry -> sortClause = transformSortClause (pstate ,
512
+ stmt -> orderClause ,
510
513
qry -> targetList ,
511
514
qry -> uniqueFlag );
512
515
/* fix group by clause */
@@ -1512,20 +1515,35 @@ transformWhereClause(ParseState *pstate, Node *a_expr)
1512
1515
/*
1513
1516
* find_tl_elt -
1514
1517
* returns the Resdom in the target list matching the specified varname
1518
+ * and range
1515
1519
*
1516
1520
*/
1517
1521
static Resdom *
1518
- find_tl_elt (char * varname , List * tlist )
1522
+ find_tl_elt (ParseState * pstate , char * range , char * varname , List * tlist )
1519
1523
{
1520
1524
List * i ;
1521
-
1525
+ int real_rtable_pos ;
1526
+
1527
+ if (range ) {
1528
+ real_rtable_pos = RangeTablePosn (pstate -> p_rtable , range );
1529
+ }
1530
+
1522
1531
foreach (i , tlist ) {
1523
1532
TargetEntry * target = (TargetEntry * )lfirst (i );
1524
1533
Resdom * resnode = target -> resdom ;
1534
+ Var * var = (Var * )target -> expr ;
1525
1535
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
+ }
1529
1547
}
1530
1548
return ((Resdom * )NULL );
1531
1549
}
@@ -1579,7 +1597,8 @@ transformGroupClause(ParseState *pstate, List *grouplist)
1579
1597
*
1580
1598
*/
1581
1599
static List *
1582
- transformSortClause (List * orderlist , List * targetlist ,
1600
+ transformSortClause (ParseState * pstate ,
1601
+ List * orderlist , List * targetlist ,
1583
1602
char * uniqueFlag )
1584
1603
{
1585
1604
List * sortlist = NIL ;
@@ -1590,7 +1609,7 @@ transformSortClause(List *orderlist, List *targetlist,
1590
1609
SortClause * sortcl = makeNode (SortClause );
1591
1610
Resdom * resdom ;
1592
1611
1593
- resdom = find_tl_elt (sortby -> name , targetlist );
1612
+ resdom = find_tl_elt (pstate , sortby -> range , sortby -> name , targetlist );
1594
1613
if (resdom == NULL )
1595
1614
elog (WARN ,"The field being sorted by must appear in the target list" );
1596
1615
0 commit comments