1
0
mirror of https://github.com/php/php-src.git synced 2026-04-27 18:23:26 +02:00

Merge branch 'PHP-7.4'

* PHP-7.4:
  Fix #79106: PDO may fetch wrong column indexes with PDO::FETCH_BOTH
This commit is contained in:
Christoph M. Becker
2020-01-13 18:49:38 +01:00
5 changed files with 85 additions and 30 deletions
+2 -3
View File
@@ -961,10 +961,9 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value, enum pdo_
case PDO_FETCH_USE_DEFAULT:
case PDO_FETCH_BOTH:
zend_symtable_update(Z_ARRVAL_P(return_value), stmt->columns[i].name, &val);
if (Z_REFCOUNTED(val)) {
Z_ADDREF(val);
if (zend_hash_index_add(Z_ARRVAL_P(return_value), i, &val) != NULL) {
Z_TRY_ADDREF(val);
}
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &val);
break;
case PDO_FETCH_NAMED:
+44
View File
@@ -0,0 +1,44 @@
--TEST--
Bug #79106 (PDO may fetch wrong column indexes with PDO::FETCH_BOTH)
--SKIPIF--
<?php
if (!extension_loaded('pdo')) die('skip pdo extension not available');
$dir = getenv('REDIR_TEST_DIR');
if (!$dir) die('skip no driver');
require_once $dir . 'pdo_test.inc';
try {
$db = PDOTest::factory();
} catch (PDOException $e) {
die('skip ' . $e->getMessage());
}
if ($db->query('SELECT 1 as "1"') === false) {
die('skip driver does not support quoted numeric identifiers');
}
?>
--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();
$stmt = $db->query('SELECT 0 as "2007", 0 as "2008", 0 as "2020"');
var_dump($stmt->fetchAll());
?>
--EXPECT--
array(1) {
[0]=>
array(6) {
[2007]=>
string(1) "0"
[0]=>
string(1) "0"
[2008]=>
string(1) "0"
[1]=>
string(1) "0"
[2020]=>
string(1) "0"
[2]=>
string(1) "0"
}
}
+38
View File
@@ -0,0 +1,38 @@
--TEST--
Bug #79106 (PDO may fetch wrong column indexes with PDO::FETCH_BOTH) - collision
--SKIPIF--
<?php
if (!extension_loaded('pdo')) die('skip pdo extension not available');
$dir = getenv('REDIR_TEST_DIR');
if (!$dir) die('skip no driver');
require_once $dir . 'pdo_test.inc';
try {
$db = PDOTest::factory();
} catch (PDOException $e) {
die('skip ' . $e->getMessage());
}
if ($db->query('SELECT 1 as "1"') === false) {
die('skip driver does not support quoted numeric identifiers');
}
?>
--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();
$stmt = $db->query('SELECT 11111 as "1", 22222 as "2"');
var_dump($stmt->fetchAll());
?>
--EXPECT--
array(1) {
[0]=>
array(3) {
[1]=>
string(5) "11111"
[0]=>
string(5) "11111"
[2]=>
string(5) "22222"
}
}
+1 -1
View File
@@ -47,7 +47,7 @@ print "done!";
array(2) {
[1]=>
int(1)
[2]=>
[0]=>
int(1)
}
done!
@@ -59,30 +59,4 @@ $db = MySQLPDOTest::factory();
print "done!";
?>
--EXPECT--
[002] Suspicious FETCH_BOTH result, dumping
array(2) {
[0]=>
string(1) "1"
[1]=>
string(1) "1"
}
array(2) {
[1]=>
string(1) "1"
[2]=>
string(1) "1"
}
[002] Expected differes from returned data, dumping
array(2) {
[0]=>
string(1) "1"
[1]=>
string(1) "1"
}
array(2) {
[1]=>
string(1) "1"
[2]=>
string(1) "1"
}
done!