Commit daa9fe8a authored by Peter Eisentraut's avatar Peter Eisentraut

pg_dump: Reorganize getTableAttrs()

Instead of repeating the almost same large query in each version branch,
use one query and add a few columns to the SELECT list depending on the
version.  This saves a lot of duplication.
Reviewed-by: default avatarTom Lane <tgl@sss.pgh.pa.us>
parent a846e6d0
...@@ -8162,150 +8162,77 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) ...@@ -8162,150 +8162,77 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
resetPQExpBuffer(q); resetPQExpBuffer(q);
appendPQExpBuffer(q,
"SELECT\n"
"a.attnum,\n"
"a.attname,\n"
"a.atttypmod,\n"
"a.attstattarget,\n"
"a.attstorage,\n"
"t.typstorage,\n"
"a.attnotnull,\n"
"a.atthasdef,\n"
"a.attisdropped,\n"
"a.attlen,\n"
"a.attalign,\n"
"a.attislocal,\n"
"pg_catalog.format_type(t.oid, a.atttypmod) AS atttypname,\n");
if (fout->remoteVersion >= 110000) if (fout->remoteVersion >= 110000)
{ appendPQExpBuffer(q,
/* atthasmissing and attmissingval are new in 11 */
appendPQExpBuffer(q, "SELECT a.attnum, a.attname, a.atttypmod, "
"a.attstattarget, a.attstorage, t.typstorage, "
"a.attnotnull, a.atthasdef, a.attisdropped, "
"a.attlen, a.attalign, a.attislocal, "
"pg_catalog.format_type(t.oid,a.atttypmod) AS atttypname, "
"array_to_string(a.attoptions, ', ') AS attoptions, "
"CASE WHEN a.attcollation <> t.typcollation "
"THEN a.attcollation ELSE 0 END AS attcollation, "
"a.attidentity, "
"pg_catalog.array_to_string(ARRAY("
"SELECT pg_catalog.quote_ident(option_name) || "
"' ' || pg_catalog.quote_literal(option_value) "
"FROM pg_catalog.pg_options_to_table(attfdwoptions) "
"ORDER BY option_name"
"), E',\n ') AS attfdwoptions ,"
"CASE WHEN a.atthasmissing AND NOT a.attisdropped " "CASE WHEN a.atthasmissing AND NOT a.attisdropped "
"THEN a.attmissingval ELSE null END AS attmissingval " "THEN a.attmissingval ELSE null END AS attmissingval,\n");
"FROM pg_catalog.pg_attribute a LEFT JOIN pg_catalog.pg_type t " else
"ON a.atttypid = t.oid " appendPQExpBuffer(q,
"WHERE a.attrelid = '%u'::pg_catalog.oid " "NULL AS attmissingval,\n");
"AND a.attnum > 0::pg_catalog.int2 "
"ORDER BY a.attnum", if (fout->remoteVersion >= 100000)
tbinfo->dobj.catId.oid); appendPQExpBuffer(q,
} "a.attidentity,\n");
else if (fout->remoteVersion >= 100000) else
{ appendPQExpBuffer(q,
/* "'' AS attidentity,\n");
* attidentity is new in version 10.
*/ if (fout->remoteVersion >= 90200)
appendPQExpBuffer(q, "SELECT a.attnum, a.attname, a.atttypmod, " appendPQExpBuffer(q,
"a.attstattarget, a.attstorage, t.typstorage, "
"a.attnotnull, a.atthasdef, a.attisdropped, "
"a.attlen, a.attalign, a.attislocal, "
"pg_catalog.format_type(t.oid,a.atttypmod) AS atttypname, "
"array_to_string(a.attoptions, ', ') AS attoptions, "
"CASE WHEN a.attcollation <> t.typcollation "
"THEN a.attcollation ELSE 0 END AS attcollation, "
"a.attidentity, "
"pg_catalog.array_to_string(ARRAY("
"SELECT pg_catalog.quote_ident(option_name) || "
"' ' || pg_catalog.quote_literal(option_value) "
"FROM pg_catalog.pg_options_to_table(attfdwoptions) "
"ORDER BY option_name"
"), E',\n ') AS attfdwoptions ,"
"NULL as attmissingval "
"FROM pg_catalog.pg_attribute a LEFT JOIN pg_catalog.pg_type t "
"ON a.atttypid = t.oid "
"WHERE a.attrelid = '%u'::pg_catalog.oid "
"AND a.attnum > 0::pg_catalog.int2 "
"ORDER BY a.attnum",
tbinfo->dobj.catId.oid);
}
else if (fout->remoteVersion >= 90200)
{
/*
* attfdwoptions is new in 9.2.
*/
appendPQExpBuffer(q, "SELECT a.attnum, a.attname, a.atttypmod, "
"a.attstattarget, a.attstorage, t.typstorage, "
"a.attnotnull, a.atthasdef, a.attisdropped, "
"a.attlen, a.attalign, a.attislocal, "
"pg_catalog.format_type(t.oid,a.atttypmod) AS atttypname, "
"array_to_string(a.attoptions, ', ') AS attoptions, "
"CASE WHEN a.attcollation <> t.typcollation "
"THEN a.attcollation ELSE 0 END AS attcollation, "
"pg_catalog.array_to_string(ARRAY(" "pg_catalog.array_to_string(ARRAY("
"SELECT pg_catalog.quote_ident(option_name) || " "SELECT pg_catalog.quote_ident(option_name) || "
"' ' || pg_catalog.quote_literal(option_value) " "' ' || pg_catalog.quote_literal(option_value) "
"FROM pg_catalog.pg_options_to_table(attfdwoptions) " "FROM pg_catalog.pg_options_to_table(attfdwoptions) "
"ORDER BY option_name" "ORDER BY option_name"
"), E',\n ') AS attfdwoptions, " "), E',\n ') AS attfdwoptions,\n");
"NULL as attmissingval " else
"FROM pg_catalog.pg_attribute a LEFT JOIN pg_catalog.pg_type t " appendPQExpBuffer(q,
"ON a.atttypid = t.oid " "'' AS attfdwoptions,\n");
"WHERE a.attrelid = '%u'::pg_catalog.oid "
"AND a.attnum > 0::pg_catalog.int2 " if (fout->remoteVersion >= 90100)
"ORDER BY a.attnum",
tbinfo->dobj.catId.oid);
}
else if (fout->remoteVersion >= 90100)
{
/* /*
* attcollation is new in 9.1. Since we only want to dump COLLATE * Since we only want to dump COLLATE clauses for attributes whose
* clauses for attributes whose collation is different from their * collation is different from their type's default, we use a CASE
* type's default, we use a CASE here to suppress uninteresting * here to suppress uninteresting attcollations cheaply.
* attcollations cheaply.
*/ */
appendPQExpBuffer(q, "SELECT a.attnum, a.attname, a.atttypmod, " appendPQExpBuffer(q,
"a.attstattarget, a.attstorage, t.typstorage, "
"a.attnotnull, a.atthasdef, a.attisdropped, "
"a.attlen, a.attalign, a.attislocal, "
"pg_catalog.format_type(t.oid,a.atttypmod) AS atttypname, "
"array_to_string(a.attoptions, ', ') AS attoptions, "
"CASE WHEN a.attcollation <> t.typcollation " "CASE WHEN a.attcollation <> t.typcollation "
"THEN a.attcollation ELSE 0 END AS attcollation, " "THEN a.attcollation ELSE 0 END AS attcollation,\n");
"NULL AS attfdwoptions, "
"NULL as attmissingval "
"FROM pg_catalog.pg_attribute a LEFT JOIN pg_catalog.pg_type t "
"ON a.atttypid = t.oid "
"WHERE a.attrelid = '%u'::pg_catalog.oid "
"AND a.attnum > 0::pg_catalog.int2 "
"ORDER BY a.attnum",
tbinfo->dobj.catId.oid);
}
else if (fout->remoteVersion >= 90000)
{
/* attoptions is new in 9.0 */
appendPQExpBuffer(q, "SELECT a.attnum, a.attname, a.atttypmod, "
"a.attstattarget, a.attstorage, t.typstorage, "
"a.attnotnull, a.atthasdef, a.attisdropped, "
"a.attlen, a.attalign, a.attislocal, "
"pg_catalog.format_type(t.oid,a.atttypmod) AS atttypname, "
"array_to_string(a.attoptions, ', ') AS attoptions, "
"0 AS attcollation, "
"NULL AS attfdwoptions, "
"NULL as attmissingval "
"FROM pg_catalog.pg_attribute a LEFT JOIN pg_catalog.pg_type t "
"ON a.atttypid = t.oid "
"WHERE a.attrelid = '%u'::pg_catalog.oid "
"AND a.attnum > 0::pg_catalog.int2 "
"ORDER BY a.attnum",
tbinfo->dobj.catId.oid);
}
else else
{ appendPQExpBuffer(q,
/* need left join here to not fail on dropped columns ... */ "0 AS attcollation,\n");
appendPQExpBuffer(q, "SELECT a.attnum, a.attname, a.atttypmod, "
"a.attstattarget, a.attstorage, t.typstorage, " if (fout->remoteVersion >= 90000)
"a.attnotnull, a.atthasdef, a.attisdropped, " appendPQExpBuffer(q,
"a.attlen, a.attalign, a.attislocal, " "array_to_string(a.attoptions, ', ') AS attoptions\n");
"pg_catalog.format_type(t.oid,a.atttypmod) AS atttypname, " else
"'' AS attoptions, 0 AS attcollation, " appendPQExpBuffer(q,
"NULL AS attfdwoptions, " "'' AS attoptions\n");
"NULL as attmissingval "
"FROM pg_catalog.pg_attribute a LEFT JOIN pg_catalog.pg_type t " appendPQExpBuffer(q,
"ON a.atttypid = t.oid " /* need left join here to not fail on dropped columns ... */
"WHERE a.attrelid = '%u'::pg_catalog.oid " "FROM pg_catalog.pg_attribute a LEFT JOIN pg_catalog.pg_type t "
"AND a.attnum > 0::pg_catalog.int2 " "ON a.atttypid = t.oid\n"
"ORDER BY a.attnum", "WHERE a.attrelid = '%u'::pg_catalog.oid "
tbinfo->dobj.catId.oid); "AND a.attnum > 0::pg_catalog.int2\n"
} "ORDER BY a.attnum",
tbinfo->dobj.catId.oid);
res = ExecuteSqlQuery(fout, q->data, PGRES_TUPLES_OK); res = ExecuteSqlQuery(fout, q->data, PGRES_TUPLES_OK);
...@@ -8363,7 +8290,7 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) ...@@ -8363,7 +8290,7 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
tbinfo->attstattarget[j] = atoi(PQgetvalue(res, j, i_attstattarget)); tbinfo->attstattarget[j] = atoi(PQgetvalue(res, j, i_attstattarget));
tbinfo->attstorage[j] = *(PQgetvalue(res, j, i_attstorage)); tbinfo->attstorage[j] = *(PQgetvalue(res, j, i_attstorage));
tbinfo->typstorage[j] = *(PQgetvalue(res, j, i_typstorage)); tbinfo->typstorage[j] = *(PQgetvalue(res, j, i_typstorage));
tbinfo->attidentity[j] = (i_attidentity >= 0 ? *(PQgetvalue(res, j, i_attidentity)) : '\0'); tbinfo->attidentity[j] = *(PQgetvalue(res, j, i_attidentity));
tbinfo->needs_override = tbinfo->needs_override || (tbinfo->attidentity[j] == ATTRIBUTE_IDENTITY_ALWAYS); tbinfo->needs_override = tbinfo->needs_override || (tbinfo->attidentity[j] == ATTRIBUTE_IDENTITY_ALWAYS);
tbinfo->attisdropped[j] = (PQgetvalue(res, j, i_attisdropped)[0] == 't'); tbinfo->attisdropped[j] = (PQgetvalue(res, j, i_attisdropped)[0] == 't');
tbinfo->attlen[j] = atoi(PQgetvalue(res, j, i_attlen)); tbinfo->attlen[j] = atoi(PQgetvalue(res, j, i_attlen));
...@@ -16023,7 +15950,7 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo) ...@@ -16023,7 +15950,7 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
/* /*
* Dump per-column attributes. * Dump per-column attributes.
*/ */
if (tbinfo->attoptions[j] && tbinfo->attoptions[j][0] != '\0') if (tbinfo->attoptions[j][0] != '\0')
{ {
appendPQExpBuffer(q, "ALTER TABLE ONLY %s ", appendPQExpBuffer(q, "ALTER TABLE ONLY %s ",
qualrelname); qualrelname);
...@@ -16037,7 +15964,6 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo) ...@@ -16037,7 +15964,6 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
* Dump per-column fdw options. * Dump per-column fdw options.
*/ */
if (tbinfo->relkind == RELKIND_FOREIGN_TABLE && if (tbinfo->relkind == RELKIND_FOREIGN_TABLE &&
tbinfo->attfdwoptions[j] &&
tbinfo->attfdwoptions[j][0] != '\0') tbinfo->attfdwoptions[j][0] != '\0')
{ {
appendPQExpBuffer(q, "ALTER FOREIGN TABLE %s ", appendPQExpBuffer(q, "ALTER FOREIGN TABLE %s ",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment