Fix problem with nodes handling.
This commit is contained in:
parent
3d24e75176
commit
1316113ea3
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue