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