Skip to content

Commit b8a7728

Browse files
MDEV-32854: Make JSON_DEPTH_LIMIT unlimited
The initial hard capped limit on the depth was 32. It was implemented using static arrays of relevant type and size 32. Hence, to implement unlimited depth, dynamic array on mem_root was implemented which grows by 3200 as needed. Relevant arrays were replaced with this dynamic array.
1 parent 374f30c commit b8a7728

30 files changed

+2922
-885
lines changed

include/json_lib.h

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,27 @@
77
extern "C" {
88
#endif
99

10-
#define JSON_DEPTH_LIMIT 32
10+
#define JSON_DEPTH_DEFAULT 32
11+
#define JSON_DEPTH_LIMIT 32 /* Still used in columnstore. */
12+
#define JSON_DEPTH_INC JSON_DEPTH_DEFAULT*100
1113

14+
/*
15+
Because this array will store approximate two arrays of
16+
type json_path_step_t and one or two integer arrays,
17+
each of average 70 elements. So this size should suffice.
18+
*/
19+
#define BLOCK_SIZE_JSON_DYN_ARRAY 4096
20+
21+
#define get_json_step(p,s) if (p->last_step_idx < (int)(p->steps.max_element)) \
22+
s= ((json_path_step_t*)(p->steps.buffer))+p->last_step_idx; \
23+
else \
24+
s= (json_path_step_t*) mem_root_dynamic_array_resize_and_get_val(&p->steps, p->last_step_idx);
25+
26+
#define set_json_array_value_ptr(idx, max_element, dyn_arr_ptr, val) \
27+
if ((size_t)(idx) < (max_element)) \
28+
memcpy((dyn_arr_ptr)->buffer + (dyn_arr_ptr)->size_of_element * (idx), &(val), sizeof(val)); \
29+
else \
30+
mem_root_dynamic_array_resize_and_set_val((dyn_arr_ptr), &(val), (idx));
1231
/*
1332
When error happens, the c_next of the JSON engine contains the
1433
character that caused the error, and the c_str is the position
@@ -28,7 +47,7 @@ enum json_errors {
2847

2948
JE_ESCAPING= -6, /* Error in the escaping. */
3049

31-
JE_DEPTH= -7, /* The limit on the JSON depth was overrun. */
50+
JE_DEPTH= -7, /* The limit on the JSON depth was overrun. Still used in columnstore*/
3251
};
3352

3453

@@ -104,8 +123,8 @@ typedef struct st_json_path_step_t
104123
typedef struct st_json_path_t
105124
{
106125
json_string_t s; /* The string to be parsed. */
107-
json_path_step_t steps[JSON_DEPTH_LIMIT]; /* Steps of the path. */
108-
json_path_step_t *last_step; /* Points to the last step. */
126+
MEM_ROOT_DYNAMIC_ARRAY steps; /* Steps of the path. */
127+
int last_step_idx;
109128

110129
int mode_strict; /* TRUE if the path specified as 'strict' */
111130
enum json_path_step_types types_used; /* The '|' of all step's 'type'-s */
@@ -225,8 +244,8 @@ typedef struct st_json_engine_t
225244
const uchar *value_end; /* Points to the next character after the value. */
226245
int value_len; /* The length of the value. Does not count quotations for */
227246
/* string constants. */
228-
229-
int stack[JSON_DEPTH_LIMIT]; /* Keeps the stack of nested JSON structures. */
247+
/* Keeps the stack of nested JSON structures. */
248+
MEM_ROOT_DYNAMIC_ARRAY stack;
230249
int stack_p; /* The 'stack' pointer. */
231250
volatile uchar *killed_ptr;
232251
} json_engine_t;
@@ -341,6 +360,13 @@ int json_skip_level_and_count(json_engine_t *j, int *n_items_skipped);
341360
*/
342361
#define json_value_scalar(je) ((je)->value_type > JSON_VALUE_ARRAY)
343362

363+
#define report_json_error(js, je, n_param) \
364+
report_json_error_ex(js->ptr(), je, func_name(), n_param, \
365+
Sql_condition::WARN_LEVEL_WARN)
366+
367+
#define report_path_error(js, je, n_param) \
368+
report_path_error_ex(js->ptr(), je, func_name(), n_param,\
369+
Sql_condition::WARN_LEVEL_WARN)
344370

345371
/*
346372
Look for the JSON PATH in the json string.
@@ -350,7 +376,7 @@ int json_skip_level_and_count(json_engine_t *j, int *n_items_skipped);
350376
initialized with the JSON string, and the json_path_t with the JSON path
351377
appropriately. The 'p_cur_step' should point at the first
352378
step of the path.
353-
The 'array_counters' is the array of JSON_DEPTH_LIMIT size.
379+
The 'array_counters' is the array of 'curr_json_depth_limit' size.
354380
It stores the array counters of the parsed JSON.
355381
If function returns 0, it means it found the match. The position of
356382
the match is je->s.c_str. Then we can call the json_find_path()
@@ -360,7 +386,7 @@ int json_skip_level_and_count(json_engine_t *j, int *n_items_skipped);
360386
*/
361387
int json_find_path(json_engine_t *je,
362388
json_path_t *p, json_path_step_t **p_cur_step,
363-
int *array_counters);
389+
MEM_ROOT_DYNAMIC_ARRAY *array_counters);
364390

365391

366392
typedef struct st_json_find_paths_t
@@ -369,7 +395,7 @@ typedef struct st_json_find_paths_t
369395
json_path_t *paths;
370396
uint cur_depth;
371397
uint *path_depths;
372-
int array_counters[JSON_DEPTH_LIMIT];
398+
MEM_ROOT_DYNAMIC_ARRAY array_counters;
373399
} json_find_paths_t;
374400

375401

@@ -431,17 +457,22 @@ int json_get_path_start(json_engine_t *je, CHARSET_INFO *i_cs,
431457
int json_get_path_next(json_engine_t *je, json_path_t *p);
432458

433459
int json_path_compare(const json_path_t *a, const json_path_t *b,
434-
enum json_value_types vt, const int* array_size_counter);
460+
enum json_value_types vt,
461+
MEM_ROOT_DYNAMIC_ARRAY* array_size_counter);
435462

436-
int json_valid(const char *js, size_t js_len, CHARSET_INFO *cs);
463+
int json_valid(const char *js, size_t js_len,
464+
CHARSET_INFO *cs, json_engine_t *je);
437465

438-
int json_locate_key(const char *js, const char *js_end,
466+
int json_locate_key(json_engine_t *je, const char *js, const char *js_end,
439467
const char *kname,
440468
const char **key_start, const char **key_end,
441469
int *comma_pos);
442470

443471
int json_normalize(DYNAMIC_STRING *result,
444-
const char *s, size_t size, CHARSET_INFO *cs);
472+
const char *s, size_t size, CHARSET_INFO *cs,
473+
MEM_ROOT *current_mem_root,
474+
json_engine_t *temp_je,
475+
MEM_ROOT_DYNAMIC_ARRAY *stack);
445476

446477
int json_skip_array_and_count(json_engine_t *j, int* n_item);
447478

@@ -450,6 +481,8 @@ inline static int json_scan_ended(json_engine_t *j)
450481
return (j->state == JST_ARRAY_END && j->stack_p == 0);
451482
}
452483

484+
void initJsonArray(MEM_ROOT *mem_root, MEM_ROOT_DYNAMIC_ARRAY *mem_root_array, size_t size, void *buffer, myf myflag);
485+
453486
#ifdef __cplusplus
454487
}
455488
#endif

include/my_sys.h

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ C_MODE_START
8989
#define MY_FREE_ON_ERROR 128U /* my_realloc() ; Free old ptr on error */
9090
#define MY_DONT_OVERWRITE_FILE 2048U /* my_copy: Don't overwrite file */
9191
#define MY_THREADSAFE 2048U /* my_seek(): lock fd mutex */
92+
#define MY_BUFFER_NO_RESIZE 512U
9293
#define MY_SYNC 4096U /* my_copy(): sync dst file */
9394
#define MY_SYNC_DIR 32768U /* my_create/delete/rename: sync directory */
9495
#define MY_THREAD_SPECIFIC 0x10000U /* my_malloc(): thread specific */
@@ -362,6 +363,17 @@ typedef struct st_dynamic_array
362363
myf malloc_flags;
363364
} DYNAMIC_ARRAY;
364365

366+
typedef struct st_mem_root_dynamic_array
367+
{
368+
MEM_ROOT *mem_root;
369+
uchar *buffer;
370+
size_t elements, max_element;
371+
size_t alloc_increment;
372+
size_t size_of_element;
373+
PSI_memory_key m_psi_key;
374+
myf malloc_flags;
375+
} MEM_ROOT_DYNAMIC_ARRAY;
376+
365377

