bug80458.phpt 4.2 KB

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