From 31a697bf92c95ec3eb6ed3435037533b6a376220 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Fri, 9 Jan 1998 05:48:22 +0000 Subject: [PATCH] Yohoo UNIONS of VIEWS. --- src/backend/nodes/copyfuncs.c | 26 ++++++++++++++------------ src/backend/rewrite/rewriteHandler.c | 10 +++++++--- src/backend/tcop/postgres.c | 19 +++++++++++++++++-- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index edc055dfdb..95e793d936 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 34cf891b74..68f34e6cd5 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 c01f0b50af..31da750ffe 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 $"); } /* ---------------- -- 2.11.0