From 307c1f6bf0e8e3c97416b2a22ed54dd4546ea689 Mon Sep 17 00:00:00 2001 From: Daniel Persson Date: Sat, 26 Sep 2015 21:48:18 +0200 Subject: [PATCH] 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. --- ext/pdo/pdo_dbh.c | 3 + ext/pdo/tests/bug_64172.phpt | 84 +++++++++++++++++++ .../tests/pdo_mysql_stmt_errorinfo.phpt | 4 +- 3 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 ext/pdo/tests/bug_64172.phpt 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-- + +--FILE-- +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! -- 2.40.0