summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Persson <daniel.persson@textalk.se>2015-09-26 21:48:18 +0200
committerStanislav Malyshev <stas@php.net>2015-10-18 17:03:39 -0700
commit307c1f6bf0e8e3c97416b2a22ed54dd4546ea689 (patch)
tree0b7dc19da5fc4ae12d6375dba9a01c58f91be550
parentc7c6df6cec04b3b46160fd726c2af698bbdf4dc9 (diff)
downloadphp-git-307c1f6bf0e8e3c97416b2a22ed54dd4546ea689.tar.gz
Fix bug #64172
Check if the SQLSTATE error code is equal to PDO_ERR_NONE before we ask the driver. And if no error is reported skip the extra call to the driver.
-rw-r--r--ext/pdo/pdo_dbh.c3
-rw-r--r--ext/pdo/tests/bug_64172.phpt84
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt4
3 files changed, 89 insertions, 2 deletions
diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c
index 1607792def..ddf3b78ae0 100644
--- a/ext/pdo/pdo_dbh.c
+++ b/ext/pdo/pdo_dbh.c
@@ -1016,14 +1016,17 @@ static PHP_METHOD(PDO, errorInfo)
if (dbh->query_stmt) {
add_next_index_string(return_value, dbh->query_stmt->error_code);
+ if(!strncmp(dbh->query_stmt->error_code, PDO_ERR_NONE, sizeof(PDO_ERR_NONE))) goto fill_array;
} else {
add_next_index_string(return_value, dbh->error_code);
+ if(!strncmp(dbh->error_code, PDO_ERR_NONE, sizeof(PDO_ERR_NONE))) goto fill_array;
}
if (dbh->methods->fetch_err) {
dbh->methods->fetch_err(dbh, dbh->query_stmt, return_value);
}
+fill_array:
/**
* In order to be consistent, we have to make sure we add the good amount
* of nulls depending on the current number of elements. We make a simple
diff --git a/ext/pdo/tests/bug_64172.phpt b/ext/pdo/tests/bug_64172.phpt
new file mode 100644
index 0000000000..e8949fe597
--- /dev/null
+++ b/ext/pdo/tests/bug_64172.phpt
@@ -0,0 +1,84 @@
+--TEST--
+PDO Common: Bug #64172 errorInfo is not properly cleaned up
+--SKIPIF--
+<?php # vim:ft=php
+if (!extension_loaded('pdo')) die('skip');
+$dir = getenv('REDIR_TEST_DIR');
+if (false == $dir) die('skip no driver');
+require_once $dir . 'pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.dirname(__FILE__) . '/../../pdo/tests/');
+require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
+
+$db = PDOTest::factory();
+
+@$db->exec("DROP TABLE test");
+$db->exec("CREATE TABLE test (x int)");
+$db->exec("INSERT INTO test VALUES (1)");
+
+echo "===FAIL===\n";
+$db->query('SELECT * FROM bad_table');
+echo "\n";
+echo "===TEST===\n";
+var_dump(is_string($db->errorInfo()[0])) . "\n";
+var_dump(is_int($db->errorInfo()[1])) . "\n";
+var_dump(is_string($db->errorInfo()[2])) . "\n";
+echo "===GOOD===\n";
+$stmt = $db->query('SELECT * FROM test');
+$stmt->fetchAll();
+$stmt = null;
+var_dump($db->errorInfo());
+
+echo "===FAIL===\n";
+$db->exec("INSERT INTO bad_table VALUES(1)");
+echo "\n";
+echo "===TEST===\n";
+var_dump(is_string($db->errorInfo()[0])) . "\n";
+var_dump(is_int($db->errorInfo()[1])) . "\n";
+var_dump(is_string($db->errorInfo()[2])) . "\n";
+echo "===GOOD===\n";
+$db->exec("INSERT INTO test VALUES (2)");
+var_dump($db->errorInfo());
+
+$db->exec("DROP TABLE test");
+?>
+===DONE===
+--EXPECTF--
+===FAIL===
+
+Warning: PDO::query(): SQLSTATE[%s]: %s
+%A
+===TEST===
+bool(true)
+bool(true)
+bool(true)
+===GOOD===
+array(3) {
+ [0]=>
+ string(5) "00000"
+ [1]=>
+ NULL
+ [2]=>
+ NULL
+}
+===FAIL===
+
+Warning: PDO::exec(): SQLSTATE[%s]: %s
+%A
+===TEST===
+bool(true)
+bool(true)
+bool(true)
+===GOOD===
+array(3) {
+ [0]=>
+ string(5) "00000"
+ [1]=>
+ NULL
+ [2]=>
+ NULL
+}
+===DONE=== \ No newline at end of file
diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt
index d5a348957f..9028f0b49f 100644
--- a/ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt
+++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_errorinfo.phpt
@@ -129,8 +129,8 @@ array(3) {
[0]=>
%unicode|string%(5) "00000"
[1]=>
- int(1146)
+ NULL
[2]=>
- %unicode|string%(%d) "Table '%s.ihopeitdoesnotexist' doesn't exist"
+ NULL
}
done!