From 9432b6dd64b521276dc8e1fd37bc66853c93073d Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sun, 23 May 1999 21:42:09 +0000
Subject: [PATCH] Do not assign output columns to junk attributes created from
 GROUP BY or ORDER BY expressions in INSERT ... SELECT.

---
 src/backend/parser/parse_target.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c
index 1294326f3d4..2dfe2ece57d 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.38 1999/05/22 04:12:28 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.39 1999/05/23 21:42:09 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -32,16 +32,12 @@
 
 
 static List *ExpandAllTables(ParseState *pstate);
-char *FigureColname(Node *expr, Node *resval);
-
+static char *FigureColname(Node *expr, Node *resval);
 static Node *SizeTargetExpr(ParseState *pstate,
 			   Node *expr,
 			   Oid attrtype,
 			   int32 attrtypmod);
 
-static TargetEntry *
-MakeTargetEntryCase(ParseState *pstate,
-					ResTarget *res);
 
 /* MakeTargetEntryIdent()
  * Transforms an Ident Node to a Target Entry
@@ -66,8 +62,13 @@ MakeTargetEntryIdent(ParseState *pstate,
 	Oid			attrtype_target;
 	TargetEntry *tent = makeNode(TargetEntry);
 
-	if (pstate->p_is_insert)
+	if (pstate->p_is_insert && !resjunk)
 	{
+		/* Assign column name of destination column to the new TLE.
+		 * XXX this is probably WRONG in INSERT ... SELECT case,
+		 * since handling of GROUP BY and so forth probably should use
+		 * the source table's names not the destination's names.
+		 */
 		if (pstate->p_insert_columns != NIL)
 		{
 			Ident	   *id = lfirst(pstate->p_insert_columns);
@@ -79,7 +80,7 @@ MakeTargetEntryIdent(ParseState *pstate,
 			elog(ERROR, "INSERT has more expressions than target columns");
 	}
 
-	if (pstate->p_is_insert || pstate->p_is_update)
+	if ((pstate->p_is_insert || pstate->p_is_update) && !resjunk)
 	{
 		Oid			attrtype_id;
 		int			resdomno_id,
@@ -208,7 +209,7 @@ MakeTargetEntryExpr(ParseState *pstate,
 		type_mod = -1;
 
 	/* Process target columns that will be receiving results */
-	if (pstate->p_is_insert || pstate->p_is_update)
+	if ((pstate->p_is_insert || pstate->p_is_update) && !resjunk)
 	{
 
 		/*
@@ -870,7 +871,7 @@ ExpandAllTables(ParseState *pstate)
  *	  list, we have to guess.
  *
  */
-char *
+static char *
 FigureColname(Node *expr, Node *resval)
 {
 	switch (nodeTag(expr))
-- 
GitLab