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

Commit 2e61593

Browse files
committed
I made several adjustments to my earlier patch to handle the
condition where the target label is ambiguous.
1 parent a576a60 commit 2e61593

File tree

4 files changed

+31
-16
lines changed

4 files changed

+31
-16
lines changed

src/backend/parser/parse_clause.c

+23-8
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.17 1998/05/29 14:00:19 thomas Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.18 1998/06/05 03:49:18 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -194,17 +194,32 @@ find_targetlist_entry(ParseState *pstate, SortGroupBy *sortgroupby, List *tlist)
194194
* it will not be projected into the final tuple.
195195
* daveh@insightdist.com 5/20/98
196196
*/
197-
if ( ! target_result) {
197+
if ( ! target_result && sortgroupby->name) {
198198
List *p_target = tlist;
199-
Ident *missingTargetId = (Ident *)makeNode(Ident);
200199
TargetEntry *tent = makeNode(TargetEntry);
201200

202-
/* Fill in the constructed Ident node */
203-
missingTargetId->type = T_Ident;
204-
missingTargetId->name = palloc(strlen(sortgroupby->name) + 1);
205-
strcpy(missingTargetId->name, sortgroupby->name);
206201

207-
transformTargetId(pstate, missingTargetId, tent, missingTargetId->name, TRUE);
202+
if (sortgroupby->range) {
203+
Attr *missingTarget = (Attr *)makeNode(Attr);
204+
missingTarget->type = T_Attr;
205+
206+
missingTarget->relname = palloc(strlen(sortgroupby->range) + 1);
207+
strcpy(missingTarget->relname, sortgroupby->range);
208+
209+
missingTarget->attrs = lcons(makeString(sortgroupby->name), NIL);
210+
211+
transformTargetId(pstate, (Node*)missingTarget, tent, sortgroupby->name, TRUE);
212+
}
213+
else {
214+
Ident *missingTarget = (Ident *)makeNode(Ident);
215+
missingTarget->type = T_Ident;
216+
217+
missingTarget->name = palloc(strlen(sortgroupby->name) + 1);
218+
strcpy(missingTarget->name, sortgroupby->name);
219+
220+
transformTargetId(pstate, (Node*)missingTarget, tent, sortgroupby->name, TRUE);
221+
}
222+
208223

209224
/* Add to the end of the target list */
210225
while (lnext(p_target) != NIL) {

src/backend/parser/parse_target.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.14 1998/05/29 14:00:23 thomas Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.15 1998/06/05 03:49:18 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -54,7 +54,7 @@ size_target_expr(ParseState *pstate,
5454
*/
5555
void
5656
transformTargetId(ParseState *pstate,
57-
Ident *ident,
57+
Node *node,
5858
TargetEntry *tent,
5959
char *resname,
6060
int16 resjunk)
@@ -68,7 +68,7 @@ transformTargetId(ParseState *pstate,
6868
* relation names (even though they can be stored in
6969
* Ident nodes, too)
7070
*/
71-
expr = transformIdent(pstate, (Node *) ident, EXPR_COLUMN_FIRST);
71+
expr = transformExpr(pstate, node, EXPR_COLUMN_FIRST);
7272
type_id = exprType(expr);
7373
if (nodeTag(expr) == T_Var)
7474
type_mod = ((Var *) expr)->vartypmod;
@@ -113,7 +113,7 @@ transformTargetList(ParseState *pstate, List *targetlist)
113113
identname = ((Ident *) res->val)->name;
114114
handleTargetColname(pstate, &res->name, NULL, identname);
115115
resname = (res->name) ? res->name : identname;
116-
transformTargetId(pstate, (Ident*)res->val, tent, resname, FALSE);
116+
transformTargetId(pstate, (Node*)res->val, tent, resname, FALSE);
117117
break;
118118
}
119119
case T_ParamNo:

src/include/parser/parse_target.h

+3-4
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: parse_target.h,v 1.6 1998/05/29 14:07:50 thomas Exp $
9+
* $Id: parse_target.h,v 1.7 1998/06/05 03:49:19 momjian Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -24,9 +24,8 @@
2424

2525
extern List *transformTargetList(ParseState *pstate, List *targetlist);
2626
extern List *makeTargetNames(ParseState *pstate, List *cols);
27-
extern void transformTargetId(ParseState *pstate, Ident *ident,
28-
TargetEntry *tent, char *resname,
29-
int16 resjunk);
27+
extern void transformTargetId(ParseState *pstate, Node *node,
28+
TargetEntry *tent, char *resname, int16 resjunk);
3029
extern Node *coerce_target_expr(ParseState *pstate, Node *expr,
3130
Oid type_id, Oid attrtype);
3231

src/test/regress/sql/tests

+1
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,4 @@ hash_index
5858
select_views
5959
alter_table
6060
portals_p2
61+
junkfilter

0 commit comments

Comments
 (0)