aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_dump/pg_dump.c32
-rw-r--r--src/bin/pg_dump/pg_dump.h12
2 files changed, 27 insertions, 17 deletions
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)