@@ -8188,9 +8188,12 @@ 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
- * 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.
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.
8194
8197
*
8195
8198
* This function exists because there are scattered nonobvious places that
8196
8199
* must be kept in sync with this decision.
@@ -8200,7 +8203,9 @@ shouldPrintColumn(DumpOptions *dopt, TableInfo *tbinfo, int colno)
8200
8203
{
8201
8204
if (dopt->binary_upgrade)
8202
8205
return true;
8203
- return (tbinfo->attislocal[colno] && !tbinfo->attisdropped[colno]);
8206
+ if (tbinfo->attisdropped[colno])
8207
+ return false;
8208
+ return (tbinfo->attislocal[colno] || tbinfo->ispartition);
8204
8209
}
8205
8210
8206
8211
@@ -14963,27 +14968,6 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
14963
14968
if (tbinfo->reloftype && !dopt->binary_upgrade)
14964
14969
appendPQExpBuffer(q, " OF %s", tbinfo->reloftype);
14965
14970
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
-
14987
14971
if (tbinfo->relkind != RELKIND_MATVIEW)
14988
14972
{
14989
14973
/* Dump the attributes */
@@ -15012,12 +14996,9 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
15012
14996
(!tbinfo->inhNotNull[j] ||
15013
14997
dopt->binary_upgrade));
15014
14998
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)
14999
+ /* Skip column if fully defined by reloftype */
15000
+ if (tbinfo->reloftype && !has_default && !has_notnull &&
15001
+ !dopt->binary_upgrade)
15021
15002
continue;
15022
15003
15023
15004
/* Format properly if not first attr */
@@ -15040,20 +15021,16 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
15040
15021
* clean things up later.
15041
15022
*/
15042
15023
appendPQExpBufferStr(q, " INTEGER /* dummy */");
15043
- /* Skip all the rest, too */
15024
+ /* and skip to the next column */
15044
15025
continue;
15045
15026
}
15046
15027
15047
15028
/*
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.
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.
15055
15032
*/
15056
- if (dopt->binary_upgrade || ( !tbinfo->reloftype && !tbinfo->ispartition) )
15033
+ if (dopt->binary_upgrade || !tbinfo->reloftype)
15057
15034
{
15058
15035
appendPQExpBuffer(q, " %s",
15059
15036
tbinfo->atttypnames[j]);
@@ -15103,25 +15080,20 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
15103
15080
15104
15081
if (actual_atts)
15105
15082
appendPQExpBufferStr(q, "\n)");
15106
- else if (!((tbinfo->reloftype || tbinfo->ispartition) &&
15107
- !dopt->binary_upgrade))
15083
+ else if (!(tbinfo->reloftype && !dopt->binary_upgrade))
15108
15084
{
15109
15085
/*
15110
- * We must have a parenthesized attribute list, even though
15111
- * empty, when not using the OF TYPE or PARTITION OF syntax.
15086
+ * No attributes? we must have a parenthesized attribute list,
15087
+ * even though empty, when not using the OF TYPE syntax.
15112
15088
*/
15113
15089
appendPQExpBufferStr(q, " (\n)");
15114
15090
}
15115
15091
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 &&
15092
+ /*
15093
+ * Emit the INHERITS clause (not for partitions), except in
15094
+ * binary-upgrade mode.
15095
+ */
15096
+ if (numParents > 0 && !tbinfo->ispartition &&
15125
15097
!dopt->binary_upgrade)
15126
15098
{
15127
15099
appendPQExpBufferStr(q, "\nINHERITS (");
@@ -15271,30 +15243,16 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
15271
15243
appendPQExpBufferStr(q, "::pg_catalog.regclass;\n");
15272
15244
}
15273
15245
15274
- if (numParents > 0)
15246
+ if (numParents > 0 && !tbinfo->ispartition )
15275
15247
{
15276
- appendPQExpBufferStr(q, "\n-- For binary upgrade, set up inheritance and partitioning this way.\n");
15248
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, set up inheritance this way.\n");
15277
15249
for (k = 0; k < numParents; k++)
15278
15250
{
15279
15251
TableInfo *parentRel = parents[k];
15280
15252
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));
15253
+ appendPQExpBuffer(q, "ALTER TABLE ONLY %s INHERIT %s;\n",
15254
+ qualrelname,
15255
+ fmtQualifiedDumpable(parentRel));
15298
15256
}
15299
15257
}
15300
15258
@@ -15307,6 +15265,27 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
15307
15265
}
15308
15266
}
15309
15267
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\"",
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
+
15310
15289
/*
15311
15290
* In binary_upgrade mode, arrange to restore the old relfrozenxid and
15312
15291
* relminmxid of all vacuumable relations. (While vacuum.c processes
0 commit comments