bug79375.phpt 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. --TEST--
  2. Bug #79375: mysqli_store_result does not report error from lock wait timeout
  3. --EXTENSIONS--
  4. pdo
  5. pdo_mysql
  6. --SKIPIF--
  7. <?php
  8. if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
  9. require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
  10. MySQLPDOTest::skip();
  11. ?>
  12. --FILE--
  13. <?php
  14. require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
  15. function createDB(): PDO {
  16. $db = MySQLPDOTest::factory();
  17. $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  18. $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  19. return $db;
  20. }
  21. $db = createDB();
  22. $db2 = createDB();
  23. $db->query('DROP TABLE IF EXISTS test');
  24. $db->query('CREATE TABLE test (first int) ENGINE = InnoDB');
  25. $db->query('INSERT INTO test VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9)');
  26. function testNormalQuery(PDO $db, string $name) {
  27. $db->exec("SET innodb_lock_wait_timeout = 1");
  28. $db->exec("START TRANSACTION");
  29. $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE";
  30. echo "Running query on $name\n";
  31. try {
  32. $stmt = $db->query($query);
  33. echo "Got {$stmt->rowCount()} for $name\n";
  34. } catch (PDOException $e) {
  35. echo $e->getMessage()."\n";
  36. }
  37. }
  38. function testPrepareExecute(PDO $db, string $name) {
  39. $db->exec("SET innodb_lock_wait_timeout = 1");
  40. $db->exec("START TRANSACTION");
  41. $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE";
  42. echo "Running query on $name\n";
  43. $stmt = $db->prepare($query);
  44. try {
  45. $stmt->execute();
  46. echo "Got {$stmt->rowCount()} for $name\n";
  47. } catch (PDOException $e) {
  48. echo $e->getMessage()."\n";
  49. }
  50. }
  51. function testUnbuffered(PDO $db, string $name) {
  52. $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
  53. $db->exec("SET innodb_lock_wait_timeout = 1");
  54. $db->exec("START TRANSACTION");
  55. $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE";
  56. echo "Running query on $name\n";
  57. $stmt = $db->prepare($query);
  58. $stmt->execute();
  59. try {
  60. $rows = $stmt->fetchAll();
  61. $count = count($rows);
  62. echo "Got $count for $name\n";
  63. } catch (PDOException $e) {
  64. echo $e->getMessage()."\n";
  65. }
  66. }
  67. testNormalQuery($db, 'first connection');
  68. testNormalQuery($db2, 'second connection');
  69. unset($db);
  70. unset($db2);
  71. echo "\n";
  72. $db = createDB();
  73. $db2 = createDB();
  74. testPrepareExecute($db, 'first connection');
  75. testPrepareExecute($db2, 'second connection');
  76. unset($db);
  77. unset($db2);
  78. echo "\n";
  79. $db = createDB();
  80. $db2 = createDB();
  81. testUnbuffered($db, 'first connection');
  82. testUnbuffered($db2, 'second connection');
  83. unset($db);
  84. unset($db2);
  85. echo "\n";
  86. ?>
  87. --CLEAN--
  88. <?php
  89. require __DIR__ . '/mysql_pdo_test.inc';
  90. MySQLPDOTest::dropTestTable();
  91. ?>
  92. --EXPECT--
  93. Running query on first connection
  94. Got 1 for first connection
  95. Running query on second connection
  96. SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction
  97. Running query on first connection
  98. Got 1 for first connection
  99. Running query on second connection
  100. SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction
  101. Running query on first connection
  102. Got 1 for first connection
  103. Running query on second connection
  104. SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction