Yohoo UNIONS of VIEWS.
authorBruce Momjian
Fri, 9 Jan 1998 05:48:22 +0000 (05:48 +0000)
committerBruce Momjian
Fri, 9 Jan 1998 05:48:22 +0000 (05:48 +0000)
src/backend/nodes/copyfuncs.c
src/backend/rewrite/rewriteHandler.c
src/backend/tcop/postgres.c

index edc055dfdb0d1770656f231458748d51fc447279..95e793d93683b94864da377bbd86cc4aaeaf3a03 100644 (file)
@@ -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);
 
index 34cf891b747cb393f3127d97b89b51104475cf4b..68f34e6cd5d76dcd2514e952a69e9546f835a606 100644 (file)
@@ -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);
index c01f0b50afab29242e6121845d8b5a521aaffdbe..31da750ffe570794349d6f9c106f9d9a3598a29a 100644 (file)
@@ -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 $");
    }
 
    /* ----------------