On 11/26/18 6:45 PM, Andres Freund wrote:
> Hi,
>
> Triggered by the thread at [1] I looked for functions marked as
> immutable but not parallel safe.
>
> postgres[19492][1]=# SELECT oid::regprocedure, provolatile, proparallel FROM pg_proc WHERE provolatile = 'i' AND
proparallel!= 's';
> ┌─────────────┬─────────────┬─────────────┐
> │ oid │ provolatile │ proparallel │
> ├─────────────┼─────────────┼─────────────┤
> │ pg_config() │ i │ r │
> └─────────────┴─────────────┴─────────────┘
> (1 row)
>
> # pg_config
> { oid => '3400', descr => 'pg_config binary as a function',
> proname => 'pg_config', prorows => '23', proretset => 't', proparallel => 'r',
> prorettype => 'record', proargtypes => '', proallargtypes => '{text,text}',
> proargmodes => '{o,o}', proargnames => '{name,setting}',
> prosrc => 'pg_config' },
>
> so that function is marked as immutable but not parallel safe, without
> an explanation for that odd combination.
>
> Now obviously I don't think it practially matters for pg_config(), but
> it seems unnecessarily confusing as a general matter.
>
> I think we probably should fix this specific case, and then add a check
> to opr_sanity.sql or such.
>
> As far as I can tell pg_config() was marked as such since its addition
> in [2]. Joe, I assume this wasn't intentional?
Not intentional. Though, sitting here chatting with Stephen about it, I
am now wondering if pg_config() should actually be marked immutable:
select * from pg_config() where name = 'VERSION';
name | setting
---------+-----------------
VERSION | PostgreSQL 10.5
(1 row)
[...upgrade the postgres binaries...]
select * from pg_config() where name = 'VERSION';
name | setting
---------+-----------------
VERSION | PostgreSQL 10.6
(1 row)
So the correct answer is probably to mark pg_config() stable, but it
still seems to be parallel safe to me.
Joe
--
Crunchy Data - http://crunchydata.com
PostgreSQL Support for Secure Enterprises
Consulting, Training, & Open Source Development