Fix bug in checking of IDENTIFY_SYSTEM result.
authorFujii Masao <fujii@postgresql.org>
Tue, 19 Aug 2014 08:26:07 +0000 (17:26 +0900)
committerFujii Masao <fujii@postgresql.org>
Tue, 19 Aug 2014 08:26:07 +0000 (17:26 +0900)
5a991ef8692ed0d170b44958a81a6bd70e90585 added new column into
the result of IDENTIFY_SYSTEM command. But it was not reflected into
several codes checking that result. Specifically though the number of
columns in the result was increased to 4, it was still compared with 3
in some replication codes.

Back-patch to 9.4 where the number of columns in IDENTIFY_SYSTEM
result was increased.

Report from Michael Paquier

src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
src/bin/pg_basebackup/pg_basebackup.c
src/bin/pg_basebackup/pg_receivexlog.c
src/bin/pg_basebackup/receivelog.c

index 65e95c59f02f9b88cfc07b43eb88bc607e12a7d8..7049f12296bf9f2659a296fdaa406bb42c52d6ec 100644 (file)
@@ -131,7 +131,7 @@ libpqrcv_identify_system(TimeLineID *primary_tli)
                                                "the primary server: %s",
                                                PQerrorMessage(streamConn))));
        }
-       if (PQnfields(res) < 3 || PQntuples(res) != 1)
+       if (PQnfields(res) < 4 || PQntuples(res) != 1)
        {
                int                     ntuples = PQntuples(res);
                int                     nfields = PQnfields(res);
@@ -140,7 +140,7 @@ libpqrcv_identify_system(TimeLineID *primary_tli)
                ereport(ERROR,
                                (errmsg("invalid response from primary server"),
                                 errdetail("Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields.",
-                                                  ntuples, nfields, 3, 1)));
+                                                  ntuples, nfields, 4, 1)));
        }
        primary_sysid = PQgetvalue(res, 0, 0);
        *primary_tli = pg_atoi(PQgetvalue(res, 0, 1), 4, 0);
index 3d26e22b8fc982278d3b7597ad9c5b8130f05527..3fee38a17d661bf2158a7b906d97c5d4f8136337 100644 (file)
@@ -1644,11 +1644,11 @@ BaseBackup(void)
                                progname, "IDENTIFY_SYSTEM", PQerrorMessage(conn));
                disconnect_and_exit(1);
        }
-       if (PQntuples(res) != 1 || PQnfields(res) < 3)
+       if (PQntuples(res) != 1 || PQnfields(res) < 4)
        {
                fprintf(stderr,
                                _("%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"),
-                               progname, PQntuples(res), PQnfields(res), 1, 3);
+                               progname, PQntuples(res), PQnfields(res), 1, 4);
                disconnect_and_exit(1);
        }
        sysidentifier = pg_strdup(PQgetvalue(res, 0, 0));
index a8b9ad3c05fe71935da0c3f1cd4c45c3dafbfeed..525522adc7333d7b83cc82dd70367d3a57b859e3 100644 (file)
@@ -290,11 +290,11 @@ StreamLog(void)
                                progname, "IDENTIFY_SYSTEM", PQerrorMessage(conn));
                disconnect_and_exit(1);
        }
-       if (PQntuples(res) != 1 || PQnfields(res) < 3)
+       if (PQntuples(res) != 1 || PQnfields(res) < 4)
        {
                fprintf(stderr,
                                _("%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"),
-                               progname, PQntuples(res), PQnfields(res), 1, 3);
+                               progname, PQntuples(res), PQnfields(res), 1, 4);
                disconnect_and_exit(1);
        }
        servertli = atoi(PQgetvalue(res, 0, 1));
index 89b22f20e2a3b373adeb24b26f32a60876125bc4..7cdb3b1214c485f3bb64b65eb0093270cfd2449b 100644 (file)
@@ -499,11 +499,11 @@ ReceiveXlogStream(PGconn *conn, XLogRecPtr startpos, uint32 timeline,
                        PQclear(res);
                        return false;
                }
-               if (PQntuples(res) != 1 || PQnfields(res) < 3)
+               if (PQntuples(res) != 1 || PQnfields(res) < 4)
                {
                        fprintf(stderr,
                                        _("%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"),
-                                       progname, PQntuples(res), PQnfields(res), 1, 3);
+                                       progname, PQntuples(res), PQnfields(res), 1, 4);
                        PQclear(res);
                        return false;
                }