Skip to content

Commit bb39596

Browse files
committed
Fix flags preservation and move test to PDO core
Extract flags before resolving PDO_FETCH_USE_DEFAULT so caller-supplied flags (e.g. PDO_FETCH_GROUP) are preserved. Move test from pdo_sqlite to ext/pdo/tests/ for cross-driver coverage. Add test cases for query() with second argument and flags preservation.
1 parent ed0339f commit bb39596

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

ext/pdo/pdo_stmt.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1731,12 +1731,12 @@ bool pdo_stmt_setup_fetch_mode(pdo_stmt_t *stmt, zend_long mode, uint32_t mode_a
17311731

17321732
stmt->default_fetch_type = PDO_FETCH_BOTH;
17331733

1734+
flags = mode & PDO_FETCH_FLAGS;
1735+
17341736
if ((mode & ~PDO_FETCH_FLAGS) == PDO_FETCH_USE_DEFAULT) {
1735-
mode = stmt->dbh->default_fetch_type;
1737+
mode = stmt->dbh->default_fetch_type | flags;
17361738
}
17371739

1738-
flags = mode & PDO_FETCH_FLAGS;
1739-
17401740
if (!pdo_stmt_verify_mode(stmt, mode, mode_arg_num, false)) {
17411741
return false;
17421742
}
Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
--TEST--
22
GH-20214 (PDO::FETCH_DEFAULT unexpected behavior with PDOStatement::setFetchMode)
33
--EXTENSIONS--
4-
pdo_sqlite
4+
pdo
5+
--SKIPIF--
6+
<?php
7+
$dir = getenv('REDIR_TEST_DIR');
8+
if (false == $dir) die('skip no driver');
9+
require_once $dir . 'pdo_test.inc';
10+
PDOTest::skip();
11+
?>
512
--FILE--
613
<?php
7-
$db = new PDO("sqlite::memory:");
14+
if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.__DIR__ . '/../../pdo/tests/');
15+
require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
16+
$db = PDOTest::factory();
817
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
918

1019
// setFetchMode with FETCH_DEFAULT should use connection default (FETCH_OBJ)
@@ -29,10 +38,25 @@ $stmt = $db->query("SELECT 'v1' AS c1, 'v2' AS c2");
2938
$stmt->setFetchMode(PDO::FETCH_DEFAULT);
3039
$row = $stmt->fetch();
3140
var_dump($row instanceof stdClass);
41+
42+
// query() with FETCH_DEFAULT as second argument
43+
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_NUM);
44+
$stmt = $db->query("SELECT 'v1' AS c1, 'v2' AS c2", PDO::FETCH_DEFAULT);
45+
$row = $stmt->fetch();
46+
var_dump(is_array($row) && isset($row[0]));
47+
48+
// FETCH_DEFAULT with flags should preserve the flags
49+
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
50+
$stmt = $db->query("SELECT 'v1' AS c1, 'v2' AS c2");
51+
$stmt->setFetchMode(PDO::FETCH_DEFAULT | PDO::FETCH_GROUP);
52+
$rows = $stmt->fetchAll();
53+
var_dump(is_array($rows) && array_key_exists('v1', $rows));
3254
?>
3355
--EXPECT--
3456
bool(true)
3557
string(2) "v1"
3658
bool(true)
3759
bool(true)
3860
bool(true)
61+
bool(true)
62+
bool(true)

0 commit comments

Comments
 (0)