]> granicus.if.org Git - php/commitdiff
Let's try not to have 'uft8'-only tests and avoid setting the charset upon connect...
authorUlf Wendel <uw@php.net>
Thu, 23 Sep 2010 15:08:43 +0000 (15:08 +0000)
committerUlf Wendel <uw@php.net>
Thu, 23 Sep 2010 15:08:43 +0000 (15:08 +0000)
ext/mysqli/tests/connect.inc
ext/mysqli/tests/mysqli_change_user_set_names.phpt
ext/mysqli/tests/mysqli_fetch_field.phpt
ext/mysqli/tests/mysqli_fetch_field_oo.phpt
ext/mysqli/tests/mysqli_fetch_fields.phpt
ext/mysqli/tests/mysqli_field_seek.phpt
ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt
ext/mysqli/tests/mysqli_stmt_get_result_metadata_fetch_field.phpt

index 02a71ec0b801c2de8f5390f5a59ede9218a9aebf..6c6c48b5fcdc5a823fad954568677bd29b2c06f6 100644 (file)
@@ -20,6 +20,7 @@
        if ($socket) {
                ini_set('mysqli.default_socket', $socket);
        }
+
        /* Development setting: test experimal features and/or feature requests that never worked before? */
        $TEST_EXPERIMENTAL = (in_array(getenv("MYSQL_TEST_EXPERIMENTAL"), array(0, 1))) ?
                                ((1 == getenv("MYSQL_TEST_EXPERIMENTAL")) ? true : false) :
 
                        if ($flags !== false) {
                                $link = mysqli_init();
-                               $link->options(MYSQLI_SET_CHARSET_NAME, "utf8");
                                if (!mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags))
                                        $link = false;
                        } else {
                                $link = mysqli_connect($host, $user, $passwd, $db, $port, $socket);
-                               $link->set_charset("utf8");
                        }
 
                        return $link;
                                }
                        }
                }
+
+               function my_get_charsets($link) {
+
+                       /* Those tree are set by SET NAMES */
+                       $charsets = array(
+                               'client'                => NULL,
+                               'results'               => NULL,
+                               'connection'    => NULL,
+                       );
+
+                       if (!($res = mysqli_query($link, "SHOW VARIABLES LIKE '%character%'"))) {
+                               printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+                               return $charsets;
+                       }
+
+                       $names = array();
+                       while ($row = mysqli_fetch_assoc($res)) {
+                               $names[$row['Variable_name']] = $row['Value'];
+                       }
+                       mysqli_free_result($res);
+
+                       if (!($res = mysqli_query($link, sprintf("SHOW CHARACTER SET LIKE '%s'", $names['character_set_client']))) ||
+                               !($details = mysqli_fetch_assoc($res))) {
+                               printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+                               return $charsets;
+                       }
+                       mysqli_free_result($res);
+
+                       $charsets['client'] = array(
+                               'charset'       => $details['Charset'],
+                               'desc'          => $details['Description'],
+                               'collation'     => $details['Default collation'],
+                               'maxlen'        => $details['Maxlen'],
+                               'nr'            => NULL,
+                       );
+
+                       if (!($res = mysqli_query($link, sprintf("SHOW COLLATION LIKE '%s'", $details['Default collation']))) ||
+                               !($collation = mysqli_fetch_assoc($res))) {
+                               printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+                               return $charsets;
+                       }
+                       mysqli_free_result($res);
+                       $charsets['client']['nr'] = $collation['Id'];
+
+                       if (!($res = mysqli_query($link, sprintf("SHOW CHARACTER SET LIKE '%s'", $names['character_set_results']))) ||
+                               !($details = mysqli_fetch_assoc($res))) {
+                               printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+                               return $charsets;
+                       }
+                       mysqli_free_result($res);
+
+                       $charsets['results'] = array(
+                               'charset'       => $details['Charset'],
+                               'desc'          => $details['Description'],
+                               'collation'     => $details['Default collation'],
+                               'maxlen'        => $details['Maxlen'],
+                               'nr'            => NULL,
+                       );
+
+                       if (!($res = mysqli_query($link, sprintf("SHOW COLLATION LIKE '%s'", $details['Default collation']))) ||
+                               !($collation = mysqli_fetch_assoc($res))) {
+                               printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+                               return $charsets;
+                       }
+                       mysqli_free_result($res);
+                       $charsets['results']['nr'] = $collation['Id'];
+
+
+                       if (!($res = mysqli_query($link, sprintf("SHOW CHARACTER SET LIKE '%s'", $names['character_set_connection']))) ||
+                               !($details = mysqli_fetch_assoc($res))) {
+                               printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+                               return $charsets;
+                       }
+                       mysqli_free_result($res);
+
+                       $charsets['connection'] = array(
+                               'charset'       => $details['Charset'],
+                               'desc'          => $details['Description'],
+                               'collation'     => $details['Default collation'],
+                               'maxlen'        => $details['Maxlen'],
+                               'nr'            => NULL,
+                       );
+
+                       if (!($res = mysqli_query($link, sprintf("SHOW COLLATION LIKE '%s'", $details['Default collation']))) ||
+                               !($collation = mysqli_fetch_assoc($res))) {
+                               printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+                               return $charsets;
+                       }
+                       mysqli_free_result($res);
+                       $charsets['connection']['nr'] = $collation['Id'];
+
+                       return $charsets;
+               }
+
        } else {
                printf("skip Eeeek/BUG/FIXME - connect.inc included twice! skipif bug?\n");
        }
