]> granicus.if.org Git - postgresql/commitdiff
Fix failure with lock mode used for custom relation options
authorMichael Paquier <michael@paquier.xyz>
Wed, 25 Sep 2019 01:08:36 +0000 (10:08 +0900)
committerMichael Paquier <michael@paquier.xyz>
Wed, 25 Sep 2019 01:08:36 +0000 (10:08 +0900)
In-core relation options can use a custom lock mode since 47167b7, that
has lowered the lock available for some autovacuum parameters.  However
it forgot to consider custom relation options.  This causes failures
with ALTER TABLE SET when changing a custom relation option, as its lock
is not defined.  The existing APIs to define a custom reloption does not
allow to define a custom lock mode, so enforce its initialization to
AccessExclusiveMode which should be safe enough in all cases.  An
upcoming patch will extend the existing APIs to allow a custom lock mode
to be defined.

The problem can be reproduced with bloom indexes, so add a test there.

Reported-by: Nikolay Sharplov
Analyzed-by: Thomas Munro, Michael Paquier
Author: Michael Paquier
Reviewed-by: Kuntal Ghosh
Discussion: https://postgr.es/m/20190920013831.GD1844@paquier.xyz
Backpatch-through: 9.6

contrib/bloom/expected/bloom.out
contrib/bloom/sql/bloom.sql
src/backend/access/common/reloptions.c

index cbc50f757b65af892094faf4082951ef5caa89d2..77521f0286998a8e7fa152d6dab521706ba5b082 100644 (file)
@@ -5,6 +5,7 @@ CREATE TABLE tst (
 );
 INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i;
 CREATE INDEX bloomidx ON tst USING bloom (i, t) WITH (col1 = 3);
+ALTER INDEX bloomidx SET (length=80);
 SET enable_seqscan=on;
 SET enable_bitmapscan=off;
 SET enable_indexscan=off;
index 22274609f201456ce4450fbf423dbeb2c7e01380..b2136c3a79828bb4c34b4908051be48d64aa0800 100644 (file)
@@ -7,6 +7,7 @@ CREATE TABLE tst (
 
 INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i;
 CREATE INDEX bloomidx ON tst USING bloom (i, t) WITH (col1 = 3);
+ALTER INDEX bloomidx SET (length=80);
 
 SET enable_seqscan=on;
 SET enable_bitmapscan=off;
index ec10762529d7823e66d0d03573254ed23823a657..57ed5760789f564a4abacb3b0be699523e3d7ea1 100644 (file)
@@ -620,6 +620,13 @@ allocate_reloption(bits32 kinds, int type, char *name, char *desc)
        newoption->namelen = strlen(name);
        newoption->type = type;
 
+       /*
+        * Set the default lock mode for this option.  There is no actual way
+        * for a module to enforce it when declaring a custom relation option,
+        * so just use the highest level, which is safe for all cases.
+        */
+       newoption->lockmode = AccessExclusiveLock;
+
        MemoryContextSwitchTo(oldcxt);
 
        return newoption;