summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane2025-04-16 17:31:44 +0000
committerTom Lane2025-04-16 17:31:44 +0000
commit3424c1075e4aafdf42e9ff829ed2a6e12c554ff2 (patch)
tree5d71f66b9d2d9591b71357d759b3ce6869110566 /src
parent3c39c000c85957940d4c4b30639447246b2595c0 (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_dump/pg_dump.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 85adb5dee76..9ed1a856fa3 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -16933,7 +16933,17 @@ dumpIndex(Archive *fout, const IndxInfo *indxinfo)
qindxname);
}
- appendPQExpBuffer(delq, "DROP INDEX %s;\n", qqindxname);
+ /*
+ * If this index is a member of a partitioned index, the backend will
+ * not allow us to drop it separately, so don't try. It will go away
+ * automatically when we drop either the index's table or the
+ * partitioned index. (If, in a selective restore with --clean, we
+ * drop neither of those, then this index will not be dropped either.
+ * But that's fine, and even if you think it's not, the backend won't
+ * let us do differently.)
+ */
+ if (indxinfo->parentidx == 0)
+ appendPQExpBuffer(delq, "DROP INDEX %s;\n", qqindxname);
if (indxinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
ArchiveEntry(fout, indxinfo->dobj.catId, indxinfo->dobj.dumpId,
@@ -16986,11 +16996,15 @@ dumpIndexAttach(Archive *fout, const IndexAttachInfo *attachinfo)
fmtQualifiedDumpable(attachinfo->partitionIdx));
/*
- * There is no point in creating a drop query as the drop is done by
- * index drop. (If you think to change this, see also
- * _printTocEntry().) Although this object doesn't really have
- * ownership as such, set the owner field anyway to ensure that the
- * command is run by the correct role at restore time.
+ * There is no need for a dropStmt since the drop is done implicitly
+ * when we drop either the index's table or the partitioned index.
+ * Moreover, since there's no ALTER INDEX DETACH PARTITION command,
+ * there's no way to do it anyway. (If you think to change this,
+ * consider also what to do with --if-exists.)
+ *
+ * Although this object doesn't really have ownership as such, set the
+ * owner field anyway to ensure that the command is run by the correct
+ * role at restore time.
*/
ArchiveEntry(fout, attachinfo->dobj.catId, attachinfo->dobj.dumpId,
ARCHIVE_OPTS(.tag = attachinfo->dobj.name,