Hi, In PGSQL-9.6, if we create a function with PARALLEL clause and try displaying it's definition using "*pg_get_functiondef*" we see that the PARALLEL keyword used during function creation is missing.
Below are the steps to reproduce: postgres=# CREATE FUNCTION add(integer, integer) RETURNS integer postgres-# AS 'select $1 + $2;' postgres-# LANGUAGE SQL postgres-# PARALLEL SAFE postgres-# RETURNS NULL ON NULL INPUT; CREATE FUNCTION postgres=# CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$ postgres$# BEGIN postgres$# RETURN i + 1; postgres$# END; postgres$# $$ LANGUAGE plpgsql PARALLEL SAFE; CREATE FUNCTION postgres=# CREATE FUNCTION square_root(double precision) RETURNS double precision AS 'dsqrt' LANGUAGE internal PARALLEL SAFE; CREATE FUNCTION postgres=# \df List of functions Schema | Name | Result data type | Argument data types | Type --------+-------------+------------------+---------------------+-------- public | add | integer | integer, integer | normal public | increment | integer | i integer | normal public | square_root | double precision | double precision | normal (3 rows) postgres=# SELECT pg_get_functiondef('add'::regproc); pg_get_functiondef --------------------------------------------------------- CREATE OR REPLACE FUNCTION public.add(integer, integer)+ RETURNS integer + LANGUAGE sql + STRICT + AS $function$select $1 + $2;$function$ + (1 row) postgres=# SELECT pg_get_functiondef('increment'::regproc); pg_get_functiondef -------------------------------------------------------- CREATE OR REPLACE FUNCTION public.increment(i integer)+ RETURNS integer + LANGUAGE plpgsql + AS $function$ + BEGIN + RETURN i + 1; + END; + $function$ + (1 row) postgres=# SELECT pg_get_functiondef('square_root'::regproc); pg_get_functiondef ----------------------------------------------------------------- CREATE OR REPLACE FUNCTION public.square_root(double precision)+ RETURNS double precision + LANGUAGE internal + AS $function$dsqrt$function$ + (1 row) *RCA:* The proparallel information for a function is not considered while preparing its definition inside pg_get_functiondef(). *Solution:* Add a check for the proparallel flag inside pg_get_functiondef() and based on the value in proparallel flag, store the parallel {safe | unsafe | restricted} info in the buffer that holds the function definition. PFA patch to fix the issue. With Regards, Ashutosh Sharma EnterpriseDB: *http://www.enterprisedb.com <http://www.enterprisedb.com>*
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index e38895d..10499c9 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -2044,6 +2044,19 @@ pg_get_functiondef(PG_FUNCTION_ARGS) case PROVOLATILE_VOLATILE: break; } + + switch (proc->proparallel) + { + case PROPARALLEL_SAFE: + appendStringInfoString(&buf, " PARALLEL SAFE"); + break; + case PROPARALLEL_RESTRICTED: + appendStringInfoString(&buf, " PARALLEL RESTRICTED"); + break; + case PROPARALLEL_UNSAFE: + break; + } + if (proc->proisstrict) appendStringInfoString(&buf, " STRICT"); if (proc->prosecdef)
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers