Fix pg_dump/pg_restore's ExecuteSqlCommand() to behave suitably if PQexec
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 16 Aug 2008 02:25:23 +0000 (02:25 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 16 Aug 2008 02:25:23 +0000 (02:25 +0000)
returns NULL instead of a PGresult.  The former coding would fail, which
is OK, but it neglected to give you the PQerrorMessage that might tell
you why.  In the oldest branches, there was another problem: it'd sometimes
report PQerrorMessage from the wrong connection.

src/bin/pg_dump/pg_backup_db.c

index 1b4f484bc2b549fee56582ab4b05c3dc5bfa09c3..a3c1decb633d17f8b87c51642e7c6d02cb7c6934 100644 (file)
@@ -293,19 +293,23 @@ ExecuteSqlCommand(ArchiveHandle *AH, PQExpBuffer qry, char *desc)
        PGresult   *res;
        char            errStmt[DB_MAX_ERR_STMT];
 
-       /* fprintf(stderr, "Executing: '%s'\n\n", qry->data); */
+#ifdef NOT_USED
+        fprintf(stderr, "Executing: '%s'\n\n", qry->data);
+#endif
        res = PQexec(conn, qry->data);
-       if (!res)
-               die_horribly(AH, modulename, "%s: no result from server\n", desc);
 
-       if (PQresultStatus(res) != PGRES_COMMAND_OK && PQresultStatus(res) != PGRES_TUPLES_OK)
+       switch (PQresultStatus(res))
        {
-               if (PQresultStatus(res) == PGRES_COPY_IN)
-               {
+               case PGRES_COMMAND_OK:
+               case PGRES_TUPLES_OK:
+                       /* A-OK */
+                       break;
+               case PGRES_COPY_IN:
+                       /* Assume this is an expected result */
                        AH->pgCopyIn = true;
-               }
-               else
-               {
+                       break;
+               default:
+                       /* trouble */
                        strncpy(errStmt, qry->data, DB_MAX_ERR_STMT);
                        if (errStmt[DB_MAX_ERR_STMT - 1] != '\0')
                        {
@@ -315,9 +319,7 @@ ExecuteSqlCommand(ArchiveHandle *AH, PQExpBuffer qry, char *desc)
                                errStmt[DB_MAX_ERR_STMT - 1] = '\0';
                        }
                        warn_or_die_horribly(AH, modulename, "%s: %s    Command was: %s\n",
-                                                                desc, PQerrorMessage(AH->connection),
-                                                                errStmt);
-               }
+                                                                desc, PQerrorMessage(conn), errStmt);
        }
 
        PQclear(res);