xref: /php-src/ext/mysqli/tests/bug79375.phpt (revision 6fb1c7a7)
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