Skip to content

Commit 3424c10

Browse files
committed
Fix pg_dump --clean with partitioned indexes.
We'd try to drop the partitions of a partitioned index separately, which is disallowed by the backend, leading to an error during restore. While the error is harmless, it causes problems if you try to use --single-transaction mode. Fortunately, there seems no need to do a DROP at all, since the partition will go away silently when we drop either the parent index or the partition's table. So just make the DROP conditional on not being a partition. Reported-by: jian he <jian.universality@gmail.com> Author: jian he <jian.universality@gmail.com> Reviewed-by: Pavel Stehule <pavel.stehule@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/CACJufxF0QSdkjFKF4di-JGWN6CSdQYEAhGPmQJJCdkSZtd=oLg@mail.gmail.com Backpatch-through: 13
1 parent 3c39c00 commit 3424c10

File tree

1 file changed

+20
-6
lines changed

1 file changed

+20
-6
lines changed

src/bin/pg_dump/pg_dump.c

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16933,7 +16933,17 @@ dumpIndex(Archive *fout, const IndxInfo *indxinfo)
1693316933
qindxname);
1693416934
}
1693516935

16936-
appendPQExpBuffer(delq, "DROP INDEX %s;\n", qqindxname);
16936+
/*
16937+
* If this index is a member of a partitioned index, the backend will
16938+
* not allow us to drop it separately, so don't try. It will go away
16939+
* automatically when we drop either the index's table or the
16940+
* partitioned index. (If, in a selective restore with --clean, we
16941+
* drop neither of those, then this index will not be dropped either.
16942+
* But that's fine, and even if you think it's not, the backend won't
16943+
* let us do differently.)
16944+
*/
16945+
if (indxinfo->parentidx == 0)
16946+
appendPQExpBuffer(delq, "DROP INDEX %s;\n", qqindxname);
1693716947

1693816948
if (indxinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
1693916949
ArchiveEntry(fout, indxinfo->dobj.catId, indxinfo->dobj.dumpId,
@@ -16986,11 +16996,15 @@ dumpIndexAttach(Archive *fout, const IndexAttachInfo *attachinfo)
1698616996
fmtQualifiedDumpable(attachinfo->partitionIdx));
1698716997

1698816998
/*
16989-
* There is no point in creating a drop query as the drop is done by
16990-
* index drop. (If you think to change this, see also
16991-
* _printTocEntry().) Although this object doesn't really have
16992-
* ownership as such, set the owner field anyway to ensure that the
16993-
* command is run by the correct role at restore time.
16999+
* There is no need for a dropStmt since the drop is done implicitly
17000+
* when we drop either the index's table or the partitioned index.
17001+
* Moreover, since there's no ALTER INDEX DETACH PARTITION command,
17002+
* there's no way to do it anyway. (If you think to change this,
17003+
* consider also what to do with --if-exists.)
17004+
*
17005+
* Although this object doesn't really have ownership as such, set the
17006+
* owner field anyway to ensure that the command is run by the correct
17007+
* role at restore time.
1699417008
*/
1699517009
ArchiveEntry(fout, attachinfo->dobj.catId, attachinfo->dobj.dumpId,
1699617010
ARCHIVE_OPTS(.tag = attachinfo->dobj.name,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy