mirror of
https://github.com/postgres/postgres.git
synced 2025-04-20 00:42:27 +03:00
Fix volatility markings of some contrib I/O functions.
In general, datatype I/O functions are supposed to be immutable or at worst stable. Some contrib I/O functions were, through oversight, not marked with any volatility property at all, which made them VOLATILE. Since (most of) these functions actually behave immutably, the erroneous marking isn't terribly harmful; but it can be user-visible in certain circumstances, as per a recent bug report from Joe Van Dyk in which a cast to text was disallowed in an expression index definition. To fix, just adjust the declarations in the extension SQL scripts. If we were being very fussy about this, we'd bump the extension version numbers, but that seems like more trouble (for both developers and users) than the problem is worth. A fly in the ointment is that chkpass_in actually is volatile, because of its use of random() to generate a fresh salt when presented with a not-yet-encrypted password. This is bad because of the general assumption that I/O functions aren't volatile: the consequence is that records or arrays containing chkpass elements may have input behavior a bit different from a bare chkpass column. But there seems no way to fix this without breaking existing usage patterns for chkpass, and the consequences of the inconsistency don't seem bad enough to justify that. So for the moment, just document it in a comment. Since we're not bumping version numbers, there seems no harm in back-patching these fixes; at least future installations will get the functions marked correctly.
This commit is contained in:
parent
63ff971e06
commit
26a95a1e52
@ -10,12 +10,15 @@
|
|||||||
CREATE FUNCTION chkpass_in(cstring)
|
CREATE FUNCTION chkpass_in(cstring)
|
||||||
RETURNS chkpass
|
RETURNS chkpass
|
||||||
AS 'MODULE_PATHNAME'
|
AS 'MODULE_PATHNAME'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT VOLATILE;
|
||||||
|
-- Note: chkpass_in actually is volatile, because of its use of random().
|
||||||
|
-- In hindsight that was a bad idea, but there's no way to change it without
|
||||||
|
-- breaking some usage patterns.
|
||||||
|
|
||||||
CREATE FUNCTION chkpass_out(chkpass)
|
CREATE FUNCTION chkpass_out(chkpass)
|
||||||
RETURNS cstring
|
RETURNS cstring
|
||||||
AS 'MODULE_PATHNAME'
|
AS 'MODULE_PATHNAME'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT IMMUTABLE;
|
||||||
|
|
||||||
CREATE TYPE chkpass (
|
CREATE TYPE chkpass (
|
||||||
internallength = 16,
|
internallength = 16,
|
||||||
|
@ -6,12 +6,12 @@
|
|||||||
CREATE FUNCTION ltree_in(cstring)
|
CREATE FUNCTION ltree_in(cstring)
|
||||||
RETURNS ltree
|
RETURNS ltree
|
||||||
AS 'MODULE_PATHNAME'
|
AS 'MODULE_PATHNAME'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT IMMUTABLE;
|
||||||
|
|
||||||
CREATE FUNCTION ltree_out(ltree)
|
CREATE FUNCTION ltree_out(ltree)
|
||||||
RETURNS cstring
|
RETURNS cstring
|
||||||
AS 'MODULE_PATHNAME'
|
AS 'MODULE_PATHNAME'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT IMMUTABLE;
|
||||||
|
|
||||||
CREATE TYPE ltree (
|
CREATE TYPE ltree (
|
||||||
INTERNALLENGTH = -1,
|
INTERNALLENGTH = -1,
|
||||||
@ -303,12 +303,12 @@ CREATE OPERATOR CLASS ltree_ops
|
|||||||
CREATE FUNCTION lquery_in(cstring)
|
CREATE FUNCTION lquery_in(cstring)
|
||||||
RETURNS lquery
|
RETURNS lquery
|
||||||
AS 'MODULE_PATHNAME'
|
AS 'MODULE_PATHNAME'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT IMMUTABLE;
|
||||||
|
|
||||||
CREATE FUNCTION lquery_out(lquery)
|
CREATE FUNCTION lquery_out(lquery)
|
||||||
RETURNS cstring
|
RETURNS cstring
|
||||||
AS 'MODULE_PATHNAME'
|
AS 'MODULE_PATHNAME'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT IMMUTABLE;
|
||||||
|
|
||||||
CREATE TYPE lquery (
|
CREATE TYPE lquery (
|
||||||
INTERNALLENGTH = -1,
|
INTERNALLENGTH = -1,
|
||||||
@ -414,12 +414,12 @@ CREATE OPERATOR ^? (
|
|||||||
CREATE FUNCTION ltxtq_in(cstring)
|
CREATE FUNCTION ltxtq_in(cstring)
|
||||||
RETURNS ltxtquery
|
RETURNS ltxtquery
|
||||||
AS 'MODULE_PATHNAME'
|
AS 'MODULE_PATHNAME'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT IMMUTABLE;
|
||||||
|
|
||||||
CREATE FUNCTION ltxtq_out(ltxtquery)
|
CREATE FUNCTION ltxtq_out(ltxtquery)
|
||||||
RETURNS cstring
|
RETURNS cstring
|
||||||
AS 'MODULE_PATHNAME'
|
AS 'MODULE_PATHNAME'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT IMMUTABLE;
|
||||||
|
|
||||||
CREATE TYPE ltxtquery (
|
CREATE TYPE ltxtquery (
|
||||||
INTERNALLENGTH = -1,
|
INTERNALLENGTH = -1,
|
||||||
@ -481,12 +481,12 @@ CREATE OPERATOR ^@ (
|
|||||||
CREATE FUNCTION ltree_gist_in(cstring)
|
CREATE FUNCTION ltree_gist_in(cstring)
|
||||||
RETURNS ltree_gist
|
RETURNS ltree_gist
|
||||||
AS 'MODULE_PATHNAME'
|
AS 'MODULE_PATHNAME'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT IMMUTABLE;
|
||||||
|
|
||||||
CREATE FUNCTION ltree_gist_out(ltree_gist)
|
CREATE FUNCTION ltree_gist_out(ltree_gist)
|
||||||
RETURNS cstring
|
RETURNS cstring
|
||||||
AS 'MODULE_PATHNAME'
|
AS 'MODULE_PATHNAME'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT IMMUTABLE;
|
||||||
|
|
||||||
CREATE TYPE ltree_gist (
|
CREATE TYPE ltree_gist (
|
||||||
internallength = -1,
|
internallength = -1,
|
||||||
|
@ -53,12 +53,12 @@ CREATE OPERATOR <-> (
|
|||||||
CREATE FUNCTION gtrgm_in(cstring)
|
CREATE FUNCTION gtrgm_in(cstring)
|
||||||
RETURNS gtrgm
|
RETURNS gtrgm
|
||||||
AS 'MODULE_PATHNAME'
|
AS 'MODULE_PATHNAME'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT IMMUTABLE;
|
||||||
|
|
||||||
CREATE FUNCTION gtrgm_out(gtrgm)
|
CREATE FUNCTION gtrgm_out(gtrgm)
|
||||||
RETURNS cstring
|
RETURNS cstring
|
||||||
AS 'MODULE_PATHNAME'
|
AS 'MODULE_PATHNAME'
|
||||||
LANGUAGE C STRICT;
|
LANGUAGE C STRICT IMMUTABLE;
|
||||||
|
|
||||||
CREATE TYPE gtrgm (
|
CREATE TYPE gtrgm (
|
||||||
INTERNALLENGTH = -1,
|
INTERNALLENGTH = -1,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user