366378
typedef struct st_dynamic_array_append
367379
{
@@ -1176,6 +1188,74 @@ extern void thd_increment_bytes_sent(void *thd, size_t length);
11761188
extern void thd_increment_bytes_received(void *thd, size_t length);
11771189
extern void thd_increment_net_big_packet_count(void *thd, size_t length);
11781190

1191+
extern int mem_root_dynamic_array_init(MEM_ROOT *mem_root,
1192+
PSI_memory_key psi_key,
1193+
MEM_ROOT_DYNAMIC_ARRAY *array,
1194+
size_t element_size, void *init_buffer,
1195+
size_t init_alloc,
1196+
size_t alloc_increment,
1197+
myf my_flags);
1198+
int mem_root_allocate_dynamic(MEM_ROOT *mem_root,
1199+
MEM_ROOT_DYNAMIC_ARRAY *array,
1200+
size_t idx);
1201+
extern void* mem_root_dynamic_array_get_val(MEM_ROOT_DYNAMIC_ARRAY *array, size_t idx);
1202+
extern void mem_root_dynamic_array_reset(MEM_ROOT_DYNAMIC_ARRAY *array);
1203+
extern int mem_root_dynamic_array_resize_not_allowed(MEM_ROOT_DYNAMIC_ARRAY *array);
1204+
extern void mem_root_dynamic_array_copy_values(MEM_ROOT_DYNAMIC_ARRAY *dest, MEM_ROOT_DYNAMIC_ARRAY *src);
1205+
static inline int mem_root_dynamic_array_set_val(MEM_ROOT_DYNAMIC_ARRAY *array,
1206+
const void *element, size_t idx)
1207+
{
1208+
DBUG_ASSERT(idx < array->max_element);
1209+
1210+
memcpy(array->buffer+(idx * array->size_of_element), element,
1211+
array->size_of_element);
1212+
return TRUE;
1213+
}
1214+
static inline int mem_root_dynamic_array_resize_and_set_val(MEM_ROOT_DYNAMIC_ARRAY *array,
1215+
const void *element, size_t idx)
1216+
{
1217+
if (array->malloc_flags & MY_BUFFER_NO_RESIZE)
1218+
return TRUE;
1219+
1220+
if (idx >= array->max_element)
1221+
{
1222+
if (mem_root_allocate_dynamic(array->mem_root, array, idx))
1223+
return 1;
1224+
array->elements++;
1225+
}
1226+
1227+
/*
1228+
Ensure the array size has increased and the index is
1229+
now well within the array bounds.
1230+
*/
1231+
DBUG_ASSERT(idx < array->max_element);
1232+
1233+
memcpy(array->buffer+(idx * array->size_of_element), element,
1234+
array->size_of_element);
1235+
1236+
return FALSE;
1237+
}
1238+
1239+
static inline void* mem_root_dynamic_array_resize_and_get_val(MEM_ROOT_DYNAMIC_ARRAY *array, size_t idx)
1240+
{
1241+
if (array->malloc_flags & MY_BUFFER_NO_RESIZE)
1242+
return NULL;
1243+
1244+
if (idx >= array->max_element)
1245+
{
1246+
if (mem_root_allocate_dynamic(array->mem_root, array, idx))
1247+
return NULL;
1248+
}
1249+
1250+
/*
1251+
Ensure the array size has increased and the index is
1252+
now well within the array bounds.
1253+
*/
1254+
DBUG_ASSERT(idx < array->max_element);
1255+
1256+
return mem_root_dynamic_array_get_val(array, idx);
1257+
}
1258+
11791259
#include <mysql/psi/psi.h>
11801260

11811261
#ifdef HAVE_PSI_INTERFACE

mysql-test/main/func_json.result

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -640,24 +640,20 @@ ex
640640
set @save_max_allowed_packet=@@max_allowed_packet;
641641
set @save_net_buffer_length=@@net_buffer_length;
642642
set @@global.net_buffer_length=1024;
643-
set @@global.max_allowed_packet=2048;
643+
set @@global.max_allowed_packet=4096;
644644
connect newconn, localhost, root,,;
645645
show variables like 'net_buffer_length';
646646
Variable_name Value
647647
net_buffer_length 1024
648648
show variables like 'max_allowed_packet';
649649
Variable_name Value
650-
max_allowed_packet 2048
650+
max_allowed_packet 4096
651651
select json_array(repeat('a',1024),repeat('a',1024)) as ex;
652652
ex
653-
NULL
654-
Warnings:
655-
Warning 1301 Result of json_array() was larger than max_allowed_packet (2048) - truncated
653+
["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]
656654
select json_object("a", repeat('a',1024),"b", repeat('a',1024)) as ex;
657655
ex
658-
NULL
659-
Warnings:
660-
Warning 1301 Result of json_object() was larger than max_allowed_packet (2048) - truncated
656+
{"a": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "b": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}
661657
connection default;
662658
set @@global.max_allowed_packet = @save_max_allowed_packet;
663659
set @@global.net_buffer_length = @save_net_buffer_length;
@@ -4842,16 +4838,16 @@ JSON_SCHEMA_VALID(@schema_array, '[')
48424838
0
48434839
Warnings:
48444840
Warning 4037 Unexpected end of JSON text in argument 2 to function 'json_schema_valid'
4845-
SELECT JSON_SCHEMA_VALID(repeat('[', 100000), json_object());
4846-
JSON_SCHEMA_VALID(repeat('[', 100000), json_object())
4841+
SELECT JSON_SCHEMA_VALID(repeat('[', 100), json_object());
4842+
JSON_SCHEMA_VALID(repeat('[', 100), json_object())
48474843
NULL
48484844
Warnings:
4849-
Warning 4040 Limit of 32 on JSON nested structures depth is reached in argument 1 to function 'json_schema_valid' at position 32
4850-
SELECT JSON_SCHEMA_VALID(json_object(), repeat('[', 10000000));
4851-
JSON_SCHEMA_VALID(json_object(), repeat('[', 10000000))
4845+
Warning 4037 Unexpected end of JSON text in argument 1 to function 'json_schema_valid'
4846+
SELECT JSON_SCHEMA_VALID(json_object(), repeat('[', 100));
4847+
JSON_SCHEMA_VALID(json_object(), repeat('[', 100))
48524848
0
48534849
Warnings:
4854-
Warning 4040 Limit of 32 on JSON nested structures depth is reached in argument 2 to function 'json_schema_valid' at position 32
4850+
Warning 4037 Unexpected end of JSON text in argument 2 to function 'json_schema_valid'
48554851
#
48564852
# MDEV-30677: Incorrect result for "SELECT JSON_SCHEMA_VALID('{}', NULL)"
48574853
#
@@ -4895,6 +4891,8 @@ NULL
48954891
SELECT JSON_KEY_VALUE('', '$.a');
48964892
JSON_KEY_VALUE('', '$.a')
48974893
NULL
4894+
Warnings:
4895+
Warning 4037 Unexpected end of JSON text in argument 1 to function 'json_key_value'
48984896
SELECT JSON_KEY_VALUE('[1,2,3]', '');
48994897
JSON_KEY_VALUE('[1,2,3]', '')
49004898
NULL

mysql-test/main/func_json.test

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ set @save_max_allowed_packet=@@max_allowed_packet;
310310
set @save_net_buffer_length=@@net_buffer_length;
311311

312312
set @@global.net_buffer_length=1024;
313-
set @@global.max_allowed_packet=2048;
313+
set @@global.max_allowed_packet=4096;
314314
--connect (newconn, localhost, root,,)
315315

316316
show variables like 'net_buffer_length';
@@ -3800,10 +3800,10 @@ SET @schema_array= '{"type":"array"}';
38003800
SELECT JSON_SCHEMA_VALID(@schema_array, '[');
38013801

38023802
--disable_view_protocol
3803-
SELECT JSON_SCHEMA_VALID(repeat('[', 100000), json_object());
3803+
SELECT JSON_SCHEMA_VALID(repeat('[', 100), json_object());
38043804
--enable_view_protocol
38053805

3806-
SELECT JSON_SCHEMA_VALID(json_object(), repeat('[', 10000000));
3806+
SELECT JSON_SCHEMA_VALID(json_object(), repeat('[', 100));
38073807

38083808
--echo #
38093809
--echo # MDEV-30677: Incorrect result for "SELECT JSON_SCHEMA_VALID('{}', NULL)"

mysql-test/main/json_equals.result

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ select json_equals('{"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"ob
6565
select json_equals('{"obj":{"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}',
6666
'{"obj":{"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"obj": {"key": "value"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}') as 32_levels;
6767
32_levels
68-
NULL
68+
1
6969
#
7070
# test values from different charset
7171
# (UTF-8 two-bytes vs. latin1 single high-byte)

0 commit comments

Comments
 (0)