summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Botchkov <holyfoot@askmonty.org>2017-03-14 17:31:14 +0400
committerAlexey Botchkov <holyfoot@askmonty.org>2017-03-14 17:31:14 +0400
commitaf6eee1fc5c40c73edb65c08d16929ccfdc1f5f0 (patch)
treeba3597232b6c1b9f3a3c2508ff38c0cff6209c93
parentd0e8b427a1877392f3b90e00f2c7606608bac996 (diff)
downloadmariadb-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.result23
-rw-r--r--mysql-test/t/func_json.test18
-rw-r--r--sql/item_jsonfunc.cc23
-rw-r--r--sql/item_jsonfunc.h1
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) {}