Lists: | pgsql-hackers |
---|
From: | Ashutosh Sharma <ashu(dot)coek88(at)gmail(dot)com> |
---|---|
To: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Parallel SAFE information missing in CREATE OR REPLACE FUNCTION definition |
Date: | 2016-04-26 05:24:48 |
Message-ID: | CAE9k0Pmo_6KomApECzHqnjNWEn76ix-1-u4f+bj8JZxiX3h39g@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-hackers |
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>*
Attachment | Content-Type | Size |
---|---|---|
display-PARALLEL-SAFE-info-in-CREATE-Function_v1.patch | text/x-diff | 660 bytes |
From: | Robert Haas <robertmhaas(at)gmail(dot)com> |
---|---|
To: | Ashutosh Sharma <ashu(dot)coek88(at)gmail(dot)com> |
Cc: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Parallel SAFE information missing in CREATE OR REPLACE FUNCTION definition |
Date: | 2016-04-27 02:57:14 |
Message-ID: | CA+Tgmob517iggevC_WKM2kBoxZ6AbMS_KUVuo-hrQN6KYZBMZw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-hackers |
On Tue, Apr 26, 2016 at 1:24 AM, Ashutosh Sharma <ashu(dot)coek88(at)gmail(dot)com> wrote:
> 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.
Thanks, committed. Boy, I feel stupid.
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company