com php-src: Fix for Bug #70384 mysqli_real_query() : Unknown type 245 sent by the server: ext/mysqli/tests/bug70384.phpt ext/mysqli/test
s/mysqli_get_client_stats.phpt ext/mysqlnd/mysqlnd. c ext/mysqlnd/mysqlnd_enum_n_def.h ext/mysqlnd/mysq lnd_ps_codec.c
ext/mysqlnd/mysqlnd_statistics.c e xt/mysqlnd/mysqlnd_wireprotocol.c

From: Date: Wed, 23 Sep 2015 16:38:29 +0000
Subject: com php-src: Fix for Bug #70384 mysqli_real_query() : Unknown type 245 sent by the server: ext/mysqli/tests/bug70384.phpt ext/mysqli/test
s/mysqli_get_client_stats.phpt ext/mysqlnd/mysqlnd. c ext/mysqlnd/mysqlnd_enum_n_def.h ext/mysqlnd/mysq lnd_ps_codec.c
ext/mysqlnd/mysqlnd_statistics.c e xt/mysqlnd/mysqlnd_wireprotocol.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-89145@lists.php.net to get a copy of this message
Commit: 003b764a49fc141834fa75a962d82fa7716503d2 Author: Andrey Hristov <andrey@php.net> Wed, 23 Sep 2015 17:27:18 +0200 Parents: bccac3774bade617d88da45e7f1781151bb16160 Branches: PHP-7.0 Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=003b764a49fc141834fa75a962d82fa7716503d2 Log: Fix for Bug #70384 mysqli_real_query(): Unknown type 245 sent by the server Bugs: https://bugs.php.net/70384 Changed paths: A ext/mysqli/tests/bug70384.phpt M ext/mysqli/tests/mysqli_get_client_stats.phpt M ext/mysqlnd/mysqlnd.c M ext/mysqlnd/mysqlnd_enum_n_def.h M ext/mysqlnd/mysqlnd_ps_codec.c M ext/mysqlnd/mysqlnd_statistics.c M ext/mysqlnd/mysqlnd_wireprotocol.c Diff: diff --git a/ext/mysqli/tests/bug70384.phpt b/ext/mysqli/tests/bug70384.phpt new file mode 100644 index 0000000..aa8662b --- /dev/null +++ b/ext/mysqli/tests/bug70384.phpt @@ -0,0 +1,62 @@ +--TEST-- +mysqli_float_handling - ensure 4 byte float is handled correctly +--SKIPIF-- +<?php + require_once('skipif.inc'); + require_once('skipifemb.inc'); + require_once('skipifconnectfailure.inc'); + if (@$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + if ($link->server_version < 50709) { + die("skip MySQL 5.7.9+ needed. Found [". + intval(substr($link->server_version."", -5, 1)). + ".". + intval(substr($link->server_version."", -4, 2)). + ".". + intval(substr($link->server_version."", -2, 2)). + "]"); + } + } +?> +--FILE-- +<?php + require('connect.inc'); + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + printf("[001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + die(); + } + + if (!mysqli_query($link, "DROP TABLE IF EXISTS test")) { + printf("[002] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + die(); + } + + if (!mysqli_query($link, "CREATE TABLE test(jsfield JSON) ENGINE = InnoDB")) { + printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + die(); + } + $jsfield_data = '{"aaa": 123}'; + // Insert via string to make sure the real floating number gets to the DB + if (!mysqli_query($link, "INSERT INTO test VALUES ('".$jsfield_data."')")) { + printf("[004] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + die(); + } + + if (!($res = mysqli_query($link, "SELECT * FROM test"))) { + printf("[005] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + die(); + } + $rows = $res->fetch_all(); + if (json_encode($rows[0][0]) != json_encode($jsfield_data)) { + printf("[006] Data differs"); + var_dump(json_encode($rows[0][0]) != json_encode($jsfield_data)); + die(); + } + mysqli_close($link); + echo "OK"; +?> +--CLEAN-- +<?php + require_once("clean_table.inc"); +?> +--EXPECTF-- +OK \ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_get_client_stats.phpt b/ext/mysqli/tests/mysqli_get_client_stats.phpt index a61165a..f0c4129 100644 --- a/ext/mysqli/tests/mysqli_get_client_stats.phpt +++ b/ext/mysqli/tests/mysqli_get_client_stats.phpt @@ -958,7 +958,7 @@ if (!mysqli_query($link, "DROP SERVER IF EXISTS myself")) mysqli_close($link); ?> --EXPECTF-- -array(160) { +array(161) { [%u|b%"bytes_sent"]=> %unicode|string%(1) "0" [%u|b%"bytes_received"]=> @@ -1203,6 +1203,8 @@ array(160) { %unicode|string%(1) "0" [%u|b%"proto_binary_fetched_string"]=> %unicode|string%(1) "0" + [%u|b%"proto_binary_fetched_json"]=> + %unicode|string%(1) "0" [%u|b%"proto_binary_fetched_blob"]=> %unicode|string%(1) "0" [%u|b%"proto_binary_fetched_enum"]=> diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index 1a1882c..ad57c6c 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -2212,6 +2212,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, next_result)(MYSQLND_CONN_DATA * const conn) PHPAPI const char *mysqlnd_field_type_name(enum mysqlnd_field_types field_type) { switch(field_type) { + case FIELD_TYPE_JSON: + return "json"; case FIELD_TYPE_STRING: case FIELD_TYPE_VAR_STRING: return "string"; diff --git a/ext/mysqlnd/mysqlnd_enum_n_def.h b/ext/mysqlnd/mysqlnd_enum_n_def.h index 62f45a4..1aa9c39 100644 --- a/ext/mysqlnd/mysqlnd_enum_n_def.h +++ b/ext/mysqlnd/mysqlnd_enum_n_def.h @@ -259,6 +259,7 @@ typedef enum mysqlnd_field_types MYSQL_TYPE_NEWDATE = 14, MYSQL_TYPE_VARCHAR = 15, MYSQL_TYPE_BIT = 16, + MYSQL_TYPE_JSON=245, MYSQL_TYPE_NEWDECIMAL=246, MYSQL_TYPE_ENUM=247, MYSQL_TYPE_SET=248, @@ -300,6 +301,7 @@ typedef enum mysqlnd_server_option #define FIELD_TYPE_NEWDATE MYSQL_TYPE_NEWDATE #define FIELD_TYPE_ENUM MYSQL_TYPE_ENUM #define FIELD_TYPE_SET MYSQL_TYPE_SET +#define FIELD_TYPE_JSON MYSQL_TYPE_JSON #define FIELD_TYPE_TINY_BLOB MYSQL_TYPE_TINY_BLOB #define FIELD_TYPE_MEDIUM_BLOB MYSQL_TYPE_MEDIUM_BLOB #define FIELD_TYPE_LONG_BLOB MYSQL_TYPE_LONG_BLOB @@ -504,6 +506,7 @@ typedef enum mysqlnd_collected_stats STAT_TEXT_TYPE_FETCHED_DATETIME, STAT_TEXT_TYPE_FETCHED_TIMESTAMP, STAT_TEXT_TYPE_FETCHED_STRING, + STAT_TEXT_TYPE_FETCHED_JSON, STAT_TEXT_TYPE_FETCHED_BLOB, STAT_TEXT_TYPE_FETCHED_ENUM, STAT_TEXT_TYPE_FETCHED_SET, diff --git a/ext/mysqlnd/mysqlnd_ps_codec.c b/ext/mysqlnd/mysqlnd_ps_codec.c index f16333a..55886d2 100644 --- a/ext/mysqlnd/mysqlnd_ps_codec.c +++ b/ext/mysqlnd/mysqlnd_ps_codec.c @@ -437,6 +437,12 @@ void _mysqlnd_init_ps_fetch_subsystem() mysqlnd_ps_fetch_functions[MYSQL_TYPE_TIMESTAMP].php_type= IS_STRING; mysqlnd_ps_fetch_functions[MYSQL_TYPE_TIMESTAMP].can_ret_as_str_in_uni = TRUE; + mysqlnd_ps_fetch_functions[MYSQL_TYPE_JSON].func = ps_fetch_string; + mysqlnd_ps_fetch_functions[MYSQL_TYPE_JSON].pack_len= MYSQLND_PS_SKIP_RESULT_STR; + mysqlnd_ps_fetch_functions[MYSQL_TYPE_JSON].php_type = IS_STRING; + mysqlnd_ps_fetch_functions[MYSQL_TYPE_JSON].is_possibly_blob = TRUE; + mysqlnd_ps_fetch_functions[MYSQL_TYPE_JSON].can_ret_as_str_in_uni = TRUE; + mysqlnd_ps_fetch_functions[MYSQL_TYPE_TINY_BLOB].func = ps_fetch_string; mysqlnd_ps_fetch_functions[MYSQL_TYPE_TINY_BLOB].pack_len= MYSQLND_PS_SKIP_RESULT_STR; mysqlnd_ps_fetch_functions[MYSQL_TYPE_TINY_BLOB].php_type = IS_STRING; diff --git a/ext/mysqlnd/mysqlnd_statistics.c b/ext/mysqlnd/mysqlnd_statistics.c index 094ea11..6050e38 100644 --- a/ext/mysqlnd/mysqlnd_statistics.c +++ b/ext/mysqlnd/mysqlnd_statistics.c @@ -153,6 +153,7 @@ const MYSQLND_STRING mysqlnd_stats_values_names[STAT_LAST] = { MYSQLND_STR_W_LEN("proto_binary_fetched_datetime") }, { MYSQLND_STR_W_LEN("proto_binary_fetched_timestamp") }, { MYSQLND_STR_W_LEN("proto_binary_fetched_string") }, + { MYSQLND_STR_W_LEN("proto_binary_fetched_json") }, { MYSQLND_STR_W_LEN("proto_binary_fetched_blob") }, { MYSQLND_STR_W_LEN("proto_binary_fetched_enum") }, { MYSQLND_STR_W_LEN("proto_binary_fetched_set") }, diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 0923a98..b464aab 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -1653,6 +1653,7 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, case MYSQL_TYPE_NEWDECIMAL: statistic = STAT_TEXT_TYPE_FETCHED_DECIMAL; break; case MYSQL_TYPE_ENUM: statistic = STAT_TEXT_TYPE_FETCHED_ENUM; break; case MYSQL_TYPE_SET: statistic = STAT_TEXT_TYPE_FETCHED_SET; break; + case MYSQL_TYPE_JSON: statistic = STAT_TEXT_TYPE_FETCHED_JSON; break; case MYSQL_TYPE_TINY_BLOB: statistic = STAT_TEXT_TYPE_FETCHED_BLOB; break; case MYSQL_TYPE_MEDIUM_BLOB:statistic = STAT_TEXT_TYPE_FETCHED_BLOB; break; case MYSQL_TYPE_LONG_BLOB: statistic = STAT_TEXT_TYPE_FETCHED_BLOB; break;

« previous php.cvs (#89145) next »