diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-11-03 17:53:33 -0400 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-11-03 17:53:33 -0400 |
| commit | 9fc28fb5ea16c7f335aba052a2c31bbd03932f09 (patch) | |
| tree | 42839d20693c30b5c5a9a22ab0f32af109c4ba43 /src/backend | |
| parent | 9f19cc28a439c88c73bc6083ebd9cd603a65b7fe (diff) | |
Fix inline_set_returning_function() to allow multiple OUT parameters.
inline_set_returning_function failed to distinguish functions returning
generic RECORD (which require a column list in the RTE, as well as run-time
type checking) from those with multiple OUT parameters (which do not).
This prevented inlining from happening. Per complaint from Jay Levitt.
Back-patch to 8.4 where this capability was introduced.
Diffstat (limited to 'src/backend')
| -rw-r--r-- | src/backend/optimizer/util/clauses.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index e9ab204aa9c..76f317da46f 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -26,6 +26,7 @@ #include "catalog/pg_type.h" #include "executor/executor.h" #include "executor/functions.h" +#include "funcapi.h" #include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" @@ -4113,9 +4114,12 @@ inline_set_returning_function(PlannerInfo *root, RangeTblEntry *rte) * If it returns RECORD, we have to check against the column type list * provided in the RTE; check_sql_fn_retval can't do that. (If no match, * we just fail to inline, rather than complaining; see notes for - * tlist_matches_coltypelist.) + * tlist_matches_coltypelist.) We don't have to do this for functions + * with declared OUT parameters, even though their funcresulttype is + * RECORDOID, so check get_func_result_type too. */ if (fexpr->funcresulttype == RECORDOID && + get_func_result_type(fexpr->funcid, NULL, NULL) == TYPEFUNC_RECORD && !tlist_matches_coltypelist(querytree->targetList, rte->funccoltypes)) goto fail; |
