1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-28 23:42:10 +03:00

Update extensions with GIN/GIST support for parallel query.

Commit 749a787c5b bumped the extension
version on all of these extensions already, and we haven't had a
release since then, so we can make further changes without bumping the
extension version again.  Take this opportunity to mark all of the
functions exported by these modules PARALLEL SAFE -- except for
pg_trgm's set_limit().  Mark that one PARALLEL RESTRICTED, because it
makes a persistent change to a GUC value.

Note that some of the markings added by this commit don't have any
effect; for example, gseg_picksplit() isn't likely to be mentioned
explicitly in a query and therefore it's parallel-safety marking will
never be consulted.  But this commit just marks everything for
consistency: if it were somehow used in a query, that would be fine as
far as parallel query is concerned, since it does not consult any
backend-private state, attempt to write data, etc.

Andreas Karlsson, with a few revisions by me.
This commit is contained in:
Robert Haas
2016-06-14 13:34:37 -04:00
parent 131c7e70b4
commit 2910fc8239
12 changed files with 553 additions and 274 deletions

View File

@ -24,3 +24,61 @@ WHERE oid = pg_catalog.to_regprocedure(oldproc);
UPDATE pg_catalog.pg_proc SET
prorettype = 'ghstore'::pg_catalog.regtype
WHERE oid = pg_catalog.to_regprocedure('ghstore_union(internal,internal)');
ALTER FUNCTION hstore_in(cstring) PARALLEL SAFE;
ALTER FUNCTION hstore_out(hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_recv(internal) PARALLEL SAFE;
ALTER FUNCTION hstore_send(hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_version_diag(hstore) PARALLEL SAFE;
ALTER FUNCTION fetchval(hstore, text) PARALLEL SAFE;
ALTER FUNCTION slice_array(hstore, text[]) PARALLEL SAFE;
ALTER FUNCTION slice(hstore, text[]) PARALLEL SAFE;
ALTER FUNCTION isexists(hstore, text) PARALLEL SAFE;
ALTER FUNCTION exist(hstore, text) PARALLEL SAFE;
ALTER FUNCTION exists_any(hstore, text[]) PARALLEL SAFE;
ALTER FUNCTION exists_all(hstore, text[]) PARALLEL SAFE;
ALTER FUNCTION isdefined(hstore, text) PARALLEL SAFE;
ALTER FUNCTION defined(hstore, text) PARALLEL SAFE;
ALTER FUNCTION delete(hstore, text) PARALLEL SAFE;
ALTER FUNCTION delete(hstore, text[]) PARALLEL SAFE;
ALTER FUNCTION delete(hstore, hstore) PARALLEL SAFE;
ALTER FUNCTION hs_concat(hstore, hstore) PARALLEL SAFE;
ALTER FUNCTION hs_contains(hstore, hstore) PARALLEL SAFE;
ALTER FUNCTION hs_contained(hstore, hstore) PARALLEL SAFE;
ALTER FUNCTION tconvert(text, text) PARALLEL SAFE;
ALTER FUNCTION hstore(text, text) PARALLEL SAFE;
ALTER FUNCTION hstore(text[], text[]) PARALLEL SAFE;
ALTER FUNCTION hstore(text[]) PARALLEL SAFE;
ALTER FUNCTION hstore_to_json(hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_to_json_loose(hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_to_jsonb(hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_to_jsonb_loose(hstore) PARALLEL SAFE;
ALTER FUNCTION hstore(record) PARALLEL SAFE;
ALTER FUNCTION hstore_to_array(hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_to_matrix(hstore) PARALLEL SAFE;
ALTER FUNCTION akeys(hstore) PARALLEL SAFE;
ALTER FUNCTION avals(hstore) PARALLEL SAFE;
ALTER FUNCTION skeys(hstore) PARALLEL SAFE;
ALTER FUNCTION svals(hstore) PARALLEL SAFE;
ALTER FUNCTION each(hstore) PARALLEL SAFE;
ALTER FUNCTION populate_record(anyelement, hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_eq(hstore, hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_ne(hstore, hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_gt(hstore, hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_ge(hstore, hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_lt(hstore, hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_le(hstore, hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_cmp(hstore, hstore) PARALLEL SAFE;
ALTER FUNCTION hstore_hash(hstore) PARALLEL SAFE;
ALTER FUNCTION ghstore_in(cstring) PARALLEL SAFE;
ALTER FUNCTION ghstore_out(ghstore) PARALLEL SAFE;
ALTER FUNCTION ghstore_compress(internal) PARALLEL SAFE;
ALTER FUNCTION ghstore_decompress(internal) PARALLEL SAFE;
ALTER FUNCTION ghstore_penalty(internal, internal, internal) PARALLEL SAFE;
ALTER FUNCTION ghstore_picksplit(internal, internal) PARALLEL SAFE;
ALTER FUNCTION ghstore_union(internal, internal) PARALLEL SAFE;
ALTER FUNCTION ghstore_same(ghstore, ghstore, internal) PARALLEL SAFE;
ALTER FUNCTION ghstore_consistent(internal, hstore, smallint, oid, internal) PARALLEL SAFE;
ALTER FUNCTION gin_extract_hstore(hstore, internal) PARALLEL SAFE;
ALTER FUNCTION gin_extract_hstore_query(hstore, internal, int2, internal, internal) PARALLEL SAFE;
ALTER FUNCTION gin_consistent_hstore(internal, int2, hstore, int4, internal, internal) PARALLEL SAFE;

View File

@ -8,22 +8,22 @@ CREATE TYPE hstore;
CREATE FUNCTION hstore_in(cstring)
RETURNS hstore
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION hstore_out(hstore)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION hstore_recv(internal)
RETURNS hstore
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION hstore_send(hstore)
RETURNS bytea
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE TYPE hstore (
INTERNALLENGTH = -1,
@ -37,12 +37,12 @@ CREATE TYPE hstore (
CREATE FUNCTION hstore_version_diag(hstore)
RETURNS integer
AS 'MODULE_PATHNAME','hstore_version_diag'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION fetchval(hstore,text)
RETURNS text
AS 'MODULE_PATHNAME','hstore_fetchval'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE OPERATOR -> (
LEFTARG = hstore,
@ -53,7 +53,7 @@ CREATE OPERATOR -> (
CREATE FUNCTION slice_array(hstore,text[])
RETURNS text[]
AS 'MODULE_PATHNAME','hstore_slice_to_array'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE OPERATOR -> (
LEFTARG = hstore,
@ -64,17 +64,17 @@ CREATE OPERATOR -> (
CREATE FUNCTION slice(hstore,text[])
RETURNS hstore
AS 'MODULE_PATHNAME','hstore_slice_to_hstore'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION isexists(hstore,text)
RETURNS bool
AS 'MODULE_PATHNAME','hstore_exists'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION exist(hstore,text)
RETURNS bool
AS 'MODULE_PATHNAME','hstore_exists'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE OPERATOR ? (
LEFTARG = hstore,
@ -87,7 +87,7 @@ CREATE OPERATOR ? (
CREATE FUNCTION exists_any(hstore,text[])
RETURNS bool
AS 'MODULE_PATHNAME','hstore_exists_any'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE OPERATOR ?| (
LEFTARG = hstore,
@ -100,7 +100,7 @@ CREATE OPERATOR ?| (
CREATE FUNCTION exists_all(hstore,text[])
RETURNS bool
AS 'MODULE_PATHNAME','hstore_exists_all'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE OPERATOR ?& (
LEFTARG = hstore,
@ -113,27 +113,27 @@ CREATE OPERATOR ?& (
CREATE FUNCTION isdefined(hstore,text)
RETURNS bool
AS 'MODULE_PATHNAME','hstore_defined'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION defined(hstore,text)
RETURNS bool
AS 'MODULE_PATHNAME','hstore_defined'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION delete(hstore,text)
RETURNS hstore
AS 'MODULE_PATHNAME','hstore_delete'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION delete(hstore,text[])
RETURNS hstore
AS 'MODULE_PATHNAME','hstore_delete_array'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION delete(hstore,hstore)
RETURNS hstore
AS 'MODULE_PATHNAME','hstore_delete_hstore'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE OPERATOR - (
LEFTARG = hstore,
@ -156,7 +156,7 @@ CREATE OPERATOR - (
CREATE FUNCTION hs_concat(hstore,hstore)
RETURNS hstore
AS 'MODULE_PATHNAME','hstore_concat'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE OPERATOR || (
LEFTARG = hstore,
@ -167,12 +167,12 @@ CREATE OPERATOR || (
CREATE FUNCTION hs_contains(hstore,hstore)
RETURNS bool
AS 'MODULE_PATHNAME','hstore_contains'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION hs_contained(hstore,hstore)
RETURNS bool
AS 'MODULE_PATHNAME','hstore_contained'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE OPERATOR @> (
LEFTARG = hstore,
@ -214,22 +214,22 @@ CREATE OPERATOR ~ (
CREATE FUNCTION tconvert(text,text)
RETURNS hstore
AS 'MODULE_PATHNAME','hstore_from_text'
LANGUAGE C IMMUTABLE; -- not STRICT; needs to allow (key,NULL)
LANGUAGE C IMMUTABLE PARALLEL SAFE; -- not STRICT; needs to allow (key,NULL)
CREATE FUNCTION hstore(text,text)
RETURNS hstore
AS 'MODULE_PATHNAME','hstore_from_text'
LANGUAGE C IMMUTABLE; -- not STRICT; needs to allow (key,NULL)
LANGUAGE C IMMUTABLE PARALLEL SAFE; -- not STRICT; needs to allow (key,NULL)
CREATE FUNCTION hstore(text[],text[])
RETURNS hstore
AS 'MODULE_PATHNAME', 'hstore_from_arrays'
LANGUAGE C IMMUTABLE; -- not STRICT; allows (keys,null)
LANGUAGE C IMMUTABLE PARALLEL SAFE; -- not STRICT; allows (keys,null)
CREATE FUNCTION hstore(text[])
RETURNS hstore
AS 'MODULE_PATHNAME', 'hstore_from_array'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE CAST (text[] AS hstore)
WITH FUNCTION hstore(text[]);
@ -237,7 +237,7 @@ CREATE CAST (text[] AS hstore)
CREATE FUNCTION hstore_to_json(hstore)
RETURNS json
AS 'MODULE_PATHNAME', 'hstore_to_json'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE CAST (hstore AS json)
WITH FUNCTION hstore_to_json(hstore);
@ -245,12 +245,12 @@ CREATE CAST (hstore AS json)
CREATE FUNCTION hstore_to_json_loose(hstore)
RETURNS json
AS 'MODULE_PATHNAME', 'hstore_to_json_loose'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE FUNCTION hstore_to_jsonb(hstore)
RETURNS jsonb
AS 'MODULE_PATHNAME', 'hstore_to_jsonb'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE CAST (hstore AS jsonb)
WITH FUNCTION hstore_to_jsonb(hstore);
@ -258,17 +258,17 @@ CREATE CAST (hstore AS jsonb)
CREATE FUNCTION hstore_to_jsonb_loose(hstore)
RETURNS jsonb
AS 'MODULE_PATHNAME', 'hstore_to_jsonb_loose'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE FUNCTION hstore(record)
RETURNS hstore
AS 'MODULE_PATHNAME', 'hstore_from_record'
LANGUAGE C IMMUTABLE; -- not STRICT; allows (null::recordtype)
LANGUAGE C IMMUTABLE PARALLEL SAFE; -- not STRICT; allows (null::recordtype)
CREATE FUNCTION hstore_to_array(hstore)
RETURNS text[]
AS 'MODULE_PATHNAME','hstore_to_array'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE OPERATOR %% (
RIGHTARG = hstore,
@ -278,7 +278,7 @@ CREATE OPERATOR %% (
CREATE FUNCTION hstore_to_matrix(hstore)
RETURNS text[]
AS 'MODULE_PATHNAME','hstore_to_matrix'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE OPERATOR %# (
RIGHTARG = hstore,
@ -288,34 +288,34 @@ CREATE OPERATOR %# (
CREATE FUNCTION akeys(hstore)
RETURNS text[]
AS 'MODULE_PATHNAME','hstore_akeys'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION avals(hstore)
RETURNS text[]
AS 'MODULE_PATHNAME','hstore_avals'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION skeys(hstore)
RETURNS setof text
AS 'MODULE_PATHNAME','hstore_skeys'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION svals(hstore)
RETURNS setof text
AS 'MODULE_PATHNAME','hstore_svals'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION each(IN hs hstore,
OUT key text,
OUT value text)
RETURNS SETOF record
AS 'MODULE_PATHNAME','hstore_each'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION populate_record(anyelement,hstore)
RETURNS anyelement
AS 'MODULE_PATHNAME', 'hstore_populate_record'
LANGUAGE C IMMUTABLE; -- not STRICT; allows (null::rectype,hstore)
LANGUAGE C IMMUTABLE PARALLEL SAFE; -- not STRICT; allows (null::rectype,hstore)
CREATE OPERATOR #= (
LEFTARG = anyelement,
@ -328,37 +328,37 @@ CREATE OPERATOR #= (
CREATE FUNCTION hstore_eq(hstore,hstore)
RETURNS boolean
AS 'MODULE_PATHNAME','hstore_eq'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION hstore_ne(hstore,hstore)
RETURNS boolean
AS 'MODULE_PATHNAME','hstore_ne'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION hstore_gt(hstore,hstore)
RETURNS boolean
AS 'MODULE_PATHNAME','hstore_gt'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION hstore_ge(hstore,hstore)
RETURNS boolean
AS 'MODULE_PATHNAME','hstore_ge'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION hstore_lt(hstore,hstore)
RETURNS boolean
AS 'MODULE_PATHNAME','hstore_lt'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION hstore_le(hstore,hstore)
RETURNS boolean
AS 'MODULE_PATHNAME','hstore_le'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION hstore_cmp(hstore,hstore)
RETURNS integer
AS 'MODULE_PATHNAME','hstore_cmp'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE OPERATOR = (
LEFTARG = hstore,
@ -437,7 +437,7 @@ AS
CREATE FUNCTION hstore_hash(hstore)
RETURNS integer
AS 'MODULE_PATHNAME','hstore_hash'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE OPERATOR CLASS hash_hstore_ops
DEFAULT FOR TYPE hstore USING hash
@ -452,12 +452,12 @@ CREATE TYPE ghstore;
CREATE FUNCTION ghstore_in(cstring)
RETURNS ghstore
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE FUNCTION ghstore_out(ghstore)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT IMMUTABLE;
LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
CREATE TYPE ghstore (
INTERNALLENGTH = -1,
@ -468,37 +468,37 @@ CREATE TYPE ghstore (
CREATE FUNCTION ghstore_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE FUNCTION ghstore_decompress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE FUNCTION ghstore_penalty(internal,internal,internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE FUNCTION ghstore_picksplit(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE FUNCTION ghstore_union(internal, internal)
RETURNS ghstore
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE FUNCTION ghstore_same(ghstore, ghstore, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE FUNCTION ghstore_consistent(internal,hstore,smallint,oid,internal)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OPERATOR CLASS gist_hstore_ops
DEFAULT FOR TYPE hstore USING gist
@ -524,17 +524,17 @@ AS
CREATE FUNCTION gin_extract_hstore(hstore, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE FUNCTION gin_extract_hstore_query(hstore, internal, int2, internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE FUNCTION gin_consistent_hstore(internal, int2, hstore, int4, internal, internal)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
CREATE OPERATOR CLASS gin_hstore_ops
DEFAULT FOR TYPE hstore USING gin