aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2011-11-03 17:53:19 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2011-11-03 17:53:19 -0400
commit1819a375f117b8f98f6d4dd33bf53169e5e001ba (patch)
treec4069a1a5939f1331ba9f2f00b2b7c9c377dfc7e /src/backend
parente4e60e7b6125e77f679861ebf43cc6b9f9dbf16d (diff)
downloadpostgresql-1819a375f117b8f98f6d4dd33bf53169e5e001ba.tar.gz
postgresql-1819a375f117b8f98f6d4dd33bf53169e5e001ba.zip
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.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index 51e0033139c..fe1a8952fc2 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"
@@ -4476,9 +4477,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(func_oid, NULL, NULL) == TYPEFUNC_RECORD &&
!tlist_matches_coltypelist(querytree->targetList, rte->funccoltypes))
goto fail;