Commit 5f21f529 authored by Peter Eisentraut's avatar Peter Eisentraut

Mark immutable functions in information schema as parallel safe

Also add opr_sanity check that all preloaded immutable functions are
parallel safe.  (Per discussion, this does not necessarily have to be
true for all possible such functions, but deviations would be unlikely
enough that maintaining such a test is reasonable.)
Reported-by: default avatarDavid Rowley <david.rowley@2ndquadrant.com>
Reviewed-by: default avatarRobert Haas <robertmhaas@gmail.com>
Reviewed-by: default avatarTom Lane <tgl@sss.pgh.pa.us>
parent 4be613f6
...@@ -42,14 +42,14 @@ SET search_path TO information_schema; ...@@ -42,14 +42,14 @@ SET search_path TO information_schema;
/* Expand any 1-D array into a set with integers 1..N */ /* Expand any 1-D array into a set with integers 1..N */
CREATE FUNCTION _pg_expandarray(IN anyarray, OUT x anyelement, OUT n int) CREATE FUNCTION _pg_expandarray(IN anyarray, OUT x anyelement, OUT n int)
RETURNS SETOF RECORD RETURNS SETOF RECORD
LANGUAGE sql STRICT IMMUTABLE LANGUAGE sql STRICT IMMUTABLE PARALLEL SAFE
AS 'select $1[s], s - pg_catalog.array_lower($1,1) + 1 AS 'select $1[s], s - pg_catalog.array_lower($1,1) + 1
from pg_catalog.generate_series(pg_catalog.array_lower($1,1), from pg_catalog.generate_series(pg_catalog.array_lower($1,1),
pg_catalog.array_upper($1,1), pg_catalog.array_upper($1,1),
1) as g(s)'; 1) as g(s)';
CREATE FUNCTION _pg_keysequal(smallint[], smallint[]) RETURNS boolean CREATE FUNCTION _pg_keysequal(smallint[], smallint[]) RETURNS boolean
LANGUAGE sql IMMUTABLE -- intentionally not STRICT, to allow inlining LANGUAGE sql IMMUTABLE PARALLEL SAFE -- intentionally not STRICT, to allow inlining
AS 'select $1 operator(pg_catalog.<@) $2 and $2 operator(pg_catalog.<@) $1'; AS 'select $1 operator(pg_catalog.<@) $2 and $2 operator(pg_catalog.<@) $1';
/* Given an index's OID and an underlying-table column number, return the /* Given an index's OID and an underlying-table column number, return the
...@@ -66,6 +66,7 @@ $$; ...@@ -66,6 +66,7 @@ $$;
CREATE FUNCTION _pg_truetypid(pg_attribute, pg_type) RETURNS oid CREATE FUNCTION _pg_truetypid(pg_attribute, pg_type) RETURNS oid
LANGUAGE sql LANGUAGE sql
IMMUTABLE IMMUTABLE
PARALLEL SAFE
RETURNS NULL ON NULL INPUT RETURNS NULL ON NULL INPUT
AS AS
$$SELECT CASE WHEN $2.typtype = 'd' THEN $2.typbasetype ELSE $1.atttypid END$$; $$SELECT CASE WHEN $2.typtype = 'd' THEN $2.typbasetype ELSE $1.atttypid END$$;
...@@ -73,6 +74,7 @@ $$SELECT CASE WHEN $2.typtype = 'd' THEN $2.typbasetype ELSE $1.atttypid END$$; ...@@ -73,6 +74,7 @@ $$SELECT CASE WHEN $2.typtype = 'd' THEN $2.typbasetype ELSE $1.atttypid END$$;
CREATE FUNCTION _pg_truetypmod(pg_attribute, pg_type) RETURNS int4 CREATE FUNCTION _pg_truetypmod(pg_attribute, pg_type) RETURNS int4
LANGUAGE sql LANGUAGE sql
IMMUTABLE IMMUTABLE
PARALLEL SAFE
RETURNS NULL ON NULL INPUT RETURNS NULL ON NULL INPUT
AS AS
$$SELECT CASE WHEN $2.typtype = 'd' THEN $2.typtypmod ELSE $1.atttypmod END$$; $$SELECT CASE WHEN $2.typtype = 'd' THEN $2.typtypmod ELSE $1.atttypmod END$$;
...@@ -82,6 +84,7 @@ $$SELECT CASE WHEN $2.typtype = 'd' THEN $2.typtypmod ELSE $1.atttypmod END$$; ...@@ -82,6 +84,7 @@ $$SELECT CASE WHEN $2.typtype = 'd' THEN $2.typtypmod ELSE $1.atttypmod END$$;
CREATE FUNCTION _pg_char_max_length(typid oid, typmod int4) RETURNS integer CREATE FUNCTION _pg_char_max_length(typid oid, typmod int4) RETURNS integer
LANGUAGE sql LANGUAGE sql
IMMUTABLE IMMUTABLE
PARALLEL SAFE
RETURNS NULL ON NULL INPUT RETURNS NULL ON NULL INPUT
AS AS
$$SELECT $$SELECT
...@@ -97,6 +100,7 @@ $$SELECT ...@@ -97,6 +100,7 @@ $$SELECT
CREATE FUNCTION _pg_char_octet_length(typid oid, typmod int4) RETURNS integer CREATE FUNCTION _pg_char_octet_length(typid oid, typmod int4) RETURNS integer
LANGUAGE sql LANGUAGE sql
IMMUTABLE IMMUTABLE
PARALLEL SAFE
RETURNS NULL ON NULL INPUT RETURNS NULL ON NULL INPUT
AS AS
$$SELECT $$SELECT
...@@ -112,6 +116,7 @@ $$SELECT ...@@ -112,6 +116,7 @@ $$SELECT
CREATE FUNCTION _pg_numeric_precision(typid oid, typmod int4) RETURNS integer CREATE FUNCTION _pg_numeric_precision(typid oid, typmod int4) RETURNS integer
LANGUAGE sql LANGUAGE sql
IMMUTABLE IMMUTABLE
PARALLEL SAFE
RETURNS NULL ON NULL INPUT RETURNS NULL ON NULL INPUT
AS AS
$$SELECT $$SELECT
...@@ -132,6 +137,7 @@ $$SELECT ...@@ -132,6 +137,7 @@ $$SELECT
CREATE FUNCTION _pg_numeric_precision_radix(typid oid, typmod int4) RETURNS integer CREATE FUNCTION _pg_numeric_precision_radix(typid oid, typmod int4) RETURNS integer
LANGUAGE sql LANGUAGE sql
IMMUTABLE IMMUTABLE
PARALLEL SAFE
RETURNS NULL ON NULL INPUT RETURNS NULL ON NULL INPUT
AS AS
$$SELECT $$SELECT
...@@ -143,6 +149,7 @@ $$SELECT ...@@ -143,6 +149,7 @@ $$SELECT
CREATE FUNCTION _pg_numeric_scale(typid oid, typmod int4) RETURNS integer CREATE FUNCTION _pg_numeric_scale(typid oid, typmod int4) RETURNS integer
LANGUAGE sql LANGUAGE sql
IMMUTABLE IMMUTABLE
PARALLEL SAFE
RETURNS NULL ON NULL INPUT RETURNS NULL ON NULL INPUT
AS AS
$$SELECT $$SELECT
...@@ -158,6 +165,7 @@ $$SELECT ...@@ -158,6 +165,7 @@ $$SELECT
CREATE FUNCTION _pg_datetime_precision(typid oid, typmod int4) RETURNS integer CREATE FUNCTION _pg_datetime_precision(typid oid, typmod int4) RETURNS integer
LANGUAGE sql LANGUAGE sql
IMMUTABLE IMMUTABLE
PARALLEL SAFE
RETURNS NULL ON NULL INPUT RETURNS NULL ON NULL INPUT
AS AS
$$SELECT $$SELECT
...@@ -173,6 +181,7 @@ $$SELECT ...@@ -173,6 +181,7 @@ $$SELECT
CREATE FUNCTION _pg_interval_type(typid oid, mod int4) RETURNS text CREATE FUNCTION _pg_interval_type(typid oid, mod int4) RETURNS text
LANGUAGE sql LANGUAGE sql
IMMUTABLE IMMUTABLE
PARALLEL SAFE
RETURNS NULL ON NULL INPUT RETURNS NULL ON NULL INPUT
AS AS
$$SELECT $$SELECT
......
...@@ -53,6 +53,6 @@ ...@@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 201704061 #define CATALOG_VERSION_NO 201704062
#endif #endif
...@@ -733,6 +733,14 @@ order by 1; ...@@ -733,6 +733,14 @@ order by 1;
lowrite | 955 lowrite | 955
(13 rows) (13 rows)
-- Check that all immutable functions are marked parallel safe
SELECT p1.oid, p1.proname
FROM pg_proc AS p1
WHERE provolatile = 'i' AND proparallel = 'u';
oid | proname
-----+---------
(0 rows)
-- **************** pg_cast **************** -- **************** pg_cast ****************
-- Catch bogus values in pg_cast columns (other than cases detected by -- Catch bogus values in pg_cast columns (other than cases detected by
-- oidjoins test). -- oidjoins test).
......
...@@ -381,6 +381,11 @@ and pronamespace = (select oid from pg_catalog.pg_namespace ...@@ -381,6 +381,11 @@ and pronamespace = (select oid from pg_catalog.pg_namespace
where nspname = 'pg_catalog') where nspname = 'pg_catalog')
order by 1; order by 1;
-- Check that all immutable functions are marked parallel safe
SELECT p1.oid, p1.proname
FROM pg_proc AS p1
WHERE provolatile = 'i' AND proparallel = 'u';
-- **************** pg_cast **************** -- **************** pg_cast ****************
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment