]> granicus.if.org Git - postgresql/commitdiff
Fix problem with nodes handling.
authorBruce Momjian <bruce@momjian.us>
Mon, 19 Jan 1998 18:11:10 +0000 (18:11 +0000)
committerBruce Momjian <bruce@momjian.us>
Mon, 19 Jan 1998 18:11:10 +0000 (18:11 +0000)
src/backend/nodes/copyfuncs.c
src/backend/nodes/outfuncs.c
src/backend/nodes/readfuncs.c
src/backend/parser/parse_expr.c
src/include/nodes/primnodes.h

index 834cc8c25713e6556450bccf8df10340dcf590e2..3f12cbd2c3a820c0639faa99c1541d2e638bc82b 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.32 1998/01/17 04:53:07 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.33 1998/01/19 18:10:48 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -908,7 +908,7 @@ _copySubLink(SubLink *from)
        newnode->subLinkType = from->subLinkType;
        newnode->useor = from->useor;
        Node_Copy(from, newnode, lefthand);
-       Node_Copy(from, newnode, oper);
+       newnode->oper = listCopy(from->oper);
        Node_Copy(from, newnode, subselect);
 
        return newnode;
index 63c2ffef434a8d1997e03e02a229414a288aebc6..23f6372866275b3f2736d8982279422ac43943dc 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.23 1998/01/17 04:53:09 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.24 1998/01/19 18:10:50 momjian Exp $
  *
  * NOTES
  *       Every (plan) node in POSTGRES has an associated "out" routine which
@@ -771,7 +771,7 @@ _outSubLink(StringInfo str, SubLink *node)
        appendStringInfo(str, " :lefthand ");
        _outNode(str, node->lefthand);
        appendStringInfo(str, " :oper ");
-       _outNode(str, node->oper);
+       _outIntList(str, node->oper);
        appendStringInfo(str, " :subselect ");
        _outNode(str, node->subselect);
 }
index e2c458e293339eab88c711f480d991ef503b4102..297cdec1418ab5eb202055b87c6a41ca47fc1dea 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.19 1998/01/17 04:53:11 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.20 1998/01/19 18:10:52 momjian Exp $
  *
  * NOTES
  *       Most of the read functions for plan nodes are tested. (In fact, they
@@ -1182,7 +1182,7 @@ _readSubLink()
        local_node->lefthand = nodeRead(true);          /* now read it */
 
        token = lsptok(NULL, &length);          /* eat :oper */
-       local_node->oper = nodeRead(true);              /* now read it */
+       local_node->oper = toIntList(nodeRead(true));           /* now read it */
 
        token = lsptok(NULL, &length);          /* eat :subselect */
        local_node->subselect = nodeRead(true);         /* now read it */
index 6dab88c12cda98366ee6da450b25d40f966e6c8f..e321a8517e5c401b29c0660299a0905555a554b0 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.9 1998/01/19 05:48:36 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.10 1998/01/19 18:10:56 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -255,12 +255,14 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
                                SubLink                 *sublink = (SubLink *) expr;
                                QueryTreeList   *qtree;
                                Query                   *subselect;
-
-                               qtree = parse_analyze(lcons(sublink->subselect,NIL), pstate);
+                               List                    *llist;
                                
+                               qtree = parse_analyze(lcons(sublink->subselect,NIL), pstate);
                                Assert(qtree->len == 1);
-
                                sublink->subselect = (Node *) subselect = qtree->qtrees[0];
+
+                               foreach(llist, sublink->lefthand)
+                                       lfirst(llist) = transformExpr(pstate, lfirst(llist), precedence);
                        
                                if (length(sublink->lefthand) !=
                                        length(subselect->targetList))
@@ -270,20 +272,22 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
                                {
                                        char *op = lfirst(sublink->oper);
                                        List *left_expr = sublink->lefthand;
-                                       List *right_expr = subselect->targetList;
-                                       List *elist;
-                                       
-                                       foreach(elist, left_expr)
-                                       {
-                                               Node       *lexpr = transformExpr(pstate, lfirst(elist), precedence);
-                                               Node       *rexpr = lfirst(right_expr);
-                                               TargetEntry *tent = (TargetEntry *)rexpr;
-                                               Expr       *op_expr;                                            
-
-                                               op_expr = make_op(op, lexpr, tent->expr);
-                                               sublink->oper = lappend(sublink->oper, op_expr->oper);
-                                               right_expr = lnext(right_expr);
-                                       }
+                                       List *right_expr = subselect->targetList;
+                                       List *elist;
+  
+                                       sublink->oper = NIL;
+                                       foreach(elist, left_expr)
+                                       {
+                                               Node       *lexpr = lfirst(elist);
+                                               Node       *rexpr = lfirst(right_expr);
+                                               TargetEntry *tent = (TargetEntry *)rexpr;
+                                               Expr       *op_expr;                                            
+  
+                                               op_expr = make_op(op, lexpr, tent->expr);
+                                               sublink->oper = lappendi(sublink->oper,
+                                                               ((Oper *)op_expr->oper)->opno);
+                                               right_expr = lnext(right_expr);
+                                       }
                                        result = (Node *) expr;
                                }
                                break;
index 531e5e9052bb4961d838b53ffc54b09f1c63994d..92c2ab00f399adc79811f8df07033d89de59a429 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: primnodes.h,v 1.14 1998/01/19 05:06:36 momjian Exp $
+ * $Id: primnodes.h,v 1.15 1998/01/19 18:11:10 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -287,7 +287,6 @@ typedef enum SubLinkType
 
 typedef struct SubLink
 {
-struct Query;
        NodeTag         type;
        SubLinkType     subLinkType;
        bool            useor;