]> granicus.if.org Git - postgresql/commitdiff
pg_dump: Reorganize getTableAttrs()
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 29 Aug 2018 14:45:32 +0000 (16:45 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Thu, 30 Aug 2018 16:09:44 +0000 (18:09 +0200)
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: Tom Lane <tgl@sss.pgh.pa.us>
src/bin/pg_dump/pg_dump.c

index d833c41147a16cfb4b29db482efc6be0147e149b..f0ea83e6a97d2ac75baf59ba44774f900f5f06bf 100644 (file)
@@ -8162,150 +8162,77 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
 
                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)
-               {
-                       /* 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 ,"
+                       appendPQExpBuffer(q,
                                                          "CASE WHEN a.atthasmissing AND NOT a.attisdropped "
-                                                         "THEN a.attmissingval ELSE null END 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 >= 100000)
-               {
-                       /*
-                        * attidentity is new in version 10.
-                        */
-                       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 ,"
-                                                         "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, "
+                                                         "THEN a.attmissingval ELSE null END AS attmissingval,\n");
+               else
+                       appendPQExpBuffer(q,
+                                                         "NULL AS attmissingval,\n");
+
+               if (fout->remoteVersion >= 100000)
+                       appendPQExpBuffer(q,
+                                                         "a.attidentity,\n");
+               else
+                       appendPQExpBuffer(q,
+                                                         "'' AS attidentity,\n");
+
+               if (fout->remoteVersion >= 90200)
+                       appendPQExpBuffer(q,
                                                          "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 >= 90100)
-               {
+                                                         "), E',\n    ') AS attfdwoptions,\n");
+               else
+                       appendPQExpBuffer(q,
+                                                         "'' AS attfdwoptions,\n");
+
+               if (fout->remoteVersion >= 90100)
                        /*
-                        * attcollation is new in 9.1.  Since we only want to dump COLLATE
-                        * clauses for attributes whose collation is different from their
-                        * type's default, we use a CASE here to suppress uninteresting
-                        * attcollations cheaply.
+                        * Since we only want to dump COLLATE clauses for attributes whose
+                        * collation is different from their type's default, we use a CASE
+                        * here to suppress uninteresting attcollations cheaply.
                         */
-                       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, "
+                       appendPQExpBuffer(q,
                                                          "CASE WHEN a.attcollation <> t.typcollation "
-                                                         "THEN a.attcollation ELSE 0 END 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 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);
-               }
+                                                         "THEN a.attcollation ELSE 0 END AS attcollation,\n");
                else
-               {
-                       /* need left join here to not fail on dropped columns ... */
-                       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, "
-                                                         "'' 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);
-               }
+                       appendPQExpBuffer(q,
+                                                         "0 AS attcollation,\n");
+
+               if (fout->remoteVersion >= 90000)
+                       appendPQExpBuffer(q,
+                                                         "array_to_string(a.attoptions, ', ') AS attoptions\n");
+               else
+                       appendPQExpBuffer(q,
+                                                         "'' AS attoptions\n");
+
+               appendPQExpBuffer(q,
+                                                 /* need left join here to not fail on dropped columns ... */
+                                                 "FROM pg_catalog.pg_attribute a LEFT JOIN pg_catalog.pg_type t "
+                                                 "ON a.atttypid = t.oid\n"
+                                                 "WHERE a.attrelid = '%u'::pg_catalog.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);
 
@@ -8363,7 +8290,7 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
                        tbinfo->attstattarget[j] = atoi(PQgetvalue(res, j, i_attstattarget));
                        tbinfo->attstorage[j] = *(PQgetvalue(res, j, i_attstorage));
                        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->attisdropped[j] = (PQgetvalue(res, j, i_attisdropped)[0] == 't');
                        tbinfo->attlen[j] = atoi(PQgetvalue(res, j, i_attlen));
@@ -16023,7 +15950,7 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
                        /*
                         * 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 ",
                                                                  qualrelname);
@@ -16037,7 +15964,6 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
                         * Dump per-column fdw options.
                         */
                        if (tbinfo->relkind == RELKIND_FOREIGN_TABLE &&
-                               tbinfo->attfdwoptions[j] &&
                                tbinfo->attfdwoptions[j][0] != '\0')
                        {
                                appendPQExpBuffer(q, "ALTER FOREIGN TABLE %s ",