Skip to content

Commit 6a3e578

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 c7597a1 commit 6a3e578

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
@@ -17015,7 +17015,17 @@ dumpIndex(Archive *fout, IndxInfo *indxinfo)
1701517015
qindxname);
1701617016
}
1701717017

17018-
appendPQExpBuffer(delq, "DROP INDEX %s;\n", qqindxname);
17018+
/*
17019+
* If this index is a member of a partitioned index, the backend will
17020+
* not allow us to drop it separately, so don't try. It will go away
17021+
* automatically when we drop either the index's table or the
17022+
* partitioned index. (If, in a selective restore with --clean, we
17023+
* drop neither of those, then this index will not be dropped either.
17024+
* But that's fine, and even if you think it's not, the backend won't
17025+
* let us do differently.)
17026+
*/
17027+
if (indxinfo->parentidx == 0)
17028+
appendPQExpBuffer(delq, "DROP INDEX %s;\n", qqindxname);
1701917029

1702017030
if (indxinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
1702117031
ArchiveEntry(fout, indxinfo->dobj.catId, indxinfo->dobj.dumpId,
@@ -17069,11 +17079,15 @@ dumpIndexAttach(Archive *fout, IndexAttachInfo *attachinfo)
1706917079
fmtQualifiedDumpable(attachinfo->partitionIdx));
1707017080

1707117081
/*
17072-
* There is no point in creating a drop query as the drop is done by
17073-
* index drop. (If you think to change this, see also
17074-
* _printTocEntry().) Although this object doesn't really have
17075-
* ownership as such, set the owner field anyway to ensure that the
17076-
* command is run by the correct role at restore time.
17082+
* There is no need for a dropStmt since the drop is done implicitly
17083+
* when we drop either the index's table or the partitioned index.
17084+
* Moreover, since there's no ALTER INDEX DETACH PARTITION command,
17085+
* there's no way to do it anyway. (If you think to change this,
17086+
* consider also what to do with --if-exists.)
17087+
*
17088+
* Although this object doesn't really have ownership as such, set the
17089+
* owner field anyway to ensure that the command is run by the correct
17090+
* role at restore time.
1707717091
*/
1707817092
ArchiveEntry(fout, attachinfo->dobj.catId, attachinfo->dobj.dumpId,
1707917093
ARCHIVE_OPTS(.tag = attachinfo->dobj.name,

0 commit comments

Comments
 (0)