From 2e6159311ace7a0bdbc82bdb3c537ba16aea5e4d Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 5 Jun 1998 03:49:20 +0000
Subject: [PATCH] I made several adjustments to my earlier patch to handle the
 condition where the target label is ambiguous.

---
 src/backend/parser/parse_clause.c | 31 +++++++++++++++++++++++--------
 src/backend/parser/parse_target.c |  8 ++++----
 src/include/parser/parse_target.h |  7 +++----
 src/test/regress/sql/tests        |  1 +
 4 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 8fb8e185587..aad47e077b3 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.17 1998/05/29 14:00:19 thomas Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.18 1998/06/05 03:49:18 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -194,17 +194,32 @@ find_targetlist_entry(ParseState *pstate, SortGroupBy *sortgroupby, List *tlist)
 	 *    it will not be projected into the final tuple.
 	 *          daveh@insightdist.com    5/20/98
 	 */  
-	if ( ! target_result)  {  
+	if ( ! target_result && sortgroupby->name)   {
 		List   *p_target = tlist;
-		Ident *missingTargetId = (Ident *)makeNode(Ident);
 		TargetEntry *tent = makeNode(TargetEntry);
 		
-		/*   Fill in the constructed Ident node   */
-		missingTargetId->type = T_Ident;
-		missingTargetId->name = palloc(strlen(sortgroupby->name) + 1);
-		strcpy(missingTargetId->name, sortgroupby->name);
 
-		transformTargetId(pstate, missingTargetId, tent, missingTargetId->name, TRUE);
+		if (sortgroupby->range)  {
+			Attr *missingTarget = (Attr *)makeNode(Attr);
+			missingTarget->type = T_Attr;
+
+			missingTarget->relname = palloc(strlen(sortgroupby->range) + 1);
+			strcpy(missingTarget->relname, sortgroupby->range);
+
+			missingTarget->attrs = lcons(makeString(sortgroupby->name), NIL);
+
+			transformTargetId(pstate, (Node*)missingTarget, tent, sortgroupby->name, TRUE);
+		}
+		else  {
+			Ident *missingTarget = (Ident *)makeNode(Ident);
+			missingTarget->type = T_Ident;
+
+			missingTarget->name = palloc(strlen(sortgroupby->name) + 1);
+			strcpy(missingTarget->name, sortgroupby->name);
+
+			transformTargetId(pstate, (Node*)missingTarget, tent, sortgroupby->name, TRUE);
+		}
+
 
 		/* Add to the end of the target list */
 		while (lnext(p_target) != NIL)  {
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c
index ad996081625..51b3fe0b0f4 100644
--- a/src/backend/parser/parse_target.c
+++ b/src/backend/parser/parse_target.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.14 1998/05/29 14:00:23 thomas Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.15 1998/06/05 03:49:18 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -54,7 +54,7 @@ size_target_expr(ParseState *pstate,
  */
 void
 transformTargetId(ParseState *pstate,
-				Ident *ident,
+				Node *node,
 				TargetEntry *tent,
 				char *resname,
 				int16 resjunk)
@@ -68,7 +68,7 @@ transformTargetId(ParseState *pstate,
 	 * relation names (even though they can be stored in
 	 * Ident nodes, too)
 	 */
-	expr = transformIdent(pstate, (Node *) ident, EXPR_COLUMN_FIRST);
+	expr = transformExpr(pstate, node, EXPR_COLUMN_FIRST);
 	type_id = exprType(expr);
 	if (nodeTag(expr) == T_Var)
 		type_mod = ((Var *) expr)->vartypmod;
@@ -113,7 +113,7 @@ transformTargetList(ParseState *pstate, List *targetlist)
 					identname = ((Ident *) res->val)->name;
 					handleTargetColname(pstate, &res->name, NULL, identname);
 					resname = (res->name) ? res->name : identname;
-					transformTargetId(pstate, (Ident*)res->val, tent, resname, FALSE);
+					transformTargetId(pstate, (Node*)res->val, tent, resname, FALSE);
 					break;
 				}
 			case T_ParamNo:
diff --git a/src/include/parser/parse_target.h b/src/include/parser/parse_target.h
index 466f0329b6a..2275c283ce6 100644
--- a/src/include/parser/parse_target.h
+++ b/src/include/parser/parse_target.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: parse_target.h,v 1.6 1998/05/29 14:07:50 thomas Exp $
+ * $Id: parse_target.h,v 1.7 1998/06/05 03:49:19 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -24,9 +24,8 @@
 
 extern List *transformTargetList(ParseState *pstate, List *targetlist);
 extern List *makeTargetNames(ParseState *pstate, List *cols);
-extern void transformTargetId(ParseState *pstate, Ident *ident,
-							  TargetEntry *tent, char *resname,
-							  int16 resjunk);
+extern void transformTargetId(ParseState *pstate, Node *node,
+  	TargetEntry *tent, char *resname, int16 resjunk);
 extern Node *coerce_target_expr(ParseState *pstate, Node *expr,
 								Oid type_id, Oid attrtype);
 
diff --git a/src/test/regress/sql/tests b/src/test/regress/sql/tests
index 783cb9691db..c2c8cfa9cd5 100644
--- a/src/test/regress/sql/tests
+++ b/src/test/regress/sql/tests
@@ -58,3 +58,4 @@ hash_index
 select_views
 alter_table
 portals_p2
+junkfilter
-- 
GitLab