1--TEST-- 2Bug #79375: mysqli_store_result does not report error from lock wait timeout 3--EXTENSIONS-- 4mysqli 5--SKIPIF-- 6<?php 7if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); 8require_once 'skipifconnectfailure.inc'; 9?> 10--FILE-- 11<?php 12 13require_once 'connect.inc'; 14mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 15$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); 16$mysqli2 = new my_mysqli($host, $user, $passwd, $db, $port, $socket); 17 18$mysqli->query('DROP TABLE IF EXISTS test'); 19$mysqli->query('CREATE TABLE test (first int) ENGINE = InnoDB'); 20$mysqli->query('INSERT INTO test VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9)'); 21 22function testStmtStoreResult(mysqli $mysqli, string $name) { 23 $mysqli->query("SET innodb_lock_wait_timeout = 1"); 24 $mysqli->query("START TRANSACTION"); 25 $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE"; 26 echo "Running query on $name\n"; 27 $stmt = $mysqli->prepare($query); 28 $stmt->execute(); 29 try { 30 $stmt->store_result(); 31 echo "Got {$stmt->num_rows} for $name\n"; 32 } catch(mysqli_sql_exception $e) { 33 echo $e->getMessage()."\n"; 34 } 35} 36function testStmtGetResult(mysqli $mysqli, string $name) { 37 $mysqli->query("SET innodb_lock_wait_timeout = 1"); 38 $mysqli->query("START TRANSACTION"); 39 $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE"; 40 echo "Running query on $name\n"; 41 $stmt = $mysqli->prepare($query); 42 $stmt->execute(); 43 try { 44 $res = $stmt->get_result(); 45 echo "Got {$res->num_rows} for $name\n"; 46 } catch(mysqli_sql_exception $e) { 47 echo $e->getMessage()."\n"; 48 } 49} 50function testNormalQuery(mysqli $mysqli, string $name) { 51 $mysqli->query("SET innodb_lock_wait_timeout = 1"); 52 $mysqli->query("START TRANSACTION"); 53 $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE"; 54 echo "Running query on $name\n"; 55 try { 56 $res = $mysqli->query($query); 57 echo "Got {$res->num_rows} for $name\n"; 58 } catch(mysqli_sql_exception $e) { 59 echo $e->getMessage()."\n"; 60 } 61} 62function testStmtUseResult(mysqli $mysqli, string $name) { 63 $mysqli->query("SET innodb_lock_wait_timeout = 1"); 64 $mysqli->query("START TRANSACTION"); 65 $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE"; 66 echo "Running query on $name\n"; 67 $stmt = $mysqli->prepare($query); 68 $stmt->execute(); 69 try { 70 $stmt->fetch(); // should throw an error 71 $stmt->fetch(); 72 echo "Got {$stmt->num_rows} for $name\n"; 73 } catch (mysqli_sql_exception $e) { 74 echo $e->getMessage()."\n"; 75 } 76} 77function testResultFetchRow(mysqli $mysqli, string $name) { 78 $mysqli->query("SET innodb_lock_wait_timeout = 1"); 79 $mysqli->query("START TRANSACTION"); 80 $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE"; 81 echo "Running query on $name\n"; 82 $res = $mysqli->query($query, MYSQLI_USE_RESULT); 83 try { 84 $res->fetch_row(); 85 $res->fetch_row(); 86 echo "Got {$res->num_rows} for $name\n"; 87 } catch(mysqli_sql_exception $e) { 88 echo $e->getMessage()."\n"; 89 } 90} 91 92testStmtStoreResult($mysqli, 'first connection'); 93testStmtStoreResult($mysqli2, 'second connection'); 94 95$mysqli->close(); 96$mysqli2->close(); 97 98echo "\n"; 99// try it again for get_result 100$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); 101$mysqli2 = new my_mysqli($host, $user, $passwd, $db, $port, $socket); 102 103testStmtGetResult($mysqli, 'first connection'); 104testStmtGetResult($mysqli2, 'second connection'); 105 106$mysqli->close(); 107$mysqli2->close(); 108 109echo "\n"; 110// try it again with unprepared query 111$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); 112$mysqli2 = new my_mysqli($host, $user, $passwd, $db, $port, $socket); 113 114testNormalQuery($mysqli, 'first connection'); 115testNormalQuery($mysqli2, 'second connection'); 116 117$mysqli->close(); 118$mysqli2->close(); 119 120echo "\n"; 121// try it again with unprepared query 122$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); 123$mysqli2 = new my_mysqli($host, $user, $passwd, $db, $port, $socket); 124 125testStmtUseResult($mysqli, 'first connection'); 126testStmtUseResult($mysqli2, 'second connection'); 127 128$mysqli->close(); 129$mysqli2->close(); 130 131echo "\n"; 132// try it again using fetch_row on a result object 133$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); 134$mysqli2 = new my_mysqli($host, $user, $passwd, $db, $port, $socket); 135 136testResultFetchRow($mysqli, 'first connection'); 137testResultFetchRow($mysqli2, 'second connection'); 138 139$mysqli->close(); 140$mysqli2->close(); 141 142?> 143--CLEAN-- 144<?php 145 require_once 'clean_table.inc'; 146?> 147--EXPECTF-- 148Running query on first connection 149Got %d for first connection 150Running query on second connection 151Lock wait timeout exceeded; try restarting transaction 152 153Running query on first connection 154Got %d for first connection 155Running query on second connection 156Lock wait timeout exceeded; try restarting transaction 157 158Running query on first connection 159Got %d for first connection 160Running query on second connection 161Lock wait timeout exceeded; try restarting transaction 162 163Running query on first connection 164Got %d for first connection 165Running query on second connection 166Lock wait timeout exceeded; try restarting transaction 167 168Running query on first connection 169Got 1 for first connection 170Running query on second connection 171Lock wait timeout exceeded; try restarting transaction 172