index 362873c84247048a2835c74730f981cf58b5dd38..3579e3135815123288f34a1966eaaf4d0c75e7b3 100644 (file)
@@ -16,10 +16,10 @@ $tmp = mysqli_fetch_assoc($res);
 mysqli_free_result($res);
 $version = explode('.', $tmp['server_version']);
 if (empty($version))
-       die(sprintf("skip Cannot determine server version, need MySQL Server 4.1+ for the test!"));
+       die(sprintf("skip Cannot determine server version, we need MySQL Server 4.1+ for the test!"));
 
 if ($version[0] <= 4 && $version[1] < 1)
-       die(sprintf("ski Need MySQL Server 4.1+ for the test!"));
+       die(sprintf("skip We need MySQL Server 4.1+ for the test!"));
 ?>
 --FILE--
 <?php
index a99864ce2f96cdcba5af378ccf083c424b9101ca..4dde6c9aaf33632944f920a420bd3696447abc9d 100644 (file)
@@ -22,33 +22,51 @@ require_once('skipifconnectfailure.inc');
 
        require('table.inc');
 
+       $charsets = my_get_charsets($link);
        if (!$res = mysqli_query($link, "SELECT id AS ID, label FROM test AS TEST ORDER BY id LIMIT 1")) {
                printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
        }
 
-       while ($tmp = mysqli_fetch_field($res))
-               var_dump($tmp);
+       /* ID column, binary charset */
+       $tmp = mysqli_fetch_field($res);
        var_dump($tmp);
 
+       /* label column, result set charset */
+       $tmp = mysqli_fetch_field($res);
+       var_dump($tmp);
+       if ($tmp->charsetnr != $charsets['results']['nr']) {
+               printf("[004] Expecting charset %s/%d got %d\n",
+                       $charsets['results']['charset'],
+                       $charsets['results']['nr'], $tmp->charsetnr);
+       }
+       if ($tmp->length != (1 * $charsets['results']['maxlen'])) {
+               printf("[005] Expecting length %d got %d\n",
+                       $charsets['results']['maxlen'],
+                       $tmp->max_length);
+       }
+
+       var_dump(mysqli_fetch_field($res));
+
        mysqli_free_result($res);
 
        // Read http://bugs.php.net/bug.php?id=42344 on defaults!
        if (NULL !== ($tmp = mysqli_fetch_field($res)))
-               printf("[004] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
+               printf("[006] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
 
        if (!mysqli_query($link, "DROP TABLE IF EXISTS test"))
-               printf("[005] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+               printf("[007] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
 
        if (!mysqli_query($link, "CREATE TABLE test(id INT NOT NULL DEFAULT 1)"))
-               printf("[006] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+               printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
 
        if (!mysqli_query($link, "INSERT INTO test(id) VALUES (2)"))
-               printf("[007] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+               printf("[009] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
 
        if (!$res = mysqli_query($link, "SELECT id as _default_test FROM test")) {
-               printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+               printf("[010] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
        }
        var_dump(mysqli_fetch_assoc($res));
+       /* binary */
        var_dump(mysqli_fetch_field($res));
        mysqli_free_result($res);
 
@@ -97,7 +115,7 @@ object(stdClass)#%d (11) {
   [%u|b%"def"]=>
   %unicode|string%(0) ""
   [%u|b%"max_length"]=>
-  int(1)
+  int(%d)
   [%u|b%"length"]=>
   int(%d)
   [%u|b%"charsetnr"]=>
index fc51e858b331a87d369040f836f849bc5ac4a945..0130f0e7f28e9b082a32af69d6ec5d8529ec2f40 100644 (file)
@@ -24,22 +24,36 @@ require_once('skipifconnectfailure.inc');
                printf("[002] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
                        $host, $user, $db, $port, $socket);
 
-       if (!$res = $mysqli->query("SELECT id AS ID, label FROM test AS TEST ORDER BY id LIMIT 1")) {
-               printf("[003] [%d] %s\n", $mysqli->errno, $mysqli->error);
-       }
-
        if (!is_null($tmp = @$res->fetch_field($link)))
                printf("[003] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
 
-       while ($tmp = $res->fetch_field()) {
-               var_dump($tmp);
+       $charsets = my_get_charsets($link);
+
+       if (!$res = $mysqli->query("SELECT id AS ID, label FROM test AS TEST ORDER BY id LIMIT 1")) {
+               printf("[004] [%d] %s\n", $mysqli->errno, $mysqli->error);
        }
+
+       var_dump($res->fetch_field());
+
+       $tmp = $res->fetch_field();
        var_dump($tmp);
+       if ($tmp->charsetnr != $charsets['results']['nr']) {
+               printf("[005] Expecting charset %s/%d got %d\n",
+                       $charsets['results']['charset'],
+                       $charsets['results']['nr'], $tmp->charsetnr);
+       }
+       if ($tmp->length != (1 * $charsets['results']['maxlen'])) {
+               printf("[006] Expecting length %d got %d\n",
+                       $charsets['results']['maxlen'],
+                       $tmp->max_length);
+       }
+
+       var_dump($res->fetch_field());
 
        $res->free_result();
 
        if (NULL !== ($tmp = $res->fetch_field()))
-               printf("[004] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
+               printf("[007] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
 
        $mysqli->close();
        print "done!";
@@ -85,7 +99,7 @@ object(stdClass)#%d (11) {
   [%u|b%"def"]=>
   %unicode|string%(0) ""
   [%u|b%"max_length"]=>
-  int(1)
+  int(%d)
   [%u|b%"length"]=>
   int(%d)
   [%u|b%"charsetnr"]=>
index 332db84c6c604ba481867e1c40aefcc253d38274..885c7338b57cf63bb64f742b52be58b12297519a 100644 (file)
@@ -21,13 +21,31 @@ require_once('skipifconnectfailure.inc');
                printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
 
        require('table.inc');
+       $charsets = my_get_charsets($link);
+
        if (!$res = mysqli_query($link, "SELECT id AS ID, label FROM test AS TEST ORDER BY id LIMIT 1")) {
                printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
        }
 
        $fields = mysqli_fetch_fields($res);
-       foreach ($fields as $k => $field)
+       foreach ($fields as $k => $field) {
                var_dump($field);
+               switch ($k) {
+                       case 1:
+                               /* label column, result set charset */
+                               if ($field->charsetnr != $charsets['results']['nr']) {
+                                       printf("[004] Expecting charset %s/%d got %d\n",
+                                               $charsets['results']['charset'],
+                                               $charsets['results']['nr'], $field->charsetnr);
+                               }
+                               if ($field->length != (1 * $charsets['results']['maxlen'])) {
+                                       printf("[005] Expecting length %d got %d\n",
+                                               $charsets['results']['maxlen'],
+                                               $field->max_length);
+                               }
+                               break;
+               }
+       }
 
        mysqli_free_result($res);
 
index a0cab48ec978a74031e681d554f0870848e9a11a..1da42c28336c66a5f26ef9f7848272fdc3d2a232 100644 (file)
@@ -66,6 +66,8 @@ require_once('skipifconnectfailure.inc');
                printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
 
        require('table.inc');
+       $charsets = my_get_charsets($link);
+
        if (!$res = mysqli_query($link, "SELECT id, label FROM test ORDER BY id LIMIT 1", MYSQLI_USE_RESULT)) {
                printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
        }
@@ -75,7 +77,21 @@ require_once('skipifconnectfailure.inc');
        var_dump(mysqli_field_seek($res, 0));
        var_dump(mysqli_fetch_field($res));
        var_dump(mysqli_field_seek($res, 1));
-       var_dump(mysqli_fetch_field($res));
+
+       $field = mysqli_fetch_field($res);
+       var_dump($field);
+       /* label column, result set charset */
+       if ($field->charsetnr != $charsets['results']['nr']) {
+               printf("[004] Expecting charset %s/%d got %d\n",
+                       $charsets['results']['charset'],
+                       $charsets['results']['nr'], $field->charsetnr);
+       }
+       if ($field->length != (1 * $charsets['results']['maxlen'])) {
+               printf("[005] Expecting length %d got %d\n",
+                       $charsets['results']['maxlen'],
+                       $field->max_length);
+       }
+
        var_dump(mysqli_field_tell($res));
        var_dump(mysqli_field_seek($res, 2));
        var_dump(mysqli_fetch_field($res));
@@ -96,8 +112,6 @@ require_once('skipifconnectfailure.inc');
 
        var_dump(mysqli_field_seek($res, 0));
 
-
-
        mysqli_close($link);
        print "done!";
 ?>
@@ -170,7 +184,7 @@ object(stdClass)#%d (11) {
   [%u|b%"def"]=>
   %unicode|string%(0) ""
   [%u|b%"max_length"]=>
-  int(0)
+  int(%d)
   [%u|b%"length"]=>
   int(%d)
   [%u|b%"charsetnr"]=>
index e1e3a92e56a107a92f2cb1624d0ab2fefa7d0e38..03d15902af5e69a8ded15a636c4df371df05fb1b 100644 (file)
@@ -9,6 +9,7 @@ require_once('skipifconnectfailure.inc');
 --FILE--
 <?php
        require('table.inc');
+       $link->set_charset('latin1');
 
        class foo {
          // @var $bar string
index 9c876e522753c5730f7f436e46a554c1f6bd04f4..23d045a22beadfc53974656a4d4ad57c437ba076 100644 (file)
@@ -12,26 +12,44 @@ if (!function_exists('mysqli_stmt_get_result'))
 --FILE--
 <?php
        require('table.inc');
+       $charsets = my_get_charsets($link);
 
        if (!($stmt = mysqli_stmt_init($link)) ||
                !mysqli_stmt_prepare($stmt, "SELECT id, label, id + 1 as _id,  concat(label, '_') ___label FROM test ORDER BY id ASC LIMIT 3") ||
                !mysqli_stmt_execute($stmt))
-               printf("[006] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+               printf("[001] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
 
        if (!is_object($res = mysqli_stmt_get_result($stmt)) || 'mysqli_result' != get_class($res)) {
-               printf("[007] Expecting object/mysqli_result got %s/%s, [%d] %s\n",
+               printf("[002] Expecting object/mysqli_result got %s/%s, [%d] %s\n",
                        gettype($res), $res, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        }
 
        if (!is_object($res_meta = mysqli_stmt_result_metadata($stmt)) ||
                'mysqli_result' != get_class($res_meta)) {
-               printf("[008] Expecting object/mysqli_result got %s/%s, [%d] %s\n",
+               printf("[003] Expecting object/mysqli_result got %s/%s, [%d] %s\n",
                        gettype($res), $res, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        }
 
-       $fields = array();
-       while ($info = $res->fetch_field()) {
-               var_dump($info);
+       $i = 0;
+       while ($field = $res->fetch_field()) {
+               var_dump($field);
+               $i++;
+               if (2 == $i) {
+                       /*
+                       Label column, result set charset.
+                       All of the following columns are "too hot" - too server dependent
+                       */
+                       if ($field->charsetnr != $charsets['results']['nr']) {
+                               printf("[004] Expecting charset %s/%d got %d\n",
+                                       $charsets['results']['charset'],
+                                       $charsets['results']['nr'], $field->charsetnr);
+                       }
+                       if ($field->length != (1 * $charsets['results']['maxlen'])) {
+                               printf("[005] Expecting length %d got %d\n",
+                                       $charsets['results']['maxlen'],
+                                       $field->max_length);
+                       }
+               }
        }
 
        mysqli_stmt_close($stmt);
@@ -79,7 +97,7 @@ object(stdClass)#%d (11) {
   [%u|b%"def"]=>
   %unicode|string%(0) ""
   [%u|b%"max_length"]=>
-  int(1)
+  int(%d)
   [%u|b%"length"]=>
   int(%d)
   [%u|b%"charsetnr"]=>
@@ -127,7 +145,7 @@ object(stdClass)#%d (11) {
   [%u|b%"def"]=>
   %unicode|string%(0) ""
   [%u|b%"max_length"]=>
-  int(2)
+  int(%d)
   [%u|b%"length"]=>
   int(%d)
   [%u|b%"charsetnr"]=>