diff options
author | Bruce Momjian <bruce@momjian.us> | 1998-01-19 18:11:10 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 1998-01-19 18:11:10 +0000 |
commit | 1316113ea366315961c214282fb7f5e6cc94affa (patch) | |
tree | f49262a39746c99c3abab5014f1ce24b5b96a0e8 /src/backend/parser/parse_expr.c | |
parent | 3d24e75176cf93a109392e9a9449b47c9dc58330 (diff) | |
download | postgresql-1316113ea366315961c214282fb7f5e6cc94affa.tar.gz postgresql-1316113ea366315961c214282fb7f5e6cc94affa.zip |
Fix problem with nodes handling.
Diffstat (limited to 'src/backend/parser/parse_expr.c')
-rw-r--r-- | src/backend/parser/parse_expr.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 6dab88c12cd..e321a8517e5 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; |