postgres.git / summary / log / commit / refs

commit    b2171d472dc77d176bc71a584ec3a2b48faa9d21
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Fri Aug 17 21:12:21 2018 +0000

    Ensure schema qualification in pg_restore DISABLE/ENABLE TRIGGER commands.
    
    Previously, this code blindly followed the common coding pattern of
    passing PQserverVersion(AH->connection) as the server-version parameter
    of fmtQualifiedId.  That works as long as we have a connection; but in
    pg_restore with text output, we don't.  Instead we got a zero from
    PQserverVersion, which fmtQualifiedId interpreted as "server is too old to
    have schemas", and so the name went unqualified.  That still accidentally
    managed to work in many cases, which is probably why this ancient bug went
    undetected for so long.  It only became obvious in the wake of the changes
    to force dump/restore to execute with restricted search_path.
    
    In HEAD/v11, let's deal with this by ripping out fmtQualifiedId's server-
    version behavioral dependency, and just making it schema-qualify all the
    time.  We no longer support pg_dump from servers old enough to need the
    ability to omit schema name, let alone restoring to them.  (Also, the few
    callers outside pg_dump already didn't work with pre-schema servers.)
    
    In older branches, that's not an acceptable solution, so instead just
    tweak the DISABLE/ENABLE TRIGGER logic to ensure it will schema-qualify
    its output regardless of server version.
    
    Per bug #15338 from Oleg somebody.  Back-patch to all supported branches.
    
    Discussion: https://postgr.es/m/153452458706.1316.5328079417086507743@wrigleys.postgresql.org


src/bin/pg_dump/pg_backup_archiver.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 8c9455041eb..c4dbfab3301 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -792,10 +792,12 @@ _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *rop _becomeUser(AH, ropt->superuser); /* - * Disable them. + * Disable them. Assume that the table name should be schema-qualified + * (we can't look at PQserverVersion, since we might not have any + * connection; and anyway we don't promise our output will load pre-7.3). */ ahprintf(AH, "ALTER TABLE %s DISABLE TRIGGER ALL;\n\n", - fmtQualifiedId(PQserverVersion(AH->connection), + fmtQualifiedId(70300, te->namespace, te->tag)); } @@ -818,10 +820,10 @@ _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt _becomeUser(AH, ropt->superuser); /* - * Enable them. + * Enable them. As above, force schema qualification. */ ahprintf(AH, "ALTER TABLE %s ENABLE TRIGGER ALL;\n\n", - fmtQualifiedId(PQserverVersion(AH->connection), + fmtQualifiedId(70300, te->namespace, te->tag)); } [parent: 807c1c555064]