On 28/08/2018 23:43, Tom Lane wrote:
> I think I had this discussion already with somebody, but ... I do not
> like this style at all:
> 
>             tbinfo->attidentity[j] = (i_attidentity >= 0 ? *(PQgetvalue(res, 
> j, i_attidentity)) : '\0');

OK, updated patch attached.  If the updated style is acceptable, I'll
start running more extensive tests against the older branches.

-- 
Peter Eisentraut              http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From 1a51258aa317f8068c18f034906c3536d570b354 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pete...@gmx.net>
Date: Wed, 29 Aug 2018 16:45:32 +0200
Subject: [PATCH v2] 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.
---
 src/bin/pg_dump/pg_dump.c | 198 ++++++++++++--------------------------
 1 file changed, 62 insertions(+), 136 deletions(-)

diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index d833c41147..f0ea83e6a9 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -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 ",
-- 
2.18.0

Reply via email to