--TEST-- Bug #80458 PDOStatement::fetchAll() throws for upsert queries --EXTENSIONS-- pdo_mysql --SKIPIF-- --FILE-- setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true); $db->query('CREATE TABLE test_80458 (first INT) ENGINE = InnoDB'); $res = $db->query('INSERT INTO test_80458(first) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16)'); var_dump($res->fetchAll()); $stmt = $db->prepare('DELETE FROM test_80458 WHERE first=1'); $stmt->execute(); var_dump($stmt->fetchAll()); $res = $db->query('DELETE FROM test_80458 WHERE first=2'); var_dump($res->fetchAll()); $stmt2 = $db->prepare('DELETE FROM test_80458 WHERE first=3'); $stmt2->execute(); foreach($stmt2 as $row){ // expect nothing } $stmt3 = $db->prepare('DELETE FROM test_80458 WHERE first=4'); $stmt3->execute(); var_dump($stmt3->fetch(PDO::FETCH_ASSOC)); $stmt = $db->prepare('SELECT first FROM test_80458 WHERE first=5'); $stmt->execute(); var_dump($stmt->fetchAll()); $procedure_nores = 'nores_bug80458_pdo_mysql_p'; $db->exec("CREATE PROCEDURE {$procedure_nores}() BEGIN DELETE FROM test_80458 WHERE first=6; END;"); $stmt4 = $db->prepare("CALL {$procedure_nores}()"); $stmt4->execute(); var_dump($stmt4->fetchAll()); $db->exec("DROP PROCEDURE IF EXISTS {$procedure_nores}"); $procedure_ret = 'ret_bug80458_pdo_mysql_p'; $db->exec("CREATE PROCEDURE {$procedure_ret}() BEGIN SELECT first FROM test_80458 WHERE first=7; END;"); $stmt5 = $db->prepare("CALL {$procedure_ret}()"); $stmt5->execute(); var_dump($stmt5->fetchAll()); $stmt5->nextRowset(); // needed to fetch the empty result set of CALL var_dump($stmt5->fetchAll()); $db->exec("DROP PROCEDURE IF EXISTS {$procedure_ret}"); /* With emulated prepares */ print("Emulated prepares\n"); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); $stmt = $db->prepare('DELETE FROM test_80458 WHERE first=8'); $stmt->execute(); var_dump($stmt->fetchAll()); $res = $db->query('DELETE FROM test_80458 WHERE first=9'); var_dump($res->fetchAll()); $stmt2 = $db->prepare('DELETE FROM test_80458 WHERE first=10'); $stmt2->execute(); foreach($stmt2 as $row){ // expect nothing } $stmt3 = $db->prepare('DELETE FROM test_80458 WHERE first=11'); $stmt3->execute(); var_dump($stmt3->fetch(PDO::FETCH_ASSOC)); $stmt = $db->prepare('SELECT first FROM test_80458 WHERE first=12'); $stmt->execute(); var_dump($stmt->fetchAll()); $db->exec("CREATE PROCEDURE {$procedure_nores}() BEGIN DELETE FROM test_80458 WHERE first=13; END;"); $stmt4 = $db->prepare("CALL {$procedure_nores}()"); $stmt4->execute(); var_dump($stmt4->fetchAll()); $db->exec("CREATE PROCEDURE {$procedure_ret}() BEGIN SELECT first FROM test_80458 WHERE first=14; END;"); $stmt5 = $db->prepare("CALL {$procedure_ret}()"); $stmt5->execute(); var_dump($stmt5->fetchAll()); $stmt5->nextRowset(); // needed to fetch the empty result set of CALL var_dump($stmt5->fetchAll()); $db->exec("DROP PROCEDURE IF EXISTS {$procedure_ret}"); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); $stmt = $db->prepare('DELETE FROM test_80458 WHERE first=15'); $stmt->execute(); var_dump($stmt->fetchAll()); $stmt = $db->prepare('SELECT first FROM test_80458 WHERE first=16'); $stmt->execute(); var_dump($stmt->fetchAll()); ?> --CLEAN-- exec('DROP TABLE IF EXISTS test_80458'); $db->exec('DROP PROCEDURE IF EXISTS nores_bug80458_pdo_mysql_p'); $db->exec('DROP PROCEDURE IF EXISTS ret_bug80458_pdo_mysql_p'); ?> --EXPECT-- array(0) { } array(0) { } array(0) { } bool(false) array(1) { [0]=> array(2) { ["first"]=> string(1) "5" [0]=> string(1) "5" } } array(0) { } array(1) { [0]=> array(2) { ["first"]=> string(1) "7" [0]=> string(1) "7" } } array(0) { } Emulated prepares array(0) { } array(0) { } bool(false) array(1) { [0]=> array(2) { ["first"]=> string(2) "12" [0]=> string(2) "12" } } array(0) { } array(1) { [0]=> array(2) { ["first"]=> string(2) "14" [0]=> string(2) "14" } } array(0) { } array(0) { } array(1) { [0]=> array(2) { ["first"]=> string(2) "16" [0]=> string(2) "16" } }