Skip to content

Commit 9054a8f

Browse files
committed
ext/pdo: Add test for lazy fetch mode
1 parent 481bafe commit 9054a8f

File tree

4 files changed

+245
-1
lines changed

4 files changed

+245
-1
lines changed

ext/pdo/tests/pdo_027.phpt

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ $db->exec('create table test027 (id int, name varchar(10))');
1919
$db->exec("INSERT INTO test027 (id,name) VALUES(1,'test1')");
2020
$db->exec("INSERT INTO test027 (id,name) VALUES(2,'test2')");
2121

22-
foreach ($db->query("SELECT * FROM test027", PDO::FETCH_LAZY) as $v) {
22+
$alias = null;
23+
$r = $db->query("SELECT * FROM test027", PDO::FETCH_LAZY);
24+
var_dump($r);
25+
foreach ($r as $v) {
26+
var_dump($alias === $v);
27+
var_dump($v);
28+
$alias = $v;
2329
echo "lazy: " . $v->id.$v->name."\n";
2430
}
2531
echo "End\n";
@@ -31,6 +37,28 @@ $db = PDOTest::factory();
3137
PDOTest::dropTableIfExists($db, "test027");
3238
?>
3339
--EXPECT--
40+
object(PDOStatement)#2 (1) {
41+
["queryString"]=>
42+
string(21) "SELECT * FROM test027"
43+
}
44+
bool(false)
45+
object(PDORow)#4 (3) {
46+
["queryString"]=>
47+
string(21) "SELECT * FROM test027"
48+
["id"]=>
49+
string(1) "1"
50+
["name"]=>
51+
string(5) "test1"
52+
}
3453
lazy: 1test1
54+
bool(true)
55+
object(PDORow)#4 (3) {
56+
["queryString"]=>
57+
string(21) "SELECT * FROM test027"
58+
["id"]=>
59+
string(1) "2"
60+
["name"]=>
61+
string(5) "test2"
62+
}
3563
lazy: 2test2
3664
End
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
--TEST--
2+
PDO Common: PDO::FETCH_LAZY set via PDOStatement::setFetchMode()
3+
--DESCRIPTION--
4+
This test uses an EXPECT section because we want to know the object handlers
5+
--EXTENSIONS--
6+
pdo
7+
--SKIPIF--
8+
<?php
9+
$dir = getenv('REDIR_TEST_DIR');
10+
if (false == $dir) die('skip no driver');
11+
require_once $dir . 'pdo_test.inc';
12+
PDOTest::skip();
13+
?>
14+
--FILE--
15+
<?php
16+
if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.__DIR__ . '/../../pdo/tests/');
17+
require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
18+
$db = PDOTest::factory();
19+
20+
$db->exec('CREATE TABLE pdo_fetch_lazy_as_default_changed(id int NOT NULL PRIMARY KEY, val1 VARCHAR(10), val2 VARCHAR(10), grp VARCHAR(10))');
21+
// Firebird does not allow inserting multiple rows with INSERT INTO
22+
$db->exec("INSERT INTO pdo_fetch_lazy_as_default_changed VALUES (1, 'A', 'alpha', 'Group1')");
23+
$db->exec("INSERT INTO pdo_fetch_lazy_as_default_changed VALUES (2, 'B', 'beta', 'Group1')");
24+
$db->exec("INSERT INTO pdo_fetch_lazy_as_default_changed VALUES (3, 'C', 'gamma', 'Group2')");
25+
$db->exec("INSERT INTO pdo_fetch_lazy_as_default_changed VALUES (4, 'D', 'delta', 'Group2')");
26+
27+
function to_upper_with_log(string $str): string {
28+
echo __FUNCTION__, '(', var_export($str, true), ')', PHP_EOL;
29+
return strtoupper($str);
30+
}
31+
32+
$pdoQuery = $db->prepare('SELECT val2, val1 FROM pdo_fetch_lazy_as_default_changed');
33+
$pdoQuery->execute();
34+
$pdoQuery->setFetchMode(PDO::FETCH_LAZY);
35+
36+
class Test {
37+
public $val1;
38+
public $val2;
39+
}
40+
$o = new Test();
41+
42+
var_dump($pdoQuery->fetch());
43+
var_dump($pdoQuery->fetchObject(Test::class));
44+
var_dump($pdoQuery->fetch());
45+
$pdoQuery->setFetchMode(PDO::FETCH_INTO, $o);
46+
var_dump($pdoQuery->fetch());
47+
var_dump($o);
48+
49+
?>
50+
--CLEAN--
51+
<?php
52+
require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
53+
$db = PDOTest::factory();
54+
PDOTest::dropTableIfExists($db, "pdo_fetch_lazy_as_default_changed");
55+
?>
56+
--EXPECT--
57+
object(PDORow)#4 (3) {
58+
["queryString"]=>
59+
string(56) "SELECT val2, val1 FROM pdo_fetch_lazy_as_default_changed"
60+
["val2"]=>
61+
string(5) "alpha"
62+
["val1"]=>
63+
string(1) "A"
64+
}
65+
object(Test)#4 (2) {
66+
["val1"]=>
67+
string(1) "B"
68+
["val2"]=>
69+
string(4) "beta"
70+
}
71+
object(PDORow)#4 (3) {
72+
["queryString"]=>
73+
string(56) "SELECT val2, val1 FROM pdo_fetch_lazy_as_default_changed"
74+
["val2"]=>
75+
string(5) "gamma"
76+
["val1"]=>
77+
string(1) "C"
78+
}
79+
object(Test)#3 (2) {
80+
["val1"]=>
81+
string(1) "D"
82+
["val2"]=>
83+
string(5) "delta"
84+
}
85+
object(Test)#3 (2) {
86+
["val1"]=>
87+
string(1) "D"
88+
["val2"]=>
89+
string(5) "delta"
90+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
--TEST--
2+
PDO Common: PDO::FETCH_LAZY when FETCH_INTO set via PDOStatement::setFetchMode()
3+
--DESCRIPTION--
4+
This test uses an EXPECT section because we want to know the object handlers
5+
--EXTENSIONS--
6+
pdo
7+
--SKIPIF--
8+
<?php
9+
$dir = getenv('REDIR_TEST_DIR');
10+
if (false == $dir) die('skip no driver');
11+
require_once $dir . 'pdo_test.inc';
12+
PDOTest::skip();
13+
?>
14+
--FILE--
15+
<?php
16+
if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.__DIR__ . '/../../pdo/tests/');
17+
require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
18+
$db = PDOTest::factory();
19+
20+
$db->exec('CREATE TABLE pdo_fetch_lazy_as_default_changed(id int NOT NULL PRIMARY KEY, val1 VARCHAR(10), val2 VARCHAR(10), grp VARCHAR(10))');
21+
// Firebird does not allow inserting multiple rows with INSERT INTO
22+
$db->exec("INSERT INTO pdo_fetch_lazy_as_default_changed VALUES (1, 'A', 'alpha', 'Group1')");
23+
$db->exec("INSERT INTO pdo_fetch_lazy_as_default_changed VALUES (2, 'B', 'beta', 'Group1')");
24+
$db->exec("INSERT INTO pdo_fetch_lazy_as_default_changed VALUES (3, 'C', 'gamma', 'Group2')");
25+
$db->exec("INSERT INTO pdo_fetch_lazy_as_default_changed VALUES (4, 'D', 'delta', 'Group2')");
26+
27+
function to_upper_with_log(string $str): string {
28+
echo __FUNCTION__, '(', var_export($str, true), ')', PHP_EOL;
29+
return strtoupper($str);
30+
}
31+
32+
$pdoQuery = $db->prepare('SELECT val2, val1 FROM pdo_fetch_lazy_as_default_changed');
33+
$pdoQuery->execute();
34+
35+
class Test {
36+
public $val1;
37+
public $val2;
38+
}
39+
$o = new Test();
40+
41+
$pdoQuery->setFetchMode(PDO::FETCH_INTO, $o);
42+
43+
var_dump($pdoQuery->fetch());
44+
var_dump($pdoQuery->fetch(PDO::FETCH_LAZY));
45+
var_dump($pdoQuery->fetch());
46+
47+
$another_obj = new stdClass();
48+
var_dump($another_obj);
49+
50+
var_dump($pdoQuery->fetch(PDO::FETCH_LAZY));
51+
52+
?>
53+
--CLEAN--
54+
<?php
55+
require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
56+
$db = PDOTest::factory();
57+
PDOTest::dropTableIfExists($db, "pdo_fetch_lazy_as_default_changed");
58+
?>
59+
--EXPECT--
60+
object(Test)#3 (2) {
61+
["val1"]=>
62+
string(1) "A"
63+
["val2"]=>
64+
string(5) "alpha"
65+
}
66+
object(PDORow)#4 (3) {
67+
["queryString"]=>
68+
string(56) "SELECT val2, val1 FROM pdo_fetch_lazy_as_default_changed"
69+
["val2"]=>
70+
string(4) "beta"
71+
["val1"]=>
72+
string(1) "B"
73+
}
74+
object(Test)#3 (2) {
75+
["val1"]=>
76+
string(1) "C"
77+
["val2"]=>
78+
string(5) "gamma"
79+
}
80+
object(stdClass)#4 (0) {
81+
}
82+
object(PDORow)#5 (3) {
83+
["queryString"]=>
84+
string(56) "SELECT val2, val1 FROM pdo_fetch_lazy_as_default_changed"
85+
["val2"]=>
86+
string(5) "delta"
87+
["val1"]=>
88+
string(1) "D"
89+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
--TEST--
2+
PDO Common: PDO::query() with PDO::FETCH_LAZY unused result
3+
--EXTENSIONS--
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+
?>
12+
--FILE--
13+
<?php
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();
17+
18+
$db->exec('create table pdo_query_fetch_lazy_001 (id int, name varchar(10))');
19+
$db->exec("INSERT INTO pdo_query_fetch_lazy_001 (id,name) VALUES(1,'test1')");
20+
$db->exec("INSERT INTO pdo_query_fetch_lazy_001 (id,name) VALUES(2,'test2')");
21+
22+
$r = $db->query("SELECT * FROM pdo_query_fetch_lazy_001", PDO::FETCH_LAZY);
23+
var_dump($r);
24+
echo "End\n";
25+
?>
26+
--CLEAN--
27+
<?php
28+
require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
29+
$db = PDOTest::factory();
30+
PDOTest::dropTableIfExists($db, "pdo_query_fetch_lazy_001");
31+
?>
32+
--EXPECT--
33+
object(PDOStatement)#2 (1) {
34+
["queryString"]=>
35+
string(38) "SELECT * FROM pdo_query_fetch_lazy_001"
36+
}
37+
End

0 commit comments

Comments
 (0)