*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
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;
*
*
* 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
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);
}
*
*
* 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
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 */
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
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))
{
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;
*
* 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 $
*
*-------------------------------------------------------------------------
*/
typedef struct SubLink
{
-struct Query;
NodeTag type;
SubLinkType subLinkType;
bool useor;