]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.4'
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 8 Apr 2020 14:38:18 +0000 (16:38 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 8 Apr 2020 14:38:18 +0000 (16:38 +0200)
* PHP-7.4:
  Make mysqli_poll test more deterministic

1  2 
ext/mysqli/tests/mysqli_poll_mixing_insert_select.phpt

index 13dcb1209314d8c78dc4b558296a9fbe230d3f97,0bafb2cc9ba4389c364ae5d3fbfc1da2c7456176..a52c2355d5c4789b912eabac002df162f6338eea
@@@ -12,150 -12,152 +12,152 @@@ if (!$IS_MYSQLND
  ?>
  --FILE--
  <?php
 -      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);
 -                              }
 -                      }
 -              }
 -
 -      } 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--
  <?php