aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1998-01-09 05:48:22 +0000
committerBruce Momjian <bruce@momjian.us>1998-01-09 05:48:22 +0000
commit31a697bf92c95ec3eb6ed3435037533b6a376220 (patch)
tree9c3c2d39732515320050ab2f9e65798e5c08a5e9 /src
parent8f125413b0a1b6d29b3d849c41c45f311f67a436 (diff)
downloadpostgresql-31a697bf92c95ec3eb6ed3435037533b6a376220.tar.gz
postgresql-31a697bf92c95ec3eb6ed3435037533b6a376220.zip
Yohoo UNIONS of VIEWS.
Diffstat (limited to 'src')
-rw-r--r--src/backend/nodes/copyfuncs.c26
-rw-r--r--src/backend/rewrite/rewriteHandler.c10
-rw-r--r--src/backend/tcop/postgres.c19
3 files changed, 38 insertions, 17 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index edc055dfdb0..95e793d9368 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.27 1998/01/04 04:31:02 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.28 1998/01/09 05:48:10 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1520,6 +1520,16 @@ _copyQuery(Query *from)
int i;
newnode->commandType = from->commandType;
+ if (from->utilityStmt && nodeTag(from->utilityStmt) == T_NotifyStmt)
+ {
+ NotifyStmt *from_notify = (NotifyStmt *) from->utilityStmt;
+ NotifyStmt *n = makeNode(NotifyStmt);
+ int length = strlen(from_notify->relname);
+
+ n->relname = palloc(length + 1);
+ strcpy(n->relname, from_notify->relname);
+ newnode->utilityStmt = (Node *) n;
+ }
newnode->resultRelation = from->resultRelation;
/* probably should dup this string instead of just pointing */
/* to the old one --djm */
@@ -1532,17 +1542,8 @@ _copyQuery(Query *from)
newnode->into = (char *) 0;
}
newnode->isPortal = from->isPortal;
- Node_Copy(from, newnode, rtable);
- if (from->utilityStmt && nodeTag(from->utilityStmt) == T_NotifyStmt)
- {
- NotifyStmt *from_notify = (NotifyStmt *) from->utilityStmt;
- NotifyStmt *n = makeNode(NotifyStmt);
- int length = strlen(from_notify->relname);
-
- n->relname = palloc(length + 1);
- strcpy(n->relname, from_notify->relname);
- newnode->utilityStmt = (Node *) n;
- }
+ newnode->isBinary = from->isBinary;
+ newnode->unionall = from->unionall;
if (from->uniqueFlag)
{
newnode->uniqueFlag = (char *) palloc(strlen(from->uniqueFlag) + 1);
@@ -1551,6 +1552,7 @@ _copyQuery(Query *from)
else
newnode->uniqueFlag = NULL;
Node_Copy(from, newnode, sortClause);
+ Node_Copy(from, newnode, rtable);
Node_Copy(from, newnode, targetList);
Node_Copy(from, newnode, qual);
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index 34cf891b747..68f34e6cd5d 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -6,7 +6,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.9 1998/01/07 21:04:37 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.10 1998/01/09 05:48:17 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -598,8 +598,12 @@ RewriteQuery(Query *parsetree, bool *instead_flag, List **qual_products)
*/
Query *other;
- other = copyObject(parsetree); /* ApplyRetrieveRule changes the
- * range table */
+ /*
+ * ApplyRetrieveRule changes the range table
+ * XXX Unions are copied again.
+ */
+ other = copyObject(parsetree);
+
return
ProcessRetrieveQuery(other, parsetree->rtable,
instead_flag, FALSE);
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index c01f0b50afa..31da750ffe5 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.59 1998/01/07 21:06:00 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.60 1998/01/09 05:48:22 momjian Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -439,6 +439,8 @@ pg_parse_and_plan(char *query_string, /* string to execute */
* rewrites */
for (i = 0; i < querytree_list->len; i++)
{
+ List *union_result, *union_list, *rewritten_list;
+
querytree = querytree_list->qtrees[i];
@@ -465,6 +467,19 @@ pg_parse_and_plan(char *query_string, /* string to execute */
/* rewrite queries (retrieve, append, delete, replace) */
rewritten = QueryRewrite(querytree);
+
+ /*
+ * Rewrite the UNIONS.
+ */
+ foreach(rewritten_list, rewritten)
+ {
+ Query *qry = (Query *)lfirst(rewritten_list);
+ union_result = NIL;
+ foreach(union_list, qry->unionClause)
+ union_result = nconc(union_result, QueryRewrite((Query *)lfirst(union_list)));
+ qry->unionClause = union_result;
+ }
+
if (rewritten != NULL)
{
int len,
@@ -1372,7 +1387,7 @@ PostgresMain(int argc, char *argv[])
if (IsUnderPostmaster == false)
{
puts("\nPOSTGRES backend interactive interface");
- puts("$Revision: 1.59 $ $Date: 1998/01/07 21:06:00 $");
+ puts("$Revision: 1.60 $ $Date: 1998/01/09 05:48:22 $");
}
/* ----------------