From c1f1a2e03a78d52dc8e177d15e5822a0e8fbea4a Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Wed, 15 Jul 1998 22:16:21 +0000
Subject: [PATCH] Allow UNION/UNION ALL in subselects.

---
 src/backend/executor/execAmi.c    |  6 +++++-
 src/backend/executor/nodeAppend.c | 27 +++++++++++++++++++++++++--
 src/backend/parser/gram.c         |  2 +-
 src/include/executor/nodeAppend.h |  3 ++-
 4 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/src/backend/executor/execAmi.c b/src/backend/executor/execAmi.c
index 8ce988114ad..6fa29ac6ec9 100644
--- a/src/backend/executor/execAmi.c
+++ b/src/backend/executor/execAmi.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/executor/execAmi.c,v 1.21 1998/06/15 19:28:18 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/executor/execAmi.c,v 1.22 1998/07/15 22:16:17 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -369,6 +369,10 @@ ExecReScan(Plan *node, ExprContext *exprCtxt, Plan *parent)
 			ExecReScanMergeJoin((MergeJoin *) node, exprCtxt, parent);
 			break;
 
+		case T_Append:
+			ExecReScanAppend((Append *) node, exprCtxt, parent);
+			break;
+
 /*
  * Tee is never used
 		case T_Tee:
diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c
index a1c21e88939..aea18739344 100644
--- a/src/backend/executor/nodeAppend.c
+++ b/src/backend/executor/nodeAppend.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/executor/nodeAppend.c,v 1.13 1998/07/15 14:54:30 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/executor/nodeAppend.c,v 1.14 1998/07/15 22:16:18 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -15,6 +15,7 @@
  *		ExecInitAppend	- initialize the append node
  *		ExecProcAppend	- retrieve the next tuple from the node
  *		ExecEndAppend	- shut down the append node
+ *		ExecReScanAppend - rescan the append node
  *
  *	 NOTES
  *		Each append node contains a list of one or more subplans which
@@ -34,7 +35,7 @@
  *			  nil	nil		 ...	...    ...
  *								 subplans
  *
- *		Append nodes are currently used to unions, and to support inheritance
+ *		Append nodes are currently used for unions, and to support inheritance
  *		queries, where several relations need to be scanned.
  *		For example, in our standard person/student/employee/student-emp
  *		example, where student and employee inherit from person
@@ -500,3 +501,25 @@ ExecEndAppend(Append *node)
 	 * appendstate->as_junkfilter_list here
 	 */
 }
+void
+ExecReScanAppend(Append *node, ExprContext *exprCtxt, Plan *parent)
+{
+	AppendState *appendstate = node->appendstate;
+	int	nplans = length(node->appendplans);
+	int i;
+
+	for (i = 0; i < nplans; i++)
+	{
+		Plan	   *rescanNode;
+
+		appendstate->as_whichplan = i;
+		rescanNode = (Plan *) nth(i, node->appendplans);
+		if (rescanNode->chgParam == NULL)
+		{
+			exec_append_initialize_next(node);
+			ExecReScan((Plan *)rescanNode, exprCtxt, (Plan *) node);
+		}
+	}
+	appendstate->as_whichplan = 0;
+	exec_append_initialize_next(node);
+}
diff --git a/src/backend/parser/gram.c b/src/backend/parser/gram.c
index eb8c424856a..fa1e1cef6cb 100644
--- a/src/backend/parser/gram.c
+++ b/src/backend/parser/gram.c
@@ -218,7 +218,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/Attic/gram.c,v 2.15 1998/07/15 15:56:34 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/Attic/gram.c,v 2.16 1998/07/15 22:16:18 momjian Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
diff --git a/src/include/executor/nodeAppend.h b/src/include/executor/nodeAppend.h
index 335cf4a33a8..2825cf573f4 100644
--- a/src/include/executor/nodeAppend.h
+++ b/src/include/executor/nodeAppend.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: nodeAppend.h,v 1.7 1997/11/26 01:12:44 momjian Exp $
+ * $Id: nodeAppend.h,v 1.8 1998/07/15 22:16:21 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -21,5 +21,6 @@ extern bool ExecInitAppend(Append *node, EState *estate, Plan *parent);
 extern int	ExecCountSlotsAppend(Append *node);
 extern TupleTableSlot *ExecProcAppend(Append *node);
 extern void ExecEndAppend(Append *node);
+extern void ExecReScanAppend(Append *node, ExprContext *exprCtxt, Plan *parent);
 
 #endif							/* NODEAPPEND_H */
-- 
GitLab