mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-15 08:20:16 +08:00
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.
This commit is contained in:
parent
42f77244e7
commit
9b3c35a9db
@ -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"
|
||||
@ -4337,9 +4338,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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user