diff options
author | Alexey Botchkov <holyfoot@askmonty.org> | 2017-03-14 17:31:14 +0400 |
---|---|---|
committer | Alexey Botchkov <holyfoot@askmonty.org> | 2017-03-14 17:31:14 +0400 |
commit | af6eee1fc5c40c73edb65c08d16929ccfdc1f5f0 (patch) | |
tree | ba3597232b6c1b9f3a3c2508ff38c0cff6209c93 | |
parent | d0e8b427a1877392f3b90e00f2c7606608bac996 (diff) | |
download | mariadb-git-af6eee1fc5c40c73edb65c08d16929ccfdc1f5f0.tar.gz |
MDEV-11833 JSON functions don't seem to respect max_allowed_packet.
Now let's check JSON length to fit the max_allowed packet.
-rw-r--r-- | mysql-test/r/func_json.result | 23 | ||||
-rw-r--r-- | mysql-test/t/func_json.test | 18 | ||||
-rw-r--r-- | sql/item_jsonfunc.cc | 23 | ||||
-rw-r--r-- | sql/item_jsonfunc.h | 1 |
4 files changed, 63 insertions, 2 deletions
diff --git a/mysql-test/r/func_json.result b/mysql-test/r/func_json.result index b1e52efcf8f..6a77648efa5 100644 --- a/mysql-test/r/func_json.result +++ b/mysql-test/r/func_json.result @@ -595,3 +595,26 @@ JSON_search( '{"x": "\\""}', "one", '"') SELECT JSON_search( '{"x": "\\""}', "one", '\\"'); JSON_search( '{"x": "\\""}', "one", '\\"') "$.x" +set @@global.net_buffer_length=1024; +set @@global.max_allowed_packet=2048; +connect newconn, localhost, root,,; +show variables like 'net_buffer_length'; +Variable_name Value +net_buffer_length 1024 +show variables like 'max_allowed_packet'; +Variable_name Value +max_allowed_packet 2048 +select json_array(repeat('a',1024),repeat('a',1024)); +json_array(repeat('a',1024),repeat('a',1024)) +NULL +Warnings: +Warning 1301 Result of json_array() was larger than max_allowed_packet (2048) - truncated +select json_object("a", repeat('a',1024),"b", repeat('a',1024)); +json_object("a", repeat('a',1024),"b", repeat('a',1024)) +NULL +Warnings: +Warning 1301 Result of json_object() was larger than max_allowed_packet (2048) - truncated +connection default; +set @@global.max_allowed_packet = default; +set @@global.net_buffer_length = default; +disconnect newconn; diff --git a/mysql-test/t/func_json.test b/mysql-test/t/func_json.test index ed1fe38d57d..74692c475f4 100644 --- a/mysql-test/t/func_json.test +++ b/mysql-test/t/func_json.test @@ -245,3 +245,21 @@ select json_detailed('{"a":1, "b":[1,2,3], "c":{"aa":"v1", "bb": "v2"}}'); SELECT JSON_search( '{"x": "\\""}', "one", '"'); SELECT JSON_search( '{"x": "\\""}', "one", '\\"'); + +# +# MDEV-11833 JSON functions don't seem to respect max_allowed_packet. +# +set @@global.net_buffer_length=1024; +set @@global.max_allowed_packet=2048; +--connect (newconn, localhost, root,,) + +show variables like 'net_buffer_length'; +show variables like 'max_allowed_packet'; +select json_array(repeat('a',1024),repeat('a',1024)); +select json_object("a", repeat('a',1024),"b", repeat('a',1024)); +--connection default + +set @@global.max_allowed_packet = default; +set @@global.net_buffer_length = default; +--disconnect newconn + diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc index 7909c605136..f3090a4097f 100644 --- a/sql/item_jsonfunc.cc +++ b/sql/item_jsonfunc.cc @@ -1407,6 +1407,7 @@ void Item_func_json_array::fix_length_and_dec() fix_char_length_ulonglong(char_length); tmp_val.set_charset(collation.collation); + result_limit= 0; } @@ -1431,7 +1432,16 @@ String *Item_func_json_array::val_str(String *str) if (str->append("]", 1)) goto err_return; - return str; + if (result_limit == 0) + result_limit= current_thd->variables.max_allowed_packet; + + if (str->length() <= result_limit) + return str; + + push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_ALLOWED_PACKET_OVERFLOWED, + ER_THD(current_thd, ER_WARN_ALLOWED_PACKET_OVERFLOWED), + func_name(), result_limit); err_return: /*TODO: Launch out of memory error. */ @@ -1749,7 +1759,16 @@ String *Item_func_json_object::val_str(String *str) if (str->append("}", 1)) goto err_return; - return str; + if (result_limit == 0) + result_limit= current_thd->variables.max_allowed_packet; + + if (str->length() <= result_limit) + return str; + + push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_ALLOWED_PACKET_OVERFLOWED, + ER_THD(current_thd, ER_WARN_ALLOWED_PACKET_OVERFLOWED), + func_name(), result_limit); err_return: /*TODO: Launch out of memory error. */ diff --git a/sql/item_jsonfunc.h b/sql/item_jsonfunc.h index ac78ed932d5..394ed5f189a 100644 --- a/sql/item_jsonfunc.h +++ b/sql/item_jsonfunc.h @@ -216,6 +216,7 @@ class Item_func_json_array: public Item_str_func { protected: String tmp_val; + ulong result_limit; public: Item_func_json_array(THD *thd): Item_str_func(thd) {} |