diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index f3988f1492d..d2b0667a2a9 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -7210,20 +7210,15 @@ getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables) seqinfo->owning_tab, seqinfo->dobj.catId.oid); /* - * Only dump identity sequences if we're going to dump the table that - * it belongs to. - */ - if (owning_tab->dobj.dump == DUMP_COMPONENT_NONE && - seqinfo->is_identity_sequence) - { - seqinfo->dobj.dump = DUMP_COMPONENT_NONE; - continue; - } - - /* - * Otherwise we need to dump the components that are being dumped for - * the table and any components which the sequence is explicitly - * marked with. + * For an identity sequence, dump exactly the same components for the + * sequence as for the owning table. This is important because we + * treat the identity sequence as an integral part of the table. For + * example, there is not any DDL command that allows creation of such + * a sequence independently of the table. + * + * For other owned sequences such as serial sequences, we need to dump + * the components that are being dumped for the table and any + * components that the sequence is explicitly marked with. * * We can't simply use the set of components which are being dumped * for the table as the table might be in an extension (and only the @@ -7236,10 +7231,17 @@ getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables) * marked by checkExtensionMembership() and this will be a no-op as * the table will be equivalently marked. */ - seqinfo->dobj.dump = seqinfo->dobj.dump | owning_tab->dobj.dump; + if (seqinfo->is_identity_sequence) + seqinfo->dobj.dump = owning_tab->dobj.dump; + else + seqinfo->dobj.dump |= owning_tab->dobj.dump; + /* Make sure that necessary data is available if we're dumping it */ if (seqinfo->dobj.dump != DUMP_COMPONENT_NONE) + { seqinfo->interesting = true; + owning_tab->interesting = true; + } } } diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 865823868f1..1d352fe12d1 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -89,8 +89,16 @@ typedef enum /* * DumpComponents is a bitmask of the potentially dumpable components of * a database object: its core definition, plus optional attributes such - * as ACL, comments, etc. The NONE and ALL symbols are convenient - * shorthands. + * as ACL, comments, etc. + * + * The NONE and ALL symbols are convenient shorthands for assigning values, + * but be careful about using them in tests. For example, a test like + * "if (dobj->dump == DUMP_COMPONENT_NONE)" is probably wrong; you likely want + * "if (!(dobj->dump & DUMP_COMPONENT_DEFINITION))" instead. This is because + * we aren't too careful about the values of irrelevant bits, as indeed can be + * seen in the definition of DUMP_COMPONENT_ALL. It's also possible that an + * object has only subsidiary bits such as DUMP_COMPONENT_ACL set, leading to + * unexpected behavior of a test against NONE. */ typedef uint32 DumpComponents; #define DUMP_COMPONENT_NONE (0)