• Robert Haas's avatar
    Prevent adding relations to a concurrently dropped schema. · 1575fbcb
    Robert Haas authored
    In the previous coding, it was possible for a relation to be created
    via CREATE TABLE, CREATE VIEW, CREATE SEQUENCE, CREATE FOREIGN TABLE,
    etc.  in a schema while that schema was meanwhile being concurrently
    dropped.  This led to a pg_class entry with an invalid relnamespace
    value.  The same problem could occur if a relation was moved using
    ALTER .. SET SCHEMA while the target schema was being concurrently
    dropped.  This patch prevents both of those scenarios by locking the
    schema to which the relation is being added using AccessShareLock,
    which conflicts with the AccessExclusiveLock taken by DROP.
    
    As a desirable side effect, this also prevents the use of CREATE OR
    REPLACE VIEW to queue for an AccessExclusiveLock on a relation on which
    you have no rights: that will now fail immediately with a permissions
    error, before trying to obtain a lock.
    
    We need similar protection for all other object types, but as everything
    other than relations uses a slightly different set of code paths, I'm
    leaving that for a separate commit.
    
    Original complaint (as far as I could find) about CREATE by Nikhil
    Sontakke; risk for ALTER .. SET SCHEMA pointed out by Tom Lane;
    further details by Dan Farina; patch by me; review by Hitoshi Harada.
    1575fbcb
namespace.h 5.62 KB