--TEST-- Bug #79375: mysqli_store_result does not report error from lock wait timeout --SKIPIF-- --FILE-- query('DROP TABLE IF EXISTS test'); $mysqli->query('CREATE TABLE test (first int) ENGINE = InnoDB'); $mysqli->query('INSERT INTO test VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9)'); function testStmtStoreResult(mysqli $mysqli, string $name) { $mysqli->query("SET innodb_lock_wait_timeout = 1"); $mysqli->query("START TRANSACTION"); $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE"; echo "Running query on $name\n"; $stmt = $mysqli->prepare($query); $stmt->execute(); try { $stmt->store_result(); echo "Got {$stmt->num_rows} for $name\n"; } catch(mysqli_sql_exception $e) { echo $e->getMessage()."\n"; } } function testStmtGetResult(mysqli $mysqli, string $name) { $mysqli->query("SET innodb_lock_wait_timeout = 1"); $mysqli->query("START TRANSACTION"); $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE"; echo "Running query on $name\n"; $stmt = $mysqli->prepare($query); $stmt->execute(); try { $res = $stmt->get_result(); echo "Got {$res->num_rows} for $name\n"; } catch(mysqli_sql_exception $e) { echo $e->getMessage()."\n"; } } function testNormalQuery(mysqli $mysqli, string $name) { $mysqli->query("SET innodb_lock_wait_timeout = 1"); $mysqli->query("START TRANSACTION"); $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE"; echo "Running query on $name\n"; try { $res = $mysqli->query($query); echo "Got {$res->num_rows} for $name\n"; } catch(mysqli_sql_exception $e) { echo $e->getMessage()."\n"; } } function testStmtUseResult(mysqli $mysqli, string $name) { $mysqli->query("SET innodb_lock_wait_timeout = 1"); $mysqli->query("START TRANSACTION"); $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE"; echo "Running query on $name\n"; $stmt = $mysqli->prepare($query); $stmt->execute(); try { $stmt->fetch(); // should throw an error $stmt->fetch(); echo "Got {$stmt->num_rows} for $name\n"; } catch (mysqli_sql_exception $e) { echo $e->getMessage()."\n"; } } function testResultFetchRow(mysqli $mysqli, string $name) { $mysqli->query("SET innodb_lock_wait_timeout = 1"); $mysqli->query("START TRANSACTION"); $query = "SELECT first FROM test WHERE first = 1 FOR UPDATE"; echo "Running query on $name\n"; $res = $mysqli->query($query, MYSQLI_USE_RESULT); try { $res->fetch_row(); $res->fetch_row(); echo "Got {$res->num_rows} for $name\n"; } catch(mysqli_sql_exception $e) { echo $e->getMessage()."\n"; } } testStmtStoreResult($mysqli, 'first connection'); testStmtStoreResult($mysqli2, 'second connection'); $mysqli->close(); $mysqli2->close(); echo "\n"; // try it again for get_result $mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); $mysqli2 = new my_mysqli($host, $user, $passwd, $db, $port, $socket); testStmtGetResult($mysqli, 'first connection'); testStmtGetResult($mysqli2, 'second connection'); $mysqli->close(); $mysqli2->close(); echo "\n"; // try it again with unprepared query $mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); $mysqli2 = new my_mysqli($host, $user, $passwd, $db, $port, $socket); testNormalQuery($mysqli, 'first connection'); testNormalQuery($mysqli2, 'second connection'); $mysqli->close(); $mysqli2->close(); echo "\n"; // try it again with unprepared query $mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); $mysqli2 = new my_mysqli($host, $user, $passwd, $db, $port, $socket); testStmtUseResult($mysqli, 'first connection'); testStmtUseResult($mysqli2, 'second connection'); $mysqli->close(); $mysqli2->close(); echo "\n"; // try it again using fetch_row on a result object $mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); $mysqli2 = new my_mysqli($host, $user, $passwd, $db, $port, $socket); testResultFetchRow($mysqli, 'first connection'); testResultFetchRow($mysqli2, 'second connection'); $mysqli->close(); $mysqli2->close(); ?> --CLEAN-- --EXPECTF-- Running query on first connection Got %d for first connection Running query on second connection Lock wait timeout exceeded; try restarting transaction Running query on first connection Got %d for first connection Running query on second connection Lock wait timeout exceeded; try restarting transaction Running query on first connection Got %d for first connection Running query on second connection Lock wait timeout exceeded; try restarting transaction Running query on first connection Got %d for first connection Running query on second connection Lock wait timeout exceeded; try restarting transaction Running query on first connection Got 1 for first connection Running query on second connection Warning: mysqli_result::fetch_row(): Error while reading a row in %s on line %d Got 0 for second connection