xref: /PHP-7.4/ext/pdo_mysql/tests/bug80458.phpt (revision a83cc03c)
1--TEST--
2Bug #80458 PDOStatement::fetchAll() throws for upsert queries
3--SKIPIF--
4<?php
5if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) die('skip not loaded');
6require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc');
7require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
8MySQLPDOTest::skip();
9?>
10--FILE--
11<?php
12require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
13
14$db = MySQLPDOTest::factory();
15$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
16$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
17
18$db->query('DROP TABLE IF EXISTS test');
19$db->query('CREATE TABLE test (first int) ENGINE = InnoDB');
20$res = $db->query('INSERT INTO test(first) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16)');
21var_dump($res->fetchAll());
22
23$stmt = $db->prepare('DELETE FROM test WHERE first=1');
24$stmt->execute();
25var_dump($stmt->fetchAll());
26
27$res = $db->query('DELETE FROM test WHERE first=2');
28var_dump($res->fetchAll());
29
30$stmt2 = $db->prepare('DELETE FROM test WHERE first=3');
31$stmt2->execute();
32foreach($stmt2 as $row){
33    // expect nothing
34}
35
36$stmt3 = $db->prepare('DELETE FROM test WHERE first=4');
37$stmt3->execute();
38var_dump($stmt3->fetch(PDO::FETCH_ASSOC));
39
40$stmt = $db->prepare('SELECT first FROM test WHERE first=5');
41$stmt->execute();
42var_dump($stmt->fetchAll());
43
44$db->exec('DROP PROCEDURE IF EXISTS nores');
45$db->exec('CREATE PROCEDURE nores() BEGIN DELETE FROM test WHERE first=6; END;');
46$stmt4 = $db->prepare('CALL nores()');
47$stmt4->execute();
48var_dump($stmt4->fetchAll());
49$db->exec('DROP PROCEDURE IF EXISTS nores');
50
51$db->exec('DROP PROCEDURE IF EXISTS ret');
52$db->exec('CREATE PROCEDURE ret() BEGIN SELECT first FROM test WHERE first=7; END;');
53$stmt5 = $db->prepare('CALL ret()');
54$stmt5->execute();
55var_dump($stmt5->fetchAll());
56$stmt5->nextRowset(); // needed to fetch the empty result set of CALL
57var_dump($stmt5->fetchAll());
58$db->exec('DROP PROCEDURE IF EXISTS ret');
59
60/* With emulated prepares */
61print("Emulated prepares\n");
62$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
63
64$stmt = $db->prepare('DELETE FROM test WHERE first=8');
65$stmt->execute();
66var_dump($stmt->fetchAll());
67
68$res = $db->query('DELETE FROM test WHERE first=9');
69var_dump($res->fetchAll());
70
71$stmt2 = $db->prepare('DELETE FROM test WHERE first=10');
72$stmt2->execute();
73foreach($stmt2 as $row){
74    // expect nothing
75}
76
77$stmt3 = $db->prepare('DELETE FROM test WHERE first=11');
78$stmt3->execute();
79var_dump($stmt3->fetch(PDO::FETCH_ASSOC));
80
81$stmt = $db->prepare('SELECT first FROM test WHERE first=12');
82$stmt->execute();
83var_dump($stmt->fetchAll());
84
85$db->exec('DROP PROCEDURE IF EXISTS nores');
86$db->exec('CREATE PROCEDURE nores() BEGIN DELETE FROM test WHERE first=13; END;');
87$stmt4 = $db->prepare('CALL nores()');
88$stmt4->execute();
89var_dump($stmt4->fetchAll());
90$db->exec('DROP PROCEDURE IF EXISTS nores');
91
92$db->exec('DROP PROCEDURE IF EXISTS ret');
93$db->exec('CREATE PROCEDURE ret() BEGIN SELECT first FROM test WHERE first=14; END;');
94$stmt5 = $db->prepare('CALL ret()');
95$stmt5->execute();
96var_dump($stmt5->fetchAll());
97$stmt5->nextRowset(); // needed to fetch the empty result set of CALL
98var_dump($stmt5->fetchAll());
99$db->exec('DROP PROCEDURE IF EXISTS ret');
100
101$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
102$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
103
104$stmt = $db->prepare('DELETE FROM test WHERE first=15');
105$stmt->execute();
106var_dump($stmt->fetchAll());
107
108$stmt = $db->prepare('SELECT first FROM test WHERE first=16');
109$stmt->execute();
110var_dump($stmt->fetchAll());
111
112?>
113--CLEAN--
114<?php
115require __DIR__ . '/mysql_pdo_test.inc';
116MySQLPDOTest::dropTestTable();
117?>
118--EXPECT--
119array(0) {
120}
121array(0) {
122}
123array(0) {
124}
125bool(false)
126array(1) {
127  [0]=>
128  array(2) {
129    ["first"]=>
130    int(5)
131    [0]=>
132    int(5)
133  }
134}
135array(0) {
136}
137array(1) {
138  [0]=>
139  array(2) {
140    ["first"]=>
141    int(7)
142    [0]=>
143    int(7)
144  }
145}
146array(0) {
147}
148Emulated prepares
149array(0) {
150}
151array(0) {
152}
153bool(false)
154array(1) {
155  [0]=>
156  array(2) {
157    ["first"]=>
158    string(2) "12"
159    [0]=>
160    string(2) "12"
161  }
162}
163array(0) {
164}
165array(1) {
166  [0]=>
167  array(2) {
168    ["first"]=>
169    string(2) "14"
170    [0]=>
171    string(2) "14"
172  }
173}
174array(0) {
175}
176array(0) {
177}
178array(1) {
179  [0]=>
180  array(2) {
181    ["first"]=>
182    int(16)
183    [0]=>
184    int(16)
185  }
186}
187