@ -8188,9 +8188,12 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
* Normally this is always true , but it ' s false for dropped columns , as well
* as those that were inherited without any local definition . ( If we print
* such a column it will mistakenly get pg_attribute . attislocal set to true . )
* However , in binary_upgrade mode , we must print all such columns anyway and
* fix the attislocal / attisdropped state later , so as to keep control of the
* physical column order .
* For partitions , it ' s always true , because we want the partitions to be
* created independently and ATTACH PARTITION used afterwards .
*
* In binary_upgrade mode , we must print all columns and fix the attislocal /
* attisdropped state later , so as to keep control of the physical column
* order .
*
* This function exists because there are scattered nonobvious places that
* must be kept in sync with this decision .
@ -8200,7 +8203,9 @@ shouldPrintColumn(DumpOptions *dopt, TableInfo *tbinfo, int colno)
{
if ( dopt - > binary_upgrade )
return true ;
return ( tbinfo - > attislocal [ colno ] & & ! tbinfo - > attisdropped [ colno ] ) ;
if ( tbinfo - > attisdropped [ colno ] )
return false ;
return ( tbinfo - > attislocal [ colno ] | | tbinfo - > ispartition ) ;
}
@ -14963,27 +14968,6 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
if ( tbinfo - > reloftype & & ! dopt - > binary_upgrade )
appendPQExpBuffer ( q , " OF %s " , tbinfo - > reloftype ) ;
/*
* If the table is a partition , dump it as such ; except in the case of
* a binary upgrade , we dump the table normally and attach it to the
* parent afterward .
*/
if ( tbinfo - > ispartition & & ! dopt - > binary_upgrade )
{
TableInfo * parentRel = tbinfo - > parents [ 0 ] ;
/*
* With partitions , unlike inheritance , there can only be one
* parent .
*/
if ( tbinfo - > numParents ! = 1 )
exit_horribly ( NULL , " invalid number of parents %d for table \" %s \" \n " ,
tbinfo - > numParents , tbinfo - > dobj . name ) ;
appendPQExpBuffer ( q , " PARTITION OF %s " ,
fmtQualifiedDumpable ( parentRel ) ) ;
}
if ( tbinfo - > relkind ! = RELKIND_MATVIEW )
{
/* Dump the attributes */
@ -14998,26 +14982,30 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
*/
if ( shouldPrintColumn ( dopt , tbinfo , j ) )
{
bool print_default ;
bool print_notnull ;
/*
* Default value - - - suppress if to be printed separately .
*/
bool has _default = ( tbinfo - > attrdefs [ j ] ! = NULL & &
! tbinfo - > attrdefs [ j ] - > separate ) ;
print _default = ( tbinfo - > attrdefs [ j ] ! = NULL & &
! tbinfo - > attrdefs [ j ] - > separate ) ;
/*
* Not Null constraint - - - suppress if inherited , except
* in binary - upgrade case where that won ' t work .
* if partition , or in binary - upgrade case where that
* won ' t work .
*/
bool has _notnull = ( tbinfo - > notnull [ j ] & &
( ! tbinfo - > inhNotNull [ j ] | |
dopt - > binary_upgrade ) ) ;
print _notnull = ( tbinfo - > notnull [ j ] & &
( ! tbinfo - > inhNotNull [ j ] | |
tbinfo - > ispartition | | dopt - > binary_upgrade ) ) ;
/*
* Skip column if fully defined by reloftype or the
* partition parent .
* Skip column if fully defined by reloftype , except in
* binary upgrade
*/
if ( ( tbinfo - > reloftype | | tbinfo - > ispartition ) & &
! has_default & & ! has_notnull & & ! dopt - > binary_upgrade )
if ( tbinfo - > reloftype & & ! print_default & & ! print_notnull & &
! dopt - > binary_upgrade )
continue ;
/* Format properly if not first attr */
@ -15040,20 +15028,16 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
* clean things up later .
*/
appendPQExpBufferStr ( q , " INTEGER /* dummy */ " ) ;
/* Skip all the rest, too */
/* and skip to the next column */
continue ;
}
/*
* Attribute type
*
* In binary - upgrade mode , we always include the type . If
* we aren ' t in binary - upgrade mode , then we skip the type
* when creating a typed table ( ' OF type_name ' ) or a
* partition ( ' PARTITION OF ' ) , since the type comes from
* the parent / partitioned table .
* Attribute type ; print it except when creating a typed
* table ( ' OF type_name ' ) , but in binary - upgrade mode ,
* print it in that case too .
*/
if ( dopt - > binary_upgrade | | ( ! tbinfo - > reloftype & & ! tbinfo - > ispartition ) )
if ( dopt - > binary_upgrade | | ! tbinfo - > reloftype )
{
appendPQExpBuffer ( q , " %s " ,
tbinfo - > atttypnames [ j ] ) ;
@ -15070,23 +15054,29 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
fmtQualifiedDumpable ( coll ) ) ;
}
if ( has _default)
if ( print _default)
appendPQExpBuffer ( q , " DEFAULT %s " ,
tbinfo - > attrdefs [ j ] - > adef_expr ) ;
if ( has _notnull)
if ( print _notnull)
appendPQExpBufferStr ( q , " NOT NULL " ) ;
}
}
/*
* Add non - inherited CHECK constraints , if any .
*
* For partitions , we need to include check constraints even if
* they ' re not defined locally , because the ALTER TABLE ATTACH
* PARTITION that we ' ll emit later expects the constraint to be
* there . ( No need to fix conislocal : ATTACH PARTITION does that )
*/
for ( j = 0 ; j < tbinfo - > ncheck ; j + + )
{
ConstraintInfo * constr = & ( tbinfo - > checkexprs [ j ] ) ;
if ( constr - > separate | | ! constr - > conislocal )
if ( constr - > separate | |
( ! constr - > conislocal & & ! tbinfo - > ispartition ) )
continue ;
if ( actual_atts = = 0 )
@ -15103,25 +15093,20 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
if ( actual_atts )
appendPQExpBufferStr ( q , " \n ) " ) ;
else if ( ! ( ( tbinfo - > reloftype | | tbinfo - > ispartition ) & &
! dopt - > binary_upgrade ) )
else if ( ! ( tbinfo - > reloftype & & ! dopt - > binary_upgrade ) )
{
/*
* W e must have a parenthesized attribute list , even though
* empty , when not using the OF TYPE or PARTITION OF syntax .
* No attributes ? w e must have a parenthesized attribute list ,
* even though e mpty , when not using the OF TYPE syntax .
*/
appendPQExpBufferStr ( q , " ( \n ) " ) ;
}
if ( tbinfo - > ispartition & & ! dopt - > binary_upgrade )
{
appendPQExpBufferStr ( q , " \n " ) ;
appendPQExpBufferStr ( q , tbinfo - > partbound ) ;
}
/* Emit the INHERITS clause, except if this is a partition. */
if ( numParents > 0 & &
! tbinfo - > ispartition & &
/*
* Emit the INHERITS clause ( not for partitions ) , except in
* binary - upgrade mode .
*/
if ( numParents > 0 & & ! tbinfo - > ispartition & &
! dopt - > binary_upgrade )
{
appendPQExpBufferStr ( q , " \n INHERITS ( " ) ;
@ -15249,11 +15234,17 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
}
}
/*
* Add inherited CHECK constraints , if any .
*
* For partitions , they were already dumped , and conislocal
* doesn ' t need fixing .
*/
for ( k = 0 ; k < tbinfo - > ncheck ; k + + )
{
ConstraintInfo * constr = & ( tbinfo - > checkexprs [ k ] ) ;
if ( constr - > separate | | constr - > conislocal )
if ( constr - > separate | | constr - > conislocal | | tbinfo - > ispartition )
continue ;
appendPQExpBufferStr ( q , " \n -- For binary upgrade, set up inherited constraint. \n " ) ;
@ -15271,30 +15262,16 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
appendPQExpBufferStr ( q , " ::pg_catalog.regclass; \n " ) ;
}
if ( numParents > 0 )
if ( numParents > 0 & & ! tbinfo - > ispartition )
{
appendPQExpBufferStr ( q , " \n -- For binary upgrade, set up inheritance and partitioning this way. \n " ) ;
appendPQExpBufferStr ( q , " \n -- For binary upgrade, set up inheritance this way. \n " ) ;
for ( k = 0 ; k < numParents ; k + + )
{
TableInfo * parentRel = parents [ k ] ;
/* In the partitioning case, we alter the parent */
if ( tbinfo - > ispartition )
appendPQExpBuffer ( q ,
" ALTER TABLE ONLY %s ATTACH PARTITION " ,
fmtQualifiedDumpable ( parentRel ) ) ;
else
appendPQExpBuffer ( q , " ALTER TABLE ONLY %s INHERIT " ,
qualrelname ) ;
/* Partition needs specifying the bounds */
if ( tbinfo - > ispartition )
appendPQExpBuffer ( q , " %s %s; \n " ,
qualrelname ,
tbinfo - > partbound ) ;
else
appendPQExpBuffer ( q , " %s; \n " ,
fmtQualifiedDumpable ( parentRel ) ) ;
appendPQExpBuffer ( q , " ALTER TABLE ONLY %s INHERIT %s; \n " ,
qualrelname ,
fmtQualifiedDumpable ( parentRel ) ) ;
}
}
@ -15307,6 +15284,27 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
}
}
/*
* For partitioned tables , emit the ATTACH PARTITION clause . Note
* that we always want to create partitions this way instead of using
* CREATE TABLE . . PARTITION OF , mainly to preserve a possible column
* layout discrepancy with the parent , but also to ensure it gets the
* correct tablespace setting if it differs from the parent ' s .
*/
if ( tbinfo - > ispartition )
{
/* With partitions there can only be one parent */
if ( tbinfo - > numParents ! = 1 )
exit_horribly ( NULL , " invalid number of parents %d for table \" %s \" \n " ,
tbinfo - > numParents , tbinfo - > dobj . name ) ;
/* Perform ALTER TABLE on the parent */
appendPQExpBuffer ( q ,
" ALTER TABLE ONLY %s ATTACH PARTITION %s %s; \n " ,
fmtQualifiedDumpable ( parents [ 0 ] ) ,
qualrelname , tbinfo - > partbound ) ;
}
/*
* In binary_upgrade mode , arrange to restore the old relfrozenxid and
* relminmxid of all vacuumable relations . ( While vacuum . c processes