From: Nikita Popov Date: Wed, 8 Apr 2020 14:38:18 +0000 (+0200) Subject: Merge branch 'PHP-7.4' X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5293c6d6d4b3faa8eecf48429c1b8a351167fc94;p=php Merge branch 'PHP-7.4' * PHP-7.4: Make mysqli_poll test more deterministic --- 5293c6d6d4b3faa8eecf48429c1b8a351167fc94 diff --cc ext/mysqli/tests/mysqli_poll_mixing_insert_select.phpt index 13dcb12093,0bafb2cc9b..a52c2355d5 --- a/ext/mysqli/tests/mysqli_poll_mixing_insert_select.phpt +++ b/ext/mysqli/tests/mysqli_poll_mixing_insert_select.phpt @@@ -12,150 -12,152 +12,152 @@@ if (!$IS_MYSQLND ?> --FILE-- 3', - 'UPDATE_FIX test SET id = 101 WHERE id > 3', - 'DROP TABLE IF EXISTS bogus', - 'DELETE FROM test WHERE id = @a', - 'DELETE FROM test WHERE id = 1', - ); - - $link = get_connection(); - $have_proc = false; - mysqli_real_query($link, "DROP PROCEDURE IF EXISTS p"); - if (mysqli_real_query($link, 'CREATE PROCEDURE p(IN ver_in VARCHAR(25), OUT ver_out VARCHAR(25)) BEGIN SELECT ver_in INTO ver_out; END;')) { - $have_proc = true; - $queries[] = "CALL p('myversion', @version)"; - } - mysqli_close($link); - - $links = array(); - for ($i = 0; $i < count($queries); $i++) { - - $link = get_connection(); - - if (true !== ($tmp = mysqli_query($link, $queries[$i], MYSQLI_ASYNC | MYSQLI_USE_RESULT))) - printf("[002] Expecting true got %s/%s\n", gettype($tmp), var_export($tmp, true)); - - // WARNING KLUDGE NOTE - // Add a tiny delay to ensure that queries get executed in a certain order - // If your MySQL server is very slow the test may randomly fail! - usleep(20000); - - $links[mysqli_thread_id($link)] = array( - 'query' => $queries[$i], - 'link' => $link, - 'processed' => false, - ); - } - - $saved_errors = array(); - do { - $poll_links = $poll_errors = $poll_reject = array(); - foreach ($links as $thread_id => $link) { - if (!$link['processed']) { - $poll_links[] = $link['link']; - $poll_errors[] = $link['link']; - $poll_reject[] = $link['link']; - } - } - if (0 == count($poll_links)) - break; - - if (0 === ($num_ready = mysqli_poll($poll_links, $poll_errors, $poll_reject, 0, 200000))) - continue; - - if (!empty($poll_errors)) { - die(var_dump($poll_errors)); - } - - if (FALSE === $num_ready) { - die("Some mysqli indicated error"); - } - - foreach ($poll_links as $link) { - $thread_id = mysqli_thread_id($link); - $links[$thread_id]['processed'] = true; - - if (is_object($res = mysqli_reap_async_query($link))) { - // result set object - while ($row = mysqli_fetch_assoc($res)) { - // eat up all results - ; - } - mysqli_free_result($res); - } else { - // either there is no result (no SELECT) or there is an error - if (mysqli_errno($link) > 0) { - $saved_errors[$thread_id] = mysqli_errno($link); - } - } - } - - } while (true); - - // Checking if all lines are still usable - foreach ($links as $thread_id => $link) { - if (isset($saved_errors[$thread_id])) { + require_once('table.inc'); + + function get_connection() { + global $host, $user, $passwd, $db, $port, $socket; + + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) + printf("[001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + return $link; + } + + + // Note: some queries will fail! They are supposed to fail. + $queries = array( + 'CREATE TABLE IF NOT EXISTS bogus(id INT)', + 'SET @a = 1', + 'SELECT * FROM test ORDER BY id ASC LIMIT 2', + "INSERT INTO test(id, label) VALUES (100, 'z')", + 'SELECT * FROM test ORDER BY id ASC LIMIT 2', + 'SELECT', + 'UPDATE test SET id = 101 WHERE id > 3', + 'UPDATE_FIX test SET id = 101 WHERE id > 3', + 'DROP TABLE IF EXISTS bogus', + 'DELETE FROM test WHERE id = @a', + 'DELETE FROM test WHERE id = 1', + ); + + $link = get_connection(); + $have_proc = false; + mysqli_real_query($link, "DROP PROCEDURE IF EXISTS p"); + if (mysqli_real_query($link, 'CREATE PROCEDURE p(IN ver_in VARCHAR(25), OUT ver_out VARCHAR(25)) BEGIN SELECT ver_in INTO ver_out; END;')) { + $have_proc = true; + $queries[] = "CALL p('myversion', @version)"; + } + mysqli_close($link); + + $links = array(); + for ($i = 0; $i < count($queries); $i++) { + + $link = get_connection(); + + if (true !== ($tmp = mysqli_query($link, $queries[$i], MYSQLI_ASYNC | MYSQLI_USE_RESULT))) + printf("[002] Expecting true got %s/%s\n", gettype($tmp), var_export($tmp, true)); + + // WARNING KLUDGE NOTE + // Add a tiny delay to ensure that queries get executed in a certain order + // If your MySQL server is very slow the test may randomly fail! + usleep(20000); + + $links[mysqli_thread_id($link)] = array( + 'query' => $queries[$i], + 'link' => $link, + 'processed' => false, + ); + } + + $saved_errors = array(); + do { + $poll_links = $poll_errors = $poll_reject = array(); + foreach ($links as $thread_id => $link) { + if (!$link['processed']) { + $poll_links[] = $link['link']; + $poll_errors[] = $link['link']; + $poll_reject[] = $link['link']; + } + } + if (0 == count($poll_links)) + break; + + if (0 === ($num_ready = mysqli_poll($poll_links, $poll_errors, $poll_reject, 0, 200000))) + continue; + + if (!empty($poll_errors)) { + die(var_dump($poll_errors)); + } + + if (FALSE === $num_ready) { + die("Some mysqli indicated error"); + } + + foreach ($poll_links as $link) { + $thread_id = mysqli_thread_id($link); + $links[$thread_id]['processed'] = true; + + if (is_object($res = mysqli_reap_async_query($link))) { + // result set object + while ($row = mysqli_fetch_assoc($res)) { + // eat up all results + ; + } + mysqli_free_result($res); + } else { + // either there is no result (no SELECT) or there is an error + if (mysqli_errno($link) > 0) { + $saved_errors[$thread_id] = mysqli_errno($link); - printf("[003] '%s' caused %d\n", $links[$thread_id]['query'], mysqli_errno($link)); + } + } + } + + } while (true); + + // Checking if all lines are still usable + foreach ($links as $thread_id => $link) { - if (isset($saved_errors[$thread_id]) && - $saved_errors[$thread_id] != mysqli_errno($link['link'])) { - printf("[004] Error state not saved for query '%s', %d != %d\n", $link['query'], ++ if (isset($saved_errors[$thread_id])) { + printf("[003] '%s' caused %d\n", + $links[$thread_id]['query'], $saved_errors[$thread_id]); - if ($saved_errors[$thread_id] != mysqli_errno($link['link'])) { ++ if ($saved_errors[$thread_id] != mysqli_errno($link['link'])) { + printf("[004] Error state not saved for query '%s', %d != %d\n", $link['query'], - $saved_errors[$thread_id], mysqli_errno($link['link'])); + $saved_errors[$thread_id], mysqli_errno($link['link'])); + } - } + } - if (!$res = mysqli_query($link['link'], 'SELECT * FROM test WHERE id = 100')) - printf("[005] Expecting true got %s/%s\n", gettype($tmp), var_export($tmp, true)); - if (!$row = mysqli_fetch_row($res)) - printf("[006] Expecting true got %s/%s\n", gettype($tmp), var_export($tmp, true)); + if (!$res = mysqli_query($link['link'], 'SELECT * FROM test WHERE id = 100')) + printf("[005] Expecting true got %s/%s\n", gettype($tmp), var_export($tmp, true)); + if (!$row = mysqli_fetch_row($res)) + printf("[006] Expecting true got %s/%s\n", gettype($tmp), var_export($tmp, true)); - mysqli_free_result($res); - } + mysqli_free_result($res); + } - if ($res = mysqli_query($link['link'], "SELECT * FROM test WHERE id = 100")) { - $row = mysqli_fetch_assoc($res); - var_dump($row); - mysqli_free_result($res); - } + if ($res = mysqli_query($link['link'], "SELECT * FROM test WHERE id = 100")) { + $row = mysqli_fetch_assoc($res); + var_dump($row); + mysqli_free_result($res); + } - if ($have_proc && ($res = mysqli_query($link['link'], "SELECT @version as _version"))) { - $row = mysqli_fetch_assoc($res); - if ($row['_version'] != 'myversion') { - printf("[007] Check procedures\n"); - } - mysqli_free_result($res); - } + if ($have_proc && ($res = mysqli_query($link['link'], "SELECT @version as _version"))) { + $row = mysqli_fetch_assoc($res); + if ($row['_version'] != 'myversion') { + printf("[007] Check procedures\n"); + } + mysqli_free_result($res); + } - foreach ($links as $link) - mysqli_close($link['link']); + foreach ($links as $link) + mysqli_close($link['link']); - $link = get_connection(); - if (!mysqli_query($link, 'SELECT 1', MYSQLI_ASYNC)) - printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + $link = get_connection(); + if (!mysqli_query($link, 'SELECT 1', MYSQLI_ASYNC)) + printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - if (!mysqli_query($link, 'SELECT 1', MYSQLI_ASYNC)) - printf("[009] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + if (!mysqli_query($link, 'SELECT 1', MYSQLI_ASYNC)) + printf("[009] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - mysqli_close($link); + mysqli_close($link); - print "done!"; + print "done!"; ?> --CLEAN--