@@ -8188,12 +8188,9 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
8188
8188
* Normally this is always true, but it's false for dropped columns, as well
8189
8189
* as those that were inherited without any local definition. (If we print
8190
8190
* such a column it will mistakenly get pg_attribute.attislocal set to true.)
8191
- * For partitions, it's always true, because we want the partitions to be
8192
- * created independently and ATTACH PARTITION used afterwards.
8193
- *
8194
- * In binary_upgrade mode, we must print all columns and fix the attislocal/
8195
- * attisdropped state later, so as to keep control of the physical column
8196
- * order.
8191
+ * However, in binary_upgrade mode, we must print all such columns anyway and
8192
+ * fix the attislocal/attisdropped state later, so as to keep control of the
8193
+ * physical column order.
8197
8194
*
8198
8195
* This function exists because there are scattered nonobvious places that
8199
8196
* must be kept in sync with this decision.
@@ -8203,9 +8200,7 @@ shouldPrintColumn(DumpOptions *dopt, TableInfo *tbinfo, int colno)
8203
8200
{
8204
8201
if (dopt->binary_upgrade)
8205
8202
return true;
8206
- if (tbinfo->attisdropped[colno])
8207
- return false;
8208
- return (tbinfo->attislocal[colno] || tbinfo->ispartition);
8203
+ return (tbinfo->attislocal[colno] && !tbinfo->attisdropped[colno]);
8209
8204
}
8210
8205
8211
8206
@@ -14968,6 +14963,27 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
14968
14963
if (tbinfo->reloftype && !dopt->binary_upgrade)
14969
14964
appendPQExpBuffer(q, " OF %s", tbinfo->reloftype);
14970
14965
14966
+ /*
14967
+ * If the table is a partition, dump it as such; except in the case of
14968
+ * a binary upgrade, we dump the table normally and attach it to the
14969
+ * parent afterward.
14970
+ */
14971
+ if (tbinfo->ispartition && !dopt->binary_upgrade)
14972
+ {
14973
+ TableInfo *parentRel = tbinfo->parents[0];
14974
+
14975
+ /*
14976
+ * With partitions, unlike inheritance, there can only be one
14977
+ * parent.
14978
+ */
14979
+ if (tbinfo->numParents != 1)
14980
+ exit_horribly(NULL, "invalid number of parents %d for table \"%s\"\n",
14981
+ tbinfo->numParents, tbinfo->dobj.name);
14982
+
14983
+ appendPQExpBuffer(q, " PARTITION OF %s",
14984
+ fmtQualifiedDumpable(parentRel));
14985
+ }
14986
+
14971
14987
if (tbinfo->relkind != RELKIND_MATVIEW)
14972
14988
{
14973
14989
/* Dump the attributes */
@@ -14996,9 +15012,12 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
14996
15012
(!tbinfo->inhNotNull[j] ||
14997
15013
dopt->binary_upgrade));
14998
15014
14999
- /* Skip column if fully defined by reloftype */
15000
- if (tbinfo->reloftype && !has_default && !has_notnull &&
15001
- !dopt->binary_upgrade)
15015
+ /*
15016
+ * Skip column if fully defined by reloftype or the
15017
+ * partition parent.
15018
+ */
15019
+ if ((tbinfo->reloftype || tbinfo->ispartition) &&
15020
+ !has_default && !has_notnull && !dopt->binary_upgrade)
15002
15021
continue;
15003
15022
15004
15023
/* Format properly if not first attr */
@@ -15021,16 +15040,20 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
15021
15040
* clean things up later.
15022
15041
*/
15023
15042
appendPQExpBufferStr(q, " INTEGER /* dummy */");
15024
- /*and skip to thenext column */
15043
+ /*Skip all therest, too */
15025
15044
continue;
15026
15045
}
15027
15046
15028
15047
/*
15029
- * Attribute type; print it except when creating a typed
15030
- * table ('OF type_name'), but in binary-upgrade mode,
15031
- * print it in that case too.
15048
+ * Attribute type
15049
+ *
15050
+ * In binary-upgrade mode, we always include the type. If
15051
+ * we aren't in binary-upgrade mode, then we skip the type
15052
+ * when creating a typed table ('OF type_name') or a
15053
+ * partition ('PARTITION OF'), since the type comes from
15054
+ * the parent/partitioned table.
15032
15055
*/
15033
- if (dopt->binary_upgrade || !tbinfo->reloftype)
15056
+ if (dopt->binary_upgrade ||( !tbinfo->reloftype && !tbinfo->ispartition) )
15034
15057
{
15035
15058
appendPQExpBuffer(q, " %s",
15036
15059
tbinfo->atttypnames[j]);
@@ -15080,20 +15103,25 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
15080
15103
15081
15104
if (actual_atts)
15082
15105
appendPQExpBufferStr(q, "\n)");
15083
- else if (!(tbinfo->reloftype && !dopt->binary_upgrade))
15106
+ else if (!((tbinfo->reloftype || tbinfo->ispartition) &&
15107
+ !dopt->binary_upgrade))
15084
15108
{
15085
15109
/*
15086
- *No attributes? we must have a parenthesized attribute list,
15087
- *even though empty, when not using the OF TYPE syntax.
15110
+ *We must have a parenthesized attribute list, even though
15111
+ * empty, when not using the OF TYPE or PARTITION OF syntax.
15088
15112
*/
15089
15113
appendPQExpBufferStr(q, " (\n)");
15090
15114
}
15091
15115
15092
- /*
15093
- * Emit the INHERITS clause (not for partitions), except in
15094
- * binary-upgrade mode.
15095
- */
15096
- if (numParents > 0 && !tbinfo->ispartition &&
15116
+ if (tbinfo->ispartition && !dopt->binary_upgrade)
15117
+ {
15118
+ appendPQExpBufferStr(q, "\n");
15119
+ appendPQExpBufferStr(q, tbinfo->partbound);
15120
+ }
15121
+
15122
+ /* Emit the INHERITS clause, except if this is a partition. */
15123
+ if (numParents > 0 &&
15124
+ !tbinfo->ispartition &&
15097
15125
!dopt->binary_upgrade)
15098
15126
{
15099
15127
appendPQExpBufferStr(q, "\nINHERITS (");
@@ -15243,16 +15271,30 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
15243
15271
appendPQExpBufferStr(q, "::pg_catalog.regclass;\n");
15244
15272
}
15245
15273
15246
- if (numParents > 0 && !tbinfo->ispartition )
15274
+ if (numParents > 0)
15247
15275
{
15248
- appendPQExpBufferStr(q, "\n-- For binary upgrade, set up inheritance this way.\n");
15276
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, set up inheritanceand partitioning this way.\n");
15249
15277
for (k = 0; k < numParents; k++)
15250
15278
{
15251
15279
TableInfo *parentRel = parents[k];
15252
15280
15253
- appendPQExpBuffer(q, "ALTER TABLE ONLY %s INHERIT %s;\n",
15254
- qualrelname,
15255
- fmtQualifiedDumpable(parentRel));
15281
+ /* In the partitioning case, we alter the parent */
15282
+ if (tbinfo->ispartition)
15283
+ appendPQExpBuffer(q,
15284
+ "ALTER TABLE ONLY %s ATTACH PARTITION ",
15285
+ fmtQualifiedDumpable(parentRel));
15286
+ else
15287
+ appendPQExpBuffer(q, "ALTER TABLE ONLY %s INHERIT ",
15288
+ qualrelname);
15289
+
15290
+ /* Partition needs specifying the bounds */
15291
+ if (tbinfo->ispartition)
15292
+ appendPQExpBuffer(q, "%s %s;\n",
15293
+ qualrelname,
15294
+ tbinfo->partbound);
15295
+ else
15296
+ appendPQExpBuffer(q, "%s;\n",
15297
+ fmtQualifiedDumpable(parentRel));
15256
15298
}
15257
15299
}
15258
15300
@@ -15265,27 +15307,6 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
15265
15307
}
15266
15308
}
15267
15309
15268
- /*
15269
- * For partitioned tables, emit the ATTACH PARTITION clause. Note
15270
- * that we always want to create partitions this way instead of using
15271
- * CREATE TABLE .. PARTITION OF, mainly to preserve a possible column
15272
- * layout discrepancy with the parent, but also to ensure it gets the
15273
- * correct tablespace setting if it differs from the parent's.
15274
- */
15275
- if (tbinfo->ispartition)
15276
- {
15277
- /* With partitions there can only be one parent */
15278
- if (tbinfo->numParents != 1)
15279
- exit_horribly(NULL, "invalid number of parents %d for table \"%s\"\n",
15280
- tbinfo->numParents, tbinfo->dobj.name);
15281
-
15282
- /* Perform ALTER TABLE on the parent */
15283
- appendPQExpBuffer(q,
15284
- "ALTER TABLE ONLY %s ATTACH PARTITION %s %s;\n",
15285
- fmtQualifiedDumpable(parents[0]),
15286
- qualrelname, tbinfo->partbound);
15287
- }
15288
-
15289
15310
/*
15290
15311
* In binary_upgrade mode, arrange to restore the old relfrozenxid and
15291
15312
* relminmxid of all vacuumable relations. (While vacuum.c processes