]> granicus.if.org Git - postgresql/commitdiff
Allow CALL with polymorphic type arguments
authorPeter Eisentraut <peter_e@gmx.net>
Fri, 6 Jul 2018 20:27:42 +0000 (22:27 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Fri, 6 Jul 2018 20:40:16 +0000 (22:40 +0200)
In order to be able to resolve polymorphic types, we need to set fn_expr
before invoking the procedure.

src/backend/commands/functioncmds.c
src/test/regress/expected/create_procedure.out
src/test/regress/sql/create_procedure.sql

index 8864d9ae44676941b2c0c1f6cfe005d918bfabfd..acc08b1990ee6b9de51cef52c9988f7731d8e07b 100644 (file)
@@ -2264,6 +2264,7 @@ ExecuteCallStmt(CallStmt *stmt, ParamListInfo params, bool atomic, DestReceiver
        /* Initialize function call structure */
        InvokeFunctionExecuteHook(fexpr->funcid);
        fmgr_info(fexpr->funcid, &flinfo);
+       fmgr_info_set_expr((Node *) fexpr, &flinfo);
        InitFunctionCallInfoData(fcinfo, &flinfo, nargs, fexpr->inputcollid, (Node *) callcontext, NULL);
 
        /*
index 30495971bc8be540a45f1f781e893930efd75cd9..0acea7bd8c7ce3881b728da2001bb6d821a6b54e 100644 (file)
@@ -116,6 +116,13 @@ SELECT * FROM cp_test;
  100 | Hello
 (8 rows)
 
+-- polymorphic types
+CREATE PROCEDURE ptest6(a int, b anyelement)
+LANGUAGE SQL
+AS $$
+SELECT NULL::int;
+$$;
+CALL ptest6(1, 2);
 -- various error cases
 CALL version();  -- error: not a procedure
 ERROR:  version() is not a procedure
index 22cc497ebeeaa30cfd99b5a591925425bf3c7d13..0a9af8c906322e4b83150ebbe62751e6201e0252 100644 (file)
@@ -84,6 +84,17 @@ CALL ptest5(b => 'Hello', a => 10);
 SELECT * FROM cp_test;
 
 
+-- polymorphic types
+
+CREATE PROCEDURE ptest6(a int, b anyelement)
+LANGUAGE SQL
+AS $$
+SELECT NULL::int;
+$$;
+
+CALL ptest6(1, 2);
+
+
 -- various error cases
 
 CALL version();  -- error: not a procedure