8000 Fix inline_set_returning_function() to allow multiple OUT parameters. · jaylevitt/postgres@9fc28fb · GitHub
[go: up one dir, main page]

Skip to content

Commit 9fc28fb

Browse files
committed
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.
1 parent 9f19cc2 commit 9fc28fb

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

src/backend/optimizer/util/clauses.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "catalog/pg_type.h"
2727
#include "executor/executor.h"
2828
#include "executor/functions.h"
29+
#include "funcapi.h"
2930
#include "miscadmin.h"
3031
#include "nodes/makefuncs.h"
3132
#include "nodes/nodeFuncs.h"
@@ -4113,9 +4114,12 @@ inline_set_returning_function(PlannerInfo *root, RangeTblEntry *rte)
41134114
* If it returns RECORD, we have to check against the column type list
41144115
* provided in the RTE; check_sql_fn_retval can't do that. (If no match,
41154116
* we just fail to inline, rather than complaining; see notes for
4116-
* tlist_matches_coltypelist.)
4117+
* tlist_matches_coltypelist.) We don't have to do this for functions
4118+
* with declared OUT parameters, even though their funcresulttype is
4119+
* RECORDOID, so check get_func_result_type too.
41174120
*/
41184121
if (fexpr->funcresulttype == RECORDOID &&
4122+
get_func_result_type(fexpr->funcid, NULL, NULL) == TYPEFUNC_RECORD &&
41194123
!tlist_matches_coltypelist(querytree->targetList, rte->funccoltypes))
41204124
goto fail;
41214125

0 commit comments

Comments
 (0)
0