Обсуждение: Unexpected behaviour: it was documented to return the same value
The following documentation comment has been logged on the website: Page: https://www.postgresql.org/docs/17/functions-admin.html Description: set_config ( setting_name text, new_value text, is_local boolean ) → text Sets the parameter setting_name to new_value, and returns that value. If is_local is true, the new value will only apply during the current transaction. If you want the new value to apply for the rest of the current session, use false instead. This function corresponds to the SQL command SET. set_config('log_statement_stats', 'off', false) → off ``` invoice=> select set_config( 'app.asdf', null, false ) is null; ?column? ---------- f (1 row) invoice=> select set_config( 'app.asdf', null, false ) = ''; ?column? ---------- t (1 row) ``` Expected: because I provided NULL value I expect to receive NULL as result Actual: but function returns the empty string instead. It would be better to follow documented behaviour, if it will not be possible to fix it, please at least document that. Thank you.
On Saturday, July 5, 2025, PG Doc comments form <noreply@postgresql.org> wrote:
The following documentation comment has been logged on the website:
Page: https://www.postgresql.org/docs/17/functions-admin.html
Description:
set_config ( setting_name text, new_value text, is_local boolean ) → text
Sets the parameter setting_name to new_value, and returns that value. If
is_local is true, the new value will only apply during the current
transaction. If you want the new value to apply for the rest of the current
session, use false instead. This function corresponds to the SQL command
SET.
set_config('log_statement_stats', 'off', false) → off
```
invoice=> select set_config( 'app.asdf', null, false ) is null;
?column?
----------
f
(1 row)
invoice=> select set_config( 'app.asdf', null, false ) = '';
?column?
----------
t
(1 row)
```
Expected: because I provided NULL value I expect to receive NULL as result
Actual: but function returns the empty string instead.
It would be better to follow documented behaviour, if it will not be
possible to fix it, please at least document that.
There are pending patch(es?) in this area, I see to what extent this specific wording is covered (not sure we are back-patching the new wording either…). The main point to remember is that a configuration setting can never take on the null value. All customized setting placeholders *that exist* are text typed with a non-null value defaulting to the empty string.
David J.
On Mon, Jul 7, 2025 at 6:51 AM David G. Johnston <david.g.johnston@gmail.com> wrote:
On Saturday, July 5, 2025, PG Doc comments form <noreply@postgresql.org> wrote:The following documentation comment has been logged on the website:
Page: https://www.postgresql.org/docs/17/functions-admin.html
Description:
Yeah, this clarification just wasn't back-patched.
"set_config accepts the NULL value for new_value, but as settings cannot be null, it is interpreted as a request to reset the setting to its default value."
David J.
On Sunday, July 13, 2025, KES <kes-kes@yandex.ru> wrote:
I suppose that DEFAULT syntax should be used to set setting to its default value. Eg.set_config( 'my.option', DEFAULT, false )This is clear what should happen here. Also this syntax will correspond to other places, eg. INSERT INTO xx (name) VALUES (DEFAULT).Using NULL to set reset the value to the default is very very confusing.set_config( 'my.option', NULL, false )Expected: this call should make option unrecognizable again.
I don’t see us changing this even if someone were willing to write a patch. You will have to make do with the behavior that exists.
David J.
KES <kes-kes@yandex.ru> writes: > I would prefer to remove the option from the configuration list > instead of having it reset to empty string. That is not the definition, and we'd be very unlikely to change it to do that, because it would make no sense for built-in or extension-defined settings. regards, tom lane