Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 736b84e

Browse files
committed
Fix failure with lock mode used for custom relation options
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
1 parent 90c0987 commit 736b84e

File tree

3 files changed

+9
-0
lines changed

3 files changed

+9
-0
lines changed

contrib/bloom/expected/bloom.out

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ CREATE TABLE tst (
55
);
66
INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i;
77
CREATE INDEX bloomidx ON tst USING bloom (i, t) WITH (col1 = 3);
8+
ALTER INDEX bloomidx SET (length=80);
89
SET enable_seqscan=on;
910
SET enable_bitmapscan=off;
1011
SET enable_indexscan=off;

contrib/bloom/sql/bloom.sql

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ CREATE TABLE tst (
77

88
INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i;
99
CREATE INDEX bloomidx ON tst USING bloom (i, t) WITH (col1 = 3);
10+
ALTER INDEX bloomidx SET (length=80);
1011

1112
SET enable_seqscan=on;
1213
SET enable_bitmapscan=off;

src/backend/access/common/reloptions.c

+7
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,13 @@ allocate_reloption(bits32 kinds, int type, const char *name, const char *desc)
659659
newoption->namelen = strlen(name);
660660
newoption->type = type;
661661

662+
/*
663+
* Set the default lock mode for this option. There is no actual way
664+
* for a module to enforce it when declaring a custom relation option,
665+
* so just use the highest level, which is safe for all cases.
666+
*/
667+
newoption->lockmode = AccessExclusiveLock;
668+
662669
MemoryContextSwitchTo(oldcxt);
663670

664671
return newoption;

0 commit comments

Comments
 (0)