]> granicus.if.org Git - postgresql/commitdiff
Fix libpq so that it reports PGRES_EMPTY_QUERY not PGRES_COMMAND_OK when an
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 9 Jan 2009 18:50:03 +0000 (18:50 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 9 Jan 2009 18:50:03 +0000 (18:50 +0000)
empty query string is passed to PQexecParams and related functions.  Its
handling of the NoData response to Describe messages was subtly incorrect.
Per my report of yesterday.

Although I consider this a bug, it's a behavioral change that might affect
applications, so not back-patched.

In passing fix a second issue in the same code: it didn't react well to an
out-of-memory failure while trying to make the PGresult object.

src/interfaces/libpq/fe-protocol3.c

index 9cd9c6b203c757ce780c2812b7d105a7b131dd7c..7dba7c2f8159943411cccd3f2a95b7ba84b5871f 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/interfaces/libpq/fe-protocol3.c,v 1.37 2009/01/01 17:24:03 momjian Exp $
+ *       $PostgreSQL: pgsql/src/interfaces/libpq/fe-protocol3.c,v 1.38 2009/01/09 18:50:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -297,19 +297,24 @@ pqParseInput3(PGconn *conn)
                                        /*
                                         * NoData indicates that we will not be seeing a
                                         * RowDescription message because the statement or portal
-                                        * inquired about doesn't return rows. Set up a COMMAND_OK
-                                        * result, instead of TUPLES_OK.
-                                        */
-                                       if (conn->result == NULL)
-                                               conn->result = PQmakeEmptyPGresult(conn,
-                                                                                                                  PGRES_COMMAND_OK);
-
-                                       /*
-                                        * If we're doing a Describe, we're ready to pass the
-                                        * result back to the client.
+                                        * inquired about doesn't return rows.
+                                        *
+                                        * If we're doing a Describe, we have to pass something
+                                        * back to the client, so set up a COMMAND_OK result,
+                                        * instead of TUPLES_OK.  Otherwise we can just ignore
+                                        * this message.
                                         */
                                        if (conn->queryclass == PGQUERY_DESCRIBE)
+                                       {
+                                               if (conn->result == NULL)
+                                               {
+                                                       conn->result = PQmakeEmptyPGresult(conn,
+                                                                                                                       PGRES_COMMAND_OK);
+                                                       if (!conn->result)
+                                                               return;
+                                               }
                                                conn->asyncStatus = PGASYNC_READY;
+                                       }
                                        break;
                                case 't':               /* Parameter Description */
                                        if (getParamDescriptions(conn))