From 3389a110d40a505951e7c7babdfb8681173bb2ca Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 12 May 2002 23:43:04 +0000 Subject: Get rid of long-since-vestigial Iter node type, in favor of adding a returns-set boolean field in Func and Oper nodes. This allows cleaner, more reliable tests for expressions returning sets in the planner and parser. For example, a WHERE clause returning a set is now detected and complained of in the parser, not only at runtime. --- src/backend/parser/parse_func.c | 40 +++------------------------------------- 1 file changed, 3 insertions(+), 37 deletions(-) (limited to 'src/backend/parser/parse_func.c') diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index 339577f39ca..1912ab4e072 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.128 2002/05/12 20:10:04 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.129 2002/05/12 23:43:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -280,7 +280,8 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, Func *funcnode = makeNode(Func); funcnode->funcid = funcid; - funcnode->functype = rettype; + funcnode->funcresulttype = rettype; + funcnode->funcretset = retset; funcnode->func_fcache = NULL; expr->typeOid = rettype; @@ -289,21 +290,6 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, expr->args = fargs; retval = (Node *) expr; - - /* - * if the function returns a set of values, then we need to iterate - * over all the returned values in the executor, so we stick an iter - * node here. if it returns a singleton, then we don't need the iter - * node. - */ - if (retset) - { - Iter *iter = makeNode(Iter); - - iter->itertype = rettype; - iter->iterexpr = retval; - retval = (Node *) iter; - } } else { @@ -1186,26 +1172,6 @@ ParseComplexProjection(ParseState *pstate, */ switch (nodeTag(first_arg)) { - case T_Iter: - { - Iter *iter = (Iter *) first_arg; - - /* - * If it's an Iter, we stick the FieldSelect - * *inside* the Iter --- this is klugy, but necessary - * because ExecTargetList() currently does the right thing - * only when the Iter node is at the top level of a - * targetlist item. - * - * XXX Iter should go away altogether... - */ - fselect = setup_field_select(iter->iterexpr, - funcname, argrelid); - iter->iterexpr = (Node *) fselect; - iter->itertype = fselect->resulttype; - return (Node *) iter; - break; - } case T_Var: { Var *var = (Var *) first_arg; -- cgit v1.2.3