After thinking about this some more, it seems like there is a related
problem with GUC save/restore actions. Consider
regression=# create function foo() returns int language sql as 'select 1'
regression-# set transaction_read_only = 1;
CREATE FUNCTION
regression=# begin;
BEGIN
regression=*# select foo();
foo
-----
1
(1 row)
regression=*# show transaction_read_only;
transaction_read_only
-----------------------
off
(1 row)
transaction_read_only was set while we executed foo(), but now it's
off again. I've not tried to weaponize this behavior, but if we
have any optimizations that depend on transaction_read_only, this
would probably break them. (SERIALIZABLE mode looks like a likely
candidate for problems.)
So it seems like we also need to forbid save/restore for these
settings, which probably means rejecting action==GUC_ACTION_SAVE
as well as value==NULL. That makes NO_RESET something of a misnomer,
but I don't have an idea for a better name.
regards, tom lane