aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_expr.c
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1998-01-19 05:06:41 +0000
committerBruce Momjian <bruce@momjian.us>1998-01-19 05:06:41 +0000
commit588867bd7b5f7cf9d3a7f373064a5a9474b992fe (patch)
tree60b411dc29d1e8a92661cd06de92625c208fd434 /src/backend/parser/parse_expr.c
parent691dc282f81ff2333837b33f8517bfc08e31f37c (diff)
downloadpostgresql-588867bd7b5f7cf9d3a7f373064a5a9474b992fe.tar.gz
postgresql-588867bd7b5f7cf9d3a7f373064a5a9474b992fe.zip
Create SubLink nodes in parser for Vadim.
Diffstat (limited to 'src/backend/parser/parse_expr.c')
-rw-r--r--src/backend/parser/parse_expr.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index 00efc044dcd..b1bf7d3a95f 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.7 1998/01/16 23:20:18 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.8 1998/01/19 05:06:18 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -22,6 +22,7 @@
#include "nodes/params.h"
#include "nodes/relation.h"
#include "parse.h"
+#include "parser/analyze.h"
#include "parser/gramparse.h"
#include "parser/parse_expr.h"
#include "parser/parse_func.h"
@@ -249,6 +250,42 @@ transformExpr(ParseState *pstate, Node *expr, int precedence)
precedence);
break;
}
+ case T_SubLink:
+ {
+ SubLink *sublink = (SubLink *) expr;
+ QueryTreeList *qtree;
+ Query *subselect;
+
+ qtree = parse_analyze(lcons(sublink->subselect,NIL), pstate);
+
+ Assert(qtree->len == 1);
+
+ sublink->subselect = (Node *) subselect = qtree->qtrees[0];
+
+ if (length(sublink->lefthand) !=
+ length(subselect->targetList))
+ elog(ERROR,"Subselect has too many or too few fields.");
+
+ if (sublink->subLinkType != EXISTS_SUBLINK)
+ {
+ 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);
+ Expr *op_expr;
+
+ op_expr = make_op(op, lexpr, rexpr);
+ sublink->oper = lappend(sublink->oper, op_expr->oper);
+ right_expr = lnext(right_expr);
+ }
+ }
+ break;
+ }
default:
/* should not reach here */
elog(ERROR, "transformExpr: does not know how to transform node %d",