aboutsummaryrefslogtreecommitdiff
path: root/src/bin/pg_dump
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pg_dump')
-rw-r--r--src/bin/pg_dump/common.c15
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.c2
-rw-r--r--src/bin/pg_dump/pg_dump.c209
-rw-r--r--src/bin/pg_dump/pg_dump.h2
-rw-r--r--src/bin/pg_dump/t/002_pg_dump.pl6
5 files changed, 37 insertions, 197 deletions
diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c
index ed95dc8dc62..5d988986edc 100644
--- a/src/bin/pg_dump/common.c
+++ b/src/bin/pg_dump/common.c
@@ -82,8 +82,7 @@ static catalogid_hash *catalogIdHash = NULL;
static void flagInhTables(Archive *fout, TableInfo *tblinfo, int numTables,
InhInfo *inhinfo, int numInherits);
static void flagInhIndexes(Archive *fout, TableInfo *tblinfo, int numTables);
-static void flagInhAttrs(Archive *fout, DumpOptions *dopt, TableInfo *tblinfo,
- int numTables);
+static void flagInhAttrs(DumpOptions *dopt, TableInfo *tblinfo, int numTables);
static int strInArray(const char *pattern, char **arr, int arr_size);
static IndxInfo *findIndexByOid(Oid oid);
@@ -227,7 +226,7 @@ getSchemaData(Archive *fout, int *numTablesPtr)
getTableAttrs(fout, tblinfo, numTables);
pg_log_info("flagging inherited columns in subtables");
- flagInhAttrs(fout, fout->dopt, tblinfo, numTables);
+ flagInhAttrs(fout->dopt, tblinfo, numTables);
pg_log_info("reading partitioning data");
getPartitioningInfo(fout);
@@ -472,8 +471,7 @@ flagInhIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
* What we need to do here is:
*
* - Detect child columns that inherit NOT NULL bits from their parents, so
- * that we needn't specify that again for the child. (Versions >= 16 no
- * longer need this.)
+ * that we needn't specify that again for the child.
*
* - Detect child columns that have DEFAULT NULL when their parents had some
* non-null default. In this case, we make up a dummy AttrDefInfo object so
@@ -493,7 +491,7 @@ flagInhIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
* modifies tblinfo
*/
static void
-flagInhAttrs(Archive *fout, DumpOptions *dopt, TableInfo *tblinfo, int numTables)
+flagInhAttrs(DumpOptions *dopt, TableInfo *tblinfo, int numTables)
{
int i,
j,
@@ -574,9 +572,8 @@ flagInhAttrs(Archive *fout, DumpOptions *dopt, TableInfo *tblinfo, int numTables
}
}
- /* In versions < 16, remember if we found inherited NOT NULL */
- if (fout->remoteVersion < 160000)
- tbinfo->localNotNull[j] = !foundNotNull;
+ /* Remember if we found inherited NOT NULL */
+ tbinfo->inhNotNull[j] = foundNotNull;
/*
* Manufacture a DEFAULT NULL clause if necessary. This breaks
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index 5b858b23482..d518349e100 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -601,7 +601,6 @@ RestoreArchive(Archive *AHX)
if (strcmp(te->desc, "CONSTRAINT") == 0 ||
strcmp(te->desc, "CHECK CONSTRAINT") == 0 ||
- strcmp(te->desc, "NOT NULL CONSTRAINT") == 0 ||
strcmp(te->desc, "FK CONSTRAINT") == 0)
strcpy(buffer, "DROP CONSTRAINT");
else
@@ -3512,7 +3511,6 @@ _getObjectDescription(PQExpBuffer buf, const TocEntry *te)
/* these object types don't have separate owners */
else if (strcmp(type, "CAST") == 0 ||
strcmp(type, "CHECK CONSTRAINT") == 0 ||
- strcmp(type, "NOT NULL CONSTRAINT") == 0 ||
strcmp(type, "CONSTRAINT") == 0 ||
strcmp(type, "DATABASE PROPERTIES") == 0 ||
strcmp(type, "DEFAULT") == 0 ||
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 967ced4eed5..7a504dfe25b 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -8372,7 +8372,6 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
PQExpBuffer q = createPQExpBuffer();
PQExpBuffer tbloids = createPQExpBuffer();
PQExpBuffer checkoids = createPQExpBuffer();
- PQExpBuffer defaultoids = createPQExpBuffer();
PGresult *res;
int ntups;
int curtblindx;
@@ -8390,7 +8389,6 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
int i_attalign;
int i_attislocal;
int i_attnotnull;
- int i_localnotnull;
int i_attoptions;
int i_attcollation;
int i_attcompression;
@@ -8400,17 +8398,16 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
/*
* We want to perform just one query against pg_attribute, and then just
- * one against pg_attrdef (for DEFAULTs) and two against pg_constraint
- * (for CHECK constraints and for NOT NULL constraints). However, we
- * mustn't try to select every row of those catalogs and then sort it out
- * on the client side, because some of the server-side functions we need
- * would be unsafe to apply to tables we don't have lock on. Hence, we
- * build an array of the OIDs of tables we care about (and now have lock
- * on!), and use a WHERE clause to constrain which rows are selected.
+ * one against pg_attrdef (for DEFAULTs) and one against pg_constraint
+ * (for CHECK constraints). However, we mustn't try to select every row
+ * of those catalogs and then sort it out on the client side, because some
+ * of the server-side functions we need would be unsafe to apply to tables
+ * we don't have lock on. Hence, we build an array of the OIDs of tables
+ * we care about (and now have lock on!), and use a WHERE clause to
+ * constrain which rows are selected.
*/
appendPQExpBufferChar(tbloids, '{');
appendPQExpBufferChar(checkoids, '{');
- appendPQExpBufferChar(defaultoids, '{');
for (int i = 0; i < numTables; i++)
{
TableInfo *tbinfo = &tblinfo[i];
@@ -8454,6 +8451,7 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
"a.attstattarget,\n"
"a.attstorage,\n"
"t.typstorage,\n"
+ "a.attnotnull,\n"
"a.atthasdef,\n"
"a.attisdropped,\n"
"a.attlen,\n"
@@ -8470,21 +8468,6 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
"ORDER BY option_name"
"), E',\n ') AS attfdwoptions,\n");
- /*
- * Write out NOT NULL. In 16 and up we have to read pg_constraint, and we
- * only print it for constraints that aren't connoinherit. A NULL result
- * means there's no contype='n' row for the column, so we mustn't print
- * anything then either. We also track conislocal so that we can handle
- * the case of partitioned tables and binary upgrade especially.
- */
- if (fout->remoteVersion >= 160000)
- appendPQExpBufferStr(q,
- "co.connoinherit IS NOT NULL AS attnotnull,\n"
- "coalesce(co.conislocal, false) AS local_notnull,\n");
- else
- appendPQExpBufferStr(q,
- "a.attnotnull, false AS local_notnull,\n");
-
if (fout->remoteVersion >= 140000)
appendPQExpBufferStr(q,
"a.attcompression AS attcompression,\n");
@@ -8519,20 +8502,11 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
"FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
"JOIN pg_catalog.pg_attribute a ON (src.tbloid = a.attrelid) "
"LEFT JOIN pg_catalog.pg_type t "
- "ON (a.atttypid = t.oid)\n",
+ "ON (a.atttypid = t.oid)\n"
+ "WHERE a.attnum > 0::pg_catalog.int2\n"
+ "ORDER BY a.attrelid, a.attnum",
tbloids->data);
- /* in 16, need pg_constraint for NOT NULLs */
- if (fout->remoteVersion >= 160000)
- appendPQExpBufferStr(q,
- " LEFT JOIN pg_catalog.pg_constraint co ON "
- "(a.attrelid = co.conrelid\n"
- " AND co.contype = 'n' AND "
- "co.conkey = array[a.attnum])\n");
- appendPQExpBufferStr(q,
- "WHERE a.attnum > 0::pg_catalog.int2\n"
- "ORDER BY a.attrelid, a.attnum");
-
res = ExecuteSqlQuery(fout, q->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
@@ -8551,7 +8525,6 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
i_attalign = PQfnumber(res, "attalign");
i_attislocal = PQfnumber(res, "attislocal");
i_attnotnull = PQfnumber(res, "attnotnull");
- i_localnotnull = PQfnumber(res, "local_notnull");
i_attoptions = PQfnumber(res, "attoptions");
i_attcollation = PQfnumber(res, "attcollation");
i_attcompression = PQfnumber(res, "attcompression");
@@ -8560,8 +8533,8 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
i_atthasdef = PQfnumber(res, "atthasdef");
/* Within the next loop, we'll accumulate OIDs of tables with defaults */
- resetPQExpBuffer(defaultoids);
- appendPQExpBufferChar(defaultoids, '{');
+ resetPQExpBuffer(tbloids);
+ appendPQExpBufferChar(tbloids, '{');
/*
* Outer loop iterates once per table, not once per row. Incrementing of
@@ -8617,7 +8590,7 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
tbinfo->attfdwoptions = (char **) pg_malloc(numatts * sizeof(char *));
tbinfo->attmissingval = (char **) pg_malloc(numatts * sizeof(char *));
tbinfo->notnull = (bool *) pg_malloc(numatts * sizeof(bool));
- tbinfo->localNotNull = (bool *) pg_malloc(numatts * sizeof(bool));
+ tbinfo->inhNotNull = (bool *) pg_malloc(numatts * sizeof(bool));
tbinfo->attrdefs = (AttrDefInfo **) pg_malloc(numatts * sizeof(AttrDefInfo *));
hasdefaults = false;
@@ -8639,7 +8612,6 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
tbinfo->attalign[j] = *(PQgetvalue(res, r, i_attalign));
tbinfo->attislocal[j] = (PQgetvalue(res, r, i_attislocal)[0] == 't');
tbinfo->notnull[j] = (PQgetvalue(res, r, i_attnotnull)[0] == 't');
- tbinfo->localNotNull[j] = (PQgetvalue(res, r, i_localnotnull)[0] == 't');
tbinfo->attoptions[j] = pg_strdup(PQgetvalue(res, r, i_attoptions));
tbinfo->attcollation[j] = atooid(PQgetvalue(res, r, i_attcollation));
tbinfo->attcompression[j] = *(PQgetvalue(res, r, i_attcompression));
@@ -8648,14 +8620,16 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
tbinfo->attrdefs[j] = NULL; /* fix below */
if (PQgetvalue(res, r, i_atthasdef)[0] == 't')
hasdefaults = true;
+ /* these flags will be set in flagInhAttrs() */
+ tbinfo->inhNotNull[j] = false;
}
if (hasdefaults)
{
/* Collect OIDs of interesting tables that have defaults */
- if (defaultoids->len > 1) /* do we have more than the '{'? */
- appendPQExpBufferChar(defaultoids, ',');
- appendPQExpBuffer(defaultoids, "%u", tbinfo->dobj.catId.oid);
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tbinfo->dobj.catId.oid);
}
}
@@ -8665,7 +8639,7 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
* Now get info about column defaults. This is skipped for a data-only
* dump, as it is only needed for table schemas.
*/
- if (!dopt->dataOnly && defaultoids->len > 1)
+ if (!dopt->dataOnly && tbloids->len > 1)
{
AttrDefInfo *attrdefs;
int numDefaults;
@@ -8673,14 +8647,14 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
pg_log_info("finding table default expressions");
- appendPQExpBufferChar(defaultoids, '}');
+ appendPQExpBufferChar(tbloids, '}');
printfPQExpBuffer(q, "SELECT a.tableoid, a.oid, adrelid, adnum, "
"pg_catalog.pg_get_expr(adbin, adrelid) AS adsrc\n"
"FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
"JOIN pg_catalog.pg_attrdef a ON (src.tbloid = a.adrelid)\n"
"ORDER BY a.adrelid, a.adnum",
- defaultoids->data);
+ tbloids->data);
res = ExecuteSqlQuery(fout, q->data, PGRES_TUPLES_OK);
@@ -8923,112 +8897,9 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
PQclear(res);
}
- /*
- * Get info about table NOT NULL constraints. This is skipped for a
- * data-only dump, as it is only needed for table schemas.
- *
- * Optimizing for tables that have no NOT NULL constraint seems
- * pointless, so we don't try.
- */
- if (!dopt->dataOnly)
- {
- ConstraintInfo *constrs;
- int numConstrs;
- int i_tableoid;
- int i_oid;
- int i_conrelid;
- int i_conname;
- int i_condef;
- int i_conislocal;
-
- pg_log_info("finding table not null constraints");
-
- /*
- * Only constraints marked connoinherit need to be handled here;
- * the normal constraints are instead handled by writing NOT NULL
- * when each column is defined.
- */
- resetPQExpBuffer(q);
- appendPQExpBuffer(q,
- "SELECT co.tableoid, co.oid, conrelid, conname, "
- "pg_catalog.pg_get_constraintdef(co.oid) AS condef,\n"
- " conislocal, coninhcount, connoinherit "
- "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
- "JOIN pg_catalog.pg_constraint co ON (src.tbloid = co.conrelid)\n"
- "JOIN pg_catalog.pg_class c ON (conrelid = c.oid)\n"
- "WHERE contype = 'n' AND connoinherit\n"
- "ORDER BY co.conrelid, co.conname",
- tbloids->data);
-
- res = ExecuteSqlQuery(fout, q->data, PGRES_TUPLES_OK);
-
- numConstrs = PQntuples(res);
- constrs = (ConstraintInfo *) pg_malloc(numConstrs * sizeof(ConstraintInfo));
-
- i_tableoid = PQfnumber(res, "tableoid");
- i_oid = PQfnumber(res, "oid");
- i_conrelid = PQfnumber(res, "conrelid");
- i_conname = PQfnumber(res, "conname");
- i_condef = PQfnumber(res, "condef");
- i_conislocal = PQfnumber(res, "conislocal");
-
- /* As above, this loop iterates once per table, not once per row */
- curtblindx = -1;
- for (int j = 0; j < numConstrs;)
- {
- Oid conrelid = atooid(PQgetvalue(res, j, i_conrelid));
- TableInfo *tbinfo = NULL;
- int numcons;
-
- /* Count rows for this table */
- for (numcons = 1; numcons < numConstrs - j; numcons++)
- if (atooid(PQgetvalue(res, j + numcons, i_conrelid)) != conrelid)
- break;
-
- /*
- * Locate the associated TableInfo; we rely on tblinfo[] being in
- * OID order.
- */
- while (++curtblindx < numTables)
- {
- tbinfo = &tblinfo[curtblindx];
- if (tbinfo->dobj.catId.oid == conrelid)
- break;
- }
- if (curtblindx >= numTables)
- pg_fatal("unrecognized table OID %u", conrelid);
-
- for (int c = 0; c < numcons; c++, j++)
- {
- constrs[j].dobj.objType = DO_CONSTRAINT;
- constrs[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_tableoid));
- constrs[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
- AssignDumpId(&constrs[j].dobj);
- constrs[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_conname));
- constrs[j].dobj.namespace = tbinfo->dobj.namespace;
- constrs[j].contable = tbinfo;
- constrs[j].condomain = NULL;
- constrs[j].contype = 'n';
- constrs[j].condef = pg_strdup(PQgetvalue(res, j, i_condef));
- constrs[j].confrelid = InvalidOid;
- constrs[j].conindex = 0;
- constrs[j].condeferrable = false;
- constrs[j].condeferred = false;
- constrs[j].conislocal = (PQgetvalue(res, j, i_conislocal)[0] == 't');
-
- constrs[j].separate = true;
-
- constrs[j].dobj.dump = tbinfo->dobj.dump;
- }
- }
-
- PQclear(res);
- }
-
destroyPQExpBuffer(q);
destroyPQExpBuffer(tbloids);
destroyPQExpBuffer(checkoids);
- destroyPQExpBuffer(defaultoids);
}
/*
@@ -15701,12 +15572,12 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo)
!tbinfo->attrdefs[j]->separate);
/*
- * Not Null constraint --- suppress unless it is locally
- * defined, except if partition, or in binary-upgrade case
- * where that won't work.
+ * Not Null constraint --- suppress if inherited, except
+ * if partition, or in binary-upgrade case where that
+ * won't work.
*/
print_notnull = (tbinfo->notnull[j] &&
- (tbinfo->localNotNull[j] ||
+ (!tbinfo->inhNotNull[j] ||
tbinfo->ispartition || dopt->binary_upgrade));
/*
@@ -16099,8 +15970,7 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo)
* we have to mark it separately.
*/
if (!shouldPrintColumn(dopt, tbinfo, j) &&
- tbinfo->notnull[j] && tbinfo->localNotNull[j] &&
- tbinfo->ispartition)
+ tbinfo->notnull[j] && !tbinfo->inhNotNull[j])
appendPQExpBuffer(q,
"ALTER %sTABLE ONLY %s ALTER COLUMN %s SET NOT NULL;\n",
foreign, qualrelname,
@@ -16925,31 +16795,6 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo)
.createStmt = q->data,
.dropStmt = delq->data));
}
- else if (coninfo->contype == 'n')
- {
- appendPQExpBuffer(q, "ALTER %sTABLE %s\n", foreign,
- fmtQualifiedDumpable(tbinfo));
- appendPQExpBuffer(q, " ADD CONSTRAINT %s %s;\n",
- fmtId(coninfo->dobj.name),
- coninfo->condef);
-
- appendPQExpBuffer(delq, "ALTER %sTABLE %s\n", foreign,
- fmtQualifiedDumpable(tbinfo));
- appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",
- fmtId(coninfo->dobj.name));
-
- tag = psprintf("%s %s", tbinfo->dobj.name, coninfo->dobj.name);
-
- if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
- ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
- ARCHIVE_OPTS(.tag = tag,
- .namespace = tbinfo->dobj.namespace->dobj.name,
- .owner = tbinfo->rolname,
- .description = "NOT NULL CONSTRAINT",
- .section = SECTION_POST_DATA,
- .createStmt = q->data,
- .dropStmt = delq->data));
- }
else if (coninfo->contype == 'c' && tbinfo)
{
/* CHECK constraint on a table */
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
index 765fe6399a6..ed6ce41ad7e 100644
--- a/src/bin/pg_dump/pg_dump.h
+++ b/src/bin/pg_dump/pg_dump.h
@@ -345,7 +345,7 @@ typedef struct _tableInfo
char **attfdwoptions; /* per-attribute fdw options */
char **attmissingval; /* per attribute missing value */
bool *notnull; /* NOT NULL constraints on attributes */
- bool *localNotNull; /* true if NOT NULL has local definition */
+ bool *inhNotNull; /* true if NOT NULL is inherited */
struct _attrDefInfo **attrdefs; /* DEFAULT expressions */
struct _constraintInfo *checkexprs; /* CHECK constraints */
bool needs_override; /* has GENERATED ALWAYS AS IDENTITY */
diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl
index afd1bb2e9a7..93e24d51457 100644
--- a/src/bin/pg_dump/t/002_pg_dump.pl
+++ b/src/bin/pg_dump/t/002_pg_dump.pl
@@ -3115,7 +3115,7 @@ my %tests = (
);',
regexp => qr/^
\QCREATE TABLE dump_test.fk_reference_test_table (\E
- \n\s+\Qcol1 integer\E
+ \n\s+\Qcol1 integer NOT NULL\E
\n\);
/xm,
like =>
@@ -3507,7 +3507,7 @@ my %tests = (
);',
regexp => qr/^
\QCREATE TABLE dump_test.test_table_generated (\E\n
- \s+\Qcol1 integer,\E\n
+ \s+\Qcol1 integer NOT NULL,\E\n
\s+\Qcol2 integer GENERATED ALWAYS AS ((col1 * 2)) STORED\E\n
\);
/xms,
@@ -3621,7 +3621,7 @@ my %tests = (
) INHERITS (dump_test.test_inheritance_parent);',
regexp => qr/^
\QCREATE TABLE dump_test.test_inheritance_child (\E\n
- \s+\Qcol1 integer NOT NULL,\E\n
+ \s+\Qcol1 integer,\E\n
\s+\QCONSTRAINT test_inheritance_child CHECK ((col2 >= 142857))\E\n
\)\n
\QINHERITS (dump_test.test_inheritance_parent);\E\n