postgres.git / summary / log / commit / refs

commit    d4816800378452e125d4e1ca7dfdb598609ab992
Author:   Michael Paquier <michael@paquier.xyz>
Date:     Wed Sep 25 01:08:36 2019 +0000
First released in: 13.0, 9.6.16, 10.11, 11.6, 12.0

    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


contrib/bloom/expected/bloom.out | 1 + contrib/bloom/sql/bloom.sql | 1 + src/backend/access/common/reloptions.c | 7 +++++++ 3 files changed, 9 insertions(+) diff --git a/contrib/bloom/expected/bloom.out b/contrib/bloom/expected/bloom.out index cbc50f757b6..77521f02869 100644 --- a/contrib/bloom/expected/bloom.out +++ b/contrib/bloom/expected/bloom.out @@ -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; diff --git a/contrib/bloom/sql/bloom.sql b/contrib/bloom/sql/bloom.sql index 22274609f20..b2136c3a798 100644 --- a/contrib/bloom/sql/bloom.sql +++ b/contrib/bloom/sql/bloom.sql @@ -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; diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index ec10762529d..57ed5760789 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -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; [parent: 0652c3992ebf]