Dear Hackers, I've found that ALTER DATABASE RESET with an unexistent guc does nothing without error reporting.
ALTER DATABASE SET reports an error if guc doesn't exist: > alter database mydb set myparam to 10; ERROR: unrecognized configuration parameter "myparam" ALTER DATABASE RESET doesn't report an error at all: > alter database mydb reset myparam; ALTER DATABASE I think it is a wrong behaviour. I believe, ALTER DATABASE RESET should report an error in this case. I've also think that ALTER DATABASE RESET TABLESPACE does nothing without any error reporting. I've prepared a simple patch to handle this case (master branch). It adds a check for guc existence with error reporting. With best regards, Vitaly
From dbe0897886144771d622d2aaff3c47ffec4f894e Mon Sep 17 00:00:00 2001 From: Vitaly Davydov <v.davy...@postgrespro.ru> Date: Thu, 11 Sep 2025 11:13:04 +0300 Subject: [PATCH] Add check for unexistent guc in ALTER DATABASE RESET Command ALTER DATABASE RESET doesn't not check that the guc exists. It does nothing and completes without an error if the guc doesn't exist. The patch adds the check with error reporting. --- src/backend/catalog/pg_db_role_setting.c | 5 +++++ src/test/regress/expected/database.out | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/backend/catalog/pg_db_role_setting.c b/src/backend/catalog/pg_db_role_setting.c index 090fc07c28a..ca6fcac4625 100644 --- a/src/backend/catalog/pg_db_role_setting.c +++ b/src/backend/catalog/pg_db_role_setting.c @@ -151,6 +151,11 @@ AlterSetting(Oid databaseid, Oid roleid, VariableSetStmt *setstmt) CatalogTupleInsert(rel, newtuple); } + else + { + /* check guc existence and report an error if the guc doesn't exist */ + GUCArrayDelete(NULL, setstmt->name); + } InvokeObjectPostAlterHookArg(DbRoleSettingRelationId, databaseid, 0, roleid, false); diff --git a/src/test/regress/expected/database.out b/src/test/regress/expected/database.out index 4cbdbdf84d0..20a258eddd6 100644 --- a/src/test/regress/expected/database.out +++ b/src/test/regress/expected/database.out @@ -3,6 +3,7 @@ CREATE DATABASE regression_tbd ALTER DATABASE regression_tbd RENAME TO regression_utf8; ALTER DATABASE regression_utf8 SET TABLESPACE regress_tblspace; ALTER DATABASE regression_utf8 RESET TABLESPACE; +ERROR: unrecognized configuration parameter "tablespace" ALTER DATABASE regression_utf8 CONNECTION_LIMIT 123; -- Test PgDatabaseToastTable. Doing this with GRANT would be slow. BEGIN; @@ -11,6 +12,7 @@ SET datacl = array_fill(makeaclitem(10, 10, 'USAGE', false), ARRAY[5e5::int]) WHERE datname = 'regression_utf8'; -- load catcache entry, if nothing else does ALTER DATABASE regression_utf8 RESET TABLESPACE; +ERROR: unrecognized configuration parameter "tablespace" ROLLBACK; CREATE ROLE regress_datdba_before; CREATE ROLE regress_datdba_after; -- 2.34.1