diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-05-12 23:43:04 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-05-12 23:43:04 +0000 |
commit | 3389a110d40a505951e7c7babdfb8681173bb2ca (patch) | |
tree | 438acebac5cfd161cf920bcda6ad168affcb96a7 /src/backend/parser/parse_func.c | |
parent | f9e4f611a18f64fd9106a72ec9af9e2220075780 (diff) | |
download | postgresql-3389a110d40a505951e7c7babdfb8681173bb2ca.tar.gz postgresql-3389a110d40a505951e7c7babdfb8681173bb2ca.zip |
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.
Diffstat (limited to 'src/backend/parser/parse_func.c')
-rw-r--r-- | src/backend/parser/parse_func.c | 40 |
1 files changed, 3 insertions, 37 deletions
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; |