]> granicus.if.org Git - php/commitdiff
PDO MySQL: Handle error during closeCursor()
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 9 Dec 2020 13:04:30 +0000 (14:04 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 9 Dec 2020 13:04:30 +0000 (14:04 +0100)
ext/pdo_mysql/mysql_statement.c
ext/pdo_mysql/tests/pdo_mysql_closecursor_error.phpt [new file with mode: 0644]

index e82cc6ddcc0443235dd12d762ee5a239f62d5c84..7d0988b384395bea81abf5032fe6c64e2d1fe0ec 100644 (file)
@@ -899,7 +899,8 @@ static int pdo_mysql_stmt_cursor_closer(pdo_stmt_t *stmt) /* {{{ */
        while (mysql_more_results(S->H->server)) {
                MYSQL_RES *res;
                if (mysql_next_result(S->H->server) != 0) {
-                       break;
+                       pdo_mysql_error_stmt(stmt);
+                       PDO_DBG_RETURN(0);
                }
                res = mysql_store_result(S->H->server);
                if (res) {
diff --git a/ext/pdo_mysql/tests/pdo_mysql_closecursor_error.phpt b/ext/pdo_mysql/tests/pdo_mysql_closecursor_error.phpt
new file mode 100644 (file)
index 0000000..1f9421f
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+Error during closeCursor() of multi query
+--SKIPIF--
+<?php
+require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc');
+require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+MySQLPDOTest::skip();
+?>
+--FILE--
+<?php
+require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+$db = MySQLPDOTest::factory();
+
+$stmt = $db->query('SELECT 1; SELECT x FROM does_not_exist');
+var_dump($stmt->fetchAll());
+var_dump($stmt->closeCursor());
+?>
+--EXPECTF--
+array(1) {
+  [0]=>
+  array(2) {
+    [1]=>
+    string(1) "1"
+    [0]=>
+    string(1) "1"
+  }
+}
+
+Warning: PDOStatement::closeCursor(): SQLSTATE[42S02]: Base table or view not found: 1146 Table '%s.does_not_exist' doesn't exist in %s on line %d
+bool(false)