From c1f1a2e03a78d52dc8e177d15e5822a0e8fbea4a Mon Sep 17 00:00:00 2001 From: Bruce Momjian 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 8ce988114a..6fa29ac6ec 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 a1c21e8893..aea1873934 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 eb8c424856..fa1e1cef6c 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 335cf4a33a..2825cf573f 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 */