From 1316113ea366315961c214282fb7f5e6cc94affa Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 19 Jan 1998 18:11:10 +0000 Subject: [PATCH] Fix problem with nodes handling. --- src/backend/nodes/copyfuncs.c | 4 ++-- src/backend/nodes/outfuncs.c | 4 ++-- src/backend/nodes/readfuncs.c | 4 ++-- src/backend/parser/parse_expr.c | 40 ++++++++++++++++++--------------- src/include/nodes/primnodes.h | 3 +-- 5 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 834cc8c257..3f12cbd2c3 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.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; diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 63c2ffef43..23f6372866 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -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); } diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index e2c458e293..297cdec141 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -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 */ diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 6dab88c12c..e321a8517e 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -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; diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 531e5e9052..92c2ab00f3 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -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;