diff options
Diffstat (limited to 'mysql-test/suite/json')
24 files changed, 14625 insertions, 0 deletions
diff --git a/mysql-test/suite/json/r/json_no_table.result b/mysql-test/suite/json/r/json_no_table.result new file mode 100644 index 00000000..375b29d5 --- /dev/null +++ b/mysql-test/suite/json/r/json_no_table.result @@ -0,0 +1,3614 @@ +SELECT JSON_COMPACT(0.0e0) = -0.0e0; +JSON_COMPACT(0.0e0) = -0.0e0 +1 +SELECT JSON_COMPACT(CAST(0 AS DECIMAL)) = CAST(-0.0e0 AS DECIMAL); +JSON_COMPACT(CAST(0 AS DECIMAL)) = CAST(-0.0e0 AS DECIMAL) +1 +SELECT JSON_COMPACT(0.0e0) = CAST(-0.0e0 AS DECIMAL); +JSON_COMPACT(0.0e0) = CAST(-0.0e0 AS DECIMAL) +1 +SELECT JSON_COMPACT(CAST(0 AS DECIMAL)) = -0.0e0; +JSON_COMPACT(CAST(0 AS DECIMAL)) = -0.0e0 +1 +SELECT JSON_COMPACT(CAST(0 AS SIGNED)) = -0.0e0; +JSON_COMPACT(CAST(0 AS SIGNED)) = -0.0e0 +1 +SELECT JSON_COMPACT(CAST(0 AS SIGNED)) = CAST(-0.0e0 AS DECIMAL); +JSON_COMPACT(CAST(0 AS SIGNED)) = CAST(-0.0e0 AS DECIMAL) +1 +SELECT JSON_COMPACT(CAST(0 AS UNSIGNED)) = -0.0e0; +JSON_COMPACT(CAST(0 AS UNSIGNED)) = -0.0e0 +1 +SELECT JSON_COMPACT(CAST(0 AS UNSIGNED)) = CAST(-0.0e0 AS DECIMAL); +JSON_COMPACT(CAST(0 AS UNSIGNED)) = CAST(-0.0e0 AS DECIMAL) +1 +select json_compact('"abc"'); +json_compact('"abc"') +"abc" +error ER_INVALID_JSON_TEXT_IN_PARAM +select json_compact('abc'); +json_compact('abc') +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_compact' at position 1 + +# String literal - valid JSON +select JSON_VALID('123'); +JSON_VALID('123') +1 +select JSON_VALID('-123'); +JSON_VALID('-123') +1 +select JSON_VALID('5000000000'); +JSON_VALID('5000000000') +1 +select JSON_VALID('-5000000000'); +JSON_VALID('-5000000000') +1 +select JSON_VALID('1.23'); +JSON_VALID('1.23') +1 +select JSON_VALID('"123"'); +JSON_VALID('"123"') +1 +select JSON_VALID('true'); +JSON_VALID('true') +1 +select JSON_VALID('false'); +JSON_VALID('false') +1 +select JSON_VALID('null'); +JSON_VALID('null') +1 +select JSON_VALID('{"address": "Trondheim"}'); +JSON_VALID('{"address": "Trondheim"}') +1 + +# String literal - not valid JSON +select JSON_VALID('12 3'); +JSON_VALID('12 3') +0 + +# String literal not in UTF-8 +set names 'ascii'; +select JSON_VALID('123'); +JSON_VALID('123') +1 +set names 'utf8'; + +# Json expression +select JSON_VALID(json_compact('[123]')); +JSON_VALID(json_compact('[123]')) +1 + +# Json expression NULL +select JSON_VALID(json_compact(NULL)); +JSON_VALID(json_compact(NULL)) +NULL + +# Bare NULL +select JSON_VALID( NULL ); +JSON_VALID( NULL ) +NULL + +# Function result - string +select JSON_VALID( UPPER('"abc"') ); +JSON_VALID( UPPER('"abc"') ) +1 +set names 'latin1'; + +# Function result - string +select JSON_VALID( UPPER('"abc"') ); +JSON_VALID( UPPER('"abc"') ) +1 +set names 'utf8'; + +# Function result - date, not valid as JSON without CAST +select JSON_VALID( CAST('2015-01-15' AS DATE) ); +JSON_VALID( CAST('2015-01-15' AS DATE) ) +0 + +# The date string doesn't parse as JSON text, so wrong: +select JSON_VALID( CAST(CAST('2015-01-15' AS DATE) as CHAR CHARACTER SET 'utf8') ); +JSON_VALID( CAST(CAST('2015-01-15' AS DATE) as CHAR CHARACTER SET 'utf8') ) +0 +# OK, though: +select JSON_VALID( json_compact(CURDATE()) ); +JSON_VALID( json_compact(CURDATE()) ) +0 + +# Function result - NULL +select JSON_VALID( UPPER(NULL) ); +JSON_VALID( UPPER(NULL) ) +NULL +select JSON_VALID( UPPER(CAST(NULL as CHAR)) ); +JSON_VALID( UPPER(CAST(NULL as CHAR)) ) +NULL +SELECT JSON_VALID( '{ "firstName" : "Fred", "lastName" : "Flintstone" }' ); +JSON_VALID( '{ "firstName" : "Fred", "lastName" : "Flintstone" }' ) +1 +SELECT JSON_VALID( '3' ); +JSON_VALID( '3' ) +1 +SELECT JSON_VALID( null ); +JSON_VALID( null ) +NULL +# ---------------------------------------------------------------------- +# Test of JSON_CONTAINS_PATH function. +# ---------------------------------------------------------------------- +select json_contains_path(); +ERROR 42000: Incorrect parameter count in the call to native function 'json_contains_path' +select json_contains_path('{ "a": true }' ); +ERROR 42000: Incorrect parameter count in the call to native function 'json_contains_path' +select json_contains_path('{ "a": true }', 'all' ); +ERROR 42000: Incorrect parameter count in the call to native function 'json_contains_path' +error ER_INVALID_JSON_TEXT_IN_PARAM +select json_contains_path('{ "a": tru }', 'all', '$' ); +json_contains_path('{ "a": tru }', 'all', '$' ) +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_contains_path' at position 10 +error ER_INVALID_JSON_PATH +select json_contains_path('{ "a": true }', 'all', '$[' ); +json_contains_path('{ "a": true }', 'all', '$[' ) +NULL +Warnings: +Warning 4041 Unexpected end of JSON path in argument 3 to function 'json_contains_path' +error ER_INVALID_JSON_PATH +select json_contains_path('{ "a": true }', 'all', '$a.***[3]' ); +json_contains_path('{ "a": true }', 'all', '$a.***[3]' ) +NULL +Warnings: +Warning 4042 Syntax error in JSON path in argument 3 to function 'json_contains_path' at position 2 +error ER_JSON_BAD_ONE_OR_ALL_ARG +select json_contains_path('{ "a": true }', 'foo', '$.a' ); +json_contains_path('{ "a": true }', 'foo', '$.a' ) +NULL +Warnings: +Warning 4046 Argument 2 to function 'json_contains_path' must be "one" or "all". +error ER_INVALID_JSON_CHARSET +select json_contains_path('{}', 'all', cast('$' as binary)); +json_contains_path('{}', 'all', cast('$' as binary)) +1 +select json_contains_path(null, 'all', '$.a' ); +json_contains_path(null, 'all', '$.a' ) +NULL +select json_contains_path('{ "a": true }', null, '$.a' ); +json_contains_path('{ "a": true }', null, '$.a' ) +NULL +select json_contains_path('{ "a": true }', 'all', null ); +json_contains_path('{ "a": true }', 'all', null ) +NULL +select json_contains_path('{ "a": true }', 'all', '$' ); +json_contains_path('{ "a": true }', 'all', '$' ) +1 +select json_contains_path('{ "a": true }', 'all', '$.a' ); +json_contains_path('{ "a": true }', 'all', '$.a' ) +1 +select json_contains_path('{ "a": true }', 'one', '$.a' ); +json_contains_path('{ "a": true }', 'one', '$.a' ) +1 +select json_contains_path('{ "a": true }', 'all', '$.b' ); +json_contains_path('{ "a": true }', 'all', '$.b' ) +0 +select json_contains_path('{ "a": true }', 'one', '$.b' ); +json_contains_path('{ "a": true }', 'one', '$.b' ) +0 +select json_contains_path('{ "a": true }', 'all', '$.a', '$.b' ); +json_contains_path('{ "a": true }', 'all', '$.a', '$.b' ) +0 +select json_contains_path('{ "a": true }', 'all', '$.b', '$.a' ); +json_contains_path('{ "a": true }', 'all', '$.b', '$.a' ) +0 +select json_contains_path('{ "a": true }', 'ALL', '$.a', '$.b' ); +json_contains_path('{ "a": true }', 'ALL', '$.a', '$.b' ) +0 +select json_contains_path('{ "a": true }', 'aLl', '$.a', '$.b' ); +json_contains_path('{ "a": true }', 'aLl', '$.a', '$.b' ) +0 +select json_contains_path('{ "a": true }', 'one', '$.a', '$.b' ); +json_contains_path('{ "a": true }', 'one', '$.a', '$.b' ) +1 +select json_contains_path('{ "a": true }', 'one', '$.b', '$.a' ); +json_contains_path('{ "a": true }', 'one', '$.b', '$.a' ) +1 +select json_contains_path('{ "a": true }', 'ONE', '$.a', '$.b' ); +json_contains_path('{ "a": true }', 'ONE', '$.a', '$.b' ) +1 +select json_contains_path('{ "a": true }', 'oNe', '$.a', '$.b' ); +json_contains_path('{ "a": true }', 'oNe', '$.a', '$.b' ) +1 +select json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**[4]' ); +json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**[4]' ) +1 +select json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**[4]', '$**[5]' ); +json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**[4]', '$**[5]' ) +0 +select json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**.c[2]' ); +json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**.c[2]' ) +1 +select json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**.c[3]' ); +json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**.c[3]' ) +0 +select json_contains_path('{"a":1, "b":2}', 'one', '$.*'); +json_contains_path('{"a":1, "b":2}', 'one', '$.*') +1 +select json_contains_path('[1,2,3]', 'one', '$.*'); +json_contains_path('[1,2,3]', 'one', '$.*') +0 +select json_contains_path('{}', 'one', '$[*]'); +json_contains_path('{}', 'one', '$[*]') +0 +SELECT JSON_CONTAINS_PATH('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', +'one', '$**.a.*'); +JSON_CONTAINS_PATH('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', +'one', '$**.a.*') +1 +SELECT JSON_CONTAINS_PATH('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', +'all', '$**.a.*'); +JSON_CONTAINS_PATH('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', +'all', '$**.a.*') +1 +SELECT JSON_CONTAINS_PATH('[1,2,3]', 'one', '$**[*]'); +JSON_CONTAINS_PATH('[1,2,3]', 'one', '$**[*]') +1 +SELECT JSON_CONTAINS_PATH('[1,2,3]', 'all', '$**[*]'); +JSON_CONTAINS_PATH('[1,2,3]', 'all', '$**[*]') +1 +select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$**[1]', '$.b[0]', '$.c' ); +json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$**[1]', '$.b[0]', '$.c' ) +0 +select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$.c', '$**[1]', '$.b[0]' ); +json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$.c', '$**[1]', '$.b[0]' ) +0 +select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$.b[0]', '$.c', '$**[1]' ); +json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$.b[0]', '$.c', '$**[1]' ) +0 +select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$**[1]', '$.b[0]', '$.c' ); +json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$**[1]', '$.b[0]', '$.c' ) +1 +select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$.c', '$**[1]', '$.b[0]' ); +json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$.c', '$**[1]', '$.b[0]' ) +1 +select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$.b[0]', '$.c', '$**[1]' ); +json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$.b[0]', '$.c', '$**[1]' ) +1 +SELECT JSON_CONTAINS_PATH +( +'{ "a" : 123, "b" : [ 123, 456 ] }', +'all', +'$.a.c', +'$.b[1]' +); +JSON_CONTAINS_PATH +( +'{ "a" : 123, "b" : [ 123, 456 ] }', +'all', +'$.a.c', +'$.b[1]' +) +0 +SELECT JSON_CONTAINS_PATH +( +'{ "a" : 123, "b" : [ 123, 456 ] }', +'one', +'$.a.c', +'$.b[1]' +); +JSON_CONTAINS_PATH +( +'{ "a" : 123, "b" : [ 123, 456 ] }', +'one', +'$.a.c', +'$.b[1]' +) +1 +SELECT JSON_CONTAINS_PATH +( +'{ "a" : 123, "b" : [ 123, 456 ] }', +'all', +'$.c' +); +JSON_CONTAINS_PATH +( +'{ "a" : 123, "b" : [ 123, 456 ] }', +'all', +'$.c' +) +0 +SELECT JSON_CONTAINS_PATH +( +'{ "a" : 123, "b" : [ 123, { "c" : { "d" : true } } ] }', +'all', +'$.b[1].c.d' +); +JSON_CONTAINS_PATH +( +'{ "a" : 123, "b" : [ 123, { "c" : { "d" : true } } ] }', +'all', +'$.b[1].c.d' +) +1 +select json_length( null ); +json_length( null ) +NULL +select json_length( '1' ); +json_length( '1' ) +1 + +# invalid json text +error ER_INVALID_JSON_TEXT_IN_PARAM +select json_length( 'abc' ); +json_length( 'abc' ) +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_length' at position 1 +select json_length( '"abc"' ); +json_length( '"abc"' ) +1 +select json_length( 'true' ); +json_length( 'true' ) +1 +select json_length( 'false' ); +json_length( 'false' ) +1 +select json_length( 'null' ); +json_length( 'null' ) +1 +select json_length( '{}' ); +json_length( '{}' ) +0 +select json_length( '{ "a" : 100, "b" : 200 }' ); +json_length( '{ "a" : 100, "b" : 200 }' ) +2 +select json_length( '{ "a" : 100, "b" : [ 300, 400, 500 ] }' ); +json_length( '{ "a" : 100, "b" : [ 300, 400, 500 ] }' ) +2 +select json_length( '[]' ); +json_length( '[]' ) +0 +select json_length( '[ null, "foo", true, 1.1 ]' ); +json_length( '[ null, "foo", true, 1.1 ]' ) +4 +select json_length( '[ null, "foo", true, { "a" : "b", "c" : "d" } ]' ); +json_length( '[ null, "foo", true, { "a" : "b", "c" : "d" } ]' ) +4 +select json_length( '"foo"' ); +json_length( '"foo"' ) +1 +select json_length( '1.2' ); +json_length( '1.2' ) +1 + +# invalid json path +error ER_INVALID_JSON_PATH +select json_length( 'true', 'c$' ); +json_length( 'true', 'c$' ) +NULL +Warnings: +Warning 4042 Syntax error in JSON path in argument 2 to function 'json_length' at position 1 + +# invalid json path +error ER_INVALID_JSON_PATH +select json_length( '{ "foo" : [ true, false ] }', '$.foo[bar]' ); +json_length( '{ "foo" : [ true, false ] }', '$.foo[bar]' ) +NULL +Warnings: +Warning 4042 Syntax error in JSON path in argument 2 to function 'json_length' at position 7 + +# wildcards not allowed in path expressions for this function +error ER_INVALID_JSON_PATH_WILDCARD +select json_length( 'true', '$.*' ); +json_length( 'true', '$.*' ) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_length' + +# wildcards not allowed in path expressions for this function +error ER_INVALID_JSON_PATH_WILDCARD +select json_length( 'true', '$.foo**.bar' ); +json_length( 'true', '$.foo**.bar' ) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_length' +select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[0]' ); +json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[0]' ) +1 +select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[1]' ); +json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[1]' ) +3 +select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2]' ); +json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2]' ) +1 +select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2][0]' ); +json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2][0]' ) +1 +select json_length( '[ 1, [ 2, 3, 4 ], {"a": 1} ]', '$[2][0]' ); +json_length( '[ 1, [ 2, 3, 4 ], {"a": 1} ]', '$[2][0]' ) +1 +select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2][1]' ); +json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2][1]' ) +NULL +select json_length( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]' ); +json_length( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]' ) +3 +SELECT JSON_LENGTH +( +'{}' +); +JSON_LENGTH +( +'{}' +) +0 +SELECT JSON_LENGTH +( +'3' +); +JSON_LENGTH +( +'3' +) +1 +SELECT JSON_LENGTH +( +'{ "a" : 123, "b" : [ 123, 456, 789 ] }' +); +JSON_LENGTH +( +'{ "a" : 123, "b" : [ 123, 456, 789 ] }' +) +2 +SELECT JSON_LENGTH +( +'{ "a" : 123, "b" : [ 123, 456, 789 ] }', +'$.b' +); +JSON_LENGTH +( +'{ "a" : 123, "b" : [ 123, 456, 789 ] }', +'$.b' +) +3 +SELECT JSON_LENGTH +( +'{ "a" : 123, "b" : [ 123, 456, 789 ] }', +'$.c' +); +JSON_LENGTH +( +'{ "a" : 123, "b" : [ 123, 456, 789 ] }', +'$.c' +) +NULL +# ---------------------------------------------------------------------- +# Test of JSON_DEPTH function. +# ---------------------------------------------------------------------- +select json_depth(null); +json_depth(null) +NULL +select json_depth(json_compact(null)); +json_depth(json_compact(null)) +NULL +select json_depth(json_compact('[]')), +json_depth(json_compact('{}')), +json_depth(json_compact('null')), +json_depth(json_quote('foo')); +json_depth(json_compact('[]')) json_depth(json_compact('{}')) json_depth(json_compact('null')) json_depth(json_quote('foo')) +1 1 1 1 +select json_depth(json_compact('[[2], 3, [[[4]]]]')); +json_depth(json_compact('[[2], 3, [[[4]]]]')) +5 +select json_depth(json_compact('{"a": {"a1": [3]}, "b": {"b1": {"c": {"d": [5]}}}}')); +json_depth(json_compact('{"a": {"a1": [3]}, "b": {"b1": {"c": {"d": [5]}}}}')) +6 +SELECT JSON_DEPTH +( +'{}' +); +JSON_DEPTH +( +'{}' +) +1 +SELECT JSON_DEPTH +( +'[]' +); +JSON_DEPTH +( +'[]' +) +1 +SELECT JSON_DEPTH( '"abc"' ); +JSON_DEPTH( '"abc"' ) +1 +SELECT JSON_DEPTH( json_compact( '"abc"') ); +JSON_DEPTH( json_compact( '"abc"') ) +1 +error ER_INVALID_TYPE_FOR_JSON +SELECT JSON_DEPTH( 1 ); +JSON_DEPTH( 1 ) +1 +error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_DEPTH( 'abc' ); +JSON_DEPTH( 'abc' ) +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_depth' at position 1 +SELECT JSON_DEPTH( json_compact( 1) ); +JSON_DEPTH( json_compact( 1) ) +1 +SELECT JSON_DEPTH +( +'{ "a" : true, "b" : false, "c" : null }' +); +JSON_DEPTH +( +'{ "a" : true, "b" : false, "c" : null }' +) +2 +SELECT JSON_DEPTH +( +'[ "a", true, "b" , false, "c" , null ]' +); +JSON_DEPTH +( +'[ "a", true, "b" , false, "c" , null ]' +) +2 +SELECT JSON_DEPTH +( +'{ "a" : true, "b" : {}, "c" : null }' +); +JSON_DEPTH +( +'{ "a" : true, "b" : {}, "c" : null }' +) +2 +SELECT JSON_DEPTH +( +'[ "a", true, "b" , {}, "c" , null ]' +); +JSON_DEPTH +( +'[ "a", true, "b" , {}, "c" , null ]' +) +2 +SELECT JSON_DEPTH +( +'{ "a" : true, "b" : { "e" : false }, "c" : null }' +); +JSON_DEPTH +( +'{ "a" : true, "b" : { "e" : false }, "c" : null }' +) +3 +SELECT JSON_DEPTH +( +'[ "a", true, "b" , { "e" : false }, "c" , null ]' +); +JSON_DEPTH +( +'[ "a", true, "b" , { "e" : false }, "c" , null ]' +) +3 +error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_DEPTH +( +'[ "a", true, "b" , { "e" : false }, "c" , null' +); +JSON_DEPTH +( +'[ "a", true, "b" , { "e" : false }, "c" , null' +) +NULL +Warnings: +Warning 4037 Unexpected end of JSON text in argument 1 to function 'json_depth' +# ---------------------------------------------------------------------- +# Test of JSON_REMOVE function. +# ---------------------------------------------------------------------- +select json_remove( null, '$[1]' ); +json_remove( null, '$[1]' ) +NULL +select json_remove( null, '$[1]' ) is null; +json_remove( null, '$[1]' ) is null +1 +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null ); +json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null ) +NULL +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null ) is null; +json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null ) is null +1 +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', null ); +json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', null ) +NULL +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', null ) is null; +json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', null ) is null +1 + +# not enough args +select json_remove(); +ERROR 42000: Incorrect parameter count in the call to native function 'json_remove' + +# not enough args +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]' ); +ERROR 42000: Incorrect parameter count in the call to native function 'json_remove' + +# not enough args +select json_remove( '$[1]' ); +ERROR 42000: Incorrect parameter count in the call to native function 'json_remove' + +# invalid json text +error ER_INVALID_JSON_TEXT_IN_PARAM +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ', '$[1]', '$[2]' ); +json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ', '$[1]', '$[2]' ) +NULL +Warnings: +Warning 4037 Unexpected end of JSON text in argument 1 to function 'json_remove' + +# invalid json path +error ER_INVALID_JSON_PATH +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1', '$[2]' ); +json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1', '$[2]' ) +NULL +Warnings: +Warning 4041 Unexpected end of JSON path in argument 2 to function 'json_remove' + +# invalid json path +error ER_INVALID_JSON_PATH +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', '$[2' ); +json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', '$[2' ) +NULL +Warnings: +Warning 4041 Unexpected end of JSON path in argument 3 to function 'json_remove' + +# Vacuous path expression +error ER_JSON_VACUOUS_PATH +select json_remove( '[ 1, 2, 3 ]', '$' ); +json_remove( '[ 1, 2, 3 ]', '$' ) +NULL +Warnings: +Warning 4051 Path expression '$' is not allowed in argument 2 to function 'json_remove'. + +# Vacuous path expression +error ER_JSON_VACUOUS_PATH +select json_remove( '[ 1, 2, 3 ]', '$', '$[2]' ); +json_remove( '[ 1, 2, 3 ]', '$', '$[2]' ) +NULL +Warnings: +Warning 4051 Path expression '$' is not allowed in argument 2 to function 'json_remove'. + +# Vacuous path expression +error ER_JSON_VACUOUS_PATH +select json_remove( '[ 1, 2, 3 ]', '$[1]', '$' ); +json_remove( '[ 1, 2, 3 ]', '$[1]', '$' ) +NULL +Warnings: +Warning 4051 Path expression '$' is not allowed in argument 3 to function 'json_remove'. +error ER_INVALID_JSON_PATH_WILDCARD +select json_remove( '[ 1, 2, 3 ]', '$[*]' ); +json_remove( '[ 1, 2, 3 ]', '$[*]' ) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_remove' +error ER_INVALID_JSON_PATH_WILDCARD +select json_remove( '[ 1, 2, 3 ]', '$**[2]' ); +json_remove( '[ 1, 2, 3 ]', '$**[2]' ) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_remove' +error ER_INVALID_JSON_PATH_WILDCARD +select json_remove( '[ 1, 2, 3 ]', '$[2]', '$[*]' ); +json_remove( '[ 1, 2, 3 ]', '$[2]', '$[*]' ) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 3 to function 'json_remove' +error ER_INVALID_JSON_PATH_WILDCARD +select json_remove( '[ 1, 2, 3 ]', '$[2]', '$**[2]' ); +json_remove( '[ 1, 2, 3 ]', '$[2]', '$**[2]' ) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 3 to function 'json_remove' +select json_remove( '[ 1, 2, 3 ]', '$[0]' ); +json_remove( '[ 1, 2, 3 ]', '$[0]' ) +[2, 3] +select json_remove( '[ 1, 2, 3 ]', '$[1]' ); +json_remove( '[ 1, 2, 3 ]', '$[1]' ) +[1, 3] +select json_remove( '[ 1, 2, 3 ]', '$[2]' ); +json_remove( '[ 1, 2, 3 ]', '$[2]' ) +[1, 2] +select json_remove( '[ 1, 2, 3 ]', '$[3]' ); +json_remove( '[ 1, 2, 3 ]', '$[3]' ) +[1, 2, 3] +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]' ); +json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]' ) +[1, 5] +error ER_INVALID_JSON_PATH_WILDCARD +select json_remove( '[ { "a": { "a": true } } ]', '$**.a' ); +json_remove( '[ { "a": { "a": true } } ]', '$**.a' ) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_remove' +select json_remove( '[ { "a": true }, { "b": false }, { "c": null }, { "a": null } ]', '$[0].a', '$[2].c' ); +json_remove( '[ { "a": true }, { "b": false }, { "c": null }, { "a": null } ]', '$[0].a', '$[2].c' ) +[{}, {"b": false}, {}, {"a": null}] +error ER_INVALID_JSON_PATH_WILDCARD +select json_remove( '[ { "a": true }, { "b": [ { "c": { "a": true } } ] }, { "c": null }, { "a": null } ]', '$**.a' ); +json_remove( '[ { "a": true }, { "b": [ { "c": { "a": true } } ] }, { "c": null }, { "a": null } ]', '$**.a' ) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_remove' +select json_remove( '{"id": 123, "name": "systemQA", "array": [1, 2, 3]}', '$[0]' ); +json_remove( '{"id": 123, "name": "systemQA", "array": [1, 2, 3]}', '$[0]' ) +{"id": 123, "name": "systemQA", "array": [1, 2, 3]} +SELECT JSON_REMOVE +( +'{"a" : "foo", "b" : [true, {"c" : 123}]}', +'$.b[ 1 ]' +); +JSON_REMOVE +( +'{"a" : "foo", "b" : [true, {"c" : 123}]}', +'$.b[ 1 ]' +) +{"a": "foo", "b": [true]} +SELECT JSON_REMOVE +( +'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.b[ 1 ].c' +); +JSON_REMOVE +( +'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.b[ 1 ].c' +) +{"a": "foo", "b": [true, {"c": 456}]} +SELECT JSON_REMOVE +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c' +); +JSON_REMOVE +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c' +) +{"a": "foo", "b": [true, {}]} +SELECT JSON_REMOVE +( +'{ "a" : "foo", "b" : [ true, { "c" : 123, "d" : 456 } ] }', +'$.b[ 1 ].e' +); +JSON_REMOVE +( +'{ "a" : "foo", "b" : [ true, { "c" : 123, "d" : 456 } ] }', +'$.b[ 1 ].e' +) +{"a": "foo", "b": [true, {"c": 123, "d": 456}]} +# ---------------------------------------------------------------------- +# Test of JSON_MERGE function. +# ---------------------------------------------------------------------- + +# not enough args +select json_merge(); +ERROR 42000: Incorrect parameter count in the call to native function 'json_merge' + +# not enough args +select json_merge( '[ 1, 2, 3 ]' ); +ERROR 42000: Incorrect parameter count in the call to native function 'json_merge' +select json_merge( null, null ); +json_merge( null, null ) +NULL +select json_merge( null, '[ 1, 2, 3 ]' ); +json_merge( null, '[ 1, 2, 3 ]' ) +NULL +select json_merge( '[ 1, 2, 3 ]', null ); +json_merge( '[ 1, 2, 3 ]', null ) +NULL +select json_merge( null, '[ 1, 2, 3 ]', '[ 4, 5, 6 ]' ); +json_merge( null, '[ 1, 2, 3 ]', '[ 4, 5, 6 ]' ) +NULL +select json_merge( '[ 1, 2, 3 ]', null, '[ 4, 5, 6 ]' ); +json_merge( '[ 1, 2, 3 ]', null, '[ 4, 5, 6 ]' ) +NULL +select json_merge( '[ 1, 2, 3 ]', '[ 4, 5, 6 ]', null ); +json_merge( '[ 1, 2, 3 ]', '[ 4, 5, 6 ]', null ) +NULL +error ER_INVALID_JSON_TEXT_IN_PARAM +select json_merge( '[1, 2]', '[3, 4' ); +json_merge( '[1, 2]', '[3, 4' ) +NULL +Warnings: +Warning 4037 Unexpected end of JSON text in argument 2 to function 'json_merge_preserve' +error ER_INVALID_JSON_TEXT_IN_PARAM +select json_merge( '[1, 2', '[3, 4]' ); +json_merge( '[1, 2', '[3, 4]' ) +NULL +Warnings: +Warning 4037 Unexpected end of JSON text in argument 1 to function 'json_merge_preserve' +select json_merge( '1', '2' ); +json_merge( '1', '2' ) +[1, 2] +select json_merge( '1', '[2, 3]' ); +json_merge( '1', '[2, 3]' ) +[1, 2, 3] +select json_merge( '[1, 2]', '3' ); +json_merge( '[1, 2]', '3' ) +[1, 2, 3] +select json_merge( '1', '{ "a": 2 }' ); +json_merge( '1', '{ "a": 2 }' ) +[1, {"a": 2}] +select json_merge( '{ "a": 2 }', '1' ); +json_merge( '{ "a": 2 }', '1' ) +[{"a": 2}, 1] +select json_merge( '[1, 2]', '[3, 4]' ); +json_merge( '[1, 2]', '[3, 4]' ) +[1, 2, 3, 4] +select json_merge( '{ "a": 2 }', '{ "b": 3}' ); +json_merge( '{ "a": 2 }', '{ "b": 3}' ) +{"a": 2, "b": 3} +select json_merge( '[1, 2]', '{ "a": 2 }' ); +json_merge( '[1, 2]', '{ "a": 2 }' ) +[1, 2, {"a": 2}] +select json_merge( '{ "a": 2 }', '[1, 2]' ); +json_merge( '{ "a": 2 }', '[1, 2]' ) +[{"a": 2}, 1, 2] +select json_merge( '{"a": 1, "b": 2 }', '{"b": 3, "d": 4 }' ); +json_merge( '{"a": 1, "b": 2 }', '{"b": 3, "d": 4 }' ) +{"a": 1, "b": [2, 3], "d": 4} +select json_merge( '{"a": 1, "b": 2 }', '{"b": [3, 4], "d": 4 }' ); +json_merge( '{"a": 1, "b": 2 }', '{"b": [3, 4], "d": 4 }' ) +{"a": 1, "b": [2, 3, 4], "d": 4} +select json_merge( '{"a": 1, "b": [2, 3] }', '{"b": 4, "d": 4 }' ); +json_merge( '{"a": 1, "b": [2, 3] }', '{"b": 4, "d": 4 }' ) +{"a": 1, "b": [2, 3, 4], "d": 4} +select json_merge( '{"a": 1, "b": 2 }', '{"b": {"e": 7, "f": 8}, "d": 4 }' ); +json_merge( '{"a": 1, "b": 2 }', '{"b": {"e": 7, "f": 8}, "d": 4 }' ) +{"a": 1, "b": [2, {"e": 7, "f": 8}], "d": 4} +select json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{"a": 1, "b": 2 }' ); +json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{"a": 1, "b": 2 }' ) +{"b": [{"e": 7, "f": 8}, 2], "d": 4, "a": 1} +select json_merge( '{"a": 1, "b": [2, 9] }', '{"b": [10, 11], "d": 4 }' ); +json_merge( '{"a": 1, "b": [2, 9] }', '{"b": [10, 11], "d": 4 }' ) +{"a": 1, "b": [2, 9, 10, 11], "d": 4} +select json_merge( '{"a": 1, "b": [2, 9] }', '{"b": {"e": 7, "f": 8}, "d": 4 }' ); +json_merge( '{"a": 1, "b": [2, 9] }', '{"b": {"e": 7, "f": 8}, "d": 4 }' ) +{"a": 1, "b": [2, 9, {"e": 7, "f": 8}], "d": 4} +select json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{"a": 1, "b": [2, 9] }' ); +json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{"a": 1, "b": [2, 9] }' ) +{"b": [{"e": 7, "f": 8}, 2, 9], "d": 4, "a": 1} +select json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{ "a": 1, "b": {"e": 20, "g": 21 } }' ); +json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{ "a": 1, "b": {"e": 20, "g": 21 } }' ) +{"b": {"e": [7, 20], "f": 8, "g": 21}, "d": 4, "a": 1} +select json_merge( '1', '2', '3' ); +json_merge( '1', '2', '3' ) +[1, 2, 3] +select json_merge( '[1, 2 ]', '3', '[4, 5]' ); +json_merge( '[1, 2 ]', '3', '[4, 5]' ) +[1, 2, 3, 4, 5] +select json_merge +( +'{ "a": true, "b": { "c": 3, "d": 4 }, "e": [ 1, 2 ] }', +'{ "d": false, "b": { "g": 3, "d": 5 }, "f": [ 1, 2 ] }', +'{ "m": true, "b": { "h": 8, "d": 4 }, "e": [ 3, 4 ] }' +); +json_merge +( +'{ "a": true, "b": { "c": 3, "d": 4 }, "e": [ 1, 2 ] }', +'{ "d": false, "b": { "g": 3, "d": 5 }, "f": [ 1, 2 ] }', +'{ "m": true, "b": { "h": 8, "d": 4 }, "e": [ 3, 4 ] }' +) +{"a": true, "b": {"c": 3, "d": [4, 5, 4], "g": 3, "h": 8}, "e": [1, 2, 3, 4], "d": false, "f": [1, 2], "m": true} +SELECT JSON_MERGE +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'[ 5, 6]' +); +JSON_MERGE +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'[ 5, 6]' +) +[{"a": "foo", "b": [true, {"c": 123}]}, 5, 6] +SELECT JSON_MERGE +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'{ "b": [ false, 34 ] }' +); +JSON_MERGE +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'{ "b": [ false, 34 ] }' +) +{"a": "foo", "b": [true, {"c": 123}, false, 34]} +SELECT JSON_MERGE +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'{ "b": "bar" }' +); +JSON_MERGE +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'{ "b": "bar" }' +) +{"a": "foo", "b": [true, {"c": 123}, "bar"]} +SELECT JSON_MERGE +( +'{ "a" : { "b" : 1 } }', +'{ "a" : { "c" : 1 } }' +); +JSON_MERGE +( +'{ "a" : { "b" : 1 } }', +'{ "a" : { "c" : 1 } }' +) +{"a": {"b": 1, "c": 1}} +# ---------------------------------------------------------------------- +# Test of JSON_TYPE function. +# ---------------------------------------------------------------------- +error ER_INVALID_JSON_TEXT_IN_PARAM +select json_type('abc'); +json_type('abc') +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_type' at position 1 +select json_type('{"a": 2}'); +json_type('{"a": 2}') +OBJECT +select json_type('[1,2]'); +json_type('[1,2]') +ARRAY +select json_type('"scalar string"'); +json_type('"scalar string"') +STRING +select json_type('true'); +json_type('true') +BOOLEAN +select json_type('false'); +json_type('false') +BOOLEAN +select json_type('null'); +json_type('null') +NULL +select json_type('1'); +json_type('1') +INTEGER +select json_type('-0'); +json_type('-0') +INTEGER +select json_type('-0.0'); +json_type('-0.0') +DOUBLE +error ER_INVALID_TYPE_FOR_JSON +select json_type(-1); +json_type(-1) +INTEGER +error ER_INVALID_TYPE_FOR_JSON +select json_type(CAST(1 AS UNSIGNED)); +json_type(CAST(1 AS UNSIGNED)) +INTEGER +select json_type('32767'); +json_type('32767') +INTEGER +error ER_INVALID_TYPE_FOR_JSON +select json_type(PI()); +json_type(PI()) +DOUBLE +select json_type('3.14'); +json_type('3.14') +DOUBLE +error ER_INVALID_JSON_TEXT_IN_PARAM +select json_type(CAST(CAST('2015-01-15' AS DATE) as CHAR CHARACTER SET 'utf8')); +json_type(CAST(CAST('2015-01-15' AS DATE) as CHAR CHARACTER SET 'utf8')) +INTEGER +# ---------------------------------------------------------------------- +# Test of json_compact(literal) +# ---------------------------------------------------------------------- +select json_type(json_compact(cast('2014-11-25 18:00' as datetime))); +json_type(json_compact(cast('2014-11-25 18:00' as datetime))) +INTEGER +select json_type(json_compact(cast('2014-11-25' as date))); +json_type(json_compact(cast('2014-11-25' as date))) +INTEGER +select json_type(json_compact(cast('18:00:59' as time))); +json_type(json_compact(cast('18:00:59' as time))) +INTEGER +select json_type(json_compact(127)); +json_type(json_compact(127)) +INTEGER +select json_type(json_compact(255)); +json_type(json_compact(255)) +INTEGER +select json_type(json_compact(32767)); +json_type(json_compact(32767)) +INTEGER +select json_type(json_compact(65535)); +json_type(json_compact(65535)) +INTEGER +select json_type(json_compact(8388607)); +json_type(json_compact(8388607)) +INTEGER +select json_type(json_compact(16777215)); +json_type(json_compact(16777215)) +INTEGER +select json_type(json_compact(2147483647)); +json_type(json_compact(2147483647)) +INTEGER +select json_type(json_compact(4294967295)); +json_type(json_compact(4294967295)) +INTEGER +select json_type(json_compact(9223372036854775807)); +json_type(json_compact(9223372036854775807)) +INTEGER +select json_type(json_compact(18446744073709551615)); +json_type(json_compact(18446744073709551615)) +INTEGER +select json_type(json_compact(true)); +json_type(json_compact(true)) +INTEGER +select json_type(json_compact(b'10101')); +json_type(json_compact(b'10101')) +NULL +Warnings: +Warning 4036 Character disallowed in JSON in argument 1 to function 'json_type' at position 1 +select json_type(json_compact(cast(3.14 as decimal(5,2)))); +json_type(json_compact(cast(3.14 as decimal(5,2)))) +DOUBLE +select json_type(json_compact(3.14)); +json_type(json_compact(3.14)) +DOUBLE +select json_type(json_compact(3.14E30)); +json_type(json_compact(3.14E30)) +DOUBLE +select json_type(json_compact(cast('10101abcde' as binary))); +json_type(json_compact(cast('10101abcde' as binary))) +INTEGER +select json_type(json_compact(ST_GeomFromText('POINT(1 1)'))); +json_type(json_compact(ST_GeomFromText('POINT(1 1)'))) +NULL +Warnings: +Warning 4036 Character disallowed in JSON in argument 1 to function 'json_type' at position 1 +select json_type(json_compact(ST_GeomFromText('LINESTRING(0 0,1 1,2 2)'))); +json_type(json_compact(ST_GeomFromText('LINESTRING(0 0,1 1,2 2)'))) +NULL +Warnings: +Warning 4036 Character disallowed in JSON in argument 1 to function 'json_type' at position 1 +select json_type(json_compact(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0), + (5 5,7 5,7 7,5 7, 5 5))'))); +json_type(json_compact(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0), + (5 5,7 5,7 7,5 7, 5 5))'))) +NULL +Warnings: +Warning 4036 Character disallowed in JSON in argument 1 to function 'json_type' at position 1 +select json_type(json_compact(null)); +json_type(json_compact(null)) +NULL +select json_type(json_compact(null)) is null; +json_type(json_compact(null)) is null +1 +select json_type(null) is null; +json_type(null) is null +1 +select json_compact(cast('2014-11-25 18:00' as datetime)); +json_compact(cast('2014-11-25 18:00' as datetime)) +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_compact' at position 5 +select json_compact(cast('2014-11-25' as date)); +json_compact(cast('2014-11-25' as date)) +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_compact' at position 5 +select json_compact(cast('18:00:59' as time)); +json_compact(cast('18:00:59' as time)) +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_compact' at position 3 +select json_compact(127); +json_compact(127) +127 +select json_compact(255); +json_compact(255) +255 +select json_compact(32767); +json_compact(32767) +32767 +select json_compact(65535); +json_compact(65535) +65535 +select json_compact(8388607); +json_compact(8388607) +8388607 +select json_compact(16777215); +json_compact(16777215) +16777215 +select json_compact(2147483647); +json_compact(2147483647) +2147483647 +select json_compact(4294967295); +json_compact(4294967295) +4294967295 +select json_compact(9223372036854775807); +json_compact(9223372036854775807) +9223372036854775807 +select json_compact(18446744073709551615); +json_compact(18446744073709551615) +18446744073709551615 +select json_compact(true); +json_compact(true) +1 +select json_compact(b'10101'); +json_compact(b'10101') +NULL +Warnings: +Warning 4036 Character disallowed in JSON in argument 1 to function 'json_compact' at position 1 +select json_compact(cast(3.14 as decimal(5,2))); +json_compact(cast(3.14 as decimal(5,2))) +3.14 +select json_compact(3.14); +json_compact(3.14) +3.14 +select json_compact(3.14e0); +json_compact(3.14e0) +3.14 +select json_compact(cast('10101abcde' as binary)); +json_compact(cast('10101abcde' as binary)) +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_compact' at position 6 +select json_compact(ST_GeomFromText('POINT(1 1)')); +json_compact(ST_GeomFromText('POINT(1 1)')) +NULL +Warnings: +Warning 4036 Character disallowed in JSON in argument 1 to function 'json_compact' at position 1 +select json_compact(ST_GeomFromText('LINESTRING(0 0,1 1,2 2)')); +json_compact(ST_GeomFromText('LINESTRING(0 0,1 1,2 2)')) +NULL +Warnings: +Warning 4036 Character disallowed in JSON in argument 1 to function 'json_compact' at position 1 +select json_compact(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0), + (5 5,7 5,7 7,5 7, 5 5))')); +json_compact(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0), + (5 5,7 5,7 7,5 7, 5 5))')) +NULL +Warnings: +Warning 4036 Character disallowed in JSON in argument 1 to function 'json_compact' at position 1 +select json_compact(null); +json_compact(null) +NULL +select json_compact(null) is null; +json_compact(null) is null +1 +# ---------------------------------------------------------------------- +# Test of JSON_KEYS function. +# ---------------------------------------------------------------------- +select json_keys(NULL); +json_keys(NULL) +NULL +select json_keys(NULL, '$.b'); +json_keys(NULL, '$.b') +NULL +select json_keys(NULL, NULL); +json_keys(NULL, NULL) +NULL +select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a'); +json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a') +NULL +select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', NULL); +json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', NULL) +NULL +select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}'); +json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}') +["a", "b"] +select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.b'); +json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.b') +["e", "b"] +error ER_INVALID_JSON_PATH_WILDCARD +select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.*.b'); +json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.*.b') +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_keys' +# returns [ "a", "b" ] +SELECT JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }'); +JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }') +["a", "b"] +# returns [] +SELECT JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : {} } ] }', +'$.b[1].c'); +JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : {} } ] }', +'$.b[1].c') +[] +# returns NULL +SELECT JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : {} } ] }', +'$.a.b[2]'); +JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : {} } ] }', +'$.a.b[2]') +NULL +error ER_INVALID_JSON_PATH +SELECT JSON_KEYS('{"a":1}', '1010'); +JSON_KEYS('{"a":1}', '1010') +NULL +Warnings: +Warning 4042 Syntax error in JSON path in argument 2 to function 'json_keys' at position 1 +error ER_INVALID_JSON_PATH +SELECT JSON_KEYS('{"a":1}', '1010') IS NULL; +JSON_KEYS('{"a":1}', '1010') IS NULL +1 +Warnings: +Warning 4042 Syntax error in JSON path in argument 2 to function 'json_keys' at position 1 +SELECT JSON_KEYS +( +'{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }' +); +JSON_KEYS +( +'{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }' +) +["a", "b"] +SELECT JSON_KEYS +( +'{ "a" : "foo", "b" : [ true, { "c" : {} } ] }', +'$.b[1].c' +); +JSON_KEYS +( +'{ "a" : "foo", "b" : [ true, { "c" : {} } ] }', +'$.b[1].c' +) +[] +SELECT JSON_KEYS +( +'{ "a" : "foo", "b" : [ true, { "c" : {} } ] }', +'$.a.b[2]' +); +JSON_KEYS +( +'{ "a" : "foo", "b" : [ true, { "c" : {} } ] }', +'$.a.b[2]' +) +NULL +SELECT JSON_KEYS(); +ERROR 42000: Incorrect parameter count in the call to native function 'JSON_KEYS' +SELECT JSON_KEYS('{}', '$', '$'); +ERROR 42000: Incorrect parameter count in the call to native function 'JSON_KEYS' +# ---------------------------------------------------------------------- +# CAST(<json> AS CHAR). See also 'json_conversions.test' for other +# conversion tests. +# ---------------------------------------------------------------------- +select cast(json_keys('{"a": 1}') as char); +cast(json_keys('{"a": 1}') as char) +["a"] +select cast(json_compact(1) as char); +cast(json_compact(1) as char) +1 +select cast(json_keys(NULL) as char); +cast(json_keys(NULL) as char) +NULL +# ---------------------------------------------------------------------- +# Path matching with double-quotes +# ---------------------------------------------------------------------- +select json_extract( '{ "one potato" : 1 }', '$."one potato"' ); +json_extract( '{ "one potato" : 1 }', '$."one potato"' ) +1 +select json_extract( '{ "a.b" : 1 }', '$."a.b"' ); +json_extract( '{ "a.b" : 1 }', '$."a.b"' ) +1 +select json_extract( '{ "\\"a\\"": 1}', '$."a"' ); +json_extract( '{ "\\"a\\"": 1}', '$."a"' ) +NULL +select json_extract( '{ "\\"a\\"": 1}', '$."\\"a\\""' ); +json_extract( '{ "\\"a\\"": 1}', '$."\\"a\\""' ) +1 +select json_extract( '{ "a": 1}', '$."a"' ); +json_extract( '{ "a": 1}', '$."a"' ) +1 +select json_extract( '{ "a": 1}', '$.a' ); +json_extract( '{ "a": 1}', '$.a' ) +1 +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[0]' ); +json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[0]' ) +[3, 2] +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[0][1]' ); +json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[0][1]' ) +2 +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1]' ); +json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1]' ) +[{"c": "d"}, 1] +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1][0]' ); +json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1][0]' ) +{"c": "d"} +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1][0].c' ); +json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1][0].c' ) +"d" +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$."one potato"' ); +json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$."one potato"' ) +7 +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.b.c' ); +json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.b.c' ) +6 +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$."b.c"' ); +json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$."b.c"' ) +8 +# ---------------------------------------------------------------------- +# Test of JSON_EXTRACT function. +# ---------------------------------------------------------------------- +select json_extract(NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_extract' +select json_extract('$.b'); +ERROR 42000: Incorrect parameter count in the call to native function 'json_extract' +select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}'); +ERROR 42000: Incorrect parameter count in the call to native function 'json_extract' +error ER_INVALID_JSON_TEXT_IN_PARAM +select json_extract('$.a', '{"a": 1, "b": {"e": "foo", "b": 3}}'); +json_extract('$.a', '{"a": 1, "b": {"e": "foo", "b": 3}}') +NULL +Warnings: +Warning 4042 Syntax error in JSON path in argument 2 to function 'json_extract' at position 1 +select json_extract(NULL, '$.b'); +json_extract(NULL, '$.b') +NULL +select json_extract(NULL, NULL); +json_extract(NULL, NULL) +NULL +select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a'); +json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a') +1 +select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.*'); +json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.*') +[1, {"e": "foo", "b": 3}] +select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a', '$.b.e'); +json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a', '$.b.e') +[1, "foo"] +select json_extract('{"a": 1, "b": [1,2,3]}', '$.b[2]'); +json_extract('{"a": 1, "b": [1,2,3]}', '$.b[2]') +3 +select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a', NULL); +json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a', NULL) +NULL +# returns a JSON value containing just the string "123" +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }', +'$.b[ 1 ].c'); +JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }', +'$.b[ 1 ].c') +"123" +# returns a JSON value containing just the number 123 +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c'); +JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c') +123 +# raises an error because the document is not valid +error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_EXTRACT('{ "a" : [ }', +'$.b[ 1 ].c'); +JSON_EXTRACT('{ "a" : [ }', +'$.b[ 1 ].c') +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 11 +# raises an error because the path is invalid +error ER_INVALID_JSON_PATH +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].'); +JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].') +NULL +Warnings: +Warning 4041 Unexpected end of JSON path in argument 2 to function 'json_extract' +# returns a JSON value containing the number 123 (because of +# auto-wrapping the scalar) +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c[ 0 ]'); +JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c[ 0 ]') +123 +# returns a JSON value containing the object because of auto-wrapping +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : {"not array": 4} } ] }', +'$.b[ 1 ].c[ 0 ]'); +JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : {"not array": 4} } ] }', +'$.b[ 1 ].c[ 0 ]') +{"not array": 4} +# returns null because the path, although valid, does not identify a value +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c[ 1 ]'); +JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c[ 1 ]') +NULL +# returns a JSON value containing the number 123 (due to normalization) +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.b[ 1 ].c'); +JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.b[ 1 ].c') +123 +# returns a JSON array [ "foo", true ] +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.a', '$.b[0]'); +JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.a', '$.b[0]') +["foo", true] +# returns a JSON array [ true ] +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.d', '$.b[0]'); +JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.d', '$.b[0]') +[true] +select json_extract( '[1]', '$[0][0]' ); +json_extract( '[1]', '$[0][0]' ) +1 +select json_extract( '[1]', '$**[0]' ); +json_extract( '[1]', '$**[0]' ) +[1] +select json_extract( '{ "a": 1 }', '$.a[0]' ); +json_extract( '{ "a": 1 }', '$.a[0]' ) +1 +select json_extract( '{ "a": 1 }', '$**[0]' ); +json_extract( '{ "a": 1 }', '$**[0]' ) +[{"a": 1}, 1] +select json_extract( '{ "a": 1 }', '$[0].a' ); +json_extract( '{ "a": 1 }', '$[0].a' ) +1 +select json_extract( '{ "a": 1 }', '$**.a' ); +json_extract( '{ "a": 1 }', '$**.a' ) +[1] +select json_extract( '{ "a": 1 }', '$[0].a[0]' ); +json_extract( '{ "a": 1 }', '$[0].a[0]' ) +1 +select json_extract( '{ "a": 1 }', '$**[0]' ); +json_extract( '{ "a": 1 }', '$**[0]' ) +[{"a": 1}, 1] +select json_extract( '{ "a": 1 }', '$[0].a' ); +json_extract( '{ "a": 1 }', '$[0].a' ) +1 +select json_extract( '{ "a": 1 }', '$**.a' ); +json_extract( '{ "a": 1 }', '$**.a' ) +[1] +select json_extract( '{ "a": 1 }', '$[0][0].a' ); +json_extract( '{ "a": 1 }', '$[0][0].a' ) +1 +select json_extract( '{ "a": 1 }', '$[0][0][0].a' ); +json_extract( '{ "a": 1 }', '$[0][0][0].a' ) +1 +SELECT JSON_EXTRACT('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', '$**.a.*'); +JSON_EXTRACT('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', '$**.a.*') +[{"c": 42}] +SELECT JSON_EXTRACT('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', +'$[1][0][0].x[0].a.*'); +JSON_EXTRACT('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', +'$[1][0][0].x[0].a.*') +[{"c": 42}] +SELECT JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }', +'$.b[ 1 ].c' +); +JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }', +'$.b[ 1 ].c' +) +"123" +SELECT JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c' +); +JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c' +) +123 +error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_EXTRACT +( +'{ "a" : [ }', +'$.b[ 1 ].c' +); +JSON_EXTRACT +( +'{ "a" : [ }', +'$.b[ 1 ].c' +) +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 11 +error ER_INVALID_JSON_PATH +SELECT JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].' +); +JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].' +) +NULL +Warnings: +Warning 4041 Unexpected end of JSON path in argument 2 to function 'json_extract' +SELECT JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c[ 0 ]' +); +JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c[ 0 ]' +) +123 +SELECT JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c[ 1 ]' +); +JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', +'$.b[ 1 ].c[ 1 ]' +) +NULL +SELECT JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.b[ 1 ].c' +); +JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.b[ 1 ].c' +) +123 +SELECT JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.a', '$.b[0]' +); +JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.a', '$.b[0]' +) +["foo", true] +SELECT JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.d', '$.b[0]' +); +JSON_EXTRACT +( +'{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', +'$.d', '$.b[0]' +) +[true] +select json_extract( '[ { "a": 1 }, { "a": 2 } ]', '$[*].b' ) jdoc; +jdoc +NULL +select json_extract( '[ { "a": 1 }, { "a": 2 } ]', '$[0].b' ) jdoc; +jdoc +NULL +select json_extract( '[ { "a": 1 }, { "a": 2 } ]', '$[0].a' ) jdoc; +jdoc +1 +select json_extract( '[ { "a": 1 }, { "a": 2 } ]', '$[*].a' ) jdoc; +jdoc +[1, 2] +select json_extract( '[ { "a": 1 }, { "b": 2 } ]', '$[*].a' ) jdoc; +jdoc +[1] +select json_extract( '[ { "a": [3,4] }, { "b": 2 } ]', '$[0].a' ) jdoc; +jdoc +[3, 4] +select json_extract( '[ { "a": [3,4] }, { "b": 2 } ]', '$[*].a' ) jdoc; +jdoc +[[3, 4]] +select json_extract( '[ { "a": [3,4] }, { "b": 2 } ]', '$[0].a', '$[1].a' ) jdoc; +jdoc +[[3, 4]] +# ---------------------------------------------------------------------- +# Test of JSON_ARRAY_APPEND function. +# ---------------------------------------------------------------------- +select json_array_append(NULL, '$.b', json_compact(1)); +json_array_append(NULL, '$.b', json_compact(1)) +NULL +select json_array_append('[1,2,3]', NULL, json_compact(1)); +json_array_append('[1,2,3]', NULL, json_compact(1)) +NULL +select json_array_append('[1,2,3]', '$', NULL); +json_array_append('[1,2,3]', '$', NULL) +[1, 2, 3, null] +select json_array_append(NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_array_append' +select json_array_append(NULL, NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_array_append' +select json_array_append(NULL, NULL, NULL, NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_array_append' +SELECT JSON_ARRAY_APPEND(json_compact('1'), '$', 3); +JSON_ARRAY_APPEND(json_compact('1'), '$', 3) +[1, 3] +SELECT JSON_ARRAY_APPEND(json_compact('{"a": 3}'), '$', 3); +JSON_ARRAY_APPEND(json_compact('{"a": 3}'), '$', 3) +[{"a": 3}, 3] +error ER_INVALID_JSON_PATH_WILDCARD +select json_array_append(json_compact('{"a": {"b": [3]}}'), '$**[0]', 6); +json_array_append(json_compact('{"a": {"b": [3]}}'), '$**[0]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_array_append' +# Auto-wrapping, since because the paths identify scalars. +# should return {"a": "foo", "b": ["bar", 4], "c": ["wibble", "grape"]} +SELECT JSON_ARRAY_APPEND('{"a": "foo", "b": "bar", "c": "wibble"}', +'$.b', json_compact(4), +'$.c', json_compact('"grape"')); +JSON_ARRAY_APPEND('{"a": "foo", "b": "bar", "c": "wibble"}', +'$.b', json_compact(4), +'$.c', json_compact('"grape"')) +{"a": "foo", "b": ["bar", 4], "c": ["wibble", "grape"]} +# should return {"a": "foo", "b": [1, 2, 3, 4], +# "c": ["apple", "pear", "grape"]} +SELECT JSON_ARRAY_APPEND('{"a" : "foo","b": [1, 2, 3], "c": ["apple", "pear"]}', +'$.b', json_compact(4), +'$.c', json_compact('"grape"')); +JSON_ARRAY_APPEND('{"a" : "foo","b": [1, 2, 3], "c": ["apple", "pear"]}', +'$.b', json_compact(4), +'$.c', json_compact('"grape"')) +{"a": "foo", "b": [1, 2, 3, 4], "c": ["apple", "pear", "grape"]} +SELECT JSON_ARRAY_APPEND('{"a" : "foo","b": [1, 2, 3], "c": ["apple", "pear"]}', +'$.b', 4, +'$.c', 'grape'); +JSON_ARRAY_APPEND('{"a" : "foo","b": [1, 2, 3], "c": ["apple", "pear"]}', +'$.b', 4, +'$.c', 'grape') +{"a": "foo", "b": [1, 2, 3, 4], "c": ["apple", "pear", "grape"]} +error ER_INVALID_JSON_PATH_WILDCARD +select json_array_append( '[[], [], []]', '$[*]', 3, '$[*]', 4); +json_array_append( '[[], [], []]', '$[*]', 3, '$[*]', 4) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_array_append' +error ER_INVALID_JSON_PATH_WILDCARD +select json_array_append( '[[], "not array", []]', '$[*]', 3, '$[*]', 4); +json_array_append( '[[], "not array", []]', '$[*]', 3, '$[*]', 4) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_array_append' +SELECT JSON_ARRAY_APPEND +( +'{ "a" : "foo", "b" : "bar", "c" : "wibble" }', +'$.b', 4, +'$.c', "grape" +); +JSON_ARRAY_APPEND +( +'{ "a" : "foo", "b" : "bar", "c" : "wibble" }', +'$.b', 4, +'$.c', "grape" +) +{"a": "foo", "b": ["bar", 4], "c": ["wibble", "grape"]} +SELECT JSON_ARRAY_APPEND +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ], "c" : [ "apple", "pear" ] }', +'$.b', 4, +'$.c', "grape" +); +JSON_ARRAY_APPEND +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ], "c" : [ "apple", "pear" ] }', +'$.b', 4, +'$.c', "grape" +) +{"a": "foo", "b": [1, 2, 3, 4], "c": ["apple", "pear", "grape"]} +# ---------------------------------------------------------------------- +# Bug#21373874 ASSERTION `PARENT' FAILED +# ---------------------------------------------------------------------- +select json_array_append('{"a":1}', '$[0]', 100); +json_array_append('{"a":1}', '$[0]', 100) +[{"a": 1}, 100] +select json_array_append('3', '$[0]', 100); +json_array_append('3', '$[0]', 100) +[3, 100] +select json_array_append('3', '$[0][0][0][0]', 100); +json_array_append('3', '$[0][0][0][0]', 100) +[3, 100] +# ---------------------------------------------------------------------- +# Test of JSON_INSERT function. +# ---------------------------------------------------------------------- +select json_insert(NULL, '$.b', json_compact(1)); +json_insert(NULL, '$.b', json_compact(1)) +NULL +select json_insert('[1,2,3]', NULL, json_compact(1)); +json_insert('[1,2,3]', NULL, json_compact(1)) +NULL +select json_insert('[1,2,3]', '$[3]', NULL); +json_insert('[1,2,3]', '$[3]', NULL) +[1, 2, 3, null] +select json_insert(NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_insert' +select json_insert(NULL, NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_insert' +select json_insert(NULL, NULL, NULL, NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_insert' +select json_insert('[1,2,3]', '$[2]', 4); +json_insert('[1,2,3]', '$[2]', 4) +[1, 2, 3] +select json_insert('[1,2,3]', '$[3]', 4); +json_insert('[1,2,3]', '$[3]', 4) +[1, 2, 3, 4] +select json_insert('[1,2,3]', '$[10]', 4); +json_insert('[1,2,3]', '$[10]', 4) +[1, 2, 3, 4] +select json_insert('{"c":4}', '$.c', 4); +json_insert('{"c":4}', '$.c', 4) +{"c": 4} +select json_insert('{"c":4}', '$.a', 4); +json_insert('{"c":4}', '$.a', 4) +{"c": 4, "a": 4} +select json_insert('1', '$', 4); +json_insert('1', '$', 4) +1 +select json_insert('1', '$[0]', 4); +json_insert('1', '$[0]', 4) +1 +select json_insert('1', '$[1]', 4); +json_insert('1', '$[1]', 4) +[1, 4] +select json_insert('1', '$[10]', '4', '$[11]', 5); +json_insert('1', '$[10]', '4', '$[11]', 5) +[1, "4", 5] +select json_insert('[1,2,3]', '$[2][0]', 4); +json_insert('[1,2,3]', '$[2][0]', 4) +[1, 2, 3] +select json_insert('[1,2,3]', '$[2][2]', 4); +json_insert('[1,2,3]', '$[2][2]', 4) +[1, 2, [3, 4]] +select json_insert('{"a": 3}', '$.a[0]', 4); +json_insert('{"a": 3}', '$.a[0]', 4) +{"a": 3} +select json_insert('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5'); +json_insert('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5') +{"a": [3, 4, "5"]} +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('{"a": [1], "b": 2}'), '$.*[1]', 6); +json_insert(json_compact('{"a": [1], "b": 2}'), '$.*[1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('{"a": 1, "b": 2}'), '$.*[1]', 6); +json_insert(json_compact('{"a": 1, "b": 2}'), '$.*[1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('{"a": {"b": 3}}'), '$.a.*[1]', 6); +json_insert(json_compact('{"a": {"b": 3}}'), '$.a.*[1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('{"a": {"b": [3]}}'), '$.a.*[1]', 6); +json_insert(json_compact('{"a": {"b": [3]}}'), '$.a.*[1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('{"a": {"b": 3}}'), '$**[1]', 6); +json_insert(json_compact('{"a": {"b": 3}}'), '$**[1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('{"a": {"b": [3]}}'), '$**[1]', 6); +json_insert(json_compact('{"a": {"b": [3]}}'), '$**[1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('[1]'), '$[*][1]', 6); +json_insert(json_compact('[1]'), '$[*][1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('[1]'), '$**[1]', 6); +json_insert(json_compact('[1]'), '$**[1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('[1, [2], 3]'), '$[*][1]', 6); +json_insert(json_compact('[1, [2], 3]'), '$[*][1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('[1, [2], 3]'), '$**[1]', 6); +json_insert(json_compact('[1, [2], 3]'), '$**[1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('[[1]]'), '$[*][1]', 6); +json_insert(json_compact('[[1]]'), '$[*][1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('[[1]]'), '$**[1]', 6); +json_insert(json_compact('[[1]]'), '$**[1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +select json_insert(json_compact('{"a": 3}'), '$[1]', 6); +json_insert(json_compact('{"a": 3}'), '$[1]', 6) +[{"a": 3}, 6] +SELECT JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.a', true); +JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.a', true) +{"a": "foo", "b": [1, 2, 3]} +SELECT JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.c', 123); +JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.c', 123) +{"a": "foo", "b": [1, 2, 3], "c": 123} +SELECT JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.c', '123'); +JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.c', '123') +{"a": "foo", "b": [1, 2, 3], "c": "123"} +SELECT JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.a[1]', true); +JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.a[1]', true) +{"a": ["foo", true], "b": [1, 2, 3]} +SELECT JSON_INSERT('{ "a" : "foo"}', '$.b', true, '$.b', false); +JSON_INSERT('{ "a" : "foo"}', '$.b', true, '$.b', false) +{"a": "foo", "b": true} +SELECT JSON_INSERT +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.a', +true +); +JSON_INSERT +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.a', +true +) +{"a": "foo", "b": [1, 2, 3]} +SELECT JSON_INSERT +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.c', +123 +); +JSON_INSERT +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.c', +123 +) +{"a": "foo", "b": [1, 2, 3], "c": 123} +SELECT JSON_INSERT +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.c', +'123' +); +JSON_INSERT +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.c', +'123' +) +{"a": "foo", "b": [1, 2, 3], "c": "123"} +SELECT JSON_INSERT +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.a[1]', +true +); +JSON_INSERT +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.a[1]', +true +) +{"a": ["foo", true], "b": [1, 2, 3]} +SELECT JSON_INSERT +( +'{ "a" : "foo"}', +'$.b', true, +'$.b', false +); +JSON_INSERT +( +'{ "a" : "foo"}', +'$.b', true, +'$.b', false +) +{"a": "foo", "b": true} +# ---------------------------------------------------------------------- +# Test of JSON_ARRAY_INSERT function. +# ---------------------------------------------------------------------- +select json_array_insert(NULL, '$.b[1]', 1); +json_array_insert(NULL, '$.b[1]', 1) +NULL +select json_array_insert('[1,2,3]', NULL, 1); +json_array_insert('[1,2,3]', NULL, 1) +NULL +select json_array_insert('[1,2,3]', '$[3]', NULL); +json_array_insert('[1,2,3]', '$[3]', NULL) +[1, 2, 3, null] +select json_array_insert(NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_array_insert' +select json_array_insert(NULL, NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_array_insert' +select json_array_insert(NULL, NULL, NULL, NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_array_insert' +error ER_INVALID_JSON_PATH_ARRAY_CELL +select json_array_insert('true', '$', 1); +json_array_insert('true', '$', 1) +NULL +error ER_INVALID_JSON_PATH_ARRAY_CELL +select json_array_insert('true', '$.a', 1); +json_array_insert('true', '$.a', 1) +NULL +error ER_INVALID_JSON_PATH_ARRAY_CELL +select json_array_insert('true', '$.a[1].b', 1); +json_array_insert('true', '$.a[1].b', 1) +NULL +select json_array_insert( 'true', '$[0]', false ); +json_array_insert( 'true', '$[0]', false ) +true +select json_array_insert( 'true', '$[1]', false ); +json_array_insert( 'true', '$[1]', false ) +true +select json_array_insert( '{ "a": true }', '$.a[0]', false ); +json_array_insert( '{ "a": true }', '$.a[0]', false ) +{"a": true} +select json_array_insert( '{ "a": true }', '$.a[1]', false ); +json_array_insert( '{ "a": true }', '$.a[1]', false ) +{"a": true} +select json_array_insert( '[]', '$[0]', false ); +json_array_insert( '[]', '$[0]', false ) +[false] +select json_array_insert( '[]', '$[1]', false ); +json_array_insert( '[]', '$[1]', false ) +[false] +select json_array_insert( '[true]', '$[0]', false ); +json_array_insert( '[true]', '$[0]', false ) +[false, true] +select json_array_insert( '[true]', '$[1]', false ); +json_array_insert( '[true]', '$[1]', false ) +[true, false] +select json_array_insert( '[true]', '$[2]', false ); +json_array_insert( '[true]', '$[2]', false ) +[true, false] +select json_array_insert( '{ "a": [] }', '$.a[0]', false ); +json_array_insert( '{ "a": [] }', '$.a[0]', false ) +{"a": [false]} +select json_array_insert( '{ "a": [] }', '$.a[1]', false ); +json_array_insert( '{ "a": [] }', '$.a[1]', false ) +{"a": [false]} +select json_array_insert( '{ "a": [true] }', '$.a[0]', false ); +json_array_insert( '{ "a": [true] }', '$.a[0]', false ) +{"a": [false, true]} +select json_array_insert( '{ "a": [true] }', '$.a[1]', false ); +json_array_insert( '{ "a": [true] }', '$.a[1]', false ) +{"a": [true, false]} +select json_array_insert( '{ "a": [true] }', '$.a[2]', false ); +json_array_insert( '{ "a": [true] }', '$.a[2]', false ) +{"a": [true, false]} +select json_array_insert( '[1, 2, 3, 4]', '$[0]', false ); +json_array_insert( '[1, 2, 3, 4]', '$[0]', false ) +[false, 1, 2, 3, 4] +select json_array_insert( '[1, 2, 3, 4]', '$[1]', false ); +json_array_insert( '[1, 2, 3, 4]', '$[1]', false ) +[1, false, 2, 3, 4] +select json_array_insert( '[1, 2, 3, 4]', '$[2]', false ); +json_array_insert( '[1, 2, 3, 4]', '$[2]', false ) +[1, 2, false, 3, 4] +select json_array_insert( '[1, 2, 3, 4]', '$[3]', false ); +json_array_insert( '[1, 2, 3, 4]', '$[3]', false ) +[1, 2, 3, false, 4] +select json_array_insert( '[1, 2, 3, 4]', '$[4]', false ); +json_array_insert( '[1, 2, 3, 4]', '$[4]', false ) +[1, 2, 3, 4, false] +select json_array_insert( '[1, 2, 3, 4]', '$[5]', false ); +json_array_insert( '[1, 2, 3, 4]', '$[5]', false ) +[1, 2, 3, 4, false] +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[0]', false ); +json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[0]', false ) +{"a": [false, 1, 2, 3, 4]} +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[1]', false ); +json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[1]', false ) +{"a": [1, false, 2, 3, 4]} +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[2]', false ); +json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[2]', false ) +{"a": [1, 2, false, 3, 4]} +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[3]', false ); +json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[3]', false ) +{"a": [1, 2, 3, false, 4]} +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[4]', false ); +json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[4]', false ) +{"a": [1, 2, 3, 4, false]} +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[5]', false ); +json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[5]', false ) +{"a": [1, 2, 3, 4, false]} +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.b[0]', false ); +json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.b[0]', false ) +{"a": [1, 2, 3, 4]} +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.b[1]', false ); +json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.b[1]', false ) +{"a": [1, 2, 3, 4]} +select json_array_insert( '"a"', '$[0]', true ); +json_array_insert( '"a"', '$[0]', true ) +"a" +select json_array_insert( '[ "a" ]', '$[0][0]', true ); +json_array_insert( '[ "a" ]', '$[0][0]', true ) +["a"] +select json_array_insert( '"a"', '$[1]', true ); +json_array_insert( '"a"', '$[1]', true ) +"a" +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert('[]', '$.a.*[1]', 6); +json_insert('[]', '$.a.*[1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert('[]', '$**[1]', 6); +json_insert('[]', '$**[1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +error ER_INVALID_JSON_PATH_WILDCARD +select json_insert('[]', '$[*][1]', 6); +json_insert('[]', '$[*][1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_insert' +select json_array_insert( '[ 1, 2, 3 ]', '$[1]', true, '$[1]', false ); +json_array_insert( '[ 1, 2, 3 ]', '$[1]', true, '$[1]', false ) +[1, false, true, 2, 3] +select json_array_insert( '[ 1, 2, 3 ]', '$[1]', +json_compact( '[ "a", "b", "c", "d" ]'), '$[1][2]', false ); +json_array_insert( '[ 1, 2, 3 ]', '$[1]', +json_compact( '[ "a", "b", "c", "d" ]'), '$[1][2]', false ) +[1, ["a", "b", false, "c", "d"], 2, 3] +error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_ARRAY_INSERT(JSON_EXTRACT('[1', '$'), '$[0]', 1); +JSON_ARRAY_INSERT(JSON_EXTRACT('[1', '$'), '$[0]', 1) +NULL +Warnings: +Warning 4037 Unexpected end of JSON text in argument 1 to function 'json_extract' +error ER_INVALID_JSON_TEXT_IN_PARAM +select json_array_insert( '[ 1, 2, 3 ]', '$[1]', json_extract( '[', '$' ) ); +json_array_insert( '[ 1, 2, 3 ]', '$[1]', json_extract( '[', '$' ) ) +[1, null, 2, 3] +Warnings: +Warning 4037 Unexpected end of JSON text in argument 1 to function 'json_extract' +# ---------------------------------------------------------------------- +# Test of JSON_SET function. +# ---------------------------------------------------------------------- +select json_set(NULL, '$.b', json_compact(1)); +json_set(NULL, '$.b', json_compact(1)) +NULL +select json_set('[1,2,3]', NULL, json_compact(1)); +json_set('[1,2,3]', NULL, json_compact(1)) +NULL +select json_set('[1,2,3]', '$[3]', NULL); +json_set('[1,2,3]', '$[3]', NULL) +[1, 2, 3, null] +select json_set(NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_set' +select json_set(NULL, NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_set' +select json_set(NULL, NULL, NULL, NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_set' +error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_SET('{}', '$.name', JSON_EXTRACT('', '$')); +JSON_SET('{}', '$.name', JSON_EXTRACT('', '$')) +{"name": null} +Warnings: +Warning 4037 Unexpected end of JSON text in argument 1 to function 'json_extract' +select json_set('[1,2,3]', '$[2]', 4); +json_set('[1,2,3]', '$[2]', 4) +[1, 2, 4] +select json_set('[1,2,3]', '$[3]', 4); +json_set('[1,2,3]', '$[3]', 4) +[1, 2, 3, 4] +select json_set('[1,2,3]', '$[10]', 4); +json_set('[1,2,3]', '$[10]', 4) +[1, 2, 3, 4] +select json_set('{"c":4}', '$.c', 5); +json_set('{"c":4}', '$.c', 5) +{"c": 5} +select json_set('{"c":4}', '$.a', 5); +json_set('{"c":4}', '$.a', 5) +{"c": 4, "a": 5} +select json_set('1', '$', 4); +json_set('1', '$', 4) +4 +select json_set('1', '$[0]', 4); +json_set('1', '$[0]', 4) +4 +select json_set('1', '$[1]', 4); +json_set('1', '$[1]', 4) +[1, 4] +select json_set('1', '$[10]', '4', '$[11]', 5); +json_set('1', '$[10]', '4', '$[11]', 5) +[1, "4", 5] +select json_set('[1,2,3]', '$[2][0]', 4); +json_set('[1,2,3]', '$[2][0]', 4) +[1, 2, 4] +select json_set('[1,2,3]', '$[2][2]', 4); +json_set('[1,2,3]', '$[2][2]', 4) +[1, 2, [3, 4]] +select json_set('{"a": 3}', '$.a[0]', 4); +json_set('{"a": 3}', '$.a[0]', 4) +{"a": 4} +select json_set('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5'); +json_set('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5') +{"a": [3, 4, "5"]} +error ER_INVALID_JSON_PATH_WILDCARD +select json_set(json_compact('{"a": {"b": [3]}}'), '$**[1]', 6); +json_set(json_compact('{"a": {"b": [3]}}'), '$**[1]', 6) +NULL +Warnings: +Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_set' +SELECT JSON_SET('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.a', +JSON_OBJECT()); +JSON_SET('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.a', +JSON_OBJECT()) +{"a": {}, "b": [1, 2, 3]} +SELECT JSON_SET('{ "a" : "foo"}', '$.a', +JSON_OBJECT( 'b', false ), '$.a.c', true); +JSON_SET('{ "a" : "foo"}', '$.a', +JSON_OBJECT( 'b', false ), '$.a.c', true) +{"a": {"b": false, "c": true}} +select json_set('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.a', +json_compact('{}')); +json_set('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.a', +json_compact('{}')) +{"a": {}, "b": [1, 2, 3]} +select json_set('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.c', +json_compact('[true, false]')); +json_set('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.c', +json_compact('[true, false]')) +{"a": "foo", "b": [1, 2, 3], "c": [true, false]} +select json_set('1', '$[3]', 2); +json_set('1', '$[3]', 2) +[1, 2] +select json_set('{ "a" : "foo"}', '$.a', +json_compact('{"b": false}'), '$.a.c', true); +json_set('{ "a" : "foo"}', '$.a', +json_compact('{"b": false}'), '$.a.c', true) +{"a": {"b": false, "c": true}} +SELECT JSON_SET +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.a', +JSON_OBJECT() +); +JSON_SET +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.a', +JSON_OBJECT() +) +{"a": {}, "b": [1, 2, 3]} +SELECT JSON_SET +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.c', +JSON_ARRAY( true, false ) +); +JSON_SET +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.c', +JSON_ARRAY( true, false ) +) +{"a": "foo", "b": [1, 2, 3], "c": [true, false]} +SELECT JSON_SET +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.c', +JSON_ARRAY( json_compact( 'true'), json_compact( 'false') ) +); +JSON_SET +( +'{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.c', +JSON_ARRAY( json_compact( 'true'), json_compact( 'false') ) +) +{"a": "foo", "b": [1, 2, 3], "c": [true, false]} +SELECT JSON_SET +( +'1', +'$[3]', +2 +); +JSON_SET +( +'1', +'$[3]', +2 +) +[1, 2] +SELECT JSON_SET +( +'{ "a" : "foo"}', +'$.a', JSON_OBJECT( 'b', false ), +'$.a.c', true +); +JSON_SET +( +'{ "a" : "foo"}', +'$.a', JSON_OBJECT( 'b', false ), +'$.a.c', true +) +{"a": {"b": false, "c": true}} +# ---------------------------------------------------------------------- +# Test of JSON_REPLACE function. +# ---------------------------------------------------------------------- +select json_replace(NULL, '$.b', json_compact(1)); +json_replace(NULL, '$.b', json_compact(1)) +NULL +select json_replace('[1,2,3]', NULL, json_compact(1)); +json_replace('[1,2,3]', NULL, json_compact(1)) +NULL +select json_replace('[1,2,3]', '$[2]', NULL); +json_replace('[1,2,3]', '$[2]', NULL) +[1, 2, null] +select json_replace(NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_replace' +select json_replace(NULL, NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_replace' +select json_replace(NULL, NULL, NULL, NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_replace' +select json_replace('[1,2,3]', '$[2]', 4); +json_replace('[1,2,3]', '$[2]', 4) +[1, 2, 4] +select json_replace('[1,2,3]', '$[3]', 4); +json_replace('[1,2,3]', '$[3]', 4) +[1, 2, 3] +select json_replace('[1,2,3]', '$[10]', 4); +json_replace('[1,2,3]', '$[10]', 4) +[1, 2, 3] +select json_replace('{"c":4}', '$.c', 5); +json_replace('{"c":4}', '$.c', 5) +{"c": 5} +select json_replace('{"c":4}', '$.a', 5); +json_replace('{"c":4}', '$.a', 5) +{"c": 4} +select json_replace('1', '$', 4); +json_replace('1', '$', 4) +4 +select json_replace('1', '$[0]', 4); +json_replace('1', '$[0]', 4) +4 +select json_replace('1', '$[1]', 4); +json_replace('1', '$[1]', 4) +1 +select json_replace('1', '$[10]', '4', '$[11]', 5); +json_replace('1', '$[10]', '4', '$[11]', 5) +1 +select json_replace('[1,2,3]', '$[2][0]', 4); +json_replace('[1,2,3]', '$[2][0]', 4) +[1, 2, 4] +select json_replace('[1,2,3]', '$[2][2]', 4); +json_replace('[1,2,3]', '$[2][2]', 4) +[1, 2, 3] +select json_replace('{"a": 3}', '$.a[0]', 4); +json_replace('{"a": 3}', '$.a[0]', 4) +{"a": 4} +select json_replace('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5'); +json_replace('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5') +{"a": 3} +SELECT JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.c', +true); +JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.c', +true) +{"a": "foo", "b": [1, 2, 3]} +SELECT JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.a[0]', +true); +JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.a[0]', +true) +{"a": true, "b": [1, 2, 3]} +SELECT JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.b[5]', +true); +JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +'$.b[5]', +true) +{"a": "foo", "b": [1, 2, 3]} +# ---------------------------------------------------------------------- +# Test of JSON_ARRAY function. +# ---------------------------------------------------------------------- +select json_array(NULL, '$.b', json_compact(1)); +json_array(NULL, '$.b', json_compact(1)) +[null, "$.b", 1] +select json_array('[1,2,3]', NULL, json_compact(1)); +json_array('[1,2,3]', NULL, json_compact(1)) +["[1,2,3]", null, 1] +select json_array('[1,2,3]', '$[3]', NULL); +json_array('[1,2,3]', '$[3]', NULL) +["[1,2,3]", "$[3]", null] +select json_array(); +json_array() +[] +select json_array(3.14); +json_array(3.14) +[3.14] +select json_array('[1,2,3]'); +json_array('[1,2,3]') +["[1,2,3]"] +select json_array(json_compact('[1,2,3]')); +json_array(json_compact('[1,2,3]')) +[[1,2,3]] +select json_array(1,2,3); +json_array(1,2,3) +[1, 2, 3] +select json_array(b'0', b'1', b'10'); +json_array(b'0', b'1', b'10') +["\u0000", "\u0001", "\u0002"] +SELECT JSON_ARRAY(); +JSON_ARRAY() +[] +# ---------------------------------------------------------------------- +# Test of JSON_OBJECT function. +# ---------------------------------------------------------------------- +select json_object( 'a' ); +ERROR 42000: Incorrect parameter count in the call to native function 'json_object' +select json_object( 'a', 1, 'b' ); +ERROR 42000: Incorrect parameter count in the call to native function 'json_object' +error ER_JSON_DOCUMENT_NULL_KEY +select json_object( null, 1 ); +json_object( null, 1 ) +{"": 1} +select json_object(); +json_object() +{} +select json_object( 'a', null ); +json_object( 'a', null ) +{"a": null} +select json_object( 'a', 1 ); +json_object( 'a', 1 ) +{"a": 1} +select json_object( 'a', 1, 'b', 'foo' ); +json_object( 'a', 1, 'b', 'foo' ) +{"a": 1, "b": "foo"} +select json_object( 'a', 1, 'b', 'foo', 'c', json_compact( '{ "d": "wibble" }') ); +json_object( 'a', 1, 'b', 'foo', 'c', json_compact( '{ "d": "wibble" }') ) +{"a": 1, "b": "foo", "c": { "d": "wibble" }} +select json_object( 'a', true, 'b', false, 'c', json_compact( 'null') ); +json_object( 'a', true, 'b', false, 'c', json_compact( 'null') ) +{"a": true, "b": false, "c": null} +select json_valid( json_object( '"a"', 1 ) ); +json_valid( json_object( '"a"', 1 ) ) +1 +select json_object( REPEAT('a', 64 * 1024), 1 ); +json_object( REPEAT('a', 64 * 1024), 1 ) +{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 1} +select json_object(json_array(), json_array()); +json_object(json_array(), json_array()) +{"[]": []} +select json_object( cast(json_array() as char), json_array()); +json_object( cast(json_array() as char), json_array()) +{"[]": []} +select json_object( 1, json_array()); +json_object( 1, json_array()) +{"1": []} +select json_object( cast(1 as char), json_array()); +json_object( cast(1 as char), json_array()) +{"1": []} +SELECT JSON_OBJECT(); +JSON_OBJECT() +{} +# ---------------------------------------------------------------------- +# Test of JSON_SEARCH function. +# ---------------------------------------------------------------------- +select json_search(); +ERROR 42000: Incorrect parameter count in the call to native function 'json_search' +select json_search( '{ "a": true }' ); +ERROR 42000: Incorrect parameter count in the call to native function 'json_search' +select json_search( '{ "a": true }', 'one' ); +ERROR 42000: Incorrect parameter count in the call to native function 'json_search' +select json_search( null, 'one', 'foo' ); +json_search( null, 'one', 'foo' ) +NULL +select json_search( '{ "a": "foo" }', null, 'foo' ); +json_search( '{ "a": "foo" }', null, 'foo' ) +NULL +select json_search( '{ "a": "foo" }', 'one', 'foo', null, null ); +json_search( '{ "a": "foo" }', 'one', 'foo', null, null ) +NULL +select json_search( '{ "a": "foo" }', 'one', 'foo', null, '$.a', null ); +json_search( '{ "a": "foo" }', 'one', 'foo', null, '$.a', null ) +NULL +error ER_JSON_BAD_ONE_OR_ALL_ARG +select json_search( '{ "a": "foo" }', 'twof', 'foo' ); +json_search( '{ "a": "foo" }', 'twof', 'foo' ) +NULL +Warnings: +Warning 4046 Argument 2 to function 'json_search' must be "one" or "all". +error ER_JSON_BAD_ONE_OR_ALL_ARG +select json_search( '{ "a": "foo" }', 'two', 'foo' ); +json_search( '{ "a": "foo" }', 'two', 'foo' ) +NULL +Warnings: +Warning 4046 Argument 2 to function 'json_search' must be "one" or "all". +select json_search( '{ "a": "foo" }', 'one', 'foo', 'ab' ); +ERROR HY000: Incorrect arguments to ESCAPE +error ER_INVALID_JSON_PATH +select json_search( '{ "a": "foo" }', 'one', 'foo', null, '$a' ); +json_search( '{ "a": "foo" }', 'one', 'foo', null, '$a' ) +NULL +Warnings: +Warning 4042 Syntax error in JSON path in argument 5 to function 'json_search' at position 2 +error ER_INVALID_JSON_PATH +select json_search( '{ "a": "foo" }', 'all', 'foo', null, '$.a', '$b' ); +json_search( '{ "a": "foo" }', 'all', 'foo', null, '$.a', '$b' ) +NULL +Warnings: +Warning 4042 Syntax error in JSON path in argument 6 to function 'json_search' at position 2 +select json_search(a, b, c); +ERROR 42S22: Unknown column 'a' in 'field list' +select json_search( '{ "a": "foobar" }', 'one', 'foo%' ); +json_search( '{ "a": "foobar" }', 'one', 'foo%' ) +"$.a" +select json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'one', 'foo%' ); +json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'one', 'foo%' ) +"$.a" +select json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'all', 'foo%' ); +json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'all', 'foo%' ) +["$.a", "$.c[1]"] +select json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'all', 'f__us' ); +json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'all', 'f__us' ) +"$.b" +select json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'all', 'foo%', null, '$.a' ); +json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'all', 'foo%', null, '$.a' ) +["$.a[0]", "$.a[2]"] +select json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'all', 'foo%', null, '$.a', '$.b' ); +json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'all', 'foo%', null, '$.a', '$.b' ) +["$.a[0]", "$.a[2]", "$.b"] +select json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'one', 'foo%', null, '$.a', '$.b' ); +json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'one', 'foo%', null, '$.a', '$.b' ) +"$.a[0]" +select json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'ALL', 'foo%', null, '$.a' ); +json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'ALL', 'foo%', null, '$.a' ) +["$.a[0]", "$.a[2]"] +select json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'aLl', 'foo%', null, '$.a', '$.b' ); +json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'aLl', 'foo%', null, '$.a', '$.b' ) +["$.a[0]", "$.a[2]", "$.b"] +select json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'ONE', 'foo%', null, '$.a', '$.b' ); +json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'ONE', 'foo%', null, '$.a', '$.b' ) +"$.a[0]" +select json_search +( +'[ { "a": { "b": { "c": "fool" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "food"} } ]', +'all', +'foo%', +null, +'$**.c' +); +json_search +( +'[ { "a": { "b": { "c": "fool" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "food"} } ]', +'all', +'foo%', +null, +'$**.c' +) +["$[0].a.b.c", "$[2].c.c"] +select json_search +( +'[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]', +'all', +'sho%', +null, +'$**.c' +); +json_search +( +'[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]', +'all', +'sho%', +null, +'$**.c' +) +["$[0].a.b.c", "$[1].b.c", "$[2].c.c"] +select json_search +( +'[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]', +'all', +'sho%e', +null, +'$**.c' +); +json_search +( +'[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]', +'all', +'sho%e', +null, +'$**.c' +) +["$[0].a.b.c", "$[2].c.c"] +select json_search +( +'[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]', +'all', +'sho%', +null, +'$[*].c' +); +json_search +( +'[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]', +'all', +'sho%', +null, +'$[*].c' +) +"$[2].c.c" +select json_search +( +'[ { "a": { "b": { "c": "showtime" } } }, [ { "b": { "c": "shout" } }, { "c": { "c": "shoe"} } ] ]', +'all', +'sho%', +null, +'$[1]**.c' +); +json_search +( +'[ { "a": { "b": { "c": "showtime" } } }, [ { "b": { "c": "shout" } }, { "c": { "c": "shoe"} } ] ]', +'all', +'sho%', +null, +'$[1]**.c' +) +["$[1][0].b.c", "$[1][1].c.c"] +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo%bar' ); +json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo%bar' ) +["$[0]", "$[1]"] +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar' ); +json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar' ) +"$[1]" +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|' ); +json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|' ) +"$[1]" +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]' ); +json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]' ) +NULL +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]', '$[1]' ); +json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]', '$[1]' ) +"$[1]" +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]', '$[1]', '$[2]' ); +json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]', '$[1]', '$[2]' ) +"$[1]" +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null ); +json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null ) +"$[1]" +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null, '$[0]' ); +json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null, '$[0]' ) +NULL +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null, '$[1]' ); +json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null, '$[1]' ) +"$[1]" +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]' ); +json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]' ) +NULL +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[1]' ); +json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[1]' ) +"$[1]" +select json_search( '[ "abc", "ABC" ]', 'all', 'aBc' ); +json_search( '[ "abc", "ABC" ]', 'all', 'aBc' ) +["$[0]", "$[1]"] +select json_search( '[ "abc", "ABC" ]', 'all', 'abc' ); +json_search( '[ "abc", "ABC" ]', 'all', 'abc' ) +["$[0]", "$[1]"] +select json_search( '[ "abc", "ABC" ]', 'all', 'ABC' ); +json_search( '[ "abc", "ABC" ]', 'all', 'ABC' ) +["$[0]", "$[1]"] +select json_search( '[ 10, "10", 1.0, "1.0" ]', 'all', '1%' ); +json_search( '[ 10, "10", 1.0, "1.0" ]', 'all', '1%' ) +["$[0]", "$[1]", "$[2]", "$[3]"] +SELECT JSON_SEARCH +( +'{ "a" : 123, "b" : [ 123, 456 ] }', +'one', +'123' +); +JSON_SEARCH +( +'{ "a" : 123, "b" : [ 123, 456 ] }', +'one', +'123' +) +"$.a" +SELECT JSON_SEARCH +( +'{ "a" : "123", "b" : [ 123, "789", "123", "456", "123" ] }', +'one', +'123', +null, +'$.b' +); +JSON_SEARCH +( +'{ "a" : "123", "b" : [ 123, "789", "123", "456", "123" ] }', +'one', +'123', +null, +'$.b' +) +"$.b[0]" +SELECT JSON_SEARCH +( +'{ "a" : "123", "b" : { "key" : "123" } }', +'one', +'123' +); +JSON_SEARCH +( +'{ "a" : "123", "b" : { "key" : "123" } }', +'one', +'123' +) +"$.a" +SELECT JSON_SEARCH +( +'{ "a" : "1243", "b" : { "key" : "1234" } }', +'one', +'123%' +); +JSON_SEARCH +( +'{ "a" : "1243", "b" : { "key" : "1234" } }', +'one', +'123%' +) +"$.b.key" +SELECT JSON_SEARCH +( +'{ "a" : "1243", "b" : { "key" : "1234", "c": "directorysub%directoryabc" } }', +'one', +'dir%torysub@%dir%', +'@' +); +JSON_SEARCH +( +'{ "a" : "1243", "b" : { "key" : "1234", "c": "directorysub%directoryabc" } }', +'one', +'dir%torysub@%dir%', +'@' +) +"$.b.c" +SELECT JSON_SEARCH +( +'{ "a" : "1243", "b" : { "key" : "1234" } }', +'one', +'123%', +null, +'$.c' +); +JSON_SEARCH +( +'{ "a" : "1243", "b" : { "key" : "1234" } }', +'one', +'123%', +null, +'$.c' +) +NULL +SELECT JSON_UNQUOTE +( +JSON_SEARCH +( +'{ "onepotato": "foot", "one potato": "food" , "one \\"potato": "fool" }', +'all', +'food' + ) +); +JSON_UNQUOTE +( +JSON_SEARCH +( +'{ "onepotato": "foot", "one potato": "food" , "one \\"potato": "fool" }', +'all', +'food' + ) +) +$.one potato +select json_type(case (null is null) when 1 then +json_compact('null') else +json_compact('[1,2,3]') end); +json_type(case (null is null) when 1 then +json_compact('null') else +json_compact('[1,2,3]') end) +NULL +select json_type(case (null is not null) when 1 then +json_compact('null') else +json_compact('[1,2,3]') end); +json_type(case (null is not null) when 1 then +json_compact('null') else +json_compact('[1,2,3]') end) +ARRAY +select json_type( if(null is null, +json_compact('null'), +json_compact('[1,2,3]')) ); +json_type( if(null is null, +json_compact('null'), +json_compact('[1,2,3]')) ) +NULL +select json_type( if(null is not null, +json_compact('null'), +json_compact('[1,2,3]'))); +json_type( if(null is not null, +json_compact('null'), +json_compact('[1,2,3]'))) +ARRAY +select cast(json_extract(json_compact(concat('[', json_compact('["A",2]'), ']')), +'$[0][1]') as char) = 2; +cast(json_extract(json_compact(concat('[', json_compact('["A",2]'), ']')), +'$[0][1]') as char) = 2 +1 +# ---------------------------------------------------------------------- +# Test of aggregate function MAX, MIN. +# ---------------------------------------------------------------------- +select max(json_compact('[1,2,3]')); +max(json_compact('[1,2,3]')) +[1,2,3] +# ---------------------------------------------------------------------- +# Test of JSON_QUOTE, JSON_UNQUOTE +# ---------------------------------------------------------------------- +select json_quote(); +ERROR 42000: Incorrect parameter count in the call to native function 'json_quote' +select json_quote('abc', 'def'); +ERROR 42000: Incorrect parameter count in the call to native function 'json_quote' +select json_quote(NULL, 'def'); +ERROR 42000: Incorrect parameter count in the call to native function 'json_quote' +select json_quote('abc', NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_quote' +select json_unquote(); +ERROR 42000: Incorrect parameter count in the call to native function 'json_unquote' +select json_unquote('"abc"', '"def"'); +ERROR 42000: Incorrect parameter count in the call to native function 'json_unquote' +select json_unquote(NULL, 'def'); +ERROR 42000: Incorrect parameter count in the call to native function 'json_unquote' +select json_unquote('"abc"', NULL); +ERROR 42000: Incorrect parameter count in the call to native function 'json_unquote' +select json_quote(NULL); +json_quote(NULL) +NULL +select json_unquote(NULL); +json_unquote(NULL) +NULL +select json_quote('abc'); +json_quote('abc') +"abc" +select json_quote(convert('abc' using ascii)); +json_quote(convert('abc' using ascii)) +"abc" +select json_quote(convert('abc' using latin1)); +json_quote(convert('abc' using latin1)) +"abc" +select json_quote(convert('abc' using utf8)); +json_quote(convert('abc' using utf8)) +"abc" +select json_quote(convert('abc' using utf8mb4)); +json_quote(convert('abc' using utf8mb4)) +"abc" +select json_unquote('abc'); +json_unquote('abc') +abc +select json_unquote('"abc"'); +json_unquote('"abc"') +abc +select json_unquote(convert('"abc"' using ascii)); +json_unquote(convert('"abc"' using ascii)) +abc +select json_unquote(convert('"abc"' using latin1)); +json_unquote(convert('"abc"' using latin1)) +abc +select json_unquote(convert('"abc"' using utf8)); +json_unquote(convert('"abc"' using utf8)) +abc +select json_unquote(convert('"abc"' using utf8mb4)); +json_unquote(convert('"abc"' using utf8mb4)) +abc +select json_quote('"'); +json_quote('"') +"\"" +select json_unquote('"'); +json_unquote('"') +" +Warnings: +Warning 4037 Unexpected end of JSON text in argument 1 to function 'json_unquote' +error ER_INCORRECT_TYPE +select json_quote(123); +json_quote(123) +NULL +error ER_INCORRECT_TYPE +select json_unquote(123); +json_unquote(123) +123 +select json_unquote('""'); +json_unquote('""') + +select char_length(json_unquote('""')); +char_length(json_unquote('""')) +0 +select json_unquote('"" '); +json_unquote('"" ') + +select json_unquote(json_compact(json_quote('abc'))); +json_unquote(json_compact(json_quote('abc'))) +abc +select json_compact('{"abc": "foo"}'); +json_compact('{"abc": "foo"}') +{"abc":"foo"} +select json_unquote(json_compact('{"abc": "foo"}')); +json_unquote(json_compact('{"abc": "foo"}')) +{"abc": "foo"} +select json_extract(json_compact('{"abc": "foo"}'), '$.abc'); +json_extract(json_compact('{"abc": "foo"}'), '$.abc') +"foo" +select json_unquote(json_extract(json_compact('{"abc": "foo"}'), '$.abc')); +json_unquote(json_extract(json_compact('{"abc": "foo"}'), '$.abc')) +foo +select json_unquote('["a", "b", "c"]'); +json_unquote('["a", "b", "c"]') +["a", "b", "c"] +select json_unquote(json_compact('["a", "b", "c"]')); +json_unquote(json_compact('["a", "b", "c"]')) +["a", "b", "c"] +select charset(json_unquote('"abc"')); +charset(json_unquote('"abc"')) +utf8mb3 +select json_quote(convert(X'e68891' using utf8)); +json_quote(convert(X'e68891' using utf8)) +"我" +select json_quote(convert(X'e68891' using utf8mb4)); +json_quote(convert(X'e68891' using utf8mb4)) +"我" +select json_compact(json_quote(convert(X'e68891' using utf8))); +json_compact(json_quote(convert(X'e68891' using utf8))) +"我" +select json_unquote(convert(X'e68891' using utf8)); +json_unquote(convert(X'e68891' using utf8)) +我 +select json_quote(json_quote(json_quote('abc'))); +json_quote(json_quote(json_quote('abc'))) +"\"\\\"abc\\\"\"" +select json_unquote(json_unquote(json_unquote( # long round trip of it +json_quote(json_quote(json_quote('abc')))))); +json_unquote(json_unquote(json_unquote( # long round trip of it +json_quote(json_quote(json_quote('abc')))))) +abc +select json_compact(cast('2015-01-15 23:24:25' as datetime)); +json_compact(cast('2015-01-15 23:24:25' as datetime)) +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_compact' at position 5 +select json_unquote(json_compact(cast('2015-01-15 23:24:25' as datetime))); +json_unquote(json_compact(cast('2015-01-15 23:24:25' as datetime))) +2015-01-15 23:24:25 +select json_compact(st_geomfromtext('point(1 1)')); +json_compact(st_geomfromtext('point(1 1)')) +NULL +Warnings: +Warning 4036 Character disallowed in JSON in argument 1 to function 'json_compact' at position 1 +select json_unquote(json_compact(st_geomfromtext('point(1 1)'))); +json_unquote(json_compact(st_geomfromtext('point(1 1)'))) + +SELECT JSON_UNQUOTE( '"abc"' ); +JSON_UNQUOTE( '"abc"' ) +abc +SELECT JSON_UNQUOTE( '"abc' ); +JSON_UNQUOTE( '"abc' ) +"abc +Warnings: +Warning 4037 Unexpected end of JSON text in argument 1 to function 'json_unquote' +error ER_INCORRECT_TYPE +SELECT JSON_UNQUOTE( 123 ); +JSON_UNQUOTE( 123 ) +123 +SELECT JSON_UNQUOTE +( CAST( json_compact( '"abc"') AS CHAR ) ); +JSON_UNQUOTE +( CAST( json_compact( '"abc"') AS CHAR ) ) +abc +SELECT JSON_UNQUOTE +( +CAST( +JSON_EXTRACT( '{ "userName" : "fred" }', '$.userName' ) +AS CHAR +) +) = 'fred'; +JSON_UNQUOTE +( +CAST( +JSON_EXTRACT( '{ "userName" : "fred" }', '$.userName' ) +AS CHAR +) +) = 'fred' +1 +SELECT +CAST( +JSON_EXTRACT( '{ "userName" : "fred" }', '$.userName' ) +AS CHAR +) = 'fred'; +CAST( +JSON_EXTRACT( '{ "userName" : "fred" }', '$.userName' ) +AS CHAR +) = 'fred' +0 +SELECT JSON_QUOTE( 'abc' ); +JSON_QUOTE( 'abc' ) +"abc" +error ER_INCORRECT_TYPE +SELECT JSON_QUOTE( 123 ); +JSON_QUOTE( 123 ) +NULL +SELECT json_compact( JSON_QUOTE( '123' )); +json_compact( JSON_QUOTE( '123' )) +"123" +# ---------------------------------------------------------------------- +# Test of JSON_CONTAINS +# ---------------------------------------------------------------------- +# should give NULL +select json_contains(NULL, NULL); +json_contains(NULL, NULL) +NULL +select json_contains(json_compact('{"a": 1, "b": 2}'), NULL); +json_contains(json_compact('{"a": 1, "b": 2}'), NULL) +NULL +select json_contains(NULL, json_compact('null')); +json_contains(NULL, json_compact('null')) +NULL +select json_contains(json_compact('[1]'), json_compact('[1]'), NULL); +json_contains(json_compact('[1]'), json_compact('[1]'), NULL) +NULL +# should give 0: +select json_contains(json_compact(3.14), json_compact(3)); +json_contains(json_compact(3.14), json_compact(3)) +0 +# should give 0: not at top level +select json_contains(json_compact('{"a": {"b": 7}}'), json_compact('{"b": 7}')); +json_contains(json_compact('{"a": {"b": 7}}'), json_compact('{"b": 7}')) +0 +# but path argument will fix it: +select json_contains(json_compact('{"a": {"b": 7}}'), json_compact('{"b": 7}'), '$.a'); +json_contains(json_compact('{"a": {"b": 7}}'), json_compact('{"b": 7}'), '$.a') +1 +# but arrays "introspect" +select json_contains(json_compact('[1,[2.0, 3.0]]'), json_compact('[2.0]')); +json_contains(json_compact('[1,[2.0, 3.0]]'), json_compact('[2.0]')) +1 +select json_contains(json_compact('[1, 2, [3, [4, 5]], 6, 7]'), json_compact('5')); +json_contains(json_compact('[1, 2, [3, [4, 5]], 6, 7]'), json_compact('5')) +1 +# should give 0: just a key +select json_contains(json_compact('{"a": 1, "b": 2}'), json_compact('"a"')); +json_contains(json_compact('{"a": 1, "b": 2}'), json_compact('"a"')) +0 +# should give 0: one candidate element doesn't match +select json_contains(json_compact('[1]'), json_compact('[1,2]')); +json_contains(json_compact('[1]'), json_compact('[1,2]')) +0 +# should all give 1 +select json_contains(json_compact('null'), json_compact('null')); +json_contains(json_compact('null'), json_compact('null')) +1 +# simple object subset +select json_contains(json_compact('{"a": 1, "b": 2}'), json_compact( '{"a": 1}')); +json_contains(json_compact('{"a": 1, "b": 2}'), json_compact( '{"a": 1}')) +1 +# simple vector subset +select json_contains(json_compact('[1, 2, 3]'), json_compact('[1, 3]')); +json_contains(json_compact('[1, 2, 3]'), json_compact('[1, 3]')) +1 +# auto-wrap, should give 1 +select json_contains(json_compact('[1, 2, 3]'), json_compact(3)); +json_contains(json_compact('[1, 2, 3]'), json_compact(3)) +1 +# ok even with nested cast off elements +select json_contains(json_compact('{"person": {"id": 1, "country": "norway"}}'), +json_compact('{"person": {"country": "norway"}}')); +json_contains(json_compact('{"person": {"id": 1, "country": "norway"}}'), +json_compact('{"person": {"country": "norway"}}')) +1 +# vector reordering and duplicates is ok +select json_contains(json_compact('[1,3,5]'), json_compact('[5,3,1,5]')); +json_contains(json_compact('[1,3,5]'), json_compact('[5,3,1,5]')) +1 +# ok even with more elts in candidate than in doc +select json_contains(json_compact('[{"b": 4, "a":7}]'), json_compact('[{"a":7},{"b":4}]')); +json_contains(json_compact('[{"b": 4, "a":7}]'), json_compact('[{"a":7},{"b":4}]')) +1 +select json_contains(json_compact('[{"b": 4, "a":7}, 5]'), json_compact('[5, {"a":7, "b":4}]')); +json_contains(json_compact('[{"b": 4, "a":7}, 5]'), json_compact('[5, {"a":7, "b":4}]')) +1 +# ok even with mixed number types that compare equal +select json_contains(json_compact('[{"b": 4, "a":7}, 5.0]'), json_compact('[5, {"a":7.0E0, "b":4}]')); +json_contains(json_compact('[{"b": 4, "a":7}, 5.0]'), json_compact('[5, {"a":7.0E0, "b":4}]')) +1 +select json_contains( '{"customer": "cust3"}', '{"customer": "cust1"}' ); +json_contains( '{"customer": "cust3"}', '{"customer": "cust1"}' ) +0 +SELECT JSON_CONTAINS('[null,1,[2,3],true,false]', '[null,1,[3],false]'); +JSON_CONTAINS('[null,1,[2,3],true,false]', '[null,1,[3],false]') +1 +SELECT JSON_CONTAINS('[null,1,[2,3],true,false]', '[null,1,[4],false]'); +JSON_CONTAINS('[null,1,[2,3],true,false]', '[null,1,[4],false]') +0 +SELECT JSON_CONTAINS('[true,false]', '[[true]]'); +JSON_CONTAINS('[true,false]', '[[true]]') +1 +SELECT JSON_CONTAINS('[1,2]', '[[1]]'); +JSON_CONTAINS('[1,2]', '[[1]]') +1 +SELECT JSON_CONTAINS('[1,2]', '1', '$.abc'); +JSON_CONTAINS('[1,2]', '1', '$.abc') +0 +SELECT JSON_CONTAINS('{}', '{}'); +JSON_CONTAINS('{}', '{}') +1 +SELECT JSON_CONTAINS('{}', '{"a":1}'); +JSON_CONTAINS('{}', '{"a":1}') +0 +SELECT JSON_CONTAINS('{"a":1}', '{"a":1,"b":2}'); +JSON_CONTAINS('{"a":1}', '{"a":1,"b":2}') +0 +SELECT JSON_CONTAINS +( +json_compact('[1, 4, 6]'), +json_compact('[1, 6]') +); +JSON_CONTAINS +( +json_compact('[1, 4, 6]'), +json_compact('[1, 6]') +) +1 +SELECT JSON_CONTAINS +( +json_compact('{"person": {"id": 1, "country": "norway"}}'), +json_compact('{"person": {"country": "norway"}}') +); +JSON_CONTAINS +( +json_compact('{"person": {"id": 1, "country": "norway"}}'), +json_compact('{"person": {"country": "norway"}}') +) +1 +SELECT JSON_CONTAINS +( +json_compact('[1,3,5]'), +json_compact('[5,3,1,5]') +); +JSON_CONTAINS +( +json_compact('[1,3,5]'), +json_compact('[5,3,1,5]') +) +1 +SELECT JSON_CONTAINS +( +json_compact('[3.14]'), +json_compact('[3]') +); +JSON_CONTAINS +( +json_compact('[3.14]'), +json_compact('[3]') +) +0 +SELECT JSON_CONTAINS +( +json_compact('[1, 2, 3]'), +json_compact(3) +); +JSON_CONTAINS +( +json_compact('[1, 2, 3]'), +json_compact(3) +) +1 +SELECT JSON_CONTAINS(); +ERROR 42000: Incorrect parameter count in the call to native function 'JSON_CONTAINS' +SELECT JSON_CONTAINS('[1]'); +ERROR 42000: Incorrect parameter count in the call to native function 'JSON_CONTAINS' +SELECT JSON_CONTAINS('[1]', '[1]', '$', '$[0]'); +ERROR 42000: Incorrect parameter count in the call to native function 'JSON_CONTAINS' +# ---------------------------------------------------------------------- +# Wrong collation from JSON_QUOTE caused problems: Set it in +# Item_func_json_quote::fix_length_and_dec. Bug found by Knut. +# Similar issue for JSON_UNQUOTE and JSON_TYPE. +# ---------------------------------------------------------------------- +select json_object("a", ifnull(json_quote('test'), json_compact('null'))); +json_object("a", ifnull(json_quote('test'), json_compact('null'))) +{"a": "\"test\""} +select json_compact(concat('[', json_quote('ab'), ']')); +json_compact(concat('[', json_quote('ab'), ']')) +["ab"] +select json_compact(concat('[', json_unquote('"12"'), ']')); +json_compact(concat('[', json_unquote('"12"'), ']')) +[12] +select json_compact(concat('["', json_type( json_compact(1)), '"]')); +json_compact(concat('["', json_type( json_compact(1)), '"]')) +["INTEGER"] +# +# Bug#20912438: ITEM_TYPE_HOLDER::DISPLAY_LENGTH(ITEM*): ASSERTION `0' FAILED +# +(SELECT JSON_KEYS('{ "key80": "2015-04-20 11:53:55"}')) UNION ALL +(SELECT JSON_KEYS('{ "key80": "2015-04-20 11:53:55" }') LIMIT 0); +JSON_KEYS('{ "key80": "2015-04-20 11:53:55"}') +["key80"] +SELECT json_compact(1) UNION ALL SELECT json_compact(1); +json_compact(1) +1 +1 +SELECT COUNT(*), json_compact(NULL); +COUNT(*) json_compact(NULL) +1 NULL +error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT COUNT(*), JSON_EXTRACT('not valid json!', '$'); +COUNT(*) JSON_EXTRACT('not valid json!', '$') +1 NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 1 +# ---------------------------------------------------------------------- +# Bug report from John E. +# Crash in Item_copy_json::~Item_copy_json +# ---------------------------------------------------------------------- +EXPLAIN SELECT COUNT(*), JSON_KEYS('{}'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used +select json_search( '{ "a": "foo" }', 'one', 'foo', 'a' ); +json_search( '{ "a": "foo" }', 'one', 'foo', 'a' ) +"$.a" +select json_search( '{ "a": "foo" }', 'one', 'foo', null ); +json_search( '{ "a": "foo" }', 'one', 'foo', null ) +"$.a" +select json_search( '{ "a": "foo" }', 'one', 'foo', convert(x'f8' using latin1) ); +json_search( '{ "a": "foo" }', 'one', 'foo', convert(x'f8' using latin1) ) +"$.a" +select json_search( '{ "a": "foo" }', 'one', 'foo', 'ab' ); +ERROR HY000: Incorrect arguments to ESCAPE +# ---------------------------------------------------------------------- +# Wrong results when Json_path_cache primed is accessed +# during the prepare-phase. +#---------------------------------------------------------------------- +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null ) is null; +json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null ) is null +1 +prepare stmt1 from 'select json_remove( ''[ 1, { "a": true, "b": false, "c": null }, 5 ]'', null ) is null'; +execute stmt1; +json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null ) is null +1 +error ER_INVALID_JSON_PATH +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$.' ) is null; +json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$.' ) is null +1 +Warnings: +Warning 4041 Unexpected end of JSON path in argument 2 to function 'json_remove' +error ER_INVALID_JSON_PATH +prepare stmt1 from 'select json_remove( ''[ 1, { "a": true, "b": false, "c": null }, 5 ]'', ''$.'' ) is null'; +# ---------------------------------------------------------------------- +# Bug#20987329 VALUE OF PREPARED STATEMENT PLACEHOLDER FOR PARAMETER +# IN JSON_EXTRACT IS STICKY +#---------------------------------------------------------------------- +prepare json_stmt1 FROM 'select json_contains( ''{ "keyA": [1, 2, 3], "keyB": [4, 5, 6] }'', ''[2]'', ? )'; +set @mypath = '$.keyA'; +execute json_stmt1 USING @mypath; +json_contains( '{ "keyA": [1, 2, 3], "keyB": [4, 5, 6] }', '[2]', ? ) +1 +set @mypath = '$.keyB'; +execute json_stmt1 USING @mypath; +json_contains( '{ "keyA": [1, 2, 3], "keyB": [4, 5, 6] }', '[2]', ? ) +0 +prepare json_stmt2 FROM 'select json_contains_path( ''{ "keyA": [1, 2, 3] }'', ''all'', ? )'; +set @mypath = '$.keyA'; +execute json_stmt2 USING @mypath; +json_contains_path( '{ "keyA": [1, 2, 3] }', 'all', ? ) +1 +set @mypath = '$.keyB'; +execute json_stmt2 USING @mypath; +json_contains_path( '{ "keyA": [1, 2, 3] }', 'all', ? ) +0 +prepare json_stmt3 FROM 'select json_length( ''{ "keyA": [1, 2, 3], "keyB": [1, 2, 3, 4] }'', ? )'; +set @mypath = '$.keyA'; +execute json_stmt3 USING @mypath; +json_length( '{ "keyA": [1, 2, 3], "keyB": [1, 2, 3, 4] }', ? ) +3 +set @mypath = '$.keyB'; +execute json_stmt3 USING @mypath; +json_length( '{ "keyA": [1, 2, 3], "keyB": [1, 2, 3, 4] }', ? ) +4 +prepare json_stmt4 FROM 'select json_keys( ''[ { "keyA": true }, { "keyB": false } ]'', ? )'; +set @mypath = '$[0]'; +execute json_stmt4 USING @mypath; +json_keys( '[ { "keyA": true }, { "keyB": false } ]', ? ) +["keyA"] +set @mypath = '$[1]'; +execute json_stmt4 USING @mypath; +json_keys( '[ { "keyA": true }, { "keyB": false } ]', ? ) +["keyB"] +prepare json_stmt5 FROM 'select json_array_append( ''{ "keyA": [1, 2], "keyB": [3, 4] }'', ?, 5 )'; +set @mypath = '$.keyA'; +execute json_stmt5 USING @mypath; +json_array_append( '{ "keyA": [1, 2], "keyB": [3, 4] }', ?, 5 ) +{"keyA": [1, 2, 5], "keyB": [3, 4]} +set @mypath = '$.keyB'; +execute json_stmt5 USING @mypath; +json_array_append( '{ "keyA": [1, 2], "keyB": [3, 4] }', ?, 5 ) +{"keyA": [1, 2], "keyB": [3, 4, 5]} +prepare json_stmt6 FROM 'select json_insert( ''{ "keyA": [1, 2], "keyB": [3, 4] }'', ?, 5 )'; +set @mypath = '$.keyA[2]'; +execute json_stmt6 USING @mypath; +json_insert( '{ "keyA": [1, 2], "keyB": [3, 4] }', ?, 5 ) +{"keyA": [1, 2, 5], "keyB": [3, 4]} +set @mypath = '$.keyB[2]'; +execute json_stmt6 USING @mypath; +json_insert( '{ "keyA": [1, 2], "keyB": [3, 4] }', ?, 5 ) +{"keyA": [1, 2], "keyB": [3, 4, 5]} +prepare json_stmt7 FROM 'select json_set( ''{ "keyA": [1, 2], "keyB": [3, 4] }'', ?, 5 )'; +set @mypath = '$.keyA[2]'; +execute json_stmt7 USING @mypath; +json_set( '{ "keyA": [1, 2], "keyB": [3, 4] }', ?, 5 ) +{"keyA": [1, 2, 5], "keyB": [3, 4]} +set @mypath = '$.keyB[2]'; +execute json_stmt7 USING @mypath; +json_set( '{ "keyA": [1, 2], "keyB": [3, 4] }', ?, 5 ) +{"keyA": [1, 2], "keyB": [3, 4, 5]} +prepare json_stmt8 FROM 'select json_replace( ''{ "keyA": [1, 2], "keyB": [3, 4] }'', ?, 5 )'; +set @mypath = '$.keyA[1]'; +execute json_stmt8 USING @mypath; +json_replace( '{ "keyA": [1, 2], "keyB": [3, 4] }', ?, 5 ) +{"keyA": [1, 5], "keyB": [3, 4]} +set @mypath = '$.keyB[1]'; +execute json_stmt8 USING @mypath; +json_replace( '{ "keyA": [1, 2], "keyB": [3, 4] }', ?, 5 ) +{"keyA": [1, 2], "keyB": [3, 5]} +prepare json_stmt9 FROM 'select json_search( ''{ "keyA": [ "foot" ], "keyB": [ "food" ] }'', ''all'', ''foo%'', null, ? )'; +set @mypath = '$.keyA'; +execute json_stmt9 USING @mypath; +json_search( '{ "keyA": [ "foot" ], "keyB": [ "food" ] }', 'all', 'foo%', null, ? ) +"$.keyA[0]" +set @mypath = '$.keyB'; +execute json_stmt9 USING @mypath; +json_search( '{ "keyA": [ "foot" ], "keyB": [ "food" ] }', 'all', 'foo%', null, ? ) +"$.keyB[0]" +prepare json_stmt10 FROM 'select json_remove( ''{ "keyA": [ "foot" ], "keyB": [ "food" ] }'', ? )'; +set @mypath = '$.keyA'; +execute json_stmt10 USING @mypath; +json_remove( '{ "keyA": [ "foot" ], "keyB": [ "food" ] }', ? ) +{"keyB": ["food"]} +set @mypath = '$.keyB'; +execute json_stmt10 USING @mypath; +json_remove( '{ "keyA": [ "foot" ], "keyB": [ "food" ] }', ? ) +{"keyA": ["foot"]} +prepare json_stmt11 FROM 'select json_contains_path( ''{ "keyA": true }'', ?, ''$.keyA'', ''$.keyB'' )'; +set @mypath = 'one'; +execute json_stmt11 USING @mypath; +json_contains_path( '{ "keyA": true }', ?, '$.keyA', '$.keyB' ) +1 +set @mypath = 'all'; +execute json_stmt11 USING @mypath; +json_contains_path( '{ "keyA": true }', ?, '$.keyA', '$.keyB' ) +0 +prepare json_stmt12 FROM 'select json_search( ''{ "keyA": [ "foot" ], "keyB": [ "food" ] }'', ?, ''foo%'' )'; +set @mypath = 'one'; +execute json_stmt12 USING @mypath; +json_search( '{ "keyA": [ "foot" ], "keyB": [ "food" ] }', ?, 'foo%' ) +"$.keyA[0]" +set @mypath = 'all'; +execute json_stmt12 USING @mypath; +json_search( '{ "keyA": [ "foot" ], "keyB": [ "food" ] }', ?, 'foo%' ) +["$.keyA[0]", "$.keyB[0]"] +# +# Bug#21128632 JSON_QUOTE(JSON_TYPE(...)) GIVES ERROR 3139 ER_INVALID_JSON_CHARSET +# +select json_quote( json_type( json_object() ) ); +json_quote( json_type( json_object() ) ) +"OBJECT" +select json_quote( json_type( json_compact('{}') ) ); +json_quote( json_type( json_compact('{}') ) ) +"OBJECT" +# +# Bug#21148020 OUTPUT FROM JSON_TYPE() IS TRUNCATED +# WHEN EXECUTED IN A VIEW OR JOIN +# +SELECT JSON_TYPE(JSON_OBJECT()); +JSON_TYPE(JSON_OBJECT()) +OBJECT +CREATE VIEW v1 AS SELECT JSON_TYPE(JSON_OBJECT()); +SELECT * FROM v1; +JSON_TYPE(JSON_OBJECT()) +OBJECT +drop view v1; +# +# Bug#21198333 SIG 6 IN ITEM_CACHE_JSON::CACHE_VALUE AT SQL/ITEM.CC:9470 +# +error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT MIN(JSON_EXTRACT('not json', '$')); +MIN(JSON_EXTRACT('not json', '$')) +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 1 +# +# Bug#21200657 DATA FROM DERIVED TABLE BASED +# ON JSN_QUOTE()/JSN_UNQUOTE() CALL IS TRUNCATED +# +SELECT JSON_QUOTE('This is a string that should not be truncated') AS field1; +field1 +"This is a string that should not be truncated" +SELECT JSON_UNQUOTE(JSON_QUOTE('This is a string that should not be truncated')) AS field1; +field1 +This is a string that should not be truncated +SELECT * FROM (SELECT JSON_QUOTE('This is a string that should not be truncated') AS field1) AS DERIVED_TABLE; +field1 +"This is a string that should not be truncated" +SELECT * FROM (SELECT JSON_UNQUOTE("This is a string that should not be truncated") AS field1) AS DERIVED_TABLE; +field1 +This is a string that should not be truncated +SELECT * FROM (SELECT JSON_UNQUOTE(JSON_QUOTE('This is a string that should not be truncated')) AS field1) AS DERIVED_TABLE; +field1 +This is a string that should not be truncated +# +# Bug#21296173 JSON_OBJECT('KEY', BOOLEAN_LITERAL) USES VALUES 0, 1 +# FOR BOOL WHEN USED VIA VIEW +# +SELECT JSON_OBJECT('key1', false, 'key2', true); +JSON_OBJECT('key1', false, 'key2', true) +{"key1": false, "key2": true} +SELECT JSON_ARRAY('key1', false, 'key2', true); +JSON_ARRAY('key1', false, 'key2', true) +["key1", false, "key2", true] +CREATE VIEW v1 AS SELECT JSON_OBJECT('key1', false, 'key2', true); +SELECT * FROM v1; +JSON_OBJECT('key1', false, 'key2', true) +{"key1": 0, "key2": 1} +CREATE VIEW v2 AS SELECT JSON_ARRAY('key1', false, 'key2', true); +SELECT * FROM v2; +JSON_ARRAY('key1', false, 'key2', true) +["key1", 0, "key2", 1] +drop view v1; +drop view v2; +# +# Bug#21293089 JSON_CONTAINS() RETURNS WRONG RESULT WITH EMPTY JSON ARRAY +# +SELECT JSON_CONTAINS('[]', '{"a" : 1}'); +JSON_CONTAINS('[]', '{"a" : 1}') +0 +SELECT JSON_CONTAINS('[]', '[1, 2, 3, 4, 5]'); +JSON_CONTAINS('[]', '[1, 2, 3, 4, 5]') +0 +SELECT JSON_CONTAINS('[]', '[1, 2, 3, 4, {"a" : 1}]'); +JSON_CONTAINS('[]', '[1, 2, 3, 4, {"a" : 1}]') +0 +SELECT JSON_CONTAINS('[]', '{"a" : [1, 2, 3, 4, 5]}'); +JSON_CONTAINS('[]', '{"a" : [1, 2, 3, 4, 5]}') +0 +SELECT JSON_CONTAINS('[]', '[]'); +JSON_CONTAINS('[]', '[]') +1 +# +# Bug#21377136 STACK OVERFLOW IN RAPIDJSON::GENERICREADER +# +error ER_JSON_DOCUMENT_TOO_DEEP +SELECT JSON_VALID(REPEAT('[', 100000)); +JSON_VALID(REPEAT('[', 100000)) +0 +error ER_JSON_DOCUMENT_TOO_DEEP +SELECT JSON_VALID(REPEAT('{"a":', 100000)); +JSON_VALID(REPEAT('{"a":', 100000)) +0 +error ER_JSON_DOCUMENT_TOO_DEEP +SELECT JSON_VALID(REPEAT('{"a":[', 100000)); +JSON_VALID(REPEAT('{"a":[', 100000)) +0 +error ER_JSON_DOCUMENT_TOO_DEEP +SELECT JSON_VALID(REPEAT('[{"a":', 100000)); +JSON_VALID(REPEAT('[{"a":', 100000)) +0 +# +# Bug#21381806 JSON: ASSERTION FAILED: ARG->NULL_VALUE +# +SELECT JSON_SET(CASE WHEN 1 THEN NULL ELSE NULL END, '{}', '{}'); +JSON_SET(CASE WHEN 1 THEN NULL ELSE NULL END, '{}', '{}') +NULL +SELECT JSON_VALID(CASE WHEN 1 THEN NULL ELSE NULL END); +JSON_VALID(CASE WHEN 1 THEN NULL ELSE NULL END) +NULL +SELECT JSON_ARRAY(CASE WHEN 1 THEN NULL ELSE NULL END); +JSON_ARRAY(CASE WHEN 1 THEN NULL ELSE NULL END) +[null] +# +# Bug#21384048 ASSERTION FAILED: N >= 0 && N <= 308 +# IN RAPIDJSON::INTERNAL::FASTPATH +# +SELECT JSON_EXTRACT('-1E-36181012216111515851075235238', '$'); +JSON_EXTRACT('-1E-36181012216111515851075235238', '$') +-1E-36181012216111515851075235238 +SELECT JSON_EXTRACT('1E-36181012216111515851075235238', '$'); +JSON_EXTRACT('1E-36181012216111515851075235238', '$') +1E-36181012216111515851075235238 +SELECT JSON_EXTRACT('1E-325', '$'); +JSON_EXTRACT('1E-325', '$') +1E-325 +SELECT JSON_EXTRACT('1E-324', '$'); +JSON_EXTRACT('1E-324', '$') +1E-324 +SELECT JSON_EXTRACT('1E-323', '$'); +JSON_EXTRACT('1E-323', '$') +1E-323 +SELECT JSON_EXTRACT('1E+308', '$'); +JSON_EXTRACT('1E+308', '$') +1E+308 +error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_EXTRACT('1E+309', '$'); +JSON_EXTRACT('1E+309', '$') +1E+309 +error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_EXTRACT('1E+36181012216111515851075235238', '$'); +JSON_EXTRACT('1E+36181012216111515851075235238', '$') +1E+36181012216111515851075235238 +error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_EXTRACT('-1E+36181012216111515851075235238', '$'); +JSON_EXTRACT('-1E+36181012216111515851075235238', '$') +-1E+36181012216111515851075235238 +# +# Bug#21383284: ASSERTION IN SELECT_LEX::SETUP_CONDS +# +SELECT 1 FROM dual WHERE JSON_SEARCH('{}', 'one', 'foo', 'too-long-escape'); +ERROR HY000: Incorrect arguments to ESCAPE +error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT 1 FROM dual WHERE JSON_SEARCH('{}', 'one', 'foo', JSON_EXTRACT('', '$')); +1 +Warnings: +Warning 4037 Unexpected end of JSON text in argument 1 to function 'json_extract' +# +# Bug#21442624 INCORRECT RESULT FROM JSON_SET WITH AUTO-WRAPPING +# +SELECT JSON_SET('1', '$', 100); +JSON_SET('1', '$', 100) +100 +SELECT JSON_SET('1', '$[0]', 100); +JSON_SET('1', '$[0]', 100) +100 +SELECT JSON_SET('1', '$[0][0]', 100); +JSON_SET('1', '$[0][0]', 100) +100 +SELECT JSON_SET('1', '$[0][0][0]', 100); +JSON_SET('1', '$[0][0][0]', 100) +100 +SELECT JSON_SET('[]', '$', 100); +JSON_SET('[]', '$', 100) +100 +SELECT JSON_SET('[]', '$[0]', 100); +JSON_SET('[]', '$[0]', 100) +[100] +SELECT JSON_SET('[]', '$[0][0]', 100); +JSON_SET('[]', '$[0][0]', 100) +[] +SELECT JSON_SET('[]', '$[0][0][0]', 100); +JSON_SET('[]', '$[0][0][0]', 100) +[] +SELECT JSON_SET('[1]', '$', 100); +JSON_SET('[1]', '$', 100) +100 +SELECT JSON_SET('[1]', '$[0]', 100); +JSON_SET('[1]', '$[0]', 100) +[100] +SELECT JSON_SET('[1]', '$[0][0]', 100); +JSON_SET('[1]', '$[0][0]', 100) +[100] +SELECT JSON_SET('[1]', '$[0][0][0]', 100); +JSON_SET('[1]', '$[0][0][0]', 100) +[100] +SELECT JSON_SET('[[1]]', '$', 100); +JSON_SET('[[1]]', '$', 100) +100 +SELECT JSON_SET('[[1]]', '$[0]', 100); +JSON_SET('[[1]]', '$[0]', 100) +[100] +SELECT JSON_SET('[[1]]', '$[0][0]', 100); +JSON_SET('[[1]]', '$[0][0]', 100) +[[100]] +SELECT JSON_SET('[[1]]', '$[0][0][0]', 100); +JSON_SET('[[1]]', '$[0][0][0]', 100) +[[100]] +SELECT JSON_SET('[[[1]]]', '$', 100); +JSON_SET('[[[1]]]', '$', 100) +100 +SELECT JSON_SET('[[[1]]]', '$[0]', 100); +JSON_SET('[[[1]]]', '$[0]', 100) +[100] +SELECT JSON_SET('[[[1]]]', '$[0][0]', 100); +JSON_SET('[[[1]]]', '$[0][0]', 100) +[[100]] +SELECT JSON_SET('[[[1]]]', '$[0][0][0]', 100); +JSON_SET('[[[1]]]', '$[0][0][0]', 100) +[[[100]]] +SELECT JSON_REPLACE('1', '$', 100); +JSON_REPLACE('1', '$', 100) +100 +SELECT JSON_REPLACE('1', '$[0]', 100); +JSON_REPLACE('1', '$[0]', 100) +100 +SELECT JSON_REPLACE('1', '$[0][0]', 100); +JSON_REPLACE('1', '$[0][0]', 100) +100 +SELECT JSON_REPLACE('1', '$[0][0][0]', 100); +JSON_REPLACE('1', '$[0][0][0]', 100) +100 +SELECT JSON_REPLACE('[]', '$', 100); +JSON_REPLACE('[]', '$', 100) +100 +SELECT JSON_REPLACE('[]', '$[0]', 100); +JSON_REPLACE('[]', '$[0]', 100) +[] +SELECT JSON_REPLACE('[]', '$[0][0]', 100); +JSON_REPLACE('[]', '$[0][0]', 100) +[] +SELECT JSON_REPLACE('[]', '$[0][0][0]', 100); +JSON_REPLACE('[]', '$[0][0][0]', 100) +[] +SELECT JSON_REPLACE('[1]', '$', 100); +JSON_REPLACE('[1]', '$', 100) +100 +SELECT JSON_REPLACE('[1]', '$[0]', 100); +JSON_REPLACE('[1]', '$[0]', 100) +[100] +SELECT JSON_REPLACE('[1]', '$[0][0]', 100); +JSON_REPLACE('[1]', '$[0][0]', 100) +[100] +SELECT JSON_REPLACE('[1]', '$[0][0][0]', 100); +JSON_REPLACE('[1]', '$[0][0][0]', 100) +[100] +SELECT JSON_REPLACE('[[1]]', '$', 100); +JSON_REPLACE('[[1]]', '$', 100) +100 +SELECT JSON_REPLACE('[[1]]', '$[0]', 100); +JSON_REPLACE('[[1]]', '$[0]', 100) +[100] +SELECT JSON_REPLACE('[[1]]', '$[0][0]', 100); +JSON_REPLACE('[[1]]', '$[0][0]', 100) +[[100]] +SELECT JSON_REPLACE('[[1]]', '$[0][0][0]', 100); +JSON_REPLACE('[[1]]', '$[0][0][0]', 100) +[[100]] +SELECT JSON_REPLACE('[[[1]]]', '$', 100); +JSON_REPLACE('[[[1]]]', '$', 100) +100 +SELECT JSON_REPLACE('[[[1]]]', '$[0]', 100); +JSON_REPLACE('[[[1]]]', '$[0]', 100) +[100] +SELECT JSON_REPLACE('[[[1]]]', '$[0][0]', 100); +JSON_REPLACE('[[[1]]]', '$[0][0]', 100) +[[100]] +SELECT JSON_REPLACE('[[[1]]]', '$[0][0][0]', 100); +JSON_REPLACE('[[[1]]]', '$[0][0][0]', 100) +[[[100]]] +# +# Bug#21828321: JSON FUNCS CALL DBUG_ABORT OR EXIT() ON WINDOWS! +# +SELECT JSON_ARRAY(LEAST(NULL, NULL), GREATEST(NULL, NULL), LEAST(j1, NULL), +GREATEST(NULL, j2), LEAST(j1, j2), GREATEST(j1, j2)) AS j +FROM (SELECT json_compact('1') AS j1, json_compact('2') AS j2) t; +j +[null, null, null, null, "1", "2"] diff --git a/mysql-test/suite/json/r/json_table.result b/mysql-test/suite/json/r/json_table.result new file mode 100644 index 00000000..44957352 --- /dev/null +++ b/mysql-test/suite/json/r/json_table.result @@ -0,0 +1,1145 @@ +select * from json_table('[{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}]', '$[*]' COLUMNS( a INT PATH '$.a')) as tt; +a +1 +2 +select * from JSON_TABLE( '[ {"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a', NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; +a b +1 11 +1 111 +2 22 +2 222 +3 NULL +SELECT * FROM JSON_TABLE( '[ {"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a', NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'), NESTED PATH '$.b[*]' COLUMNS (c INT PATH '$') ) ) jt; +a b c +1 11 NULL +1 111 NULL +1 NULL 11 +1 NULL 111 +2 22 NULL +2 222 NULL +2 NULL 22 +2 NULL 222 +3 NULL NULL +create table t1 (id varchar(5), json varchar(1024)); +insert into t1 values ('j1', '[{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}]'); +insert into t1 values ('j2', '[{"a": 3, "b": [11,111]}, {"a": 4, "b": [22,222]}, {"a": 5, "b": [22,222]}]'); +select id, json, a from t1, json_table(t1.json, '$[*]' COLUMNS(js_id FOR ORDINALITY, a INT PATH '$.a')) as tt; +id json a +j1 [{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}] 1 +j1 [{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}] 2 +j2 [{"a": 3, "b": [11,111]}, {"a": 4, "b": [22,222]}, {"a": 5, "b": [22,222]}] 3 +j2 [{"a": 3, "b": [11,111]}, {"a": 4, "b": [22,222]}, {"a": 5, "b": [22,222]}] 4 +j2 [{"a": 3, "b": [11,111]}, {"a": 4, "b": [22,222]}, {"a": 5, "b": [22,222]}] 5 +select * from t1, JSON_TABLE(t1.json, '$[*]' COLUMNS(js_id FOR ORDINALITY, a INT PATH '$.a', NESTED PATH '$.b[*]' COLUMNS (l_js_id FOR ORDINALITY, b INT PATH '$'))) as jt; +id json js_id a l_js_id b +j1 [{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}] 1 1 1 11 +j1 [{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}] 1 1 2 111 +j1 [{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}] 2 2 1 22 +j1 [{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}] 2 2 2 222 +j2 [{"a": 3, "b": [11,111]}, {"a": 4, "b": [22,222]}, {"a": 5, "b": [22,222]}] 1 3 1 11 +j2 [{"a": 3, "b": [11,111]}, {"a": 4, "b": [22,222]}, {"a": 5, "b": [22,222]}] 1 3 2 111 +j2 [{"a": 3, "b": [11,111]}, {"a": 4, "b": [22,222]}, {"a": 5, "b": [22,222]}] 2 4 1 22 +j2 [{"a": 3, "b": [11,111]}, {"a": 4, "b": [22,222]}, {"a": 5, "b": [22,222]}] 2 4 2 222 +j2 [{"a": 3, "b": [11,111]}, {"a": 4, "b": [22,222]}, {"a": 5, "b": [22,222]}] 3 5 1 22 +j2 [{"a": 3, "b": [11,111]}, {"a": 4, "b": [22,222]}, {"a": 5, "b": [22,222]}] 3 5 2 222 +select * from t1, JSON_TABLE(t1.no_field, '$[*]' COLUMNS(js_id FOR ORDINALITY, a INT PATH '$.a', NESTED PATH '$.b[*]' COLUMNS (l_js_id FOR ORDINALITY, b INT PATH '$'))) as jt; +ERROR 42S22: Unknown column 't1.no_field' in 'JSON_TABLE argument' +select * from t1, JSON_TABLE(t1.no_field, '$[*]' COLUMNS(js_id FOR ORDINALITY, a INT PATH '$.a', NESTED PATH '$.b[*]' COLUMNS (l_js_id FOR ORDINALITY, a INT PATH '$'))) as jt; +ERROR 42S21: Duplicate column name 'a' +DROP TABLE t1; +create table t1 (item_name varchar(32), item_props varchar(1024)); +insert into t1 values ('Laptop', '{"color": "black", "price": 1000}'); +insert into t1 values ('Jeans', '{"color": "blue", "price": 50}'); +select * from t1 left join json_table(t1.item_props,'$' columns( color varchar(100) path '$.color')) as T on 1; +item_name item_props color +Laptop {"color": "black", "price": 1000} black +Jeans {"color": "blue", "price": 50} blue +select * from t1 right join json_table(t1.item_props,'$' columns( color varchar(100) path '$.color')) as T on 1; +ERROR 42S22: Unknown column 't1.item_props' in 'JSON_TABLE argument' +DROP TABLE t1; +select * from JSON_TABLE( '[ {"xa": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a' default 101 on empty, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; +a b +101 11 +101 111 +2 22 +2 222 +3 NULL +select * from JSON_TABLE( '[ {"xa": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a' default 202 on error, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; +a b +NULL 11 +NULL 111 +2 22 +2 222 +3 NULL +select * from JSON_TABLE( '[ {"a": [1, 2], "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a' default '101' on empty, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; +a b +NULL 11 +NULL 111 +2 22 +2 222 +3 NULL +select * from JSON_TABLE( '[ {"a": [1, 2], "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a' default '202' on error default '101' on empty, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; +a b +202 11 +202 111 +2 22 +2 222 +3 NULL +select * from JSON_TABLE( '[{"a": [1, 2], "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3} xx YY]', '$[*]' COLUMNS( a INT PATH '$.a' default '202' on error default '101' on empty, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; +ERROR HY000: Syntax error in JSON text in argument 1 to function 'JSON_TABLE' at position 65 +select * from JSON_TABLE( '[{"a": [1, 2], "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a' error on error default '101' on empty, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; +ERROR HY000: Can't store an array or an object in the scalar column 'a' of JSON_TABLE 'jt'. +select * from json_table('{"a":0}',"$" columns(a decimal(1,1) path '$.a')) foo; +a +0.0 +connect con1,localhost,root,,; +select a from json_table('{"a":0}',"$" columns(a for ordinality)) foo; +a +1 +connection default; +disconnect con1; +create table t1 ( +color varchar(32), +price int +); +insert into t1 values ("red", 100), ("blue", 50); +insert into t1 select * from t1; +insert into t1 select * from t1; +set @save_optimizer_switch=@@optimizer_switch; +set optimizer_switch='firstmatch=off'; +select * from +json_table('[{"color": "blue", "price": 50}, + {"color": "red", "price": 100}]', +'$[*]' columns( color varchar(100) path '$.color', +price text path '$.price' + ) +) as T +where +T.color in (select color from t1 where t1.price=T.price); +color price +blue 50 +red 100 +set @@optimizer_switch=@save_optimizer_switch; +drop table t1; +select * from +json_table(' [ {"color": "blue", "sizes": [1,2,3,4], "prices" : [10,20]}, + {"color": "red", "sizes": [10,11,12,13,14], "prices" : [100,200,300]} ]', +'$[*]' columns( +color varchar(4) path '$.color', +seq0 for ordinality, +nested path '$.sizes[*]' + columns (seq1 for ordinality, +size int path '$'), +nested path '$.prices[*]' + columns (seq2 for ordinality, +price int path '$') +) +) as T; +color seq0 seq1 size seq2 price +blue 1 1 1 NULL NULL +blue 1 2 2 NULL NULL +blue 1 3 3 NULL NULL +blue 1 4 4 NULL NULL +blue 1 NULL NULL 1 10 +blue 1 NULL NULL 2 20 +red 2 1 10 NULL NULL +red 2 2 11 NULL NULL +red 2 3 12 NULL NULL +red 2 4 13 NULL NULL +red 2 5 14 NULL NULL +red 2 NULL NULL 1 100 +red 2 NULL NULL 2 200 +red 2 NULL NULL 3 300 +select * from json_table('[{"color": "blue", "price": 50}, + {"color": "red", "price": 100}, + {"color": "rojo", "price": 10.0}, + {"color": "blanco", "price": 11.0}]', +'$[*]' columns( color varchar(100) path '$.color', +price text path '$.price', seq for ordinality)) as T order by color desc; +color price seq +rojo 10.0 3 +red 100 2 +blue 50 1 +blanco 11.0 4 +create view v as select * from json_table('{"as":"b", "x":123}',"$" columns(a varchar(8) path '$.a' default '-' on empty, x int path '$.x')) x; +select * from v; +a x +- 123 +show create table v; +View Create View character_set_client collation_connection +v CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `x`.`a` AS `a`,`x`.`x` AS `x` from JSON_TABLE('{"as":"b", "x":123}', '$' COLUMNS (`a` varchar(8) PATH '$.a' DEFAULT '-' ON EMPTY, `x` int(11) PATH '$.x')) `x` latin1 latin1_swedish_ci +drop view v; +select * from json_table('{"as":"b", "x":123}', +"$" columns(a varchar(8) path '$.a' default '-' on empty null on error null on empty, x int path '$.x')) x; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'null on empty, x int path '$.x')) x' at line 2 +select * from json_table('{"a":"foo","b":"bar"}', '$' + columns (v varchar(20) path '$.*')) as jt; +v +NULL +select * from json_table('{"a":"foo","b":"bar"}', '$' + columns (v varchar(20) path '$.*' default '-' on error)) as jt; +v +- +select * from json_table('{"b":"bar"}', '$' + columns (v varchar(20) path '$.*' default '-' on error)) as jt; +v +bar +create table t1 (a varchar(100)); +insert into t1 values ('1'); +select * from t1 as T, json_table(T.a, '$[*]' columns(color varchar(100) path '$.nonexistent', seq for ordinality)) as T; +ERROR 42000: Not unique table/alias: 'T' +drop table t1; +prepare s from 'select * from +json_table(?, + \'$[*]\' columns( color varchar(100) path \'$.color\', + price text path \'$.price\', + seq for ordinality)) as T +order by color desc; '; +execute s using '[{"color": "red", "price":1}, {"color":"brown", "price":2}]'; +color price seq +red 1 1 +brown 2 2 +deallocate prepare s; +create view v2 as select * from json_table('[{"co\\\\lor": "blue", "price": 50}]', '$[*]' columns( color varchar(100) path '$.co\\\\lor') ) as T; +select * from v2; +color +blue +drop view v2; +explain format=json select * from +json_table('[{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}]', '$[*]' COLUMNS( a INT PATH '$.a')) as tt; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "tt", + "access_type": "ALL", + "rows": 40, + "filtered": 100, + "table_function": "json_table" + } + } + ] + } +} +explain select * from +json_table('[{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}]', '$[*]' COLUMNS( a INT PATH '$.a')) as tt; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE tt ALL NULL NULL NULL NULL 40 Table function: json_table +create view v1 as select * from +json_table('[{"color": "blue", "price": 50}]', +'$[*]' columns(color text path '$.nonexistent', +seq for ordinality)) as `ALIAS NOT QUOTED`; +select * from v1; +color seq +NULL 1 +drop view v1; +create view v1 as select * from +json_table('[{"color": "blue", "price": 50}, + {"color": "red", "price": 100}]', +'$[*]' columns( +color text path "$.QUOTES \" HERE \"", +color1 text path '$.QUOTES " HERE "', +color2 text path "$.QUOTES ' HERE '", +seq for ordinality)) as T; +select * from v1; +color color1 color2 seq +NULL NULL NULL 1 +NULL NULL NULL 2 +drop view v1; +CREATE TABLE t1 (x INT); +INSERT INTO t1 VALUES (1), (2), (3); +SELECT t1.x*2 m, jt.* FROM t1, +JSON_TABLE(m, '$[*]' COLUMNS (i INT PATH '$')) jt; +ERROR 42S22: Unknown column 'm' in 'JSON_TABLE argument' +DROP TABLE t1; +select * +from +json_table(JS3.size, '$' columns (size INT PATH '$.size')) as JS1, +json_table(JS1.size, '$' columns (size INT PATH '$.size')) as JS2, +json_table(JS1.size, '$' columns (size INT PATH '$.size')) as JS3 where 1; +ERROR 42S22: Unknown column 'JS3.size' in 'JSON_TABLE argument' +create table t1 (json varchar(100) character set utf8); +insert into t1 values ('{"value":"АБВ"}'); +create table tj1 as +select T.value +from t1, json_table(t1.json, '$' columns (value varchar(32) PATH '$.value')) T; +show create table tj1; +Table Create Table +tj1 CREATE TABLE `tj1` ( + `value` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +drop table t1; +drop table tj1; +CREATE TABLE t1(id INT, f1 JSON); +INSERT INTO t1 VALUES +(1, '{\"1\": 1}'), +(2, '{\"1\": 2}'), +(3, '{\"1\": 3}'), +(4, '{\"1\": 4}'), +(5, '{\"1\": 5}'), +(6, '{\"1\": 6}'); +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze Warning Engine-independent statistics are not collected for column 'f1' +test.t1 analyze status OK +SELECT * FROM JSON_TABLE(tt3.f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl STRAIGHT_JOIN t1 AS tt3; +ERROR 42S22: Unknown column 'tt3.f1' in 'JSON_TABLE argument' +SELECT * FROM t1 as jj1, +(SELECT tt2.* +FROM +t1 as tt2, +JSON_TABLE(tt3.f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl +STRAIGHT_JOIN +t1 AS tt3 +) dt +ORDER BY 1,3 LIMIT 10; +ERROR 42S22: Unknown column 'tt3.f1' in 'JSON_TABLE argument' +drop table t1; +select collation(x) from +JSON_TABLE('["abc"]', '$[*]' COLUMNS (x VARCHAR(10) CHARSET latin1 PATH '$')) tbl; +collation(x) +latin1_swedish_ci +SELECT * FROM JSON_TABLE('{"x":1, "y":2}', _utf8mb4'$' COLUMNS (NESTED PATH _utf8mb4'$.x' + COLUMNS(y INT PATH _utf8mb4'$.y' DEFAULT _utf8mb4'1' ON EMPTY DEFAULT _utf8mb4'2' ON ERROR))) jt; +y +1 +select * from json_table( +'{"name":"t-shirt", "colors": ["yellow", "blue"],"sizes": ["small", "medium", "large"]}', +'$' columns(name varchar(32) path '$.name', +nested path '$.colors[*]' columns ( +color varchar(32) path '$', +nested path '$.sizes[*]' columns ( +size varchar(32) path '$' +)))) as t; +name color size +t-shirt yellow NULL +t-shirt blue NULL +SELECT x, length(x) FROM +JSON_TABLE('{}', '$' COLUMNS (x VARCHAR(10) PATH '$.x' DEFAULT 'abcdefg' ON EMPTY)) jt; +x length(x) +abcdefg 7 +select * from +json_table('[{"a":"aa"}, {"b":null}]', '$[*]' + columns (col1 int path '$.b' default '456' on empty)) as tt; +col1 +456 +NULL +select * from +json_table('[{"a":"aa"}, {"b":true}]', '$[*]' + columns (col1 int path '$.b' default '456' on empty)) as tt; +col1 +456 +1 +select * from +json_table('[{"a":"aa"}, {"b":false}]', '$[*]' + columns (col1 int path '$.b' default '456' on empty)) as tt; +col1 +456 +0 +select * from +json_table('[{"a":"aa"}, {"b":null}]', '$[*]' + columns (col1 varchar(100) path '$.b' default '456' on empty)) as tt; +col1 +456 +NULL +select * from +json_table('[{"a":"aa"}, {"b":true}]', '$[*]' + columns (col1 varchar(100) path '$.b' default '456' on empty)) as tt; +col1 +456 +true +select * from +json_table('[{"a":"aa"}, {"b":false}]', '$[*]' + columns (col1 varchar(100) path '$.b' default '456' on empty)) as tt; +col1 +456 +false +select * from +json_table( '[{"a":"asd"}, {"a":123}, {"a":[]}, {"a":{}} ]', '$[*]' + columns (id for ordinality, +intcol int path '$.a' default '1234' on empty default '5678' on error) +) as tt; +id intcol +1 0 +2 123 +3 5678 +4 5678 +Warnings: +Warning 1366 Incorrect integer value: 'asd' for column ``.`(temporary)`.`intcol` at row 1 +SELECT COUNT(*) FROM JSON_TABLE('[1, 2]', '$[*]' COLUMNS( I INT PATH '$')) tt; +COUNT(*) +2 +create table t1 (a int); +insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t2 (js json, b int); +insert into t2 select '[1,2,3]',A.a from t1 A, t1 B; +explain select * from t1, +(select * from t2, json_table(t2.js, '$[*]' columns (o for ordinality)) as jt) as TT2 +where 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 10 +1 SIMPLE t2 ALL NULL NULL NULL NULL 100 Using join buffer (flat, BNL join) +1 SIMPLE jt ALL NULL NULL NULL NULL 40 Table function: json_table +drop table t1, t2; +CREATE TABLE t1 (x INT); +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 (j JSON); +INSERT INTO t2 (j) VALUES ('[1,2,3]'); +SELECT * FROM t1 RIGHT JOIN +(SELECT o FROM t2, JSON_TABLE(j, '$[*]' COLUMNS (o FOR ORDINALITY)) AS jt) AS t3 ON (t3.o = t1.x); +x o +1 1 +NULL 2 +NULL 3 +DROP TABLE t1, t2; +create table t20 (a int not null); +create table t21 (a int not null primary key, js varchar(100)); +insert into t20 values (1),(2); +insert into t21 values (1, '{"a":100}'); +explain select t20.a, jt1.ab +from t20 left join t21 on t20.a=t21.a +join JSON_TABLE(t21.js,'$' COLUMNS (ab INT PATH '$.a')) AS jt1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t20 ALL NULL NULL NULL NULL 2 +1 SIMPLE t21 eq_ref PRIMARY PRIMARY 4 test.t20.a 1 +1 SIMPLE jt1 ALL NULL NULL NULL NULL 40 Table function: json_table +drop table t20, t21; +select * from +json_table( +'[ + {"name": "X", + "colors":["blue"], "sizes": [1,2,3,4], "prices" : [10,20]}, + {"name": "Y", + "colors":["red"], "sizes": [10,11], "prices" : [100,200,300]} +]', +'$[*]' columns +( +seq0 for ordinality, +name varchar(4) path '$.name', +nested path '$.colors[*]' columns ( +seq1 for ordinality, +color text path '$' + ), +nested path '$.sizes[*]' columns ( +seq2 for ordinality, +size int path '$' + ), +nested path '$.prices[*]' columns ( +seq3 for ordinality, +price int path '$' + ) +) +) as T order by seq0, name; +seq0 name seq1 color seq2 size seq3 price +1 X NULL NULL NULL NULL 1 10 +1 X NULL NULL NULL NULL 2 20 +1 X NULL NULL 1 1 NULL NULL +1 X NULL NULL 2 2 NULL NULL +1 X NULL NULL 3 3 NULL NULL +1 X NULL NULL 4 4 NULL NULL +1 X 1 blue NULL NULL NULL NULL +2 Y NULL NULL NULL NULL 1 100 +2 Y NULL NULL NULL NULL 2 200 +2 Y NULL NULL NULL NULL 3 300 +2 Y NULL NULL 1 10 NULL NULL +2 Y NULL NULL 2 11 NULL NULL +2 Y 1 red NULL NULL NULL NULL +select * from json_table('[]', '$' COLUMNS(x FOR ORDINALITY)); +ERROR HY000: Every table function must have an alias. +select min(x) from json_table('[]', '$' COLUMNS(x FOR ORDINALITY)) a; +min(x) +1 +# +# Test for the problem with +# - Cross-outer-join dependency +# - dead-end join prefix +# - join order pruning +# +create table t20 (a int not null); +create table t21 (a int not null primary key, js varchar(100)); +insert into t20 select seq from seq_1_to_100; +insert into t21 select a, '{"a":100}' from t20; +create table t31(a int); +create table t32(b int); +insert into t31 values (1); +insert into t32 values (1); +explain +select +t20.a, jt1.ab +from +t20 +left join t21 on t20.a=t21.a +join +(t31 left join (t32 join JSON_TABLE(t21.js,'$' COLUMNS (ab INT PATH '$.a')) AS jt1) on t31.a<3); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t31 system NULL NULL NULL NULL 1 +1 SIMPLE t20 ALL NULL NULL NULL NULL 100 +1 SIMPLE t21 eq_ref PRIMARY PRIMARY 4 test.t20.a 1 +1 SIMPLE t32 ALL NULL NULL NULL NULL 1 Using where +1 SIMPLE jt1 ALL NULL NULL NULL NULL 40 Table function: json_table +drop table t20,t21,t31,t32; +# +# MDEV-25142: JSON_TABLE: CREATE VIEW involving EXISTS PATH ends up with invalid frm +# +drop view if exists v1; +CREATE VIEW v1 AS SELECT * FROM JSON_TABLE('[]', '$' COLUMNS (f INT EXISTS PATH '$')) a ; +show create view v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `a`.`f` AS `f` from JSON_TABLE('[]', '$' COLUMNS (`f` int(11) EXISTS PATH '$')) `a` latin1 latin1_swedish_ci +drop view v1; +# +# MDEV-25145: JSON_TABLE: Assertion `fixed == 1' failed in Item_load_file::val_str on 2nd execution of PS +# +PREPARE stmt FROM "SELECT * FROM (SELECT * FROM JSON_TABLE(LOAD_FILE('x'), '$' COLUMNS (a FOR ORDINALITY)) AS t) AS sq"; +EXECUTE stmt; +a +EXECUTE stmt; +a +# +# MDEV-JSON_TABLE: Server crashes in handler::print_error / hton_name upon ERROR ON EMPTY +# +SELECT a, b FROM JSON_TABLE('[]', '$' COLUMNS (a FOR ORDINALITY, b INT PATH '$[*]' ERROR ON EMPTY)) AS t ORDER BY a; +ERROR HY000: Field 'b' can't be set for JSON_TABLE 't'. +# +# MDEV-25151 JSON_TABLE: Unexpectedly padded values in a PATH column. +# +SET @old_character_set_connection= @@character_set_connection; +SET @@character_set_connection= utf8; +select hex(a), b from json_table('["foo","bar"]','$[*]' columns (a char(3) path '$', b for ordinality)) t; +hex(a) b +666F6F 1 +626172 2 +SET @@character_set_connection= @old_character_set_connection; +# +# MDEV-25183 JSON_TABLE: CREATE VIEW involving NESTED PATH ends up with invalid frm +# +CREATE VIEW v AS SELECT * FROM JSON_TABLE('{}', '$' COLUMNS(NESTED PATH '$**.*' COLUMNS(a FOR ORDINALITY), b VARCHAR(8) PATH '$')) AS jt; +SHOW CREATE VIEW v; +View Create View character_set_client collation_connection +v CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `jt`.`a` AS `a`,`jt`.`b` AS `b` from JSON_TABLE('{}', '$' COLUMNS (NESTED PATH '$**.*' COLUMNS (`a` FOR ORDINALITY), `b` varchar(8) PATH '$')) `jt` latin1 latin1_swedish_ci +SELECT * FROM v; +a b +NULL NULL +DROP VIEW v; +# +# MDEV-25178 JSON_TABLE: ASAN use-after-poison in my_fill_8bit / Json_table_column::On_response::respond +# +SELECT * FROM JSON_TABLE('{}', '$' COLUMNS(a CHAR(100) PATH '$' DEFAULT "0" ON ERROR)) AS jt; +a +0 +# +# MDEV-25188 JSON_TABLE: ASAN use-after-poison in Field_long::reset / Table_function_json_table::setup or malloc(): invalid size. +# +SELECT * FROM JSON_TABLE(CONVERT('{"x":1}' USING utf8mb4), '$' COLUMNS(a INT PATH '$', b CHAR(64) PATH '$.*', c INT EXISTS PATH '$**.*')) AS jt; +a b c +NULL 1 1 +# +# 25192 JSON_TABLE: ASAN use-after-poison in field_conv_memcpy / Create_tmp_table::finalize upon query with derived table. +# +SET NAMES utf8; +SELECT * FROM ( SELECT * FROM JSON_TABLE('{}', '$' COLUMNS( a BINARY(12) PATH '$.*', b VARCHAR(40) PATH '$[*]', c VARCHAR(8) PATH '$**.*')) AS jt ) AS sq; +a b c +NULL NULL NULL +SET NAMES default; +# +# MDEV-25189 JSON_TABLE: Assertion `l_offset >= 0 && table->s->rec_buff_length - l_offset > 0' failed upon CREATE .. SELECT. +# +SET NAMES utf8; +CREATE TABLE t1 AS SELECT * FROM JSON_TABLE('{}', '$' COLUMNS(a CHAR(16) PATH '$.*', b TIMESTAMP PATH '$**.*')) AS jt; +DROP TABLE t1; +SET NAMES default; +# +# MDEV-25230 SON_TABLE: CREATE VIEW with 2nd level NESTED PATH ends up with invalid frm, Assertion `m_status == DA_ERROR || m_status == DA_OK || m_status == DA_OK_BULK' failed. +# +CREATE VIEW v AS SELECT * FROM JSON_TABLE('{}', '$' COLUMNS(NESTED PATH '$' COLUMNS(NESTED PATH '$.*' COLUMNS(o FOR ORDINALITY)))) AS jt; +SELECT * FROM v; +o +NULL +SHOW CREATE VIEW v; +View Create View character_set_client collation_connection +v CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `jt`.`o` AS `o` from JSON_TABLE('{}', '$' COLUMNS (NESTED PATH '$.*' COLUMNS (NESTED PATH '$.*' COLUMNS (`o` FOR ORDINALITY)))) `jt` latin1 latin1_swedish_ci +DROP VIEW v; +# +# MDEV-25229 JSON_TABLE: Server crashes in hton_name upon MATCH .. AGAINST. +# +SELECT val, MATCH(val) AGAINST( 'MariaDB') FROM JSON_TABLE('{"db":"xx"}', '$' COLUMNS(val VARCHAR(32) PATH '$**.*')) AS jt; +ERROR HY000: The storage engine JSON_TABLE function doesn't support FULLTEXT indexes +# +# MDEV-25138 JSON_TABLE: A space between JSON_TABLE and opening bracket causes syntax error +# +select * from json_table ('{}', '$' COLUMNS(x FOR ORDINALITY)) a; +x +1 +create table json_table(id int); +insert into json_table values (1), (2), (3); +select * from json_table; +id +1 +2 +3 +drop table json_table; +# +# MDEV-25146 JSON_TABLE: Non-descriptive + wrong error messages upon trying to store array or object. +# +select a from json_table('[[]]', '$' columns(a char(8) path '$' error on error)) t; +ERROR HY000: Can't store an array or an object in the scalar column 'a' of JSON_TABLE 't'. +show warnings; +Level Code Message +Error 4178 Can't store an array or an object in the scalar column 'a' of JSON_TABLE 't'. +# +# MDEV-JSON_TABLE: CREATE TABLE ignores NULL ON ERROR (implicit or explicit) and fails. +# +CREATE TABLE t1 AS SELECT * FROM JSON_TABLE('{"x":1}', '$' COLUMNS(f DATE PATH '$.*')) AS jt; +Warnings: +Warning 1265 Data truncated for column 'f' at row 1 +SELECT * FROM t1; +f +0000-00-00 +DROP TABLE t1; +# +# MDEV-25254: JSON_TABLE: Inconsistent name resolution with right joins +# +CREATE TABLE t1 (a INT); +SELECT * FROM t1 RIGHT JOIN JSON_TABLE(t1.a,'$' COLUMNS(o FOR ORDINALITY)) jt ON TRUE; +ERROR 42S22: Unknown column 't1.a' in 'JSON_TABLE argument' +CREATE VIEW v AS +SELECT * FROM t1 RIGHT JOIN JSON_TABLE(t1.a,'$' COLUMNS(o FOR ORDINALITY)) jt ON TRUE; +ERROR 42S22: Unknown column 't1.a' in 'JSON_TABLE argument' +insert into t1 values (1),(2),(3); +SELECT * FROM t1 RIGHT JOIN JSON_TABLE(t1.a,'$' COLUMNS(o FOR ORDINALITY)) jt ON TRUE; +ERROR 42S22: Unknown column 't1.a' in 'JSON_TABLE argument' +drop table t1; +# +# MDEV-25202: JSON_TABLE: Early table reference leads to unexpected result set, server crash +# +CREATE TABLE t1 (o INT); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (a INT); +INSERT INTO t2 VALUES (3),(4); +SELECT * FROM JSON_TABLE(a, '$' COLUMNS(o FOR ORDINALITY)) AS jt1 NATURAL JOIN t1 JOIN t2; +ERROR 42S22: Unknown column 'a' in 'JSON_TABLE argument' +SELECT * FROM JSON_TABLE(a, '$' COLUMNS(o FOR ORDINALITY)) AS jt1 NATURAL JOIN t1 STRAIGHT_JOIN t2; +ERROR 42S22: Unknown column 'a' in 'JSON_TABLE argument' +drop table t1,t2; +# Now, try a JSON_TABLE that has a subquery that has an outside reference: +create table t1(a int, js varchar(32)); +create table t2(a varchar(100)); +insert into t2 values(''); +explain +select * +from +t1 left join +json_table(concat('',js), +'$' columns ( color varchar(32) path '$.color') +) as JT on 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +explain +select * +from +t1 right join +json_table(concat('',js), +'$' columns ( color varchar(32) path '$.color') +) as JT on 1; +ERROR 42S22: Unknown column 'js' in 'JSON_TABLE argument' +explain +select * +from +t1 left join +json_table((select concat(a,js) from t2), +'$' columns ( color varchar(32) path '$.color') +) as JT on 1; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +2 SUBQUERY t2 system NULL NULL NULL NULL 1 +explain +select * +from +t1 right join +json_table((select concat(a,js) from t2), +'$' columns ( color varchar(32) path '$.color') +) as JT on 1; +ERROR 42S22: Unknown column 'js' in 'field list' +drop table t1,t2; +# +# Now, a testcase with JSON_TABLEs inside NATURAL JOIN +# +create table t1 (a int, b int); +create table t2 (a int, c int); +select * from +t1, +( t2 +natural join +( +json_table(JT2.d, '$' COLUMNS (d for ordinality)) as JT +natural join +json_table(JT.d, '$' COLUMNS (d for ordinality)) as JT2 +) +); +ERROR 42S22: Unknown column 'JT2.d' in 'JSON_TABLE argument' +drop table t1, t2; +# +# MDEV-25352: JSON_TABLE: Inconsistent name resolution and ER_VIEW_INVALID ... +# (Just the testcase) +# +CREATE TABLE t1 (a INT, b VARCHAR(8)); +INSERT INTO t1 VALUES (1,'{}'),(2,'[]'); +CREATE TABLE t2 (a INT); +INSERT INTO t2 VALUES (2),(3); +SELECT t1.* +FROM +t1 NATURAL JOIN t2 +RIGHT JOIN +JSON_TABLE (t1.b, '$' COLUMNS(o FOR ORDINALITY)) AS jt ON (t1.a = jt.o) +WHERE t1.a = 1; +ERROR 42S22: Unknown column 't1.b' in 'JSON_TABLE argument' +CREATE OR REPLACE VIEW v AS +SELECT t1.* FROM t1 NATURAL JOIN t2 RIGHT JOIN JSON_TABLE (t1.b, '$' COLUMNS(o FOR ORDINALITY)) AS jt ON (t1.a = jt.o) WHERE t1.a = 1; +ERROR 42S22: Unknown column 't1.b' in 'JSON_TABLE argument' +drop table t1,t2; +# +# MDEV-25256: JSON_TABLE: Error ER_VIEW_INVALID upon running query via view +# +SELECT * FROM +JSON_TABLE('[]', '$' COLUMNS(a TEXT PATH '$[*]')) AS jt1 +RIGHT JOIN JSON_TABLE(jt1.a, '$' COLUMNS(o2 FOR ORDINALITY)) AS jt2 +ON(1) +RIGHT JOIN JSON_TABLE('[]', '$' COLUMNS(o3 FOR ORDINALITY)) AS jt3 +ON(1) +WHERE 0; +ERROR 42S22: Unknown column 'jt1.a' in 'JSON_TABLE argument' +# +# MDEV-25346: JSON_TABLE: Server crashes in Item_field::fix_outer_field upon subquery with unknown column +# +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (b INT); +SELECT * FROM ( SELECT * FROM t1 JOIN t2 ON (b IN(SELECT x FROM (SELECT 1 AS c) AS sq1))) AS sq2; +ERROR 42S22: Unknown column 'x' in 'field list' +DROP TABLE t1, t2; +# +# Another testcase +# +create table t1 (item_name varchar(32), item_props varchar(1024)); +insert into t1 values ('Jeans', '{"color": ["green", "brown"], "price": 50}'); +insert into t1 values ('Shirt', '{"color": ["blue", "white"], "price": 20}'); +insert into t1 values ('Jeans', '{"color": ["black"], "price": 60}'); +insert into t1 values ('Jeans', '{"color": ["gray"], "price": 60}'); +insert into t1 values ('Laptop', '{"color": ["black"], "price": 1000}'); +insert into t1 values ('Shirt', '{"color": ["black"], "price": 20}'); +select +t.item_name, +jt.* +from +(select +t1.item_name, +concat( +concat( +concat( +"{\"color\": ", +concat( +concat("[\"", + group_concat( jt.color separator "\", \"") + ), + "\"]") +),',' + ), +concat(concat("\"price\": ",jt.price),'}') +) as item_props +from +t1, +json_table( +t1.item_props, +'$' columns ( +nested path '$.color[*]' columns (color varchar(32) path '$'), +price int path '$.price') +) as jt +group by +t1.item_name, jt.price +) as t, +json_table(t.item_props, +'$' columns ( +nested path '$.color[*]' columns (color varchar(32) path '$'), +price int path '$.price') +) as jt +order by +t.item_name, jt.price, jt.color; +item_name color price +Jeans brown 50 +Jeans green 50 +Jeans black 60 +Jeans gray 60 +Laptop black 1000 +Shirt black 20 +Shirt blue 20 +Shirt white 20 +drop table t1; +# +# MDEV-25380: JSON_TABLE: Assertion `join->best_read < double(1.797...) fails +# +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'{}'),(2,'[]'); +explain +SELECT * +FROM t1 +WHERE +EXISTS(SELECT * +FROM JSON_TABLE(b, '$' COLUMNS(o FOR ORDINALITY)) AS jt +WHERE jt.o = t1.a); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 +1 PRIMARY jt ALL NULL NULL NULL NULL 40 Table function: json_table; Using where; FirstMatch(t1) +drop table t1; +# +# MDEV-25381: JSON_TABLE: ER_WRONG_OUTER_JOIN upon query with LEFT and RIGHT joins and view +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (b INT, c TEXT); +INSERT INTO t2 VALUES (1,'{}'),(2,'[]'); +CREATE VIEW v2 AS SELECT * FROM t2; +SELECT * +FROM +t1 RIGHT JOIN +t2 AS tt +LEFT JOIN +JSON_TABLE(tt.c, '$' COLUMNS(o FOR ORDINALITY)) AS jt +ON tt.b = jt.o +ON t1.a = tt.b; +a b c o +1 1 {} 1 +2 2 [] NULL +SELECT * +FROM +t1 RIGHT JOIN +v2 AS tt +LEFT JOIN +JSON_TABLE(tt.c, '$' COLUMNS(o FOR ORDINALITY)) AS jt +ON tt.b = jt.o +ON t1.a = tt.b; +a b c o +1 1 {} 1 +2 2 [] NULL +SELECT * +FROM +t1 RIGHT JOIN +v2 AS tt +LEFT JOIN +JSON_TABLE(CONCAT(tt.c,''), '$' COLUMNS(o FOR ORDINALITY)) AS jt +ON tt.b = jt.o +ON t1.a = tt.b; +a b c o +1 1 {} 1 +2 2 [] NULL +prepare s from +"SELECT * +FROM + t1 RIGHT JOIN + v2 AS tt + LEFT JOIN + JSON_TABLE(CONCAT(tt.c,''), '$' COLUMNS(o FOR ORDINALITY)) AS jt + ON tt.b = jt.o + ON t1.a = tt.b"; +execute s; +a b c o +1 1 {} 1 +2 2 [] NULL +execute s; +a b c o +1 1 {} 1 +2 2 [] NULL +DROP VIEW v2; +DROP TABLE t1, t2; +# +# MDEV-25259 JSON_TABLE: Illegal mix of collations upon executing query with combination of charsets via view. +# +CREATE VIEW v AS +SELECT * FROM JSON_TABLE(CONVERT('[]' USING dec8), +'$' COLUMNS(b VARCHAR(8) CHARSET utf8 PATH '$')) AS jt2 +WHERE (CONVERT('[]' USING cp1256) = b); +SELECT * FROM v; +b +DROP VIEW v; +# +# MDEV-25397: JSON_TABLE: Unexpected ER_MIX_OF_GROUP_FUNC_AND_FIELDS upon query with JOIN +# +set @save_sql_mode= @@sql_mode; +SET sql_mode='ONLY_FULL_GROUP_BY'; +CREATE TABLE t1 (a TEXT); +SELECT SUM(o) FROM t1 JOIN JSON_TABLE(t1.a, '$' COLUMNS(o FOR ORDINALITY)) jt; +SUM(o) +NULL +set sql_mode=@save_sql_mode; +drop table t1; +# +# MDEV-25379 JSON_TABLE: ERROR ON clauses are ignored if a column is not on select list. +# +SELECT * FROM JSON_TABLE ('{}', '$' COLUMNS(a INT PATH '$.*' ERROR ON EMPTY, o FOR ORDINALITY)) AS jt; +ERROR HY000: Field 'a' can't be set for JSON_TABLE 'jt'. +SELECT o FROM JSON_TABLE ('{}', '$' COLUMNS(a INT PATH '$.*' ERROR ON EMPTY, o FOR ORDINALITY)) AS jt; +ERROR HY000: Field 'a' can't be set for JSON_TABLE 'jt'. +SELECT COUNT(*) FROM JSON_TABLE ('{}', '$' COLUMNS(a INT PATH '$.*' ERROR ON EMPTY, o FOR ORDINALITY)) AS jt; +ERROR HY000: Field 'a' can't be set for JSON_TABLE 'jt'. +# +# MDEV-25408 JSON_TABLE: AddressSanitizer CHECK failed in Binary_string::realloc_raw. +# +SELECT x, COUNT(*) FROM JSON_TABLE( '{}', '$' COLUMNS( +a BIT(14) PATH '$', b CHAR(16) PATH '$', c INT PATH '$[0]', d INT PATH '$[1]', e INT PATH '$[2]', +f INT PATH '$[3]', g INT PATH '$[4]', h INT PATH '$[5]', i INT PATH '$[6]', j INT PATH '$[7]', +x TEXT PATH '$[9]')) AS jt GROUP BY x; +x COUNT(*) +NULL 1 +# +# MDEV-25408 JSON_TABLE: AddressSanitizer CHECK failed in Binary_string::realloc_raw. +# +SELECT * FROM JSON_TABLE('{}', '$' COLUMNS( +a TEXT EXISTS PATH '$', b VARCHAR(40) PATH '$', c BIT(60) PATH '$', d VARCHAR(60) PATH '$', e BIT(62) PATH '$', +f FOR ORDINALITY, g INT PATH '$', h VARCHAR(36) PATH '$', i DATE PATH '$', j CHAR(4) PATH '$' + )) AS jt; +a b c d e f g h i j +1 NULL NULL NULL NULL 1 NULL NULL NULL NULL +# +# MDEV-25373 JSON_TABLE: Illegal mix of collations upon executing PS once, or SP/function twice. +# +SELECT * FROM JSON_TABLE (CONVERT('[1,2]' USING koi8u), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt1 NATURAL JOIN JSON_TABLE (CONVERT('[2,3]' USING eucjpms), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt2; +a +2 +PREPARE stmt1 FROM " +SELECT * FROM JSON_TABLE (CONVERT('[1,2]' USING koi8u), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt1 NATURAL JOIN JSON_TABLE (CONVERT('[2,3]' USING eucjpms), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt2; +"; +EXECUTE stmt1; +a +2 +DEALLOCATE PREPARE stmt1; +# +# MDEV-25149 JSON_TABLE: Inconsistency in implicit data type conversion. +# +select * from json_table( '[{"a":"asd"}, {"a":123}, {"a":[]}, {"a":{}} ]', '$[*]' +columns ( id for ordinality, +intcol int path '$.a' default '1234' on empty default '5678' on error) +) as tt; +id intcol +1 0 +2 123 +3 5678 +4 5678 +Warnings: +Warning 1366 Incorrect integer value: 'asd' for column ``.`(temporary)`.`intcol` at row 1 +# +# MDEV-25377 JSON_TABLE: Wrong value with implicit conversion. +# +select * from json_table('{"a":"foo", "b":1, "c":1000}', '$.*' columns(converted tinyint path '$', original text path '$')) as jt; +converted original +0 foo +1 1 +127 1000 +Warnings: +Warning 1366 Incorrect integer value: 'foo' for column ``.`(temporary)`.`converted` at row 1 +Warning 1264 Out of range value for column 'converted' at row 3 +select * from json_table('{"a":"foo", "b":1, "c":1000}', '$.*' columns(converted tinyint path '$', original text path '$')) as jt order by converted; +converted original +0 foo +1 1 +127 1000 +Warnings: +Warning 1366 Incorrect integer value: 'foo' for column ``.`(temporary)`.`converted` at row 1 +Warning 1264 Out of range value for column 'converted' at row 1 +Warning 1366 Incorrect integer value: 'foo' for column ``.`(temporary)`.`converted` at row 1 +Warning 1264 Out of range value for column 'converted' at row 3 +select * from json_table('{"a":"foo", "b":1, "c":1000}', '$.*' columns(converted tinyint path '$', original text path '$')) as jt order by original; +converted original +1 1 +127 1000 +0 foo +Warnings: +Warning 1264 Out of range value for column 'converted' at row 2 +Warning 1366 Incorrect integer value: 'foo' for column ``.`(temporary)`.`converted` at row 3 +select * from +json_table('[{"color": "blue", "price": { "high": 10, "low": 5}}, + {"color": "white", "price": "pretty low"}, + {"color": "yellow", "price": 256.20}, + {"color": "red", "price": { "high": 20, "low": 8}}]', +'$[*]' columns(color varchar(100) path '$.color', +price json path '$.price' + ) +) as T; +color price +blue { "high": 10, "low": 5} +white "pretty low" +yellow 256.20 +red { "high": 20, "low": 8} +# +# MDEV-27696 Json table columns accept redundant COLLATE syntax +# +SELECT * FROM json_table('[{"name":"str"}]', '$[*]' + COLUMNS ( +name BLOB COLLATE `binary` PATH '$.name' + ) +) AS jt; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'COLLATE `binary` PATH '$.name' + ) +) AS jt' at line 3 +SELECT * FROM json_table('[{"name":"str"}]', '$[*]' + COLUMNS ( +name VARCHAR(10) COLLATE latin1_bin COLLATE latin1_swedish_ci PATH '$.name' + ) +) AS jt; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'COLLATE latin1_swedish_ci PATH '$.name' + ) +) AS jt' at line 3 +SELECT * FROM json_table('[{"name":"str"}]', '$[*]' + COLUMNS ( +name VARCHAR(10) BINARY COLLATE utf8_czech_ci path '$.name' + ) +) AS jt; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'COLLATE utf8_czech_ci path '$.name' + ) +) AS jt' at line 3 +# +# MDEV-27690 Crash on `CHARACTER SET csname COLLATE DEFAULT` in column definition +# +SELECT * FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( +name VARCHAR(10) CHARACTER SET latin1 COLLATE DEFAULT PATH '$.name' + ) +) AS jt; +name +Jeans +# +# MDEV-28480: Assertion `0' failed in Item_row::illegal_method_call +# on SELECT FROM JSON_TABLE +# +SELECT 1 FROM JSON_TABLE (row(1,2), '$' COLUMNS (o FOR ORDINALITY)) AS j; +ERROR 21000: Operand should contain 1 column(s) +# +# End of 10.6 tests +# +# +# Start of 10.9 tests +# +# +# MDEV-27743 Remove Lex::charset +# +SELECT collation(name) +FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( +name VARCHAR(10) PATH '$.name' + ) +) AS jt; +collation(name) +utf8mb4_general_ci +SELECT collation(name) +FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( +name VARCHAR(10) COLLATE DEFAULT PATH '$.name' + ) +) AS jt; +collation(name) +utf8mb4_general_ci +SELECT collation(name) +FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( +name VARCHAR(10) BINARY PATH '$.name' + ) +) AS jt; +collation(name) +utf8mb4_bin +CREATE VIEW v1 AS +SELECT * +FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( +name VARCHAR(10) PATH '$.name' + ) +) AS jt; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `jt`.`name` AS `name` from JSON_TABLE('[{"name":"Jeans"}]', '$[*]' COLUMNS (`name` varchar(10) PATH '$.name')) `jt` latin1 latin1_swedish_ci +SELECT collation(name) FROM v1; +collation(name) +utf8mb4_general_ci +DROP VIEW v1; +CREATE VIEW v1 AS +SELECT * +FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( +name VARCHAR(10) COLLATE DEFAULT PATH '$.name' + ) +) AS jt; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `jt`.`name` AS `name` from JSON_TABLE('[{"name":"Jeans"}]', '$[*]' COLUMNS (`name` varchar(10) PATH '$.name')) `jt` latin1 latin1_swedish_ci +SELECT collation(name) FROM v1; +collation(name) +utf8mb4_general_ci +DROP VIEW v1; +CREATE VIEW v1 AS +SELECT * +FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( +name VARCHAR(10) BINARY PATH '$.name' + ) +) AS jt; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `jt`.`name` AS `name` from JSON_TABLE('[{"name":"Jeans"}]', '$[*]' COLUMNS (`name` varchar(10) CHARSET utf8mb4 COLLATE utf8mb4_bin PATH '$.name')) `jt` latin1 latin1_swedish_ci +SELECT collation(name) FROM v1; +collation(name) +utf8mb4_bin +DROP VIEW v1; +# +# MDEV-28319: Assertion `cur_step->type & JSON_PATH_KEY' failed in json_find_path +# +SELECT * FROM JSON_TABLE('{"foo":{"bar":1},"qux":2}', '$' COLUMNS(c1 VARCHAR(8) PATH '$[0]', c2 CHAR(8) PATH '$.*.x')) AS js; +c1 c2 +NULL NULL +# +# MDEV-29446 Change SHOW CREATE TABLE to display default collations +# +CREATE VIEW v1 AS +SELECT * FROM +JSON_TABLE('[{"name":"Laptop"}]', '$[*]' +COLUMNS +( +name VARCHAR(10) CHARACTER SET latin1 PATH '$.name') +) AS jt; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `jt`.`name` AS `name` from JSON_TABLE('[{"name":"Laptop"}]', '$[*]' COLUMNS (`name` varchar(10) CHARSET latin1 COLLATE latin1_swedish_ci PATH '$.name')) `jt` latin1 latin1_swedish_ci +DROP VIEW v1; +CREATE VIEW v1 AS +SELECT * FROM +JSON_TABLE('[{"name":"Laptop"}]', '$[*]' +COLUMNS +( +name VARCHAR(10) CHARACTER SET utf8mb3 PATH '$.name') +) AS jt; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `jt`.`name` AS `name` from JSON_TABLE('[{"name":"Laptop"}]', '$[*]' COLUMNS (`name` varchar(10) CHARSET utf8mb3 COLLATE utf8mb3_general_ci PATH '$.name')) `jt` latin1 latin1_swedish_ci +DROP VIEW v1; +CREATE VIEW v1 AS +SELECT * FROM +JSON_TABLE('[{"name":"Laptop"}]', '$[*]' +COLUMNS +( +name VARCHAR(10) CHARACTER SET BINARY PATH '$.name') +) AS jt; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `jt`.`name` AS `name` from JSON_TABLE('[{"name":"Laptop"}]', '$[*]' COLUMNS (`name` varbinary(10) PATH '$.name')) `jt` latin1 latin1_swedish_ci +DROP VIEW v1; +CREATE VIEW v1 AS +SELECT * FROM +JSON_TABLE('[{"name":"Laptop"}]', '$[*]' +COLUMNS +( +name ENUM('Laptop') CHARACTER SET BINARY PATH '$.name') +) AS jt; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ENUM('Laptop') CHARACTER SET BINARY PATH '$.name') +) AS jt' at line 6 +# +# End of 10.9 tests +# diff --git a/mysql-test/suite/json/r/json_table_binlog.result b/mysql-test/suite/json/r/json_table_binlog.result new file mode 100644 index 00000000..472f7395 --- /dev/null +++ b/mysql-test/suite/json/r/json_table_binlog.result @@ -0,0 +1,26 @@ +# +# MDEV-25154: JSON_TABLE: Queries involving ordinality columns are unsafe for statement binlog and should be marked as such +# +create table t1 (a int); +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +set binlog_format='statement'; +insert into t1 +select * +from json_table('[1,2,3]', '$[*]' columns (a for ordinality)) as T ; +Warnings: +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave +set binlog_format='mixed'; +insert into t1 +select * +from json_table('[1,2,3]', '$[*]' columns (a for ordinality)) as T ; +# This must show Annotate_rows, Write_rows_v1 events. Not the statement event +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Annotate_rows # # insert into t1 +select * +from json_table('[1,2,3]', '$[*]' columns (a for ordinality)) as T +master-bin.000001 # Table_map # # table_id: # (test.t1) +master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000001 # Query # # COMMIT +drop table t1; diff --git a/mysql-test/suite/json/r/json_table_mysql.result b/mysql-test/suite/json/r/json_table_mysql.result new file mode 100644 index 00000000..2357d9d3 --- /dev/null +++ b/mysql-test/suite/json/r/json_table_mysql.result @@ -0,0 +1,1666 @@ +# +# WL#8867: Add JSON_TABLE table function +# +select * from +json_table( +'[{"a":"3"},{"a":2},{"b":1},{"a":0}]', +'$[*]' columns (id for ordinality, +jpath varchar(100) path '\$.a', +jexst int exists path '\$.b') +) as tt; +id jpath jexst +1 3 0 +2 2 0 +3 NULL 1 +4 0 0 +select * from +json_table( +'[{"x":"3"},{"a":2},{"b":1},{"a":0}]', +'$[*]' columns (id for ordinality, +jpath varchar(100) path '$.a' default '[99]' on error, +jexst int exists path '$.b') +) as tt; +id jpath jexst +1 NULL 0 +2 2 0 +3 NULL 1 +4 0 0 +select * from +json_table( +'[{"x":"3"},{"a":2},{"b":1},{"a":0},{"a":[1,2]}]', +'$[*]' columns (id for ordinality, +jpath varchar(100) path '$.a' + default '33' on empty +default '66' on error, +jsn_path json path '\$.a' default '{"x":33}' on empty, +jexst int exists path '\$.b') +) as tt; +id jpath jsn_path jexst +1 33 {"x":33} 0 +2 2 2 0 +3 33 {"x":33} 1 +4 0 0 0 +5 66 [1,2] 0 +select * from +json_table( +'[{"a":"3"},{"a":2},{"b":1},{"a":0.33},{"a":"asd"}]', +'$[*]' columns (id for ordinality, +jpath_i int path '$.a' + default '33' on empty +default '66' on error, +jpath_r real path '$.a' + default '33.3' on empty +default '77.7' on error, +jsn_path json path '$.a' default '{"x":33}' on empty, +jexst int exists path '$.b') +) as tt; +id jpath_i jpath_r jsn_path jexst +1 3 3 "3" 0 +2 2 2 2 0 +3 33 33.3 {"x":33} 1 +4 0 0.33 0.33 0 +5 0 0 "asd" 0 +Warnings: +Warning 1366 Incorrect integer value: 'asd' for column ``.`(temporary)`.`jpath_i` at row 5 +Warning 1366 Incorrect double value: 'asd' for column ``.`(temporary)`.`jpath_r` at row 5 +select * from +json_table( +'[{"x":"3"},{"a":2},{"b":1},{"a":0},{"a":[1,2]}]', +'$[*]' columns (id for ordinality, +jpath varchar(100) path '$.a' + default '33' on empty +default '66' on error, +jsn_path json path '$.a' default '{"x":33}' on empty, +jexst int exists path '$.b') +) as tt; +id jpath jsn_path jexst +1 33 {"x":33} 0 +2 2 2 0 +3 33 {"x":33} 1 +4 0 0 0 +5 66 [1,2] 0 +select * from +json_table( +'[{"a":"3"},{"a":2},{"b":1},{"a":0}]', +'$[*]' columns (id for ordinality, +jpath varchar(100) path '$.a', +json_path json path '$.a', +jexst int exists path '$.b') +) as tt; +id jpath json_path jexst +1 3 "3" 0 +2 2 2 0 +3 NULL NULL 1 +4 0 0 0 +select * from +json_table( +'[{"a":"3"},{"a":2},{"b":1},{"a":0}]', +'$[*]' columns (id for ordinality, +jpath varchar(100) path '$.a', +json_path json path '$.a', +jexst int exists path '$.b') +) as tt +where id = 3; +id jpath json_path jexst +3 NULL NULL 1 +select * from +json_table( +'[{"a":"3"},{"a":2},{"b":1},{"a":0}]', +'$[*]' columns (id for ordinality, +jpath varchar(100) path '$.a' error on empty, +jexst int exists path '$.b') +) as tt; +ERROR HY000: Field 'jpath' can't be set for JSON_TABLE 'tt'. +select * from +json_table( +'[{"a":"3"},{"a":2},{"a":1},{"a":[0,1]}]', +'$[*]' columns (id for ordinality, +jpath varchar(100) path '$.a' error on error, +jexst int exists path '$.b') +) as tt; +ERROR HY000: Can't store an array or an object in the scalar column 'jpath' of JSON_TABLE 'tt'. +select * from +json_table( +'!#@$!@#$', +'$[*]' columns (id for ordinality, +jpath varchar(100) path '$.a', +jexst int exists path '$.b') +) as tt; +ERROR HY000: Syntax error in JSON text in argument 1 to function 'JSON_TABLE' at position 1 +select * from +json_table( +'[{"a":"3"},{"a":2},{"b":1},{"a":0}]', +'$[*]' columns (id for ordinality, +id for ordinality) +) as tt; +ERROR 42S21: Duplicate column name 'id' +select * from +json_table( +'[{"a":"3"},{"a":2},{"b":1},{"a":0}]', +'$[*]' columns (id for ordinality, +_id for ordinality) +) as tt; +id _id +1 1 +2 2 +3 3 +4 4 +select * from +json_table( +'[ + {"a":"3", "n": { "l": 1}}, + {"a":2, "n": { "l": 1}}, + {"b":1, "n": { "l": 1}}, + {"a":0, "n": { "l": 1}} + ]', +'$[*]' columns ( +id for ordinality, +jpath varchar(100) path '$.a', +jexst int exists path '$.b', +nested path '$.n' columns ( +id_n for ordinality, +jpath_n varchar(50) path '$.l') +) +) as tt; +id jpath jexst id_n jpath_n +1 3 0 1 1 +2 2 0 1 1 +3 NULL 1 1 1 +4 0 0 1 1 +explain format=json +select * from +json_table( +'[ + {"a":"3", "n": { "l": 1}}, + {"a":2, "n": { "l": 1}}, + {"b":1, "n": { "l": 1}}, + {"a":0, "n": { "l": 1}} + ]', +'$[*]' columns ( +id for ordinality, +jpath varchar(100) path '$.a', +jexst int exists path '$.b', +nested path '$.n' columns ( +id_n for ordinality, +jpath_n varchar(50) path '$.l') +) +) as tt; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "tt", + "access_type": "ALL", + "rows": 40, + "filtered": 100, + "table_function": "json_table" + } + } + ] + } +} +select * from +json_table( +'[ + {"a":2, "n": [{ "l": 1}, {"l": 11}]}, + {"a":1, "n": [{ "l": 2}, {"l": 22}]} + ]', +'$[*]' columns ( +id for ordinality, +jpath varchar(50) path '$.a', +nested path '$.n[*]' columns ( +id_n for ordinality, +jpath_n varchar(50) path '$.l'), +nested path '$.n[*]' columns ( +id_m for ordinality, +jpath_m varchar(50) path '$.l') +) +) as tt; +id jpath id_n jpath_n id_m jpath_m +1 2 1 1 NULL NULL +1 2 2 11 NULL NULL +1 2 NULL NULL 1 1 +1 2 NULL NULL 2 11 +2 1 1 2 NULL NULL +2 1 2 22 NULL NULL +2 1 NULL NULL 1 2 +2 1 NULL NULL 2 22 +select * from json_table( +'[ + {"a":"3", "n": ["b","a","c"]}, + {"a":2, "n": [1,2]}, + {"b":1, "n": ["zzz"]}, + {"a":0, "n": [0.1, 0.02]} + ]', +'$[*]' columns ( +id for ordinality, +jpath varchar(100) path '$.a', +jexst int exists path '$.b', +nested path '$.n[*]' columns ( +id_n for ordinality, +jpath_n varchar(50) path '$') +) +) as tt; +id jpath jexst id_n jpath_n +1 3 0 1 b +1 3 0 2 a +1 3 0 3 c +2 2 0 1 1 +2 2 0 2 2 +3 NULL 1 1 zzz +4 0 0 1 0.1 +4 0 0 2 0.02 +select * from json_table( +'[ + {"a":"3", "n": ["b","a","c"]}, + {"a":2, "n": [1,2]}, + {"b":1, "n": ["zzz"]}, + {"a":0, "n": [0.1, 0.02]} + ]', +'$[*]' columns ( +id for ordinality, +jpath varchar(100) path '$.a', +jexst int exists path '$.b', +nested path '$.n[*]' columns ( +id_n1 for ordinality, +jpath_n1 varchar(50) path '$') , +nested path '$.n[*]' columns ( +id_n2 for ordinality, +jpath_n2 varchar(50) path '$') +) +) as tt; +id jpath jexst id_n1 jpath_n1 id_n2 jpath_n2 +1 3 0 1 b NULL NULL +1 3 0 2 a NULL NULL +1 3 0 3 c NULL NULL +1 3 0 NULL NULL 1 b +1 3 0 NULL NULL 2 a +1 3 0 NULL NULL 3 c +2 2 0 1 1 NULL NULL +2 2 0 2 2 NULL NULL +2 2 0 NULL NULL 1 1 +2 2 0 NULL NULL 2 2 +3 NULL 1 1 zzz NULL NULL +3 NULL 1 NULL NULL 1 zzz +4 0 0 1 0.1 NULL NULL +4 0 0 2 0.02 NULL NULL +4 0 0 NULL NULL 1 0.1 +4 0 0 NULL NULL 2 0.02 +select * from json_table( +'[ + {"a":"3", "n": [ {"ll":["b1","b2","b3"]}, {"ll": ["a1","a2"]}, + {"ll":["c"]} ]}, + {"a":2, "n": [{"ll":[1,11,111]},{"ll":[2]}]}, + {"b":1, "n": [{"ll":["zzz"]}]}, + {"a":0, "n": [{"ll":[0.1,0.01]}, {"ll":[0.02,0.002,0.0002]}]} + ]', +'$[*]' columns ( +id1 for ordinality, +jpath varchar(100) path '$.a', +jexst int exists path '$.b', +nested path '$.n[*]' columns ( +id2 for ordinality, +nested path '$.ll[*]' columns ( +id3 for ordinality, +jpath_3 varchar(50) path '$') +), +nested path '$.n[*]' columns ( +id4 for ordinality, +jpath_4 json path '$') +) +) as tt; +id1 jpath jexst id2 id3 jpath_3 id4 jpath_4 +1 3 0 1 1 b1 NULL NULL +1 3 0 1 2 b2 NULL NULL +1 3 0 1 3 b3 NULL NULL +1 3 0 2 1 a1 NULL NULL +1 3 0 2 2 a2 NULL NULL +1 3 0 3 1 c NULL NULL +1 3 0 NULL NULL NULL 1 {"ll":["b1","b2","b3"]} +1 3 0 NULL NULL NULL 2 {"ll": ["a1","a2"]} +1 3 0 NULL NULL NULL 3 {"ll":["c"]} +2 2 0 1 1 1 NULL NULL +2 2 0 1 2 11 NULL NULL +2 2 0 1 3 111 NULL NULL +2 2 0 2 1 2 NULL NULL +2 2 0 NULL NULL NULL 1 {"ll":[1,11,111]} +2 2 0 NULL NULL NULL 2 {"ll":[2]} +3 NULL 1 1 1 zzz NULL NULL +3 NULL 1 NULL NULL NULL 1 {"ll":["zzz"]} +4 0 0 1 1 0.1 NULL NULL +4 0 0 1 2 0.01 NULL NULL +4 0 0 2 1 0.02 NULL NULL +4 0 0 2 2 0.002 NULL NULL +4 0 0 2 3 0.0002 NULL NULL +4 0 0 NULL NULL NULL 1 {"ll":[0.1,0.01]} +4 0 0 NULL NULL NULL 2 {"ll":[0.02,0.002,0.0002]} +ord should be 1,1,1,2, which tells that first two values of 'l' are +from the same object, and next two are from different objects +SELECT * +FROM JSON_TABLE( +'[{"a": "a_val", + "b": [ + {"c": "c_val", + "l": [1,2]} + ] + }, {"a": "a_val", + "b": [ + {"c": "c_val", + "l": [11]}, + {"c": "c_val", + "l": [22]} + ] + }]', +'$[*]' COLUMNS ( +apath VARCHAR(10) PATH '$.a', +NESTED PATH '$.b[*]' COLUMNS ( +bpath VARCHAR(10) PATH '$.c', +ord FOR ORDINALITY, +NESTED PATH '$.l[*]' COLUMNS ( +lpath varchar(10) PATH '$' + ) +) +)) as jt; +apath bpath ord lpath +a_val c_val 1 1 +a_val c_val 1 2 +a_val c_val 1 11 +a_val c_val 2 22 +CREATE TABLE jt( i JSON ); +SELECT * FROM jt, JSON_TABLE(jt.i, '$' COLUMNS (a INT PATH '$')) AS tt +WHERE a=1; +i a +EXPLAIN SELECT * FROM jt, JSON_TABLE(jt.i, '$' COLUMNS (a INT PATH '$')) AS tt +WHERE a=1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +SELECT * FROM ( +SELECT * FROM jt, JSON_TABLE(jt.i, '$' COLUMNS (a INT PATH '$')) AS tt +WHERE a=1) AS ttt; +i a +EXPLAIN SELECT * FROM ( +SELECT * FROM jt, JSON_TABLE(jt.i, '$' COLUMNS (a INT PATH '$')) AS tt +WHERE a=1) AS ttt; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +DROP TABLE jt; +CREATE VIEW v AS +SELECT * FROM JSON_TABLE('[1,2,3]', +'$[*]' COLUMNS (num INT PATH '$.a' + DEFAULT '123' ON EMPTY +DEFAULT '456' ON ERROR)) AS jt; +SELECT * FROM v; +num +123 +123 +123 +SHOW CREATE VIEW v; +View Create View character_set_client collation_connection +v CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `jt`.`num` AS `num` from JSON_TABLE('[1,2,3]', '$[*]' COLUMNS (`num` int(11) PATH '$.a' DEFAULT '123' ON EMPTY DEFAULT '456' ON ERROR)) `jt` latin1 latin1_swedish_ci +DROP VIEW v; +SELECT * FROM JSON_TABLE('"asdf"', +'$' COLUMNS (a INT PATH '$' ERROR ON ERROR)) AS jt; +a +0 +Warnings: +Warning 1366 Incorrect integer value: 'asdf' for column ``.`(temporary)`.`a` at row 1 +SELECT * FROM +JSON_TABLE('[{"a":1},{"a":2}]', +'$' COLUMNS (a INT PATH '$[*].a' ERROR ON ERROR)) AS jt; +ERROR HY000: Can't store multiple matches of the path in the column 'a' of JSON_TABLE 'jt'. +SELECT * FROM +JSON_TABLE('[{"a":1},{"a":2}]', +'$' COLUMNS (a JSON PATH '$[*].a' ERROR ON ERROR)) AS jt; +ERROR HY000: Can't store multiple matches of the path in the column 'a' of JSON_TABLE 'jt'. +SELECT * FROM +JSON_TABLE('123.456', '$' COLUMNS (a DECIMAL(2,1) PATH '$' ERROR ON ERROR)) AS jt; +a +9.9 +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +SELECT * FROM +JSON_TABLE('123.456', '$' COLUMNS (a DECIMAL(2,1) PATH '$')) AS jt; +a +9.9 +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +SELECT * FROM +JSON_TABLE('{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{}}}}}}}}}}}}}}}}}}}', +'$' COLUMNS (i0 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i1 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i2 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i3 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i4 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i5 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i6 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i7 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i8 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i9 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i10 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i11 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i12 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i13 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i14 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i15 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i16 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i17 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i18 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i19 INT PATH '$.a', +NESTED PATH '$.b' COLUMNS (i20 INT PATH '$.a' + )))))))))))))))))))))) jt; +i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12 i13 i14 i15 i16 i17 i18 i19 i20 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 NULL NULL NULL +CREATE TABLE t1(id int, jd JSON); +INSERT INTO t1 values (1, '[1,3,5]'),(2,'[2,4,6]'); +SELECT id, jt.* FROM t1, +JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY, +val INT PATH '$')) AS jt; +id jid val +1 1 1 +1 2 3 +1 3 5 +2 1 2 +2 2 4 +2 3 6 +SELECT /*+ JOIN_ORDER(jt, t1) */ id, jt.* +FROM t1, +JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY, +val INT PATH '$')) AS jt; +id jid val +1 1 1 +1 2 3 +1 3 5 +2 1 2 +2 2 4 +2 3 6 +EXPLAIN SELECT /*+ JOIN_ORDER(jt, t1) */ id, jt.* +FROM t1, +JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY, +val INT PATH '$')) AS jt; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 +1 SIMPLE jt ALL NULL NULL NULL NULL 40 Table function: json_table +SELECT /*+ JOIN_ORDER(t2,jt) */ t1.id, t2.id, jt.* +FROM t1, +JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY, +val INT PATH '$')) AS jt, +t1 AS t2; +id id jid val +1 1 1 1 +1 1 2 3 +1 1 3 5 +1 2 1 1 +1 2 2 3 +1 2 3 5 +2 1 1 2 +2 1 2 4 +2 1 3 6 +2 2 1 2 +2 2 2 4 +2 2 3 6 +EXPLAIN SELECT t1.id, t2.id, jt.* +FROM t1, +JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY, +val INT PATH '$')) AS jt, +t1 AS t2; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 +1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using join buffer (flat, BNL join) +1 SIMPLE jt ALL NULL NULL NULL NULL 40 Table function: json_table +EXPLAIN SELECT /*+ JOIN_ORDER(t2,jt) */ t1.id, t2.id, jt.* +FROM t1, +JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY, +val INT PATH '$')) AS jt, +t1 AS t2; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 +1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using join buffer (flat, BNL join) +1 SIMPLE jt ALL NULL NULL NULL NULL 40 Table function: json_table +SELECT * FROM t1 WHERE id IN +(SELECT * FROM JSON_TABLE('[1,2]', '$[*]' COLUMNS +(id INT PATH '$')) AS jt); +id jd +1 [1,3,5] +2 [2,4,6] +EXPLAIN SELECT * FROM t1 WHERE id IN +(SELECT * FROM JSON_TABLE('[1,2]', '$[*]' COLUMNS +(id INT PATH '$')) AS jt); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 +1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1 +2 MATERIALIZED jt ALL NULL NULL NULL NULL 40 Table function: json_table +DROP TABLE t1; +SELECT * FROM JSON_TABLE('"asdf"', '$' COLUMNS( +tm TIME PATH '$', +dt DATE PATH '$', +i INT PATH '$', +f FLOAT PATH '$', +d DECIMAL PATH '$')) AS jt; +tm dt i f d +00:00:00 0000-00-00 0 0 0 +Warnings: +Warning 1265 Data truncated for column 'tm' at row 1 +Warning 1265 Data truncated for column 'dt' at row 1 +Warning 1366 Incorrect integer value: 'asdf' for column ``.`(temporary)`.`i` at row 1 +Warning 1366 Incorrect double value: 'asdf' for column ``.`(temporary)`.`f` at row 1 +Warning 1366 Incorrect decimal value: 'asdf' for column ``.`(temporary)`.`d` at row 1 +SELECT * FROM +JSON_TABLE('{}', '$' COLUMNS (x INT PATH '$.x' DEFAULT NULL ON EMPTY)) jt; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'NULL ON EMPTY)) jt' at line 2 +SELECT * FROM +JSON_TABLE('{}', '$' COLUMNS (x INT PATH '$.x' DEFAULT NULL ON ERROR)) jt; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'NULL ON ERROR)) jt' at line 2 +SELECT * FROM +JSON_TABLE('{}', '$' COLUMNS (x INT PATH '$.x' DEFAULT 0 ON EMPTY)) jt; +x +0 +SELECT * FROM +JSON_TABLE('{}', '$' COLUMNS (x INT PATH '$.x' DEFAULT 0 ON ERROR)) jt; +x +NULL +SELECT * FROM +JSON_TABLE('{}', '$' COLUMNS (x DATE +PATH '$.x' + DEFAULT DATE'2020-01-01' ON EMPTY)) jt; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DATE'2020-01-01' ON EMPTY)) jt' at line 4 +SELECT * FROM +JSON_TABLE('{}', '$' COLUMNS (x DATE +PATH '$.x' + DEFAULT DATE'2020-01-01' ON ERROR)) jt; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DATE'2020-01-01' ON ERROR)) jt' at line 4 +# +# Bug#25413069: SIG11 IN CHECK_COLUMN_GRANT_IN_TABLE_REF +# +SELECT a FROM JSON_TABLE(abc, '$[*]' COLUMNS ( a int path '$.a')) AS jt; +ERROR 42S22: Unknown column 'abc' in 'JSON_TABLE argument' +# +# Bug#25420680: ASSERTION `THD->IS_ERROR()' FAILED IN SQL/SQL_SELECT.CC +# +SELECT * FROM JSON_TABLE('{"a":"2017-11-1"}', +'$' COLUMNS (jpath DATE PATH '$.a')) AS jt; +jpath +2017-11-01 +# +# Bug#25413826: ASSERTION `TABLE_LIST->ALIAS' FAILED +# +SELECT * FROM JSON_TABLE('[{"a": 1, "b": 2}]', +'$[*]' COLUMNS ( a int path '$.b')); +ERROR HY000: Every table function must have an alias. +# +# Bug#25421464: ASSERTION `!STRCMP(TABLE_REF->TABLE_NAME, ... +# +CREATE VIEW v1 AS +SELECT * FROM JSON_TABLE('[{"a": 1, "b": 2}]', +'$[*]' COLUMNS ( a INT PATH '$.b')) AS jt; +SELECT * FROM v1; +a +2 +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `jt`.`a` AS `a` from JSON_TABLE('[{"a": 1, "b": 2}]', '$[*]' COLUMNS (`a` int(11) PATH '$.b')) `jt` latin1 latin1_swedish_ci +DROP VIEW v1; +# +# Bug#25427457: ASSERTION `!((*REG_FIELD)->FLAGS & 16)' +# +SELECT * FROM JSON_TABLE('{"a":"1"}', +'$' COLUMNS (jpath JSON PATH '$.a', +o FOR ORDINALITY)) AS jt +WHERE o = 1; +jpath o +"1" 1 +# +# Bug#25427982: ASSERTION `DERIVED' FAILED IN SQL/TABLE.H +# +SELECT je,o FROM JSON_TABLE('{"a":"1"}', +'$' COLUMNS (o FOR ORDINALITY, +je BIGINT EXISTS PATH '$.a')) AS jt +GROUP BY je; +je o +1 1 +SELECT je,COUNT(o) FROM JSON_TABLE('{"a":"1"}', +'$' COLUMNS (o FOR ORDINALITY, +je BIGINT EXISTS PATH '$.a')) AS jt +GROUP BY je; +je COUNT(o) +1 1 +# +# Bug#25413194: ASSERTION `!(WANT_PRIVILEGE & ~(GRANT->WANT_PRIVILEGE +# +CREATE TABLE t1 (j JSON); +SELECT * FROM t1,JSON_TABLE(t1.j, '$[*]' COLUMNS ( a int path '$.b')) AS jt; +j a +DROP TABLE t1; +# +# Bug#25460537:SIG 11 IN NEXT_FAST AT SQL/SQL_LIST.H +# +PREPARE STMT FROM +"SELECT * FROM JSON_TABLE( + \'[{\"a\":\"3\"},{\"a\":2},{\"b\":1},{\"a\":0}]\', + \'$[*]\' COLUMNS (id + FOR ORDINALITY, + jpath VARCHAR(100) PATH \'$.a\', + jexst INT EXISTS PATH \'$.b\') + ) as tt"; +EXECUTE STMT; +id jpath jexst +1 3 0 +2 2 0 +3 NULL 1 +4 0 0 +EXECUTE STMT; +id jpath jexst +1 3 0 +2 2 0 +3 NULL 1 +4 0 0 +DEALLOCATE PREPARE stmt; +# +# Bug#25522353: SIG 11 IN JOIN::MAKE_JOIN_PLAN | SQL/SQL_OPTIMIZER.CC +# +CREATE TABLE t1 (id INT, jc JSON); +SELECT * FROM t1 RIGHT JOIN JSON_TABLE(t1.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt ON t1.jc=jt.id; +ERROR 42S22: Unknown column 't1.jc' in 'JSON_TABLE argument' +SELECT * FROM JSON_TABLE(t1.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt LEFT JOIN t1 ON t1.jc=jt.id; +ERROR 42S22: Unknown column 't1.jc' in 'JSON_TABLE argument' +SELECT * FROM JSON_TABLE(t1.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt RIGHT JOIN t1 ON t1.jc=jt.id; +id id jc +SELECT * FROM t1 LEFT JOIN JSON_TABLE(t1.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt ON t1.jc=jt.id; +id jc id +EXPLAIN SELECT * FROM t1 LEFT JOIN JSON_TABLE(t1.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt ON t1.jc=jt.id; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +SELECT * FROM t1 t1o RIGHT JOIN t1 ON t1o.id=t1.id +LEFT JOIN JSON_TABLE(t1.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt ON t1.jc=jt.id; +id jc id jc id +EXPLAIN SELECT * FROM t1 t1o RIGHT JOIN t1 ON t1o.id=t1.id +LEFT JOIN JSON_TABLE(t1.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt ON t1.jc=jt.id; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +SELECT * FROM t1 AS t1o RIGHT JOIN +(t1 AS t1i JOIN JSON_TABLE(t1o.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt ON t1i.jc=jt.id) +ON t1o.id=t1i.id; +ERROR 42S22: Unknown column 't1o.jc' in 'JSON_TABLE argument' +SELECT * FROM t1 AS t1o RIGHT JOIN +(t1 AS t1i RIGHT JOIN JSON_TABLE(t1o.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt ON t1i.jc=jt.id) +ON t1o.id=t1i.id; +ERROR 42S22: Unknown column 't1o.jc' in 'JSON_TABLE argument' +WITH qn AS +(SELECT jt.* FROM t1 RIGHT JOIN JSON_TABLE(t1.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt ON t1.jc=jt.id) +SELECT * from qn; +ERROR 42S22: Unknown column 't1.jc' in 'JSON_TABLE argument' +WITH qn AS +(SELECT 1 UNION +SELECT jt.id FROM t1 RIGHT JOIN JSON_TABLE(t1.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt ON t1.jc=jt.id) +SELECT * from qn; +ERROR 42S22: Unknown column 't1.jc' in 'JSON_TABLE argument' +SELECT * FROM t1 AS t1o RIGHT JOIN +(t1 AS t1i JOIN JSON_TABLE(t1o.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt ON t1i.jc=jt.id) +ON t1o.id=t1i.id; +ERROR 42S22: Unknown column 't1o.jc' in 'JSON_TABLE argument' +SELECT * FROM t1 AS t1o RIGHT JOIN +(t1 AS t1i RIGHT JOIN JSON_TABLE(t1o.jc, '$' COLUMNS +(id FOR ORDINALITY)) as jt ON t1i.jc=jt.id) +ON t1o.id=t1i.id; +ERROR 42S22: Unknown column 't1o.jc' in 'JSON_TABLE argument' +INSERT INTO t1 VALUES(1,"1"),(2,"4"),(3,"3"); +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze Warning Engine-independent statistics are not collected for column 'jc' +test.t1 analyze status OK +SELECT * FROM t1 LEFT JOIN JSON_TABLE(t1.jc, '$' COLUMNS +(id INT PATH '$')) as jt ON t1.id=jt.id; +id jc id +1 1 1 +2 4 NULL +3 3 3 +EXPLAIN SELECT * FROM t1 LEFT JOIN JSON_TABLE(t1.jc, '$' COLUMNS +(id INT PATH '$')) as jt ON t1.id=jt.id; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 +1 SIMPLE jt ALL NULL NULL NULL NULL 40 Table function: json_table; Using where +SELECT * FROM t1 +LEFT JOIN +JSON_TABLE(t1.jc, '$' COLUMNS (id FOR ORDINALITY)) as jt ON t1.jc=jt.id +RIGHT JOIN +JSON_TABLE(jt.id, '$' COLUMNS (id FOR ORDINALITY)) as jt1 ON jt.id=jt1.id; +ERROR 42S22: Unknown column 'jt.id' in 'JSON_TABLE argument' +DROP TABLE t1; +# +# Bug#25525409: ASSERTION `TABLE_LIST->TABLE' FAILED IN SQL/SQL_BASE.CC +# +SELECT * FROM JSON_TABLE( ( SELECT a ) , '$.*' COLUMNS (col1 FOR ORDINALITY) ) +AS alias1; +ERROR 42S22: Unknown column 'a' in 'field list' +SELECT * FROM JSON_TABLE( ( SELECT 1 ) , '$.*' COLUMNS (col1 FOR ORDINALITY) ) +AS alias1; +col1 +SELECT * FROM JSON_TABLE( ( SUM(1) ) , '$.*' COLUMNS (col1 FOR ORDINALITY) ) +AS alias1; +ERROR HY000: Invalid use of group function +# +# Bug# #25472875: ERROR SHOULD BE THROWN FOR INCORRECT VALUES +# +SELECT * +FROM JSON_TABLE('{"a":"1993-01-01"}', +'$' COLUMNS (jp DATE PATH '$.b' DEFAULT '1000' ON EMPTY)) +AS jt; +jp +0000-00-00 +Warnings: +Warning 1265 Data truncated for column 'jp' at row 1 +# +# Bug#25532429: INVALID JSON ERROR NOT THROWN WITH EMPTY TABLES JOIN +# +CREATE TABLE t1(j JSON); +SELECT * FROM t1, +JSON_TABLE( 'dqwfjqjf' , '$[*]' COLUMNS (col5 FOR ORDINALITY) ) AS alias7; +j col5 +DROP TABLE t1; +# +# Bug#25540370: SIG 11 IN SHOW_SQL_TYPE|SQL/SQL_SHOW.CC:7063 +# +SELECT * FROM +JSON_TABLE('[3.14159]', +'$[*]' COLUMNS (col18 CHAR(70) PATH '$') +) AS alias2; +col18 +3.14159 +# Too short field causes truncation, error and triggers ON ERROR clause +SELECT * FROM +JSON_TABLE('["3.14159"]', +'$[*]' COLUMNS (col18 CHAR(6) PATH '$') +) AS alias2; +col18 +3.1415 +Warnings: +Warning 1265 Data truncated for column 'col18' at row 1 +#Truncated space doesn't trigger ON ERROR +SELECT * FROM +JSON_TABLE('["3.14159 "]', +'$[*]' COLUMNS (col18 CHAR(7) PATH '$') +) AS alias2; +col18 +3.14159 +SELECT * FROM +JSON_TABLE('[3.14159]', +'$[*]' COLUMNS (col18 CHAR(255) PATH '$') +) AS alias2; +col18 +3.14159 +SELECT * FROM +JSON_TABLE('[3.14159]', +'$[*]' COLUMNS (col18 VARCHAR(70) PATH '$') +) AS alias2; +col18 +3.14159 +SELECT * FROM +JSON_TABLE('[3.14159]', +'$[*]' COLUMNS (col18 VARCHAR(255) PATH '$') +) AS alias2; +col18 +3.14159 +SELECT * FROM +JSON_TABLE('[3.14159]', +'$[*]' COLUMNS (col18 FLOAT PATH '$') +) AS alias2; +col18 +3.14159 +SELECT * FROM +JSON_TABLE('[3.14159]', +'$[*]' COLUMNS (col18 DOUBLE PATH '$') +) AS alias2; +col18 +3.14159 +SELECT * FROM +JSON_TABLE('[3.14159]', +'$[*]' COLUMNS (col18 DECIMAL(3,3) PATH '$') +) AS alias2; +col18 +0.999 +Warnings: +Warning 1264 Out of range value for column 'col18' at row 1 +SELECT * FROM +JSON_TABLE('[3.14159]', +'$[*]' COLUMNS (col18 DECIMAL(3,3) PATH '$' ERROR ON ERROR) +) AS alias2; +col18 +0.999 +Warnings: +Warning 1264 Out of range value for column 'col18' at row 1 +SELECT * FROM +JSON_TABLE('[0.9]', +'$[*]' COLUMNS (col18 DECIMAL(3,3) PATH '$') +) AS alias2; +col18 +0.900 +SELECT * FROM +JSON_TABLE('["asdf","ghjk"]', +'$[*]' COLUMNS (col18 DECIMAL(4,3) PATH '$' +DEFAULT "3.14159" ON ERROR) +) AS alias2; +col18 +0.000 +0.000 +Warnings: +Warning 1366 Incorrect decimal value: 'asdf' for column ``.`(temporary)`.`col18` at row 1 +Warning 1366 Incorrect decimal value: 'ghjk' for column ``.`(temporary)`.`col18` at row 2 +CREATE TABLE t1(jd JSON); +INSERT INTO t1 VALUES('["asdf"]'),('["ghjk"]'); +SELECT * FROM t1, +JSON_TABLE(jd, +'$[*]' COLUMNS (col18 DECIMAL(4,3) PATH '$' +DEFAULT "3.14159" ON ERROR) +) AS alias2; +jd col18 +["asdf"] 0.000 +["ghjk"] 0.000 +Warnings: +Warning 1366 Incorrect decimal value: 'asdf' for column ``.`(temporary)`.`col18` at row 1 +Warning 1366 Incorrect decimal value: 'ghjk' for column ``.`(temporary)`.`col18` at row 1 +DROP TABLE t1; +# +# Bug#25540027: SIG 11 IN FIND_FIELD_IN_TABLE | SQL/SQL_BASE.CC +# +CREATE TABLE t1(c1 JSON); +UPDATE t1, JSON_TABLE(t1.c1,'$[*]' COLUMNS (a INT PATH '$.a')) AS jt1 +SET jt1.a=1; +ERROR HY000: The target table jt1 of the UPDATE is not updatable +DELETE JSON_TABLE(t1.c1,'$[*]' COLUMNS (a INT PATH '$.a')) AS jt1 +FROM t1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(t1.c1,'$[*]' COLUMNS (a INT PATH '$.a')) AS jt1 +FROM t1' at line 1 +DELETE t1, JSON_TABLE(t1.c1,'$[*]' COLUMNS (a INT PATH '$.a')) AS jt1 +USING t1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(t1.c1,'$[*]' COLUMNS (a INT PATH '$.a')) AS jt1 +USING t1' at line 1 +DROP TABLE t1; +# +# Bug#25547244: ASSERTION `!TABLE || (!TABLE->READ_SET || BITMAP_IS_SET( +# +CREATE TABLE t1(i INT); +INSERT INTO t1 VALUES(1); +DROP TABLE t1; +# +# Bug#25540675: ASSERTION `!COL->CHILD_JDS->PRODUCING_RECORDS' FAILED +# +CREATE TABLE j1(j JSON); +INSERT INTO j1 VALUES('[1,2,3]'),('[1,2,4]'); +SELECT * FROM j1, +JSON_TABLE( JSON_OBJECT('key1', j) , +'$.*' COLUMNS (NESTED PATH '$.*' COLUMNS (col11 FOR ORDINALITY))) AS alias2; +j col11 +[1,2,3] NULL +[1,2,4] NULL +DROP TABLE j1; +# +# Bug#25584335: SIG 11 IN TABLE_LIST::FETCH_NUMBER_OF_ROWS +# +CREATE TABLE t1(i INT); +PREPARE stmt FROM "SELECT alias1.i AS field1 FROM ( + t1 AS alias1, + (SELECT * FROM + JSON_TABLE('[1,2,3]' , + '$[*]' COLUMNS (`col_varchar` FOR ORDINALITY)) AS SQ1_alias1 + ) AS alias2 )"; +EXECUTE stmt; +field1 +DEALLOCATE PREPARE stmt; +DROP TABLE t1; +# +# Bug#25604048: COLUMN NAMES WITH SAME 33-CHAR PREFIX ARE EQUAL +# +SELECT * FROM JSON_TABLE( '{"key1": "test"}' , '$' COLUMNS( +column_name_is_thirty_four_or_more VARCHAR(17) PATH '$.key1', +column_name_is_thirty_four_or_more_yes_indeed VARCHAR(17) PATH '$.key1' +) ) AS alias1; +column_name_is_thirty_four_or_more column_name_is_thirty_four_or_more_yes_indeed +test test +SELECT * FROM JSON_TABLE( '{"key1": "test"}' , '$' COLUMNS( +`column_name_is_thirty_four_or_more ` VARCHAR(17) PATH '$.key1' +) ) AS alias1; +column_name_is_thirty_four_or_more +test +# +# Bug#25604404: JSON_TABLE MORE RESTRICTIVE WITH IDENTIFIERS THAN +# CREATE TABLE +# +SELECT * FROM JSON_TABLE( '[1, 2]', '$' COLUMNS( +one INT PATH '$[0]', two INT PATH '$[1]' +)) AS jt; +one two +1 2 +# +# Bug#25588450: SIG 6 IN JSON_WRAPPER::SEEK|SQL/JSON_DOM.CC +# +CREATE TABLE t1(c VARCHAR(10)) ENGINE=MEMORY; +INSERT INTO t1 VALUES('fiheife'); +SELECT * FROM `t1` AS alias1, JSON_TABLE( `c` , '$[*]' COLUMNS (jtcol1 JSON +PATH '$.*')) AS alias2 WHERE jtcol1 <= 'kjfh'; +ERROR HY000: Syntax error in JSON text in argument 1 to function 'JSON_TABLE' at position 1 +DROP TABLE t1; +# +# Bug#25587754: ASSERTION `FIXED == 0 || BASIC_CONST_ITEM()' FAILED +# +PREPARE stmt FROM +"SELECT * FROM JSON_TABLE( '[1,2]', '$[*]' + COLUMNS (jtcol1 JSON PATH '$.*')) AS alias2"; +EXECUTE stmt; +jtcol1 +NULL +NULL +DEALLOCATE PREPARE stmt; +# +# Bug#25584593: UNABLE TO USE JSON_TABLE() ON TEXT/BLOB JSON DATA +# +SELECT * FROM JSON_TABLE(NULL, '$.k' COLUMNS (id FOR ORDINALITY)) AS aLias; +id +SELECT * FROM JSON_TABLE(@myjson, '$.k' COLUMNS (id FOR ORDINALITY)) AS alias; +id +SET @myjson = '{"k": 42}'; +SELECT * FROM JSON_TABLE(@myjson, '$.k' COLUMNS (id FOR ORDINALITY)) AS alias; +id +1 +CREATE TABLE t1( +txt TEXT, ty TINYTEXT, tm MEDIUMTEXT, tl LONGTEXT); +INSERT INTO t1 values ( +'{"k": "text"}','{"k": "tinytext"}','{"k": "mediumtext"}','{"k": "longtext"}'); +SELECT alias.* FROM t1, JSON_TABLE(t1.txt,'$.k' COLUMNS (id VARCHAR(10) PATH '$')) AS alias; +id +text +SELECT alias.* FROM t1, JSON_TABLE(t1.ty, '$.k' COLUMNS (id VARCHAR(10) PATH '$')) AS alias; +id +tinytext +SELECT alias.* FROM t1, JSON_TABLE(t1.tm, '$.k' COLUMNS (id VARCHAR(10) PATH '$')) AS alias; +id +mediumtext +SELECT alias.* FROM t1, JSON_TABLE(t1.tl, '$.k' COLUMNS (id VARCHAR(10) PATH '$')) AS alias; +id +longtext +SELECT alias.* FROM t1, JSON_TABLE(t1.txt,'$.k' COLUMNS (id TEXT PATH '$')) AS alias; +id +text +SELECT alias.* FROM t1, JSON_TABLE(t1.txt,'$.k' COLUMNS (id TINYTEXT PATH '$')) AS alias; +id +text +SELECT alias.* FROM t1, JSON_TABLE(t1.txt,'$.k' COLUMNS (id MEDIUMTEXT PATH '$')) AS alias; +id +text +SELECT alias.* FROM t1, JSON_TABLE(t1.txt,'$.k' COLUMNS (id LONGTEXT PATH '$')) AS alias; +id +text +SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb BLOB PATH '$')) as alias; +blb +asd123 +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb BLOB PATH '$')) as alias; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE alias ALL NULL NULL NULL NULL 40 Table function: json_table +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb TINYBLOB PATH '$')) as alias; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE alias ALL NULL NULL NULL NULL 40 Table function: json_table +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb MEDIUMBLOB PATH '$')) as alias; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE alias ALL NULL NULL NULL NULL 40 Table function: json_table +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb LONGBLOB PATH '$')) as alias; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE alias ALL NULL NULL NULL NULL 40 Table function: json_table +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb TEXT PATH '$')) as alias; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE alias ALL NULL NULL NULL NULL 40 Table function: json_table +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb TINYTEXT PATH '$')) as alias; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE alias ALL NULL NULL NULL NULL 40 Table function: json_table +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb MEDIUMTEXT PATH '$')) as alias; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE alias ALL NULL NULL NULL NULL 40 Table function: json_table +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb LONGTEXT PATH '$')) as alias; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE alias ALL NULL NULL NULL NULL 40 Table function: json_table +SELECT * FROM +(SELECT CAST(blb AS JSON) jf FROM +JSON_TABLE('"asd123"', '$' COLUMNS (blb BLOB PATH '$')) AS jti) AS dt, +JSON_TABLE(jf, '$' COLUMNS (blb BLOB PATH '$')) AS jto; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'JSON) jf FROM +JSON_TABLE('"asd123"', '$' COLUMNS (blb BLOB PATH '$')) AS jti)...' at line 2 +DROP TABLE t1; +# +# Bug#26500384: ASSERT FAILURE IN QUERY WITH WINDOW FUNCTION AND +# JSON_TABLE +# +CREATE TABLE t (x INT); +INSERT INTO t VALUES (1), (2), (3); +SELECT MAX(t.x) OVER () m, jt.* FROM t, +JSON_TABLE(JSON_ARRAY(m), '$[*]' COLUMNS (i INT PATH '$')) jt; +ERROR 42S22: Unknown column 'm' in 'JSON_TABLE argument' +DROP TABLE t; +# +# Bug#26583283: ASSERTION `!THD->IS_ERROR()' FAILED IN SQL_RESOLVER.CC +# +EXPLAIN SELECT * FROM JSON_TABLE('null', '$' COLUMNS(AA DECIMAL PATH '$')) tt; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE tt ALL NULL NULL NULL NULL 40 Table function: json_table +CREATE VIEW v1 AS SELECT * FROM +JSON_TABLE( 'null', '$' COLUMNS (c1 DECIMAL PATH '$' ) ) AS jt; +SELECT * FROM v1; +c1 +NULL +EXPLAIN SELECT * FROM v1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE jt ALL NULL NULL NULL NULL 40 Table function: json_table +DROP VIEW v1; +# +# Bug#25822408: ASSERTION `!COL->CHILD_JDS->PRODUCING_RECORDS' FAILED +# +PREPARE stmt FROM "SELECT * FROM + JSON_TABLE('{\"a\":1}','$' COLUMNS (c1 CHAR(20) PATH '$.b' ERROR ON EMPTY)) jt"; +EXECUTE stmt; +ERROR HY000: Field 'c1' can't be set for JSON_TABLE 'jt'. +EXECUTE stmt; +ERROR HY000: Field 'c1' can't be set for JSON_TABLE 'jt'. +# +# Bug#25594571: CRASH AT ITEM::CONST_ITEM|SQL/ITEM.H +# +CREATE TABLE t1 (i INT); +INSERT INTO t1 VALUES(1),(2),(3),(4),(5),(6),(7); +PREPARE stmt FROM "SELECT * FROM t1 AS alias1 LEFT JOIN t1 AS alias2 +LEFT JOIN JSON_TABLE('[1,2,3]', '$[*]' COLUMNS (i FOR ORDINALITY )) AS +alias3 ON alias2 . `i` = alias3 . `i` ON alias1 . `i` = alias2 . `i`"; +EXECUTE stmt; +i i i +1 1 1 +2 2 2 +3 3 3 +4 4 NULL +5 5 NULL +6 6 NULL +7 7 NULL +EXECUTE stmt; +i i i +1 1 1 +2 2 2 +3 3 3 +4 4 NULL +5 5 NULL +6 6 NULL +7 7 NULL +DROP TABLE t1; +# +# Bug#26648617: ASSERTION `IS_VIEW_OR_DERIVED() && +# USES_MATERIALIZATION()' FAILED. +# +CREATE TABLE t1 ( +col_varchar_key varchar(1) DEFAULT NULL +) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1),(4); +SELECT * FROM t1 WHERE col_varchar_key NOT IN ( +SELECT col_varchar_key FROM JSON_TABLE( +'[{"col_key": 1},{"col_key": 2}]', "$[*]" COLUMNS +(col_varchar_key VARCHAR(10) PATH "$.col_key")) AS innr1); +col_varchar_key +4 +EXPLAIN SELECT * FROM t1 WHERE col_varchar_key NOT IN ( +SELECT col_varchar_key FROM JSON_TABLE( +'[{"col_key": 1},{"col_key": 2}]', "$[*]" COLUMNS +(col_varchar_key VARCHAR(10) PATH "$.col_key")) AS innr1); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Using where +2 DEPENDENT SUBQUERY innr1 ALL NULL NULL NULL NULL 40 Table function: json_table; Using where +SELECT * FROM t1 WHERE col_varchar_key IN ( +SELECT col_varchar_key FROM JSON_TABLE( +'[{"col_key": 1},{"col_key": 2}]', "$[*]" COLUMNS +(col_varchar_key VARCHAR(10) PATH "$.col_key")) AS innr1); +col_varchar_key +1 +EXPLAIN SELECT * FROM t1 WHERE col_varchar_key IN ( +SELECT col_varchar_key FROM JSON_TABLE( +'[{"col_key": 1},{"col_key": 2}]', "$[*]" COLUMNS +(col_varchar_key VARCHAR(10) PATH "$.col_key")) AS innr1); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 +1 PRIMARY innr1 ALL NULL NULL NULL NULL 40 Table function: json_table; Using where; FirstMatch(t1); Using join buffer (flat, BNL join) +DROP TABLE t1; +# +# Bug#26711551: WL8867:CONDITIONAL JUMP IN JSON_TABLE_COLUMN::CLEANUP +# +CREATE TABLE t(x int, y int); +INSERT INTO t(x) VALUES (1); +UPDATE t t1, JSON_TABLE('[2]', '$[*]' COLUMNS (x INT PATH '$')) t2 +SET t1.y = t2.x; +SELECT * FROM t; +x y +1 2 +DROP TABLE t; +# +# Bug#26679671: SIG 11 IN JSON_BINARY::PARSE_BINARY() +# +CREATE TABLE t1(id INT, f1 JSON); +INSERT INTO t1 VALUES (1, '{\"1\": 1}'), (2, '{\"1\": 2}'), (3, '{\"1\": 3}'), +(4, '{\"1\": 4}'), (5, '{\"1\": 5}'), (6, '{\"1\": 6}'); +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze Warning Engine-independent statistics are not collected for column 'f1' +test.t1 analyze status OK +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze Warning Engine-independent statistics are not collected for column 'f1' +test.t1 analyze status Table is already up to date +SELECT * FROM t1 as jj1, +(SELECT tt2.* FROM t1 as tt2, +JSON_TABLE(f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl) dt; +id f1 id f1 +1 {"1": 1} 1 {"1": 1} +1 {"1": 1} 2 {"1": 2} +1 {"1": 1} 3 {"1": 3} +1 {"1": 1} 4 {"1": 4} +1 {"1": 1} 5 {"1": 5} +1 {"1": 1} 6 {"1": 6} +2 {"1": 2} 1 {"1": 1} +2 {"1": 2} 2 {"1": 2} +2 {"1": 2} 3 {"1": 3} +2 {"1": 2} 4 {"1": 4} +2 {"1": 2} 5 {"1": 5} +2 {"1": 2} 6 {"1": 6} +3 {"1": 3} 1 {"1": 1} +3 {"1": 3} 2 {"1": 2} +3 {"1": 3} 3 {"1": 3} +3 {"1": 3} 4 {"1": 4} +3 {"1": 3} 5 {"1": 5} +3 {"1": 3} 6 {"1": 6} +4 {"1": 4} 1 {"1": 1} +4 {"1": 4} 2 {"1": 2} +4 {"1": 4} 3 {"1": 3} +4 {"1": 4} 4 {"1": 4} +4 {"1": 4} 5 {"1": 5} +4 {"1": 4} 6 {"1": 6} +5 {"1": 5} 1 {"1": 1} +5 {"1": 5} 2 {"1": 2} +5 {"1": 5} 3 {"1": 3} +5 {"1": 5} 4 {"1": 4} +5 {"1": 5} 5 {"1": 5} +5 {"1": 5} 6 {"1": 6} +6 {"1": 6} 1 {"1": 1} +6 {"1": 6} 2 {"1": 2} +6 {"1": 6} 3 {"1": 3} +6 {"1": 6} 4 {"1": 4} +6 {"1": 6} 5 {"1": 5} +6 {"1": 6} 6 {"1": 6} +EXPLAIN SELECT * FROM t1 as jj1, +(SELECT tt2.* FROM t1 as tt2, +JSON_TABLE(f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl) dt; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE jj1 ALL NULL NULL NULL NULL 6 +1 SIMPLE tt2 ALL NULL NULL NULL NULL 6 Using join buffer (flat, BNL join) +1 SIMPLE tbl ALL NULL NULL NULL NULL 40 Table function: json_table +SELECT * FROM t1 as jj1, +(SELECT tt2.* FROM t1 as tt2, +JSON_TABLE(f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl STRAIGHT_JOIN +t1 AS tt3) dt ORDER BY 1,3 LIMIT 10; +id f1 id f1 +1 {"1": 1} 1 {"1": 1} +1 {"1": 1} 1 {"1": 1} +1 {"1": 1} 1 {"1": 1} +1 {"1": 1} 1 {"1": 1} +1 {"1": 1} 1 {"1": 1} +1 {"1": 1} 1 {"1": 1} +1 {"1": 1} 2 {"1": 2} +1 {"1": 1} 2 {"1": 2} +1 {"1": 1} 2 {"1": 2} +1 {"1": 1} 2 {"1": 2} +EXPLAIN SELECT * FROM t1 as jj1, +(SELECT tt2.* FROM t1 as tt2, +JSON_TABLE(f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl STRAIGHT_JOIN +t1 AS tt3) dt ORDER BY 1,3 LIMIT 11; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE jj1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort +1 SIMPLE tt2 ALL NULL NULL NULL NULL 6 Using join buffer (flat, BNL join) +1 SIMPLE tbl ALL NULL NULL NULL NULL 40 Table function: json_table +1 SIMPLE tt3 ALL NULL NULL NULL NULL 6 Using join buffer (flat, BNL join) +SELECT * FROM t1 WHERE id IN +(SELECT id FROM t1 as tt2, +JSON_TABLE(f1, "$" COLUMNS (jf FOR ORDINALITY)) AS tbl); +id f1 +1 {"1": 1} +2 {"1": 2} +3 {"1": 3} +4 {"1": 4} +5 {"1": 5} +6 {"1": 6} +EXPLAIN SELECT * FROM t1 WHERE id IN +(SELECT id FROM t1 as tt2, +JSON_TABLE(f1, "$" COLUMNS (jf FOR ORDINALITY)) AS tbl); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 6 +1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1 +2 MATERIALIZED tt2 ALL NULL NULL NULL NULL 6 +2 MATERIALIZED tbl ALL NULL NULL NULL NULL 40 Table function: json_table +DROP TABLE t1; +# +# Bug#26760811: WL#8867: MEMORY LEAK REPORTED BY ASAN AND VALGRIND +# +CREATE TABLE t (j JSON); +INSERT INTO t VALUES +('[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]'), +('[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]'); +SELECT COUNT(*) FROM t, JSON_TABLE(j, '$[*]' COLUMNS (i INT PATH '$')) AS jt; +COUNT(*) +34 +PREPARE ps FROM +'SELECT COUNT(*) FROM t, JSON_TABLE(j, ''$[*]'' COLUMNS (i INT PATH ''$'')) AS jt'; +EXECUTE ps; +COUNT(*) +34 +EXECUTE ps; +COUNT(*) +34 +DROP PREPARE ps; +DROP TABLE t; +# +# Bug #26781759: NON-UNIQUE ALIAS ERROR NOT BEING THROWN +# +SELECT * FROM JSON_TABLE(NULL, '$' COLUMNS(j1 FOR ORDINALITY)) AS jalias, +JSON_TABLE(NULL, '$' COLUMNS(j1 FOR ORDINALITY)) AS jalias; +ERROR 42000: Not unique table/alias: 'jalias' +# +# Bug#27152428 JSON_TABLE + PREPARED STATEMENT + VIEW HAS PROBLEM IN DURING RESOLUTION +# +CREATE TABLE t1 (a INT, b INT); +CREATE VIEW v2 AS SELECT * FROM t1 LIMIT 2; +DROP TABLE t1; +DROP VIEW v2; +# +# Bug#27189940: CREATE VIEW FAILS ON JSON_TABLE() IN SCHEMA-LESS CONNECTIONS +# BUG#27217897: JSON_TABLE() FAILS IF NO DATABASE SELECTED +# +connect conn1,localhost,root,,*NO-ONE*; +connection conn1; +CREATE VIEW test.v AS SELECT * FROM JSON_TABLE('[1,2,3]', '$[*]' COLUMNS (num INT PATH '$[0]')) AS jt; +SELECT * FROM JSON_TABLE('[1,2,3]', '$[*]' COLUMNS (num INT PATH '$[0]')) AS jt; +num +1 +2 +3 +connection default; +disconnect conn1; +use test; +SHOW CREATE VIEW test.v; +View Create View character_set_client collation_connection +v CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `jt`.`num` AS `num` from JSON_TABLE('[1,2,3]', '$[*]' COLUMNS (`num` int(11) PATH '$[0]')) `jt` latin1 latin1_swedish_ci +SELECT * FROM test.v; +num +1 +2 +3 +DROP VIEW test.v; +# +# Bug#27729112 JSON_TABLE SHOULD DECODE BASE64-ENCODED STRINGS +# +SELECT v +FROM JSON_TABLE(JSON_OBJECT('foo', _binary'bar'), '$' + COLUMNS(v VARCHAR(255) PATH '$.foo')) tbl; +v +bar +# +# Bug#28254268: JSON_TABLE() FUNCTION REJECTS SELECT PERMISSIONS +# +CREATE DATABASE db2; +USE db2; +CREATE TABLE t1 (c JSON); +INSERT INTO t1 VALUES('[1,2,3]'); +CREATE USER user1@localhost; +GRANT SELECT ON db2.t1 TO user1@localhost; +connect conn1,localhost,user1,,; +connection conn1; +USE db2; +SELECT t1.c FROM t1; +c +[1,2,3] +SELECT jt.* FROM t1, JSON_TABLE(t1.c, '$[*]' COLUMNS (num INT PATH '$[0]')) +AS jt; +num +1 +2 +3 +disconnect conn1; +connection default; +DROP USER user1@localhost; +DROP DATABASE db2; +# +# Bug#27856835 JSON_TABLE RETURNS WRONG DATATYPE WHEN INT-VALUE IS GRATER +# THAN (2^31-1) +# +SELECT id FROM JSON_TABLE('[{"id":"9223372036854775807"}]', '$[*]' COLUMNS +(id BIGINT PATH '$.id')) AS json; +id +9223372036854775807 +# As we currently have no way of telling if a JSON string value is +# signed or unsigned, this value will overflow. +SELECT id FROM JSON_TABLE('[{"id":"9223372036854775808"}]', '$[*]' COLUMNS +(id BIGINT PATH '$.id')) AS json; +id +9223372036854775807 +Warnings: +Warning 1264 Out of range value for column 'id' at row 1 +# Here the JSON value is a NUMERIC value, and we thus know if the value +# is signed or unsigned. +SELECT id FROM JSON_TABLE('[{"id":9223372036854775808}]', '$[*]' COLUMNS +(id BIGINT PATH '$.id')) AS json; +id +9223372036854775807 +Warnings: +Warning 1264 Out of range value for column 'id' at row 1 +# If we tell the JSON table column to be unsigned, we get to store the +# full value correctly. +SELECT id FROM JSON_TABLE('[{"id":"9223372036854775808"}]', '$[*]' COLUMNS +(id BIGINT UNSIGNED PATH '$.id')) AS json; +id +9223372036854775808 +SELECT id FROM JSON_TABLE('[{"id":"2147483648"}]', '$[*]' COLUMNS +(id INT UNSIGNED PATH '$.id')) AS json; +id +2147483648 +# Check that we preserve the signedness of the columns. +USE test; +CREATE TABLE t1 AS SELECT id, value FROM +JSON_TABLE('[{"id":9223372036854775808, "value":9223372036854775807}]', +'$[*]' COLUMNS (id BIGINT UNSIGNED PATH '$.id', +value BIGINT PATH '$.value')) +AS json; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` bigint(20) unsigned DEFAULT NULL, + `value` bigint(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +# +# Bug#28255453: VIEW USING JSON_TABLE FAILS IF NO SCHEMA IS SELECTED +# +connect conn1,localhost,root,,*NO-ONE*; +CREATE VIEW test.v AS SELECT * FROM JSON_TABLE('[1,2,3]', '$[*]' COLUMNS (num INT PATH '$[0]')) AS jt; +SELECT * FROM test.v; +num +1 +2 +3 +DROP VIEW test.v; +# Check that a user with access to the schema 'foo' can do a SELECT with +# a JSON_TABLE function. +CREATE SCHEMA foo; +CREATE USER foo@localhost; +GRANT EXECUTE ON foo.* TO foo@localhost; +connect con1,localhost,foo,,foo; +SELECT 1 FROM JSON_TABLE('[1,2,3]', '$[*]' COLUMNS (num INT PATH '$.a')) AS jt; +1 +1 +1 +1 +connection default; +disconnect con1; +DROP USER foo@localhost; +DROP SCHEMA foo; +# +# Bug#27923406 ERROR 1142 (42000) WHEN USING JSON_TABLE +# +CREATE SCHEMA my_schema; +CREATE USER foo@localhost; +GRANT EXECUTE ON my_schema.* TO foo@localhost; +connect con1,localhost,foo,,my_schema; +SELECT +* +FROM +JSON_TABLE( +'[{"x":2,"y":"8"},{"x":"3","y":"7"},{"x":"4","y":6}]', +"$[*]" COLUMNS( +xval VARCHAR(100) PATH "$.x", +yval VARCHAR(100) PATH "$.y" + ) +) AS jt1; +xval yval +2 8 +3 7 +4 6 +connection default; +disconnect con1; +DROP USER foo@localhost; +DROP SCHEMA my_schema; +# +# Bug#28538315: JSON_TABLE() COLUMN TYPES DON'T SUPPORT COLLATE CLAUSE +# +CREATE TABLE t1 SELECT * +FROM JSON_TABLE('"test"', '$' COLUMNS(x VARCHAR(10) +CHARSET utf8mb4 +PATH '$')) AS jt1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `x` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +# +# Bug#28643862 JSON_TABLE'S "COLUMNS" CLAUSE USES +# GLOBAL.CHARACTER_SET_RESULTS DEFAULT CHARSET +# +SET @@SESSION.character_set_connection = ascii; +CREATE TABLE t1 SELECT a.col +FROM JSON_TABLE('"test"', '$' COLUMNS(col VARCHAR(10) PATH '$')) AS a; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `col` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SET @@SESSION.collation_connection = latin1_bin; +CREATE TABLE t2 SELECT a.col +FROM JSON_TABLE('"test"', '$' COLUMNS(col VARCHAR(10) PATH '$')) AS a; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `col` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1, t2; +SET @@SESSION.character_set_connection = DEFAULT; +# +# Bug#28851656: JSON_TABLE RETURN "UNKNOWN DATABASE ''" FROM A FUNCTION +# +CREATE FUNCTION FN_COUNT_ROWS(X JSON) +RETURNS INT DETERMINISTIC +RETURN ( +SELECT COUNT(*) FROM JSON_TABLE( X, '$[*]' COLUMNS( I INT PATH '$')) der +); +SELECT FN_COUNT_ROWS('[1, 2]') CNT; +CNT +2 +SELECT FN_COUNT_ROWS('[1, 2, 3]') CNT; +CNT +3 +SELECT FN_COUNT_ROWS('[1, 2, 3, 4]') CNT; +CNT +4 +DROP FUNCTION FN_COUNT_ROWS; +# +# Bug#30310265: VIEWS LOSE THE CHARACTER SET OF JSON_TABLE'S +# PATH ARGUMENTS +# +CREATE VIEW v1 AS +SELECT * FROM JSON_TABLE('{"å":{"å":1}}', '$.å' COLUMNS (x INT PATH '$.å')) t; +SELECT * FROM v1; +x +1 +SET NAMES latin1; +SELECT * FROM v1; +x +1 +SET NAMES DEFAULT; +DROP VIEW v1; +CREATE VIEW v2 AS +SELECT * FROM JSON_TABLE('{}', '$' COLUMNS ( +x VARCHAR(10) PATH '$.a' DEFAULT '"isn''t here"' ON EMPTY) +) t; +DROP VIEW v2; +# +# Bug#30382156: STORED PROCEDURE, JSON_TABLE AND "CONST" JOIN TYPE +# +CREATE TABLE t (id INT PRIMARY KEY, j JSON); +INSERT INTO t VALUES (1, '{"x":1}'); +CREATE PROCEDURE p() +SELECT * FROM t, JSON_TABLE(j, '$' COLUMNS (x INT PATH '$.x')) jt +WHERE id = 1; +CALL p(); +id j x +1 {"x":1} 1 +CALL p(); +id j x +1 {"x":1} 1 +CALL p(); +id j x +1 {"x":1} 1 +DROP PROCEDURE p; +DROP TABLE t; +# +# WL#13512: Deprecate ON ERROR before ON EMPTY in JSON_TABLE syntax +# +SELECT * FROM +JSON_TABLE('{}', '$' COLUMNS (x VARCHAR(10) PATH '$.x' + DEFAULT '"a"' ON ERROR DEFAULT '"b"' ON EMPTY)) jt; +x +"b" +SELECT * FROM +JSON_TABLE('{}', '$' COLUMNS (x VARCHAR(10) PATH '$.x' + NULL ON ERROR NULL ON EMPTY)) jt; +x +NULL +SELECT * FROM +JSON_TABLE('{"x":"c"}', '$' COLUMNS (x VARCHAR(10) PATH '$.x' + ERROR ON ERROR ERROR ON EMPTY)) jt; +x +c +# +# Bug#30628330: INSERT WITH JSON_TABLE FAILS DUE TO WARNING INVOKED +# WITH ON ERROR CLAUSE +# +CREATE TABLE t(id INT, a TINYINT, b VARCHAR(3), c DATE, d DECIMAL); +INSERT INTO t SELECT * FROM +JSON_TABLE(JSON_ARRAY(JSON_OBJECT('a', 1, 'b', 'abc'), +JSON_OBJECT('a', 2, 'b', 'abcd'), +JSON_OBJECT('a', 1000, 'b', 'xyz'), +JSON_OBJECT('c', TIME'12:00:00', 'd', 1e308)), +'$[*]' COLUMNS (id FOR ORDINALITY, +a TINYINT PATH '$.a' DEFAULT '111' ON ERROR, +b VARCHAR(3) PATH '$.b' DEFAULT '"ERR"' ON ERROR, +c DATE PATH '$.c' DEFAULT '"2001-01-01"' ON ERROR, +d DECIMAL PATH '$.c' DEFAULT '999' ON ERROR) +) AS jt; +Warnings: +Warning 1265 Data truncated for column 'b' at row 2 +Warning 1264 Out of range value for column 'a' at row 3 +Warning 1265 Data truncated for column 'd' at row 4 +SELECT * FROM t ORDER BY id; +id a b c d +1 1 abc NULL NULL +2 2 abc NULL NULL +3 127 xyz NULL NULL +4 NULL NULL 2012-00-00 12 +DROP TABLE t; +# +# Bug#30263373: INCORRECT OUTPUT FROM TABLE_FUNCTION_JSON::PRINT() +# +CREATE VIEW v AS SELECT * FROM +JSON_TABLE('[123]', '$[*]' COLUMNS (`name with space 1` INT PATH '$', +`name with space 2` FOR ORDINALITY)) jt; +SELECT * FROM v; +name with space 1 name with space 2 +123 1 +DROP VIEW v; +CREATE VIEW v AS SELECT HEX(x), HEX(y) FROM +JSON_TABLE('["abc"]', '$[*]' COLUMNS (x BINARY(10) PATH '$', +y VARBINARY(10) PATH '$')) jt; +SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS +WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v'; +VIEW_DEFINITION +select hex(`jt`.`x`) AS `HEX(x)`,hex(`jt`.`y`) AS `HEX(y)` from JSON_TABLE('["abc"]', '$[*]' COLUMNS (`x` binary(10) PATH '$', `y` varbinary(10) PATH '$')) `jt` +SELECT * FROM v; +HEX(x) HEX(y) +61626300000000000000 616263 +DROP VIEW v; +CREATE VIEW v AS SELECT * FROM +JSON_TABLE('[123]', '$[*]' COLUMNS(ti TINYINT PATH '$', +si SMALLINT PATH '$', +mi MEDIUMINT PATH '$', +i INT PATH '$', +bi BIGINT PATH '$', +tiu TINYINT UNSIGNED PATH '$', +siu SMALLINT UNSIGNED PATH '$', +miu MEDIUMINT UNSIGNED PATH '$', +iu INT UNSIGNED PATH '$', +biu BIGINT UNSIGNED PATH '$')) jt; +SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS +WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v'; +VIEW_DEFINITION +select `jt`.`ti` AS `ti`,`jt`.`si` AS `si`,`jt`.`mi` AS `mi`,`jt`.`i` AS `i`,`jt`.`bi` AS `bi`,`jt`.`tiu` AS `tiu`,`jt`.`siu` AS `siu`,`jt`.`miu` AS `miu`,`jt`.`iu` AS `iu`,`jt`.`biu` AS `biu` from JSON_TABLE('[123]', '$[*]' COLUMNS (`ti` tinyint(4) PATH '$', `si` smallint(6) PATH '$', `mi` mediumint(9) PATH '$', `i` int(11) PATH '$', `bi` bigint(20) PATH '$', `tiu` tinyint(3) unsigned PATH '$', `siu` smallint(5) unsigned PATH '$', `miu` mediumint(8) unsigned PATH '$', `iu` int(10) unsigned PATH '$', `biu` bigint(20) unsigned PATH '$')) `jt` +SELECT * FROM v; +ti si mi i bi tiu siu miu iu biu +123 123 123 123 123 123 123 123 123 123 +DROP VIEW v; +# +# Bug#31345503 JSON_TABLE SHOULD RETURN SQL NULL FOR JSON NULL +# +SELECT * +FROM +JSON_TABLE( +'[ + {"c1": null, + "c2": [{"c": "c_val", "l": [1,2]}], + "c3": null}, + {"c1": true, + "c2": [{"c": "c_val","l": [11]}, {"c": "c_val", "l": [false]}], + "c3": true}, + {"c1": false, + "c2": [{"c": null,"l": [true]}, {"c": "c_val", "l": [null]}], + "c3": false} + ]', +'$[*]' COLUMNS( +top_ord FOR ORDINALITY, +c1path VARCHAR(10) PATH '$.c1' ERROR ON ERROR, +NESTED PATH '$.c2[*]' COLUMNS ( +c2path VARCHAR(10) PATH '$.c' ERROR ON ERROR, +ord FOR ORDINALITY, +NESTED PATH '$.l[*]' COLUMNS (lpath_c VARCHAR(10) PATH '$' ERROR ON ERROR, +lpath_i INT PATH '$' ERROR ON ERROR) +), +c3path INT PATH '$.c3' ERROR ON ERROR +) +) as jt; +top_ord c1path c2path ord lpath_c lpath_i c3path +1 NULL c_val 1 1 1 NULL +1 NULL c_val 1 2 2 NULL +2 true c_val 1 11 11 1 +2 true c_val 2 false 0 1 +3 false NULL 1 true 1 0 +3 false c_val 2 NULL NULL 0 +# +# Bug #31327187 UBSAN: JSON_TABLE: NULL POINTER PASSED AS ARGUMENT 2, +# WHICH IS DECLARED TO NEVER BE NULL +# +SELECT HEX(a) FROM JSON_TABLE( +'[{"E":{"e":true,"~":1,"S3":"sTa"},"r":3,"":6.7},"",6.5]', +'$' + COLUMNS(a BINARY(5) PATH '$[1]' NULL ON EMPTY) +) e; +HEX(a) +0000000000 diff --git a/mysql-test/suite/json/r/json_table_notembedded.result b/mysql-test/suite/json/r/json_table_notembedded.result new file mode 100644 index 00000000..e277a879 --- /dev/null +++ b/mysql-test/suite/json/r/json_table_notembedded.result @@ -0,0 +1,20 @@ +create database db; +use db; +create table t (a text); +insert into t values ('{"foo":"bar"}'); +create user u@localhost; +grant select (a) on db.t to u@localhost; +connect con1,localhost,u,,db; +select a from t; +a +{"foo":"bar"} +select * from t, json_table(t.a, '$' columns(f varchar(20) path '$.foo')) as jt; +a f +{"foo":"bar"} bar +select * into outfile 'f' from json_table('[]', '$' columns(x for ordinality)) q; +ERROR 28000: Access denied for user 'u'@'localhost' (using password: NO) +connection default; +disconnect con1; +drop user u@localhost; +drop database db; +use test; diff --git a/mysql-test/suite/json/r/rpl_json_char.result b/mysql-test/suite/json/r/rpl_json_char.result new file mode 100644 index 00000000..91da1cdd --- /dev/null +++ b/mysql-test/suite/json/r/rpl_json_char.result @@ -0,0 +1,22 @@ +include/master-slave.inc +[connection master] +# +# Start of 10.5 tests +# +# +# MDEV-27018 IF and COALESCE lose "json" property +# +CREATE TABLE t1 (a CHAR(100) CHECK(JSON_VALID(a))); +connection slave; +connection master; +INSERT INTO t1 VALUES (JSON_OBJECT('a','b')); +connection slave; +SELECT * FROM t1 ORDER BY a; +a +{"a": "b"} +connection master; +DROP TABLE t1; +# +# End of 10.5 tests +# +include/rpl_end.inc diff --git a/mysql-test/suite/json/r/rpl_json_longtext.result b/mysql-test/suite/json/r/rpl_json_longtext.result new file mode 100644 index 00000000..8d7f2a54 --- /dev/null +++ b/mysql-test/suite/json/r/rpl_json_longtext.result @@ -0,0 +1,22 @@ +include/master-slave.inc +[connection master] +# +# Start of 10.5 tests +# +# +# MDEV-27018 IF and COALESCE lose "json" property +# +CREATE TABLE t1 (a LONGTEXT CHECK(JSON_VALID(a))); +connection slave; +connection master; +INSERT INTO t1 VALUES (JSON_OBJECT('a','b')); +connection slave; +SELECT * FROM t1 ORDER BY a; +a +{"a": "b"} +connection master; +DROP TABLE t1; +# +# End of 10.5 tests +# +include/rpl_end.inc diff --git a/mysql-test/suite/json/r/rpl_json_mediumtext.result b/mysql-test/suite/json/r/rpl_json_mediumtext.result new file mode 100644 index 00000000..4cb1a87f --- /dev/null +++ b/mysql-test/suite/json/r/rpl_json_mediumtext.result @@ -0,0 +1,22 @@ +include/master-slave.inc +[connection master] +# +# Start of 10.5 tests +# +# +# MDEV-27018 IF and COALESCE lose "json" property +# +CREATE TABLE t1 (a MEDIUMTEXT CHECK(JSON_VALID(a))); +connection slave; +connection master; +INSERT INTO t1 VALUES (JSON_OBJECT('a','b')); +connection slave; +SELECT * FROM t1 ORDER BY a; +a +{"a": "b"} +connection master; +DROP TABLE t1; +# +# End of 10.5 tests +# +include/rpl_end.inc diff --git a/mysql-test/suite/json/r/rpl_json_text.result b/mysql-test/suite/json/r/rpl_json_text.result new file mode 100644 index 00000000..4c0bac87 --- /dev/null +++ b/mysql-test/suite/json/r/rpl_json_text.result @@ -0,0 +1,22 @@ +include/master-slave.inc +[connection master] +# +# Start of 10.5 tests +# +# +# MDEV-27018 IF and COALESCE lose "json" property +# +CREATE TABLE t1 (a TEXT CHECK(JSON_VALID(a))); +connection slave; +connection master; +INSERT INTO t1 VALUES (JSON_OBJECT('a','b')); +connection slave; +SELECT * FROM t1 ORDER BY a; +a +{"a": "b"} +connection master; +DROP TABLE t1; +# +# End of 10.5 tests +# +include/rpl_end.inc diff --git a/mysql-test/suite/json/r/rpl_json_tinytext.result b/mysql-test/suite/json/r/rpl_json_tinytext.result new file mode 100644 index 00000000..92b228c3 --- /dev/null +++ b/mysql-test/suite/json/r/rpl_json_tinytext.result @@ -0,0 +1,22 @@ +include/master-slave.inc +[connection master] +# +# Start of 10.5 tests +# +# +# MDEV-27018 IF and COALESCE lose "json" property +# +CREATE TABLE t1 (a TINYTEXT CHECK(JSON_VALID(a))); +connection slave; +connection master; +INSERT INTO t1 VALUES (JSON_OBJECT('a','b')); +connection slave; +SELECT * FROM t1 ORDER BY a; +a +{"a": "b"} +connection master; +DROP TABLE t1; +# +# End of 10.5 tests +# +include/rpl_end.inc diff --git a/mysql-test/suite/json/r/rpl_json_varchar.result b/mysql-test/suite/json/r/rpl_json_varchar.result new file mode 100644 index 00000000..3adbe3eb --- /dev/null +++ b/mysql-test/suite/json/r/rpl_json_varchar.result @@ -0,0 +1,22 @@ +include/master-slave.inc +[connection master] +# +# Start of 10.5 tests +# +# +# MDEV-27018 IF and COALESCE lose "json" property +# +CREATE TABLE t1 (a VARCHAR(100) CHECK(JSON_VALID(a))); +connection slave; +connection master; +INSERT INTO t1 VALUES (JSON_OBJECT('a','b')); +connection slave; +SELECT * FROM t1 ORDER BY a; +a +{"a": "b"} +connection master; +DROP TABLE t1; +# +# End of 10.5 tests +# +include/rpl_end.inc diff --git a/mysql-test/suite/json/r/type_json.result b/mysql-test/suite/json/r/type_json.result new file mode 100644 index 00000000..333e933e --- /dev/null +++ b/mysql-test/suite/json/r/type_json.result @@ -0,0 +1,2884 @@ +# +# Start of 10.5 tests +# +# +# MDEV-27361 Hybrid functions with JSON arguments do not send format metadata +# +CREATE PROCEDURE p1(tbl TEXT, expr TEXT) +BEGIN +DECLARE t1cols INT DEFAULT (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS +WHERE TABLE_NAME=tbl AND TABLE_SCHEMA='test'); +FOR a IN 0..(t1cols-1) DO +FOR b IN 0..(t1cols-1) DO +BEGIN +DECLARE query TEXT DEFAULT CONCAT('SELECT ', expr, ' FROM ', tbl); +SET query= REPLACE(query, 'olt1', a); +SET query= REPLACE(query, 'olt2', b); +EXECUTE IMMEDIATE query; +END; +END FOR; +END FOR; +END; +$$ +CREATE PROCEDURE p2(expr TEXT) +BEGIN +DECLARE t1cols INT DEFAULT (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS +WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'); +DECLARE t2cols INT DEFAULT (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS +WHERE TABLE_NAME='t2' AND TABLE_SCHEMA='test'); +FOR a IN 0..(t1cols-1) DO +FOR b IN 0..(t2cols-1) DO +BEGIN +DECLARE query TEXT DEFAULT CONCAT('SELECT ', expr, ' FROM t1, t2'); +SET query= REPLACE(query, 'olt1', a); +SET query= REPLACE(query, 'olt2', b); +EXECUTE IMMEDIATE query; +END; +END FOR; +END FOR; +END; +$$ +CREATE TABLE t1 +( +c0 CHAR(30) DEFAULT '1' CHECK(JSON_VALID(c0)), +c1 VARCHAR(30) DEFAULT '1' CHECK(JSON_VALID(c1)), +c2 TINYTEXT DEFAULT '1' CHECK(JSON_VALID(c2)), +c3 TEXT DEFAULT '1' CHECK(JSON_VALID(c3)), +c4 MEDIUMTEXT DEFAULT '1' CHECK(JSON_VALID(c4)), +c5 LONGTEXT DEFAULT '1' CHECK(JSON_VALID(c5)), +# The below data types do not have any special JSON properties. +# Just checking CHECK(JSON_VALID()) does not give any unexpected surprises. +c6 INT DEFAULT '1' CHECK(JSON_VALID(c6)), +c7 ENUM('1') DEFAULT '1' CHECK(JSON_VALID(c7)) +); +INSERT INTO t1 VALUES (); +CREATE TABLE t1c +( +c0 CHAR(30) DEFAULT '1' CHECK(JSON_VALID(c0)), +c1 VARCHAR(30) COMPRESSED DEFAULT '1' CHECK(JSON_VALID(c1)), +c2 TINYTEXT COMPRESSED DEFAULT '1' CHECK(JSON_VALID(c2)), +c3 TEXT COMPRESSED DEFAULT '1' CHECK(JSON_VALID(c3)), +c4 MEDIUMTEXT COMPRESSED DEFAULT '1' CHECK(JSON_VALID(c4)), +c5 LONGTEXT COMPRESSED DEFAULT '1' CHECK(JSON_VALID(c5)), +# The below data types do not have any special JSON properties. +# Just checking CHECK(JSON_VALID()) does not give any unexpected surprises. +c6 INT DEFAULT '1' CHECK(JSON_VALID(c6)), +c7 ENUM('1') DEFAULT '1' CHECK(JSON_VALID(c7)) +); +INSERT INTO t1c VALUES (); +CREATE TABLE t2 +( +c0 CHAR(30) DEFAULT '1', +c1 VARCHAR(30) DEFAULT '1', +c2 TINYTEXT DEFAULT '1', +c3 TEXT DEFAULT '1', +c4 MEDIUMTEXT DEFAULT '1', +c5 LONGTEXT DEFAULT '1', +c6 INT DEFAULT 1, +c7 DOUBLE DEFAULT 1, +c8 DECIMAL(10,2) DEFAULT 1.23, +c9 TIME DEFAULT '10:20:30', +c10 DATE DEFAULT '2001-01-01', +c11 DATETIME DEFAULT '2001-01-01 10:20:30', +c12 ENUM('1','2') DEFAULT '1' +); +INSERT INTO t2 VALUES (); +CALL p1('t1', 'COALESCE(colt1, colt2)'); +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c0) 254 (format=json) 30 1 Y 0 39 8 +COALESCE(c0, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c1) 253 (format=json) 30 1 Y 0 39 8 +COALESCE(c0, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c2) 249 (format=json) 255 1 Y 0 39 8 +COALESCE(c0, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c3) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c0, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c4) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c0, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c5) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c0, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c6) 254 30 1 Y 0 39 8 +COALESCE(c0, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c7) 253 30 1 Y 0 39 8 +COALESCE(c0, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c0) 253 (format=json) 30 1 Y 0 39 8 +COALESCE(c1, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c1) 253 (format=json) 30 1 Y 0 39 8 +COALESCE(c1, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c2) 249 (format=json) 255 1 Y 0 39 8 +COALESCE(c1, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c3) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c1, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c4) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c1, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c5) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c1, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c6) 253 30 1 Y 0 39 8 +COALESCE(c1, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c7) 253 30 1 Y 0 39 8 +COALESCE(c1, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c0) 249 (format=json) 255 1 Y 0 39 8 +COALESCE(c2, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c1) 249 (format=json) 255 1 Y 0 39 8 +COALESCE(c2, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c2) 249 (format=json) 255 1 Y 0 39 8 +COALESCE(c2, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c3) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c2, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c4) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c2, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c5) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c2, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c6) 249 255 1 Y 0 39 8 +COALESCE(c2, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c7) 249 255 1 Y 0 39 8 +COALESCE(c2, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c0) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c3, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c1) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c3, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c2) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c3, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c3) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c3, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c4) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c3, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c5) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c3, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c6) 252 65535 1 Y 0 39 8 +COALESCE(c3, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c7) 252 65535 1 Y 0 39 8 +COALESCE(c3, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c0) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c4, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c1) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c4, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c2) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c4, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c3) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c4, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c4) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c4, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c5) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c4, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c6) 250 16777215 1 Y 0 39 8 +COALESCE(c4, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c7) 250 16777215 1 Y 0 39 8 +COALESCE(c4, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c0) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c5, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c1) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c5, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c2) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c5, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c3) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c5, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c4) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c5, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c5) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c5, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c6) 251 4294967295 1 Y 0 39 8 +COALESCE(c5, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c7) 251 4294967295 1 Y 0 39 8 +COALESCE(c5, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c0) 254 30 1 Y 0 39 8 +COALESCE(c6, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c1) 253 30 1 Y 0 39 8 +COALESCE(c6, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c2) 249 255 1 Y 0 39 8 +COALESCE(c6, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c3) 252 65535 1 Y 0 39 8 +COALESCE(c6, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c4) 250 16777215 1 Y 0 39 8 +COALESCE(c6, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c5) 251 4294967295 1 Y 0 39 8 +COALESCE(c6, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c6) 3 11 1 Y 32896 0 63 +COALESCE(c6, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c7) 253 11 1 Y 0 39 8 +COALESCE(c6, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c0) 253 30 1 Y 0 39 8 +COALESCE(c7, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c1) 253 30 1 Y 0 39 8 +COALESCE(c7, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c2) 249 255 1 Y 0 39 8 +COALESCE(c7, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c3) 252 65535 1 Y 0 39 8 +COALESCE(c7, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c4) 250 16777215 1 Y 0 39 8 +COALESCE(c7, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c5) 251 4294967295 1 Y 0 39 8 +COALESCE(c7, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c6) 253 11 1 Y 0 39 8 +COALESCE(c7, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c7) 253 1 1 Y 0 39 8 +COALESCE(c7, c7) +1 +CALL p1('t1', 'LEAST(colt1, colt2)'); +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c0) 254 30 1 Y 0 39 8 +LEAST(c0, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c1) 253 30 1 Y 0 39 8 +LEAST(c0, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c2) 249 255 1 Y 0 39 8 +LEAST(c0, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c3) 252 65535 1 Y 0 39 8 +LEAST(c0, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c4) 250 16777215 1 Y 0 39 8 +LEAST(c0, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c0, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c6) 5 23 1 Y 32896 31 63 +LEAST(c0, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c7) 253 30 1 Y 0 39 8 +LEAST(c0, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c0) 253 30 1 Y 0 39 8 +LEAST(c1, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c1) 253 30 1 Y 0 39 8 +LEAST(c1, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c2) 249 255 1 Y 0 39 8 +LEAST(c1, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c3) 252 65535 1 Y 0 39 8 +LEAST(c1, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c4) 250 16777215 1 Y 0 39 8 +LEAST(c1, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c1, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c6) 5 23 1 Y 32896 31 63 +LEAST(c1, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c7) 253 30 1 Y 0 39 8 +LEAST(c1, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c0) 249 255 1 Y 0 39 8 +LEAST(c2, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c1) 249 255 1 Y 0 39 8 +LEAST(c2, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c2) 249 255 1 Y 0 39 8 +LEAST(c2, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c3) 252 65535 1 Y 0 39 8 +LEAST(c2, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c4) 250 16777215 1 Y 0 39 8 +LEAST(c2, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c2, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c6) 5 23 1 Y 32896 31 63 +LEAST(c2, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c7) 249 255 1 Y 0 39 8 +LEAST(c2, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c0) 252 65535 1 Y 0 39 8 +LEAST(c3, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c1) 252 65535 1 Y 0 39 8 +LEAST(c3, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c2) 252 65535 1 Y 0 39 8 +LEAST(c3, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c3) 252 65535 1 Y 0 39 8 +LEAST(c3, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c4) 250 16777215 1 Y 0 39 8 +LEAST(c3, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c3, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c6) 5 23 1 Y 32896 31 63 +LEAST(c3, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c7) 252 65535 1 Y 0 39 8 +LEAST(c3, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c0) 250 16777215 1 Y 0 39 8 +LEAST(c4, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c1) 250 16777215 1 Y 0 39 8 +LEAST(c4, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c2) 250 16777215 1 Y 0 39 8 +LEAST(c4, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c3) 250 16777215 1 Y 0 39 8 +LEAST(c4, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c4) 250 16777215 1 Y 0 39 8 +LEAST(c4, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c4, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c6) 5 23 1 Y 32896 31 63 +LEAST(c4, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c7) 250 16777215 1 Y 0 39 8 +LEAST(c4, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c0) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c1) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c2) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c3) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c4) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c6) 5 23 1 Y 32896 31 63 +LEAST(c5, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c7) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c0) 5 23 1 Y 32896 31 63 +LEAST(c6, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c1) 5 23 1 Y 32896 31 63 +LEAST(c6, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c2) 5 23 1 Y 32896 31 63 +LEAST(c6, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c3) 5 23 1 Y 32896 31 63 +LEAST(c6, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c4) 5 23 1 Y 32896 31 63 +LEAST(c6, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c5) 5 23 1 Y 32896 31 63 +LEAST(c6, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c6) 3 11 1 Y 32896 0 63 +LEAST(c6, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c7) 5 17 1 Y 32896 0 63 +LEAST(c6, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c0) 253 30 1 Y 0 39 8 +LEAST(c7, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c1) 253 30 1 Y 0 39 8 +LEAST(c7, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c2) 249 255 1 Y 0 39 8 +LEAST(c7, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c3) 252 65535 1 Y 0 39 8 +LEAST(c7, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c4) 250 16777215 1 Y 0 39 8 +LEAST(c7, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c7, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c6) 5 17 1 Y 32896 0 63 +LEAST(c7, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c7) 253 1 1 Y 0 39 8 +LEAST(c7, c7) +1 +CALL p1('t1', 'colt1+colt2'); +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c0 5 23 1 Y 32896 31 63 +c0+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c1 5 23 1 Y 32896 31 63 +c0+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c2 5 23 1 Y 32896 31 63 +c0+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c3 5 23 1 Y 32896 31 63 +c0+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c4 5 23 1 Y 32896 31 63 +c0+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c5 5 23 1 Y 32896 31 63 +c0+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c6 5 23 1 Y 32896 31 63 +c0+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c7 5 23 1 Y 32896 31 63 +c0+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c0 5 23 1 Y 32896 31 63 +c1+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c1 5 23 1 Y 32896 31 63 +c1+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c2 5 23 1 Y 32896 31 63 +c1+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c3 5 23 1 Y 32896 31 63 +c1+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c4 5 23 1 Y 32896 31 63 +c1+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c5 5 23 1 Y 32896 31 63 +c1+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c6 5 23 1 Y 32896 31 63 +c1+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c7 5 23 1 Y 32896 31 63 +c1+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c0 5 23 1 Y 32896 31 63 +c2+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c1 5 23 1 Y 32896 31 63 +c2+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c2 5 23 1 Y 32896 31 63 +c2+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c3 5 23 1 Y 32896 31 63 +c2+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c4 5 23 1 Y 32896 31 63 +c2+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c5 5 23 1 Y 32896 31 63 +c2+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c6 5 23 1 Y 32896 31 63 +c2+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c7 5 23 1 Y 32896 31 63 +c2+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c0 5 23 1 Y 32896 31 63 +c3+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c1 5 23 1 Y 32896 31 63 +c3+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c2 5 23 1 Y 32896 31 63 +c3+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c3 5 23 1 Y 32896 31 63 +c3+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c4 5 23 1 Y 32896 31 63 +c3+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c5 5 23 1 Y 32896 31 63 +c3+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c6 5 23 1 Y 32896 31 63 +c3+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c7 5 23 1 Y 32896 31 63 +c3+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c0 5 23 1 Y 32896 31 63 +c4+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c1 5 23 1 Y 32896 31 63 +c4+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c2 5 23 1 Y 32896 31 63 +c4+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c3 5 23 1 Y 32896 31 63 +c4+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c4 5 23 1 Y 32896 31 63 +c4+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c5 5 23 1 Y 32896 31 63 +c4+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c6 5 23 1 Y 32896 31 63 +c4+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c7 5 23 1 Y 32896 31 63 +c4+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c0 5 23 1 Y 32896 31 63 +c5+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c1 5 23 1 Y 32896 31 63 +c5+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c2 5 23 1 Y 32896 31 63 +c5+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c3 5 23 1 Y 32896 31 63 +c5+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c4 5 23 1 Y 32896 31 63 +c5+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c5 5 23 1 Y 32896 31 63 +c5+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c6 5 23 1 Y 32896 31 63 +c5+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c7 5 23 1 Y 32896 31 63 +c5+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c0 5 23 1 Y 32896 31 63 +c6+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c1 5 23 1 Y 32896 31 63 +c6+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c2 5 23 1 Y 32896 31 63 +c6+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c3 5 23 1 Y 32896 31 63 +c6+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c4 5 23 1 Y 32896 31 63 +c6+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c5 5 23 1 Y 32896 31 63 +c6+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c6 8 12 1 Y 32896 0 63 +c6+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c7 8 12 1 Y 32896 0 63 +c6+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c0 5 23 1 Y 32896 31 63 +c7+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c1 5 23 1 Y 32896 31 63 +c7+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c2 5 23 1 Y 32896 31 63 +c7+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c3 5 23 1 Y 32896 31 63 +c7+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c4 5 23 1 Y 32896 31 63 +c7+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c5 5 23 1 Y 32896 31 63 +c7+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c6 8 12 1 Y 32896 0 63 +c7+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c7 3 3 1 Y 32896 0 63 +c7+c7 +2 +CALL p1('t1c', 'COALESCE(colt1, colt2)'); +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c0) 254 (format=json) 30 1 Y 0 39 8 +COALESCE(c0, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c1) 253 (format=json) 31 1 Y 0 39 8 +COALESCE(c0, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c2) 249 (format=json) 255 1 Y 0 39 8 +COALESCE(c0, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c3) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c0, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c4) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c0, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c5) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c0, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c6) 254 30 1 Y 0 39 8 +COALESCE(c0, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c0, c7) 253 30 1 Y 0 39 8 +COALESCE(c0, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c0) 253 (format=json) 31 1 Y 0 39 8 +COALESCE(c1, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c1) 253 (format=json) 31 1 Y 0 39 8 +COALESCE(c1, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c2) 249 (format=json) 255 1 Y 0 39 8 +COALESCE(c1, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c3) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c1, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c4) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c1, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c5) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c1, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c6) 253 31 1 Y 0 39 8 +COALESCE(c1, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c1, c7) 253 31 1 Y 0 39 8 +COALESCE(c1, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c0) 249 (format=json) 255 1 Y 0 39 8 +COALESCE(c2, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c1) 249 (format=json) 255 1 Y 0 39 8 +COALESCE(c2, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c2) 249 (format=json) 255 1 Y 0 39 8 +COALESCE(c2, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c3) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c2, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c4) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c2, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c5) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c2, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c6) 249 255 1 Y 0 39 8 +COALESCE(c2, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c2, c7) 249 255 1 Y 0 39 8 +COALESCE(c2, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c0) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c3, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c1) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c3, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c2) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c3, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c3) 252 (format=json) 65535 1 Y 0 39 8 +COALESCE(c3, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c4) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c3, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c5) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c3, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c6) 252 65535 1 Y 0 39 8 +COALESCE(c3, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c3, c7) 252 65535 1 Y 0 39 8 +COALESCE(c3, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c0) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c4, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c1) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c4, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c2) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c4, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c3) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c4, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c4) 250 (format=json) 16777215 1 Y 0 39 8 +COALESCE(c4, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c5) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c4, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c6) 250 16777215 1 Y 0 39 8 +COALESCE(c4, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c4, c7) 250 16777215 1 Y 0 39 8 +COALESCE(c4, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c0) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c5, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c1) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c5, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c2) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c5, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c3) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c5, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c4) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c5, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c5) 251 (format=json) 4294967295 1 Y 0 39 8 +COALESCE(c5, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c6) 251 4294967295 1 Y 0 39 8 +COALESCE(c5, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c5, c7) 251 4294967295 1 Y 0 39 8 +COALESCE(c5, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c0) 254 30 1 Y 0 39 8 +COALESCE(c6, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c1) 253 31 1 Y 0 39 8 +COALESCE(c6, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c2) 249 255 1 Y 0 39 8 +COALESCE(c6, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c3) 252 65535 1 Y 0 39 8 +COALESCE(c6, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c4) 250 16777215 1 Y 0 39 8 +COALESCE(c6, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c5) 251 4294967295 1 Y 0 39 8 +COALESCE(c6, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c6) 3 11 1 Y 32896 0 63 +COALESCE(c6, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c6, c7) 253 11 1 Y 0 39 8 +COALESCE(c6, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c0) 253 30 1 Y 0 39 8 +COALESCE(c7, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c1) 253 31 1 Y 0 39 8 +COALESCE(c7, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c2) 249 255 1 Y 0 39 8 +COALESCE(c7, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c3) 252 65535 1 Y 0 39 8 +COALESCE(c7, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c4) 250 16777215 1 Y 0 39 8 +COALESCE(c7, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c5) 251 4294967295 1 Y 0 39 8 +COALESCE(c7, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c6) 253 11 1 Y 0 39 8 +COALESCE(c7, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(c7, c7) 253 1 1 Y 0 39 8 +COALESCE(c7, c7) +1 +CALL p1('t1c', 'LEAST(colt1, colt2)'); +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c0) 254 30 1 Y 0 39 8 +LEAST(c0, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c1) 253 31 1 Y 0 39 8 +LEAST(c0, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c2) 249 255 1 Y 0 39 8 +LEAST(c0, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c3) 252 65535 1 Y 0 39 8 +LEAST(c0, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c4) 250 16777215 1 Y 0 39 8 +LEAST(c0, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c0, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c6) 5 23 1 Y 32896 31 63 +LEAST(c0, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c0, c7) 253 30 1 Y 0 39 8 +LEAST(c0, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c0) 253 31 1 Y 0 39 8 +LEAST(c1, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c1) 253 31 1 Y 0 39 8 +LEAST(c1, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c2) 249 255 1 Y 0 39 8 +LEAST(c1, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c3) 252 65535 1 Y 0 39 8 +LEAST(c1, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c4) 250 16777215 1 Y 0 39 8 +LEAST(c1, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c1, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c6) 5 23 1 Y 32896 31 63 +LEAST(c1, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c1, c7) 253 31 1 Y 0 39 8 +LEAST(c1, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c0) 249 255 1 Y 0 39 8 +LEAST(c2, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c1) 249 255 1 Y 0 39 8 +LEAST(c2, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c2) 249 255 1 Y 0 39 8 +LEAST(c2, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c3) 252 65535 1 Y 0 39 8 +LEAST(c2, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c4) 250 16777215 1 Y 0 39 8 +LEAST(c2, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c2, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c6) 5 23 1 Y 32896 31 63 +LEAST(c2, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c2, c7) 249 255 1 Y 0 39 8 +LEAST(c2, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c0) 252 65535 1 Y 0 39 8 +LEAST(c3, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c1) 252 65535 1 Y 0 39 8 +LEAST(c3, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c2) 252 65535 1 Y 0 39 8 +LEAST(c3, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c3) 252 65535 1 Y 0 39 8 +LEAST(c3, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c4) 250 16777215 1 Y 0 39 8 +LEAST(c3, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c3, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c6) 5 23 1 Y 32896 31 63 +LEAST(c3, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c3, c7) 252 65535 1 Y 0 39 8 +LEAST(c3, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c0) 250 16777215 1 Y 0 39 8 +LEAST(c4, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c1) 250 16777215 1 Y 0 39 8 +LEAST(c4, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c2) 250 16777215 1 Y 0 39 8 +LEAST(c4, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c3) 250 16777215 1 Y 0 39 8 +LEAST(c4, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c4) 250 16777215 1 Y 0 39 8 +LEAST(c4, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c4, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c6) 5 23 1 Y 32896 31 63 +LEAST(c4, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c4, c7) 250 16777215 1 Y 0 39 8 +LEAST(c4, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c0) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c1) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c2) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c3) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c4) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c6) 5 23 1 Y 32896 31 63 +LEAST(c5, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c5, c7) 251 4294967295 1 Y 0 39 8 +LEAST(c5, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c0) 5 23 1 Y 32896 31 63 +LEAST(c6, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c1) 5 23 1 Y 32896 31 63 +LEAST(c6, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c2) 5 23 1 Y 32896 31 63 +LEAST(c6, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c3) 5 23 1 Y 32896 31 63 +LEAST(c6, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c4) 5 23 1 Y 32896 31 63 +LEAST(c6, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c5) 5 23 1 Y 32896 31 63 +LEAST(c6, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c6) 3 11 1 Y 32896 0 63 +LEAST(c6, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c6, c7) 5 17 1 Y 32896 0 63 +LEAST(c6, c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c0) 253 30 1 Y 0 39 8 +LEAST(c7, c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c1) 253 31 1 Y 0 39 8 +LEAST(c7, c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c2) 249 255 1 Y 0 39 8 +LEAST(c7, c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c3) 252 65535 1 Y 0 39 8 +LEAST(c7, c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c4) 250 16777215 1 Y 0 39 8 +LEAST(c7, c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c5) 251 4294967295 1 Y 0 39 8 +LEAST(c7, c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c6) 5 17 1 Y 32896 0 63 +LEAST(c7, c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(c7, c7) 253 1 1 Y 0 39 8 +LEAST(c7, c7) +1 +CALL p1('t1c', 'colt1+colt2'); +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c0 5 23 1 Y 32896 31 63 +c0+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c1 5 23 1 Y 32896 31 63 +c0+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c2 5 23 1 Y 32896 31 63 +c0+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c3 5 23 1 Y 32896 31 63 +c0+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c4 5 23 1 Y 32896 31 63 +c0+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c5 5 23 1 Y 32896 31 63 +c0+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c6 5 23 1 Y 32896 31 63 +c0+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c0+c7 5 23 1 Y 32896 31 63 +c0+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c0 5 23 1 Y 32896 31 63 +c1+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c1 5 23 1 Y 32896 31 63 +c1+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c2 5 23 1 Y 32896 31 63 +c1+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c3 5 23 1 Y 32896 31 63 +c1+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c4 5 23 1 Y 32896 31 63 +c1+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c5 5 23 1 Y 32896 31 63 +c1+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c6 5 23 1 Y 32896 31 63 +c1+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c1+c7 5 23 1 Y 32896 31 63 +c1+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c0 5 23 1 Y 32896 31 63 +c2+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c1 5 23 1 Y 32896 31 63 +c2+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c2 5 23 1 Y 32896 31 63 +c2+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c3 5 23 1 Y 32896 31 63 +c2+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c4 5 23 1 Y 32896 31 63 +c2+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c5 5 23 1 Y 32896 31 63 +c2+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c6 5 23 1 Y 32896 31 63 +c2+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c2+c7 5 23 1 Y 32896 31 63 +c2+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c0 5 23 1 Y 32896 31 63 +c3+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c1 5 23 1 Y 32896 31 63 +c3+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c2 5 23 1 Y 32896 31 63 +c3+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c3 5 23 1 Y 32896 31 63 +c3+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c4 5 23 1 Y 32896 31 63 +c3+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c5 5 23 1 Y 32896 31 63 +c3+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c6 5 23 1 Y 32896 31 63 +c3+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c3+c7 5 23 1 Y 32896 31 63 +c3+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c0 5 23 1 Y 32896 31 63 +c4+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c1 5 23 1 Y 32896 31 63 +c4+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c2 5 23 1 Y 32896 31 63 +c4+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c3 5 23 1 Y 32896 31 63 +c4+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c4 5 23 1 Y 32896 31 63 +c4+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c5 5 23 1 Y 32896 31 63 +c4+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c6 5 23 1 Y 32896 31 63 +c4+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c4+c7 5 23 1 Y 32896 31 63 +c4+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c0 5 23 1 Y 32896 31 63 +c5+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c1 5 23 1 Y 32896 31 63 +c5+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c2 5 23 1 Y 32896 31 63 +c5+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c3 5 23 1 Y 32896 31 63 +c5+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c4 5 23 1 Y 32896 31 63 +c5+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c5 5 23 1 Y 32896 31 63 +c5+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c6 5 23 1 Y 32896 31 63 +c5+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c5+c7 5 23 1 Y 32896 31 63 +c5+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c0 5 23 1 Y 32896 31 63 +c6+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c1 5 23 1 Y 32896 31 63 +c6+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c2 5 23 1 Y 32896 31 63 +c6+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c3 5 23 1 Y 32896 31 63 +c6+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c4 5 23 1 Y 32896 31 63 +c6+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c5 5 23 1 Y 32896 31 63 +c6+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c6 8 12 1 Y 32896 0 63 +c6+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c6+c7 8 12 1 Y 32896 0 63 +c6+c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c0 5 23 1 Y 32896 31 63 +c7+c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c1 5 23 1 Y 32896 31 63 +c7+c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c2 5 23 1 Y 32896 31 63 +c7+c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c3 5 23 1 Y 32896 31 63 +c7+c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c4 5 23 1 Y 32896 31 63 +c7+c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c5 5 23 1 Y 32896 31 63 +c7+c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c6 8 12 1 Y 32896 0 63 +c7+c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def c7+c7 3 3 1 Y 32896 0 63 +c7+c7 +2 +CALL p2('COALESCE(t1.colt1, t2.colt2)'); +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c0) 254 30 1 Y 0 39 8 +COALESCE(t1.c0, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c1) 253 30 1 Y 0 39 8 +COALESCE(t1.c0, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c2) 249 255 1 Y 0 39 8 +COALESCE(t1.c0, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c3) 252 65535 1 Y 0 39 8 +COALESCE(t1.c0, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c4) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c0, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c5) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c0, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c6) 254 30 1 Y 0 39 8 +COALESCE(t1.c0, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c7) 254 30 1 Y 0 39 8 +COALESCE(t1.c0, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c8) 254 30 1 Y 0 39 8 +COALESCE(t1.c0, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c9) 254 30 1 Y 0 39 8 +COALESCE(t1.c0, t2.c9) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c10) 254 30 1 Y 0 39 8 +COALESCE(t1.c0, t2.c10) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c11) 254 30 1 Y 0 39 8 +COALESCE(t1.c0, t2.c11) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c0, t2.c12) 253 30 1 Y 0 39 8 +COALESCE(t1.c0, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c0) 253 30 1 Y 0 39 8 +COALESCE(t1.c1, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c1) 253 30 1 Y 0 39 8 +COALESCE(t1.c1, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c2) 249 255 1 Y 0 39 8 +COALESCE(t1.c1, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c3) 252 65535 1 Y 0 39 8 +COALESCE(t1.c1, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c4) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c1, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c5) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c1, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c6) 253 30 1 Y 0 39 8 +COALESCE(t1.c1, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c7) 253 30 1 Y 0 39 8 +COALESCE(t1.c1, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c8) 253 30 1 Y 0 39 8 +COALESCE(t1.c1, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c9) 253 30 1 Y 0 39 8 +COALESCE(t1.c1, t2.c9) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c10) 253 30 1 Y 0 39 8 +COALESCE(t1.c1, t2.c10) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c11) 253 30 1 Y 0 39 8 +COALESCE(t1.c1, t2.c11) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c1, t2.c12) 253 30 1 Y 0 39 8 +COALESCE(t1.c1, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c0) 249 255 1 Y 0 39 8 +COALESCE(t1.c2, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c1) 249 255 1 Y 0 39 8 +COALESCE(t1.c2, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c2) 249 255 1 Y 0 39 8 +COALESCE(t1.c2, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c3) 252 65535 1 Y 0 39 8 +COALESCE(t1.c2, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c4) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c2, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c5) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c2, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c6) 249 255 1 Y 0 39 8 +COALESCE(t1.c2, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c7) 249 255 1 Y 0 39 8 +COALESCE(t1.c2, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c8) 249 255 1 Y 0 39 8 +COALESCE(t1.c2, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c9) 249 255 1 Y 0 39 8 +COALESCE(t1.c2, t2.c9) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c10) 249 255 1 Y 0 39 8 +COALESCE(t1.c2, t2.c10) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c11) 249 255 1 Y 0 39 8 +COALESCE(t1.c2, t2.c11) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c2, t2.c12) 249 255 1 Y 0 39 8 +COALESCE(t1.c2, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c0) 252 65535 1 Y 0 39 8 +COALESCE(t1.c3, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c1) 252 65535 1 Y 0 39 8 +COALESCE(t1.c3, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c2) 252 65535 1 Y 0 39 8 +COALESCE(t1.c3, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c3) 252 65535 1 Y 0 39 8 +COALESCE(t1.c3, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c4) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c3, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c5) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c3, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c6) 252 65535 1 Y 0 39 8 +COALESCE(t1.c3, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c7) 252 65535 1 Y 0 39 8 +COALESCE(t1.c3, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c8) 252 65535 1 Y 0 39 8 +COALESCE(t1.c3, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c9) 252 65535 1 Y 0 39 8 +COALESCE(t1.c3, t2.c9) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c10) 252 65535 1 Y 0 39 8 +COALESCE(t1.c3, t2.c10) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c11) 252 65535 1 Y 0 39 8 +COALESCE(t1.c3, t2.c11) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c3, t2.c12) 252 65535 1 Y 0 39 8 +COALESCE(t1.c3, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c0) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c4, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c1) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c4, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c2) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c4, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c3) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c4, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c4) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c4, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c5) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c4, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c6) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c4, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c7) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c4, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c8) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c4, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c9) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c4, t2.c9) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c10) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c4, t2.c10) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c11) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c4, t2.c11) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c4, t2.c12) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c4, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c0) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c1) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c2) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c3) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c4) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c5) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c6) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c7) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c8) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c9) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c9) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c10) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c10) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c11) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c11) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c5, t2.c12) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c5, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c0) 254 30 1 Y 0 39 8 +COALESCE(t1.c6, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c1) 253 30 1 Y 0 39 8 +COALESCE(t1.c6, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c2) 249 255 1 Y 0 39 8 +COALESCE(t1.c6, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c3) 252 65535 1 Y 0 39 8 +COALESCE(t1.c6, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c4) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c6, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c5) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c6, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c6) 3 11 1 Y 32896 0 63 +COALESCE(t1.c6, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c7) 5 22 1 Y 32896 31 63 +COALESCE(t1.c6, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c8) 246 14 4 Y 32896 2 63 +COALESCE(t1.c6, t2.c8) +1.00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c9) 253 11 1 Y 0 39 8 +COALESCE(t1.c6, t2.c9) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c10) 253 11 1 Y 0 39 8 +COALESCE(t1.c6, t2.c10) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c11) 253 19 1 Y 0 39 8 +COALESCE(t1.c6, t2.c11) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c6, t2.c12) 253 11 1 Y 0 39 8 +COALESCE(t1.c6, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c0) 253 30 1 Y 0 39 8 +COALESCE(t1.c7, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c1) 253 30 1 Y 0 39 8 +COALESCE(t1.c7, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c2) 249 255 1 Y 0 39 8 +COALESCE(t1.c7, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c3) 252 65535 1 Y 0 39 8 +COALESCE(t1.c7, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c4) 250 16777215 1 Y 0 39 8 +COALESCE(t1.c7, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c5) 251 4294967295 1 Y 0 39 8 +COALESCE(t1.c7, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c6) 253 11 1 Y 0 39 8 +COALESCE(t1.c7, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c7) 253 22 1 Y 0 39 8 +COALESCE(t1.c7, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c8) 253 12 1 Y 0 39 8 +COALESCE(t1.c7, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c9) 253 10 1 Y 0 39 8 +COALESCE(t1.c7, t2.c9) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c10) 253 10 1 Y 0 39 8 +COALESCE(t1.c7, t2.c10) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c11) 253 19 1 Y 0 39 8 +COALESCE(t1.c7, t2.c11) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(t1.c7, t2.c12) 253 1 1 Y 0 39 8 +COALESCE(t1.c7, t2.c12) +1 +CALL p2('LEAST(t1.colt1, t2.colt2)'); +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c0) 254 30 1 Y 0 39 8 +LEAST(t1.c0, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c1) 253 30 1 Y 0 39 8 +LEAST(t1.c0, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c2) 249 255 1 Y 0 39 8 +LEAST(t1.c0, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c3) 252 65535 1 Y 0 39 8 +LEAST(t1.c0, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c4) 250 16777215 1 Y 0 39 8 +LEAST(t1.c0, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c5) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c0, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c6) 5 23 1 Y 32896 31 63 +LEAST(t1.c0, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c7) 5 23 1 Y 32896 31 63 +LEAST(t1.c0, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c8) 5 23 1 Y 32896 31 63 +LEAST(t1.c0, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c9) 11 17 15 Y 128 6 63 +LEAST(t1.c0, t2.c9) +00:00:01.000000 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c10) 10 10 10 Y 128 0 63 +LEAST(t1.c0, t2.c10) +0000-00-00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c11) 12 26 26 Y 128 6 63 +LEAST(t1.c0, t2.c11) +0000-00-00 00:00:00.000000 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c0, t2.c12) 253 30 1 Y 0 39 8 +LEAST(t1.c0, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c0) 253 30 1 Y 0 39 8 +LEAST(t1.c1, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c1) 253 30 1 Y 0 39 8 +LEAST(t1.c1, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c2) 249 255 1 Y 0 39 8 +LEAST(t1.c1, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c3) 252 65535 1 Y 0 39 8 +LEAST(t1.c1, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c4) 250 16777215 1 Y 0 39 8 +LEAST(t1.c1, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c5) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c1, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c6) 5 23 1 Y 32896 31 63 +LEAST(t1.c1, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c7) 5 23 1 Y 32896 31 63 +LEAST(t1.c1, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c8) 5 23 1 Y 32896 31 63 +LEAST(t1.c1, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c9) 11 17 15 Y 128 6 63 +LEAST(t1.c1, t2.c9) +00:00:01.000000 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c10) 10 10 10 Y 128 0 63 +LEAST(t1.c1, t2.c10) +0000-00-00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c11) 12 26 26 Y 128 6 63 +LEAST(t1.c1, t2.c11) +0000-00-00 00:00:00.000000 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c1, t2.c12) 253 30 1 Y 0 39 8 +LEAST(t1.c1, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c0) 249 255 1 Y 0 39 8 +LEAST(t1.c2, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c1) 249 255 1 Y 0 39 8 +LEAST(t1.c2, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c2) 249 255 1 Y 0 39 8 +LEAST(t1.c2, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c3) 252 65535 1 Y 0 39 8 +LEAST(t1.c2, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c4) 250 16777215 1 Y 0 39 8 +LEAST(t1.c2, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c5) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c2, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c6) 5 23 1 Y 32896 31 63 +LEAST(t1.c2, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c7) 5 23 1 Y 32896 31 63 +LEAST(t1.c2, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c8) 5 23 1 Y 32896 31 63 +LEAST(t1.c2, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c9) 11 17 15 Y 128 6 63 +LEAST(t1.c2, t2.c9) +00:00:01.000000 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c10) 10 10 10 Y 128 0 63 +LEAST(t1.c2, t2.c10) +0000-00-00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c11) 12 26 26 Y 128 6 63 +LEAST(t1.c2, t2.c11) +0000-00-00 00:00:00.000000 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c2, t2.c12) 249 255 1 Y 0 39 8 +LEAST(t1.c2, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c0) 252 65535 1 Y 0 39 8 +LEAST(t1.c3, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c1) 252 65535 1 Y 0 39 8 +LEAST(t1.c3, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c2) 252 65535 1 Y 0 39 8 +LEAST(t1.c3, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c3) 252 65535 1 Y 0 39 8 +LEAST(t1.c3, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c4) 250 16777215 1 Y 0 39 8 +LEAST(t1.c3, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c5) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c3, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c6) 5 23 1 Y 32896 31 63 +LEAST(t1.c3, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c7) 5 23 1 Y 32896 31 63 +LEAST(t1.c3, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c8) 5 23 1 Y 32896 31 63 +LEAST(t1.c3, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c9) 11 17 15 Y 128 6 63 +LEAST(t1.c3, t2.c9) +00:00:01.000000 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c10) 10 10 10 Y 128 0 63 +LEAST(t1.c3, t2.c10) +0000-00-00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c11) 12 26 26 Y 128 6 63 +LEAST(t1.c3, t2.c11) +0000-00-00 00:00:00.000000 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c3, t2.c12) 252 65535 1 Y 0 39 8 +LEAST(t1.c3, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c0) 250 16777215 1 Y 0 39 8 +LEAST(t1.c4, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c1) 250 16777215 1 Y 0 39 8 +LEAST(t1.c4, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c2) 250 16777215 1 Y 0 39 8 +LEAST(t1.c4, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c3) 250 16777215 1 Y 0 39 8 +LEAST(t1.c4, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c4) 250 16777215 1 Y 0 39 8 +LEAST(t1.c4, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c5) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c4, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c6) 5 23 1 Y 32896 31 63 +LEAST(t1.c4, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c7) 5 23 1 Y 32896 31 63 +LEAST(t1.c4, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c8) 5 23 1 Y 32896 31 63 +LEAST(t1.c4, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c9) 11 17 15 Y 128 6 63 +LEAST(t1.c4, t2.c9) +00:00:01.000000 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c10) 10 10 10 Y 128 0 63 +LEAST(t1.c4, t2.c10) +0000-00-00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c11) 12 26 26 Y 128 6 63 +LEAST(t1.c4, t2.c11) +0000-00-00 00:00:00.000000 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c4, t2.c12) 250 16777215 1 Y 0 39 8 +LEAST(t1.c4, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c0) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c5, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c1) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c5, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c2) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c5, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c3) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c5, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c4) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c5, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c5) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c5, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c6) 5 23 1 Y 32896 31 63 +LEAST(t1.c5, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c7) 5 23 1 Y 32896 31 63 +LEAST(t1.c5, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c8) 5 23 1 Y 32896 31 63 +LEAST(t1.c5, t2.c8) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c9) 11 17 15 Y 128 6 63 +LEAST(t1.c5, t2.c9) +00:00:01.000000 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c10) 10 10 10 Y 128 0 63 +LEAST(t1.c5, t2.c10) +0000-00-00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c11) 12 26 26 Y 128 6 63 +LEAST(t1.c5, t2.c11) +0000-00-00 00:00:00.000000 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c5, t2.c12) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c5, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c0) 5 23 1 Y 32896 31 63 +LEAST(t1.c6, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c1) 5 23 1 Y 32896 31 63 +LEAST(t1.c6, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c2) 5 23 1 Y 32896 31 63 +LEAST(t1.c6, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c3) 5 23 1 Y 32896 31 63 +LEAST(t1.c6, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c4) 5 23 1 Y 32896 31 63 +LEAST(t1.c6, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c5) 5 23 1 Y 32896 31 63 +LEAST(t1.c6, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c6) 3 11 1 Y 32896 0 63 +LEAST(t1.c6, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c7) 5 23 1 Y 32896 31 63 +LEAST(t1.c6, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c8) 246 14 4 Y 32896 2 63 +LEAST(t1.c6, t2.c8) +1.00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c9) 11 10 8 Y 128 0 63 +LEAST(t1.c6, t2.c9) +00:00:01 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c10) 10 10 10 Y 128 0 63 +LEAST(t1.c6, t2.c10) +0000-00-00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c11) 12 19 19 Y 128 0 63 +LEAST(t1.c6, t2.c11) +0000-00-00 00:00:00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c6, t2.c12) 5 17 1 Y 32896 0 63 +LEAST(t1.c6, t2.c12) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c0) 253 30 1 Y 0 39 8 +LEAST(t1.c7, t2.c0) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c1) 253 30 1 Y 0 39 8 +LEAST(t1.c7, t2.c1) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c2) 249 255 1 Y 0 39 8 +LEAST(t1.c7, t2.c2) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c3) 252 65535 1 Y 0 39 8 +LEAST(t1.c7, t2.c3) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c4) 250 16777215 1 Y 0 39 8 +LEAST(t1.c7, t2.c4) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c5) 251 4294967295 1 Y 0 39 8 +LEAST(t1.c7, t2.c5) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c6) 5 17 1 Y 32896 0 63 +LEAST(t1.c7, t2.c6) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c7) 5 23 1 Y 32896 31 63 +LEAST(t1.c7, t2.c7) +1 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c8) 5 19 4 Y 32896 2 63 +LEAST(t1.c7, t2.c8) +1.00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c9) 11 10 8 Y 128 0 63 +LEAST(t1.c7, t2.c9) +00:00:01 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c10) 10 10 10 Y 128 0 63 +LEAST(t1.c7, t2.c10) +0000-00-00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c11) 12 19 19 Y 128 0 63 +LEAST(t1.c7, t2.c11) +0000-00-00 00:00:00 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def LEAST(t1.c7, t2.c12) 253 1 1 Y 0 39 8 +LEAST(t1.c7, t2.c12) +1 +CALL p2('t1.colt1+t2.colt2'); +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c0 5 23 1 Y 32896 31 63 +t1.c0+t2.c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c1 5 23 1 Y 32896 31 63 +t1.c0+t2.c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c2 5 23 1 Y 32896 31 63 +t1.c0+t2.c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c3 5 23 1 Y 32896 31 63 +t1.c0+t2.c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c4 5 23 1 Y 32896 31 63 +t1.c0+t2.c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c5 5 23 1 Y 32896 31 63 +t1.c0+t2.c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c6 5 23 1 Y 32896 31 63 +t1.c0+t2.c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c7 5 23 1 Y 32896 31 63 +t1.c0+t2.c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c8 5 23 4 Y 32896 31 63 +t1.c0+t2.c8 +2.23 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c9 5 23 6 Y 32896 31 63 +t1.c0+t2.c9 +102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c10 5 23 8 Y 32896 31 63 +t1.c0+t2.c10 +20010102 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c11 5 23 14 Y 32896 31 63 +t1.c0+t2.c11 +20010101102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c0+t2.c12 5 23 1 Y 32896 31 63 +t1.c0+t2.c12 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c0 5 23 1 Y 32896 31 63 +t1.c1+t2.c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c1 5 23 1 Y 32896 31 63 +t1.c1+t2.c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c2 5 23 1 Y 32896 31 63 +t1.c1+t2.c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c3 5 23 1 Y 32896 31 63 +t1.c1+t2.c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c4 5 23 1 Y 32896 31 63 +t1.c1+t2.c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c5 5 23 1 Y 32896 31 63 +t1.c1+t2.c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c6 5 23 1 Y 32896 31 63 +t1.c1+t2.c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c7 5 23 1 Y 32896 31 63 +t1.c1+t2.c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c8 5 23 4 Y 32896 31 63 +t1.c1+t2.c8 +2.23 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c9 5 23 6 Y 32896 31 63 +t1.c1+t2.c9 +102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c10 5 23 8 Y 32896 31 63 +t1.c1+t2.c10 +20010102 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c11 5 23 14 Y 32896 31 63 +t1.c1+t2.c11 +20010101102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c1+t2.c12 5 23 1 Y 32896 31 63 +t1.c1+t2.c12 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c0 5 23 1 Y 32896 31 63 +t1.c2+t2.c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c1 5 23 1 Y 32896 31 63 +t1.c2+t2.c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c2 5 23 1 Y 32896 31 63 +t1.c2+t2.c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c3 5 23 1 Y 32896 31 63 +t1.c2+t2.c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c4 5 23 1 Y 32896 31 63 +t1.c2+t2.c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c5 5 23 1 Y 32896 31 63 +t1.c2+t2.c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c6 5 23 1 Y 32896 31 63 +t1.c2+t2.c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c7 5 23 1 Y 32896 31 63 +t1.c2+t2.c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c8 5 23 4 Y 32896 31 63 +t1.c2+t2.c8 +2.23 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c9 5 23 6 Y 32896 31 63 +t1.c2+t2.c9 +102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c10 5 23 8 Y 32896 31 63 +t1.c2+t2.c10 +20010102 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c11 5 23 14 Y 32896 31 63 +t1.c2+t2.c11 +20010101102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c2+t2.c12 5 23 1 Y 32896 31 63 +t1.c2+t2.c12 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c0 5 23 1 Y 32896 31 63 +t1.c3+t2.c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c1 5 23 1 Y 32896 31 63 +t1.c3+t2.c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c2 5 23 1 Y 32896 31 63 +t1.c3+t2.c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c3 5 23 1 Y 32896 31 63 +t1.c3+t2.c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c4 5 23 1 Y 32896 31 63 +t1.c3+t2.c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c5 5 23 1 Y 32896 31 63 +t1.c3+t2.c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c6 5 23 1 Y 32896 31 63 +t1.c3+t2.c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c7 5 23 1 Y 32896 31 63 +t1.c3+t2.c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c8 5 23 4 Y 32896 31 63 +t1.c3+t2.c8 +2.23 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c9 5 23 6 Y 32896 31 63 +t1.c3+t2.c9 +102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c10 5 23 8 Y 32896 31 63 +t1.c3+t2.c10 +20010102 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c11 5 23 14 Y 32896 31 63 +t1.c3+t2.c11 +20010101102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c3+t2.c12 5 23 1 Y 32896 31 63 +t1.c3+t2.c12 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c0 5 23 1 Y 32896 31 63 +t1.c4+t2.c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c1 5 23 1 Y 32896 31 63 +t1.c4+t2.c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c2 5 23 1 Y 32896 31 63 +t1.c4+t2.c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c3 5 23 1 Y 32896 31 63 +t1.c4+t2.c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c4 5 23 1 Y 32896 31 63 +t1.c4+t2.c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c5 5 23 1 Y 32896 31 63 +t1.c4+t2.c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c6 5 23 1 Y 32896 31 63 +t1.c4+t2.c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c7 5 23 1 Y 32896 31 63 +t1.c4+t2.c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c8 5 23 4 Y 32896 31 63 +t1.c4+t2.c8 +2.23 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c9 5 23 6 Y 32896 31 63 +t1.c4+t2.c9 +102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c10 5 23 8 Y 32896 31 63 +t1.c4+t2.c10 +20010102 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c11 5 23 14 Y 32896 31 63 +t1.c4+t2.c11 +20010101102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c4+t2.c12 5 23 1 Y 32896 31 63 +t1.c4+t2.c12 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c0 5 23 1 Y 32896 31 63 +t1.c5+t2.c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c1 5 23 1 Y 32896 31 63 +t1.c5+t2.c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c2 5 23 1 Y 32896 31 63 +t1.c5+t2.c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c3 5 23 1 Y 32896 31 63 +t1.c5+t2.c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c4 5 23 1 Y 32896 31 63 +t1.c5+t2.c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c5 5 23 1 Y 32896 31 63 +t1.c5+t2.c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c6 5 23 1 Y 32896 31 63 +t1.c5+t2.c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c7 5 23 1 Y 32896 31 63 +t1.c5+t2.c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c8 5 23 4 Y 32896 31 63 +t1.c5+t2.c8 +2.23 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c9 5 23 6 Y 32896 31 63 +t1.c5+t2.c9 +102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c10 5 23 8 Y 32896 31 63 +t1.c5+t2.c10 +20010102 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c11 5 23 14 Y 32896 31 63 +t1.c5+t2.c11 +20010101102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c5+t2.c12 5 23 1 Y 32896 31 63 +t1.c5+t2.c12 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c0 5 23 1 Y 32896 31 63 +t1.c6+t2.c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c1 5 23 1 Y 32896 31 63 +t1.c6+t2.c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c2 5 23 1 Y 32896 31 63 +t1.c6+t2.c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c3 5 23 1 Y 32896 31 63 +t1.c6+t2.c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c4 5 23 1 Y 32896 31 63 +t1.c6+t2.c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c5 5 23 1 Y 32896 31 63 +t1.c6+t2.c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c6 8 12 1 Y 32896 0 63 +t1.c6+t2.c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c7 5 23 1 Y 32896 31 63 +t1.c6+t2.c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c8 246 15 4 Y 32896 2 63 +t1.c6+t2.c8 +2.23 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c9 8 12 6 Y 32896 0 63 +t1.c6+t2.c9 +102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c10 8 12 8 Y 32896 0 63 +t1.c6+t2.c10 +20010102 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c11 8 16 14 Y 32896 0 63 +t1.c6+t2.c11 +20010101102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c6+t2.c12 8 12 1 Y 32896 0 63 +t1.c6+t2.c12 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c0 5 23 1 Y 32896 31 63 +t1.c7+t2.c0 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c1 5 23 1 Y 32896 31 63 +t1.c7+t2.c1 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c2 5 23 1 Y 32896 31 63 +t1.c7+t2.c2 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c3 5 23 1 Y 32896 31 63 +t1.c7+t2.c3 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c4 5 23 1 Y 32896 31 63 +t1.c7+t2.c4 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c5 5 23 1 Y 32896 31 63 +t1.c7+t2.c5 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c6 8 12 1 Y 32896 0 63 +t1.c7+t2.c6 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c7 5 23 1 Y 32896 31 63 +t1.c7+t2.c7 +2 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c8 246 13 4 Y 32896 2 63 +t1.c7+t2.c8 +2.23 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c9 3 9 6 Y 32896 0 63 +t1.c7+t2.c9 +102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c10 8 10 8 Y 32896 0 63 +t1.c7+t2.c10 +20010102 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c11 8 16 14 Y 32896 0 63 +t1.c7+t2.c11 +20010101102031 +Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def t1.c7+t2.c12 3 3 1 Y 32896 0 63 +t1.c7+t2.c12 +2 +DROP PROCEDURE p1; +DROP PROCEDURE p2; +DROP TABLE t1, t1c, t2; +# +# End of 10.5 tests +# diff --git a/mysql-test/suite/json/t/json_no_table.test b/mysql-test/suite/json/t/json_no_table.test new file mode 100644 index 00000000..d7b302c9 --- /dev/null +++ b/mysql-test/suite/json/t/json_no_table.test @@ -0,0 +1,2288 @@ +########### suite/json/t/json_notable.test # +# Tests json columns functionality that does not need any tables # +# to be defined (no storage engine functionality) # +# # +# This test copies some tests originally in json.test # +###################################################################### + +# Some extra checks for comparisons between positive and negative zero. +# All should be equal. +SELECT JSON_COMPACT(0.0e0) = -0.0e0; +SELECT JSON_COMPACT(CAST(0 AS DECIMAL)) = CAST(-0.0e0 AS DECIMAL); +SELECT JSON_COMPACT(0.0e0) = CAST(-0.0e0 AS DECIMAL); +SELECT JSON_COMPACT(CAST(0 AS DECIMAL)) = -0.0e0; +SELECT JSON_COMPACT(CAST(0 AS SIGNED)) = -0.0e0; +SELECT JSON_COMPACT(CAST(0 AS SIGNED)) = CAST(-0.0e0 AS DECIMAL); +SELECT JSON_COMPACT(CAST(0 AS UNSIGNED)) = -0.0e0; +SELECT JSON_COMPACT(CAST(0 AS UNSIGNED)) = CAST(-0.0e0 AS DECIMAL); + +# Test that CAST string argument isn't treated as ANY_JSON_ATOM +# in that a MySQL string needs to be parsed to JSON here; it is not +# auto-converted to a JSON string as in ANY_JSON_ATOM contexts. +select json_compact('"abc"'); +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +select json_compact('abc'); + +--echo +--echo # String literal - valid JSON +select JSON_VALID('123'); # uint +select JSON_VALID('-123'); # int +select JSON_VALID('5000000000'); # uint64 +select JSON_VALID('-5000000000'); # int64 +select JSON_VALID('1.23'); # double +select JSON_VALID('"123"'); +select JSON_VALID('true'); +select JSON_VALID('false'); +select JSON_VALID('null'); +select JSON_VALID('{"address": "Trondheim"}'); + +--echo +--echo # String literal - not valid JSON +select JSON_VALID('12 3'); + +--echo +--echo # String literal not in UTF-8 +set names 'ascii'; +# auto-convert to utf-8 +select JSON_VALID('123'); + +set names 'utf8'; + +--echo +--echo # Json expression +select JSON_VALID(json_compact('[123]')); + +--echo +--echo # Json expression NULL +select JSON_VALID(json_compact(NULL)); + +--echo +--echo # Bare NULL +select JSON_VALID( NULL ); + +--echo +--echo # Function result - string +select JSON_VALID( UPPER('"abc"') ); + +set names 'latin1'; +--echo +--echo # Function result - string +# auto-convert to utf-8 +select JSON_VALID( UPPER('"abc"') ); + +set names 'utf8'; + +--echo +--echo # Function result - date, not valid as JSON without CAST +select JSON_VALID( CAST('2015-01-15' AS DATE) ); + +--echo +--echo # The date string doesn't parse as JSON text, so wrong: +select JSON_VALID( CAST(CAST('2015-01-15' AS DATE) as CHAR CHARACTER SET 'utf8') ); +--echo # OK, though: +select JSON_VALID( json_compact(CURDATE()) ); + +--echo +--echo # Function result - NULL +select JSON_VALID( UPPER(NULL) ); +select JSON_VALID( UPPER(CAST(NULL as CHAR)) ); + +# examples from wl7909 spec +# returns 1 +SELECT JSON_VALID( '{ "firstName" : "Fred", "lastName" : "Flintstone" }' ); + +# returns 1 +SELECT JSON_VALID( '3' ); + +# returns NULL as IS JSON would +SELECT JSON_VALID( null ); + + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_CONTAINS_PATH function. +--echo # ---------------------------------------------------------------------- + +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_contains_path(); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_contains_path('{ "a": true }' ); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_contains_path('{ "a": true }', 'all' ); +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +select json_contains_path('{ "a": tru }', 'all', '$' ); +--echo error ER_INVALID_JSON_PATH +select json_contains_path('{ "a": true }', 'all', '$[' ); +--echo error ER_INVALID_JSON_PATH +select json_contains_path('{ "a": true }', 'all', '$a.***[3]' ); +--echo error ER_JSON_BAD_ONE_OR_ALL_ARG +select json_contains_path('{ "a": true }', 'foo', '$.a' ); +--echo error ER_INVALID_JSON_CHARSET +select json_contains_path('{}', 'all', cast('$' as binary)); + +select json_contains_path(null, 'all', '$.a' ); +select json_contains_path('{ "a": true }', null, '$.a' ); +select json_contains_path('{ "a": true }', 'all', null ); + +# degenerate path +select json_contains_path('{ "a": true }', 'all', '$' ); + +# positive, one path +select json_contains_path('{ "a": true }', 'all', '$.a' ); +select json_contains_path('{ "a": true }', 'one', '$.a' ); + +# negative, one path +select json_contains_path('{ "a": true }', 'all', '$.b' ); +select json_contains_path('{ "a": true }', 'one', '$.b' ); + +# all +select json_contains_path('{ "a": true }', 'all', '$.a', '$.b' ); +select json_contains_path('{ "a": true }', 'all', '$.b', '$.a' ); +select json_contains_path('{ "a": true }', 'ALL', '$.a', '$.b' ); +select json_contains_path('{ "a": true }', 'aLl', '$.a', '$.b' ); + +# some +select json_contains_path('{ "a": true }', 'one', '$.a', '$.b' ); +select json_contains_path('{ "a": true }', 'one', '$.b', '$.a' ); +select json_contains_path('{ "a": true }', 'ONE', '$.a', '$.b' ); +select json_contains_path('{ "a": true }', 'oNe', '$.a', '$.b' ); + +# some wildcards +select json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**[4]' ); +select json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**[4]', '$**[5]' ); +select json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**.c[2]' ); +select json_contains_path('{ "a": true, "b": [ 1, 2, { "c": [ 4, 5, { "d": [ 6, 7, 8, 9, 10 ]} ] } ] }', 'all', '$**.c[3]' ); +select json_contains_path('{"a":1, "b":2}', 'one', '$.*'); +select json_contains_path('[1,2,3]', 'one', '$.*'); +select json_contains_path('{}', 'one', '$[*]'); + +# combine ellipsis and wildcard +SELECT JSON_CONTAINS_PATH('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', + 'one', '$**.a.*'); +SELECT JSON_CONTAINS_PATH('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', + 'all', '$**.a.*'); +SELECT JSON_CONTAINS_PATH('[1,2,3]', 'one', '$**[*]'); +SELECT JSON_CONTAINS_PATH('[1,2,3]', 'all', '$**[*]'); + +# 3 paths +select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$**[1]', '$.b[0]', '$.c' ); +select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$.c', '$**[1]', '$.b[0]' ); +select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'all', '$.b[0]', '$.c', '$**[1]' ); +select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$**[1]', '$.b[0]', '$.c' ); +select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$.c', '$**[1]', '$.b[0]' ); +select json_contains_path('{ "a": true, "b": [ 1, 2 ] }', 'one', '$.b[0]', '$.c', '$**[1]' ); + +# examples from the wl7909 spec +# returns 0 because there is no element at $.a.c +SELECT JSON_CONTAINS_PATH +( + '{ "a" : 123, "b" : [ 123, 456 ] }', + 'all', + '$.a.c', + '$.b[1]' +); + +# returns 1 because there is an element at $.b[1] +SELECT JSON_CONTAINS_PATH +( + '{ "a" : 123, "b" : [ 123, 456 ] }', + 'one', + '$.a.c', + '$.b[1]' +); + +# returns 0 because there is no element at the given path +SELECT JSON_CONTAINS_PATH +( + '{ "a" : 123, "b" : [ 123, 456 ] }', + 'all', + '$.c' +); + +# returns 1 because there is an element at $.b[1].c.d +SELECT JSON_CONTAINS_PATH +( + '{ "a" : 123, "b" : [ 123, { "c" : { "d" : true } } ] }', + 'all', + '$.b[1].c.d' +); + +select json_length( null ); +select json_length( '1' ); +--echo +--echo # invalid json text +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +select json_length( 'abc' ); +select json_length( '"abc"' ); +select json_length( 'true' ); +select json_length( 'false' ); +select json_length( 'null' ); + +select json_length( '{}' ); +select json_length( '{ "a" : 100, "b" : 200 }' ); +select json_length( '{ "a" : 100, "b" : [ 300, 400, 500 ] }' ); +select json_length( '[]' ); +select json_length( '[ null, "foo", true, 1.1 ]' ); +select json_length( '[ null, "foo", true, { "a" : "b", "c" : "d" } ]' ); +select json_length( '"foo"' ); +select json_length( '1.2' ); + + +# bad path expressions +--echo +--echo # invalid json path +--echo error ER_INVALID_JSON_PATH +select json_length( 'true', 'c$' ); +--echo +--echo # invalid json path +--echo error ER_INVALID_JSON_PATH +select json_length( '{ "foo" : [ true, false ] }', '$.foo[bar]' ); +--echo +--echo # wildcards not allowed in path expressions for this function +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_length( 'true', '$.*' ); +--echo +--echo # wildcards not allowed in path expressions for this function +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_length( 'true', '$.foo**.bar' ); + +# json_length() with non-vacuous path expressions + +# 1 +select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[0]' ); +# 3 +select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[1]' ); +# 1 +select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2]' ); +# auto-wrapping: 1 +select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2][0]' ); # auto-wrap scalar +select json_length( '[ 1, [ 2, 3, 4 ], {"a": 1} ]', '$[2][0]' ); # ditto object + +# non-existent path: null +select json_length( '[ 1, [ 2, 3, 4 ], 5 ]', '$[2][1]' ); +# 3 +select json_length( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]' ); + +# examples from the wl7909 spec +# returns 0 +SELECT JSON_LENGTH +( + '{}' +); + +# returns 1 +SELECT JSON_LENGTH +( + '3' +); + +# returns 2 +SELECT JSON_LENGTH +( + '{ "a" : 123, "b" : [ 123, 456, 789 ] }' +); + +# returns 3 +SELECT JSON_LENGTH +( + '{ "a" : 123, "b" : [ 123, 456, 789 ] }', + '$.b' +); + +# returns null because the path does not exist +SELECT JSON_LENGTH +( + '{ "a" : 123, "b" : [ 123, 456, 789 ] }', + '$.c' +); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_DEPTH function. +--echo # ---------------------------------------------------------------------- +select json_depth(null); +select json_depth(json_compact(null)); +#select i, json_depth(j) from t1; +select json_depth(json_compact('[]')), + json_depth(json_compact('{}')), + json_depth(json_compact('null')), + json_depth(json_quote('foo')); +select json_depth(json_compact('[[2], 3, [[[4]]]]')); +select json_depth(json_compact('{"a": {"a1": [3]}, "b": {"b1": {"c": {"d": [5]}}}}')); + +# examples from the wl7909 spec +# returns 1 +SELECT JSON_DEPTH +( + '{}' +); + +# returns 1 +SELECT JSON_DEPTH +( + '[]' +); + +# returns 1 +SELECT JSON_DEPTH( '"abc"' ); + +# returns 1 +SELECT JSON_DEPTH( json_compact( '"abc"') ); + +--echo error ER_INVALID_TYPE_FOR_JSON +SELECT JSON_DEPTH( 1 ); + +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_DEPTH( 'abc' ); + +# returns 1 +SELECT JSON_DEPTH( json_compact( 1) ); + +# returns 2 +SELECT JSON_DEPTH +( + '{ "a" : true, "b" : false, "c" : null }' +); + +# returns 2 +SELECT JSON_DEPTH +( + '[ "a", true, "b" , false, "c" , null ]' +); + +# returns 2 +SELECT JSON_DEPTH +( + '{ "a" : true, "b" : {}, "c" : null }' +); + +# returns 2 +SELECT JSON_DEPTH +( + '[ "a", true, "b" , {}, "c" , null ]' +); + +# returns 3 +SELECT JSON_DEPTH +( + '{ "a" : true, "b" : { "e" : false }, "c" : null }' +); + +# returns 3 +SELECT JSON_DEPTH +( + '[ "a", true, "b" , { "e" : false }, "c" , null ]' +); + +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_DEPTH +( + '[ "a", true, "b" , { "e" : false }, "c" , null' +); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_REMOVE function. +--echo # ---------------------------------------------------------------------- + +# null args +select json_remove( null, '$[1]' ); +select json_remove( null, '$[1]' ) is null; +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null ); +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null ) is null; +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', null ); +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', null ) is null; + +# too few args + +--echo +--echo # not enough args +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_remove(); +--echo +--echo # not enough args +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]' ); +--echo +--echo # not enough args +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_remove( '$[1]' ); + +# malformed args +--echo +--echo # invalid json text +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ', '$[1]', '$[2]' ); +--echo +--echo # invalid json path +--echo error ER_INVALID_JSON_PATH +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1', '$[2]' ); +--echo +--echo # invalid json path +--echo error ER_INVALID_JSON_PATH +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]', '$[2' ); +--echo +--echo # Vacuous path expression +--echo error ER_JSON_VACUOUS_PATH +select json_remove( '[ 1, 2, 3 ]', '$' ); +--echo +--echo # Vacuous path expression +--echo error ER_JSON_VACUOUS_PATH +select json_remove( '[ 1, 2, 3 ]', '$', '$[2]' ); +--echo +--echo # Vacuous path expression +--echo error ER_JSON_VACUOUS_PATH +select json_remove( '[ 1, 2, 3 ]', '$[1]', '$' ); + +# wildcard/ellipsis not allowed in paths +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_remove( '[ 1, 2, 3 ]', '$[*]' ); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_remove( '[ 1, 2, 3 ]', '$**[2]' ); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_remove( '[ 1, 2, 3 ]', '$[2]', '$[*]' ); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_remove( '[ 1, 2, 3 ]', '$[2]', '$**[2]' ); + +# simple matches + +select json_remove( '[ 1, 2, 3 ]', '$[0]' ); +select json_remove( '[ 1, 2, 3 ]', '$[1]' ); +select json_remove( '[ 1, 2, 3 ]', '$[2]' ); +select json_remove( '[ 1, 2, 3 ]', '$[3]' ); +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$[1]' ); + +# one match nested inside another +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_remove( '[ { "a": { "a": true } } ]', '$**.a' ); + +# multiple paths +select json_remove( '[ { "a": true }, { "b": false }, { "c": null }, { "a": null } ]', '$[0].a', '$[2].c' ); + +# ellipsis with matches at different levels +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_remove( '[ { "a": true }, { "b": [ { "c": { "a": true } } ] }, { "c": null }, { "a": null } ]', '$**.a' ); + +# nonsense path +select json_remove( '{"id": 123, "name": "systemQA", "array": [1, 2, 3]}', '$[0]' ); + +# examples from wl7909 spec +# returns the document {"a": "foo", "b": [true]} +SELECT JSON_REMOVE +( + '{"a" : "foo", "b" : [true, {"c" : 123}]}', + '$.b[ 1 ]' +); + +# returns {"a": "foo", "b": [true, {}]} due to normalization +SELECT JSON_REMOVE +( + '{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', + '$.b[ 1 ].c' +); + +# returns {"a": "foo", "b": [true, {}]} +SELECT JSON_REMOVE +( + '{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', + '$.b[ 1 ].c' +); + +# returns the original document because the path doesn't identify an element +SELECT JSON_REMOVE +( + '{ "a" : "foo", "b" : [ true, { "c" : 123, "d" : 456 } ] }', + '$.b[ 1 ].e' +); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_MERGE function. +--echo # ---------------------------------------------------------------------- + +--echo +--echo # not enough args +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_merge(); +--echo +--echo # not enough args +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_merge( '[ 1, 2, 3 ]' ); + +# null args result in NULL value +select json_merge( null, null ); +select json_merge( null, '[ 1, 2, 3 ]' ); +select json_merge( '[ 1, 2, 3 ]', null ); +select json_merge( null, '[ 1, 2, 3 ]', '[ 4, 5, 6 ]' ); +select json_merge( '[ 1, 2, 3 ]', null, '[ 4, 5, 6 ]' ); +select json_merge( '[ 1, 2, 3 ]', '[ 4, 5, 6 ]', null ); + +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +select json_merge( '[1, 2]', '[3, 4' ); +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +select json_merge( '[1, 2', '[3, 4]' ); + +# good json_merge() expressions +select json_merge( '1', '2' ); +select json_merge( '1', '[2, 3]' ); +select json_merge( '[1, 2]', '3' ); +select json_merge( '1', '{ "a": 2 }' ); +select json_merge( '{ "a": 2 }', '1' ); +select json_merge( '[1, 2]', '[3, 4]' ); +select json_merge( '{ "a": 2 }', '{ "b": 3}' ); +select json_merge( '[1, 2]', '{ "a": 2 }' ); +select json_merge( '{ "a": 2 }', '[1, 2]' ); + +select json_merge( '{"a": 1, "b": 2 }', '{"b": 3, "d": 4 }' ); +select json_merge( '{"a": 1, "b": 2 }', '{"b": [3, 4], "d": 4 }' ); +select json_merge( '{"a": 1, "b": [2, 3] }', '{"b": 4, "d": 4 }' ); +select json_merge( '{"a": 1, "b": 2 }', '{"b": {"e": 7, "f": 8}, "d": 4 }' ); +select json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{"a": 1, "b": 2 }' ); +select json_merge( '{"a": 1, "b": [2, 9] }', '{"b": [10, 11], "d": 4 }' ); +select json_merge( '{"a": 1, "b": [2, 9] }', '{"b": {"e": 7, "f": 8}, "d": 4 }' ); +select json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{"a": 1, "b": [2, 9] }' ); +select json_merge( '{"b": {"e": 7, "f": 8}, "d": 4 }', '{ "a": 1, "b": {"e": 20, "g": 21 } }' ); + +select json_merge( '1', '2', '3' ); +select json_merge( '[1, 2 ]', '3', '[4, 5]' ); +select json_merge +( + '{ "a": true, "b": { "c": 3, "d": 4 }, "e": [ 1, 2 ] }', + '{ "d": false, "b": { "g": 3, "d": 5 }, "f": [ 1, 2 ] }', + '{ "m": true, "b": { "h": 8, "d": 4 }, "e": [ 3, 4 ] }' +); + +# examples from the wl7909 spec +# returns [{"a": "foo", "b": [true, {"c": 123}]}, 5, 6] +SELECT JSON_MERGE +( + '{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', + '[ 5, 6]' +); + +# returns {"a": "foo", "b": [true, {"c": 123}, false, 34]} +SELECT JSON_MERGE +( + '{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', + '{ "b": [ false, 34 ] }' +); + +# returns {"a": "foo", "b": [true, {"c": 123}, "bar"]} +SELECT JSON_MERGE +( + '{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', + '{ "b": "bar" }' +); + +# returns {"a": {"b": 1, "c": 1}} +SELECT JSON_MERGE +( + '{ "a" : { "b" : 1 } }', + '{ "a" : { "c" : 1 } }' +); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_TYPE function. +--echo # ---------------------------------------------------------------------- + +# negative test +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +select json_type('abc'); + +#select i, json_type(j) from t1; +select json_type('{"a": 2}'); +select json_type('[1,2]'); +select json_type('"scalar string"'); +select json_type('true'); +select json_type('false'); +select json_type('null'); +select json_type('1'); +select json_type('-0'); +select json_type('-0.0'); +--echo error ER_INVALID_TYPE_FOR_JSON +select json_type(-1); +--echo error ER_INVALID_TYPE_FOR_JSON +select json_type(CAST(1 AS UNSIGNED)); +select json_type('32767'); +--echo error ER_INVALID_TYPE_FOR_JSON +select json_type(PI()); +select json_type('3.14'); + +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +select json_type(CAST(CAST('2015-01-15' AS DATE) as CHAR CHARACTER SET 'utf8')); + +--echo # ---------------------------------------------------------------------- +--echo # Test of json_compact(literal) +--echo # ---------------------------------------------------------------------- +select json_type(json_compact(cast('2014-11-25 18:00' as datetime))); +select json_type(json_compact(cast('2014-11-25' as date))); +select json_type(json_compact(cast('18:00:59' as time))); +# select json_type(json_compact(cast('2014-11-25 18:00' as timestamp))); -- cast target type not supported + +# select json_type(json_compact(cast('1999' as year))); -- cast target type not supported +select json_type(json_compact(127)); +select json_type(json_compact(255)); +select json_type(json_compact(32767)); +select json_type(json_compact(65535)); +select json_type(json_compact(8388607)); +select json_type(json_compact(16777215)); +select json_type(json_compact(2147483647)); +select json_type(json_compact(4294967295)); +select json_type(json_compact(9223372036854775807)); +select json_type(json_compact(18446744073709551615)); +select json_type(json_compact(true)); +select json_type(json_compact(b'10101')); + +select json_type(json_compact(cast(3.14 as decimal(5,2)))); +select json_type(json_compact(3.14)); +select json_type(json_compact(3.14E30)); +# select json_type(json_compact(cast(3.14 as numeral(5,2)))); -- cast target type not supported + +# select json_type(json_compact(cast(3.14 as double))); -- cast target type not supported +# select json_type(json_compact(cast(3.14 as float))); -- cast target type not supported + +# select json_type(json_compact(cast(b'10101' as bit(10)))); -- cast target type not supported +# select json_type(json_compact(cast('10101abcde' as blob))); -- cast target type not supported +select json_type(json_compact(cast('10101abcde' as binary))); + +# select json_type(json_compact(cast('a' as enum('a','b','c')))); -- cast target type not supported +# select json_type(json_compact(cast('a,c' as set('a','b','c')))); -- cast target type not supported + +select json_type(json_compact(ST_GeomFromText('POINT(1 1)'))); +select json_type(json_compact(ST_GeomFromText('LINESTRING(0 0,1 1,2 2)'))); +select json_type(json_compact(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0), + (5 5,7 5,7 7,5 7, 5 5))'))); +select json_type(json_compact(null)); +select json_type(json_compact(null)) is null; # check that it is an SQL NULL +select json_type(null) is null; # is an SQL NULL + +# +# same, but now show the printable value: +# +select json_compact(cast('2014-11-25 18:00' as datetime)); +select json_compact(cast('2014-11-25' as date)); +select json_compact(cast('18:00:59' as time)); +# select json_compact(cast('2014-11-25 18:00' as timestamp)); -- cast target type not supported + +# select json_compact(cast('1999' as year)); -- cast target type not supported +select json_compact(127); +select json_compact(255); +select json_compact(32767); +select json_compact(65535); +select json_compact(8388607); +select json_compact(16777215); +select json_compact(2147483647); +select json_compact(4294967295); +select json_compact(9223372036854775807); +select json_compact(18446744073709551615); +select json_compact(true); +select json_compact(b'10101'); + +select json_compact(cast(3.14 as decimal(5,2))); +select json_compact(3.14); +select json_compact(3.14e0); +# select json_compact(cast(3.14 as numeral(5,2))); -- cast target type not supported + +# select json_compact(cast(3.14 as double)); -- cast target type not supported +# select json_compact(cast(3.14 as float)); -- cast target type not supported + +# select json_compact(cast(b'10101' as bit(10)); -- cast target type not supported +# select json_compact(cast('10101abcde' as blob)); -- cast target type not supported +select json_compact(cast('10101abcde' as binary)); + +# select json_compact(cast('a' as enum('a','b','c')); -- cast target type not supported +# select json_compact(cast('a,c' as set('a','b','c')); -- cast target type not supported + +select json_compact(ST_GeomFromText('POINT(1 1)')); +select json_compact(ST_GeomFromText('LINESTRING(0 0,1 1,2 2)')); +select json_compact(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0), + (5 5,7 5,7 7,5 7, 5 5))')); +select json_compact(null); +select json_compact(null) is null; # check that it is an SQL NULL + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_KEYS function. +--echo # ---------------------------------------------------------------------- +# should all give NULL: +select json_keys(NULL); +select json_keys(NULL, '$.b'); +select json_keys(NULL, NULL); +select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a'); +select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', NULL); + +# non NULL results +select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}'); +select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.b'); + +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_keys('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.*.b'); + +# Examples from the specification +--echo # returns [ "a", "b" ] +SELECT JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }'); + +--echo # returns [] +SELECT JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : {} } ] }', + '$.b[1].c'); + +--echo # returns NULL +SELECT JSON_KEYS('{ "a" : "foo", "b" : [ true, { "c" : {} } ] }', + '$.a.b[2]'); + +--echo error ER_INVALID_JSON_PATH +SELECT JSON_KEYS('{"a":1}', '1010'); +--echo error ER_INVALID_JSON_PATH +SELECT JSON_KEYS('{"a":1}', '1010') IS NULL; + +# examples from the wl7909 spec +# returns [ "a", "b" ] +SELECT JSON_KEYS +( + '{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }' +); + +# returns [] +SELECT JSON_KEYS +( + '{ "a" : "foo", "b" : [ true, { "c" : {} } ] }', + '$.b[1].c' +); + +# returns NULL +SELECT JSON_KEYS +( + '{ "a" : "foo", "b" : [ true, { "c" : {} } ] }', + '$.a.b[2]' +); + +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT JSON_KEYS(); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT JSON_KEYS('{}', '$', '$'); + +--echo # ---------------------------------------------------------------------- +--echo # CAST(<json> AS CHAR). See also 'json_conversions.test' for other +--echo # conversion tests. +--echo # ---------------------------------------------------------------------- +select cast(json_keys('{"a": 1}') as char); +select cast(json_compact(1) as char); +select cast(json_keys(NULL) as char); +#select cast(j as char) from keys1; + +--echo # ---------------------------------------------------------------------- +--echo # Path matching with double-quotes +--echo # ---------------------------------------------------------------------- + +# matches +select json_extract( '{ "one potato" : 1 }', '$."one potato"' ); +# matches +select json_extract( '{ "a.b" : 1 }', '$."a.b"' ); + +# doesn't match +select json_extract( '{ "\\"a\\"": 1}', '$."a"' ); +# matches +select json_extract( '{ "\\"a\\"": 1}', '$."\\"a\\""' ); +# matches +select json_extract( '{ "a": 1}', '$."a"' ); +# matches +select json_extract( '{ "a": 1}', '$.a' ); + +# examples from functional spec section on Path Syntax + +# [3, 2] +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[0]' ); +# 2 +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[0][1]' ); +# [ { "c": "d" }, 1 ] +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1]' ); +# { "c": "d" } +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1][0]' ); +# "d" +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.a[1][0].c' ); +# 7 +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$."one potato"' ); +# 6 +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$.b.c' ); +# 8 +select json_extract( '{ "a": [ [ 3, 2 ], [ { "c" : "d" }, 1 ] ], "b": { "c" : 6 }, "one potato": 7, "b.c" : 8 }', '$."b.c"' ); + + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_EXTRACT function. +--echo # ---------------------------------------------------------------------- + +# errors +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_extract(NULL); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_extract('$.b'); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}'); + +# Confused argument order +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +select json_extract('$.a', '{"a": 1, "b": {"e": "foo", "b": 3}}'); + +# NULLs +select json_extract(NULL, '$.b'); +select json_extract(NULL, NULL); + +# non-NULLs +select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a'); +select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.*'); +select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a', '$.b.e'); +select json_extract('{"a": 1, "b": [1,2,3]}', '$.b[2]'); +# one path is NULL +select json_extract('{"a": 1, "b": {"e": "foo", "b": 3}}', '$.a', NULL); + +# Examples from the specification +--echo # returns a JSON value containing just the string "123" +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }', + '$.b[ 1 ].c'); + +--echo # returns a JSON value containing just the number 123 +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', + '$.b[ 1 ].c'); + +--echo # raises an error because the document is not valid +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_EXTRACT('{ "a" : [ }', + '$.b[ 1 ].c'); + +--echo # raises an error because the path is invalid +--echo error ER_INVALID_JSON_PATH +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', + '$.b[ 1 ].'); + +--echo # returns a JSON value containing the number 123 (because of +--echo # auto-wrapping the scalar) +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', + '$.b[ 1 ].c[ 0 ]'); +--echo # returns a JSON value containing the object because of auto-wrapping +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : {"not array": 4} } ] }', + '$.b[ 1 ].c[ 0 ]'); + +--echo # returns null because the path, although valid, does not identify a value +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', + '$.b[ 1 ].c[ 1 ]'); + +--echo # returns a JSON value containing the number 123 (due to normalization) +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', + '$.b[ 1 ].c'); + +--echo # returns a JSON array [ "foo", true ] +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', + '$.a', '$.b[0]'); + +--echo # returns a JSON array [ true ] +SELECT JSON_EXTRACT('{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', + '$.d', '$.b[0]'); + +# some examples verifying ellipsis behavior + +# should have same result +select json_extract( '[1]', '$[0][0]' ); +select json_extract( '[1]', '$**[0]' ); + +# should have same result +select json_extract( '{ "a": 1 }', '$.a[0]' ); +select json_extract( '{ "a": 1 }', '$**[0]' ); + +# should have same result +select json_extract( '{ "a": 1 }', '$[0].a' ); +select json_extract( '{ "a": 1 }', '$**.a' ); + +# should have same result +select json_extract( '{ "a": 1 }', '$[0].a[0]' ); +select json_extract( '{ "a": 1 }', '$**[0]' ); + +# should have the same result +select json_extract( '{ "a": 1 }', '$[0].a' ); +select json_extract( '{ "a": 1 }', '$**.a' ); +select json_extract( '{ "a": 1 }', '$[0][0].a' ); +select json_extract( '{ "a": 1 }', '$[0][0][0].a' ); + +# should have the same result +SELECT JSON_EXTRACT('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', '$**.a.*'); +SELECT JSON_EXTRACT('[1, [[{"x": [{"a":{"b":{"c":42}}}]}]]]', + '$[1][0][0].x[0].a.*'); + +# examples from the wl7909 spec +# returns a JSON value containing just the string "123" +SELECT JSON_EXTRACT +( + '{ "a" : "foo", "b" : [ true, { "c" : "123" } ] }', + '$.b[ 1 ].c' +); + +# returns a JSON value containing just the number 123 +SELECT JSON_EXTRACT +( + '{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', + '$.b[ 1 ].c' +); + +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_EXTRACT +( + '{ "a" : [ }', + '$.b[ 1 ].c' +); + +--echo error ER_INVALID_JSON_PATH +SELECT JSON_EXTRACT +( + '{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', + '$.b[ 1 ].' +); + +# returns a JSON value containing the number 123 (because of auto-wrapping) +SELECT JSON_EXTRACT +( + '{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', + '$.b[ 1 ].c[ 0 ]' +); + +# returns null because the path, although valid, does not identify a value +SELECT JSON_EXTRACT +( + '{ "a" : "foo", "b" : [ true, { "c" : 123 } ] }', + '$.b[ 1 ].c[ 1 ]' +); + +# returns a JSON value containing the number 123 (due to normalization) +SELECT JSON_EXTRACT +( + '{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', + '$.b[ 1 ].c' +); + +# returns a JSON array ["foo", true] +SELECT JSON_EXTRACT +( + '{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', + '$.a', '$.b[0]' +); + +# returns a the 'true' literal +SELECT JSON_EXTRACT +( + '{ "a" : "foo", "b" : [ true, { "c" : 123, "c" : 456 } ] }', + '$.d', '$.b[0]' +); + +# should return NULL +select json_extract( '[ { "a": 1 }, { "a": 2 } ]', '$[*].b' ) jdoc; + +# should return NULL +select json_extract( '[ { "a": 1 }, { "a": 2 } ]', '$[0].b' ) jdoc; + +# should return 1 +select json_extract( '[ { "a": 1 }, { "a": 2 } ]', '$[0].a' ) jdoc; + +# should return [1, 2] +select json_extract( '[ { "a": 1 }, { "a": 2 } ]', '$[*].a' ) jdoc; + +# should return [1] +select json_extract( '[ { "a": 1 }, { "b": 2 } ]', '$[*].a' ) jdoc; + +# should return [3, 4] +select json_extract( '[ { "a": [3,4] }, { "b": 2 } ]', '$[0].a' ) jdoc; + +# should return [[3, 4]] +select json_extract( '[ { "a": [3,4] }, { "b": 2 } ]', '$[*].a' ) jdoc; + +# should return [[3, 4]] +select json_extract( '[ { "a": [3,4] }, { "b": 2 } ]', '$[0].a', '$[1].a' ) jdoc; + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_ARRAY_APPEND function. +--echo # ---------------------------------------------------------------------- + +# NULLs +select json_array_append(NULL, '$.b', json_compact(1)); +select json_array_append('[1,2,3]', NULL, json_compact(1)); +select json_array_append('[1,2,3]', '$', NULL); + +# wrong # args +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_array_append(NULL); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_array_append(NULL, NULL); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_array_append(NULL, NULL, NULL, NULL); + +# auto-wrap +SELECT JSON_ARRAY_APPEND(json_compact('1'), '$', 3); +SELECT JSON_ARRAY_APPEND(json_compact('{"a": 3}'), '$', 3); + +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_array_append(json_compact('{"a": {"b": [3]}}'), '$**[0]', 6); + +# Examples from the specification + +--echo # Auto-wrapping, since because the paths identify scalars. +--echo # should return {"a": "foo", "b": ["bar", 4], "c": ["wibble", "grape"]} +SELECT JSON_ARRAY_APPEND('{"a": "foo", "b": "bar", "c": "wibble"}', + '$.b', json_compact(4), + '$.c', json_compact('"grape"')); + +--echo # should return {"a": "foo", "b": [1, 2, 3, 4], +--echo # "c": ["apple", "pear", "grape"]} +SELECT JSON_ARRAY_APPEND('{"a" : "foo","b": [1, 2, 3], "c": ["apple", "pear"]}', + '$.b', json_compact(4), + '$.c', json_compact('"grape"')); + +# without CAST: cf. not required for ANY_JSON_ATOM arguments in specification +SELECT JSON_ARRAY_APPEND('{"a" : "foo","b": [1, 2, 3], "c": ["apple", "pear"]}', + '$.b', 4, + '$.c', 'grape'); + +# wild cards, multiple pairs +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_array_append( '[[], [], []]', '$[*]', 3, '$[*]', 4); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_array_append( '[[], "not array", []]', '$[*]', 3, '$[*]', 4); + +# examples from wl7909 spec +# should return {"a": "foo", "b": ["bar", 4], "c": ["wibble", "grape"]} due to autowrapping +SELECT JSON_ARRAY_APPEND +( + '{ "a" : "foo", "b" : "bar", "c" : "wibble" }', + '$.b', 4, + '$.c', "grape" +); + +# should return {"a": "foo", "b": [1, 2, 3, 4], "c": ["apple", "pear", "grape"]} +SELECT JSON_ARRAY_APPEND +( + '{ "a" : "foo", "b" : [ 1, 2, 3 ], "c" : [ "apple", "pear" ] }', + '$.b', 4, + '$.c', "grape" +); + +--echo # ---------------------------------------------------------------------- +--echo # Bug#21373874 ASSERTION `PARENT' FAILED +--echo # ---------------------------------------------------------------------- + +select json_array_append('{"a":1}', '$[0]', 100); +select json_array_append('3', '$[0]', 100); +select json_array_append('3', '$[0][0][0][0]', 100); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_INSERT function. +--echo # ---------------------------------------------------------------------- + +# NULLs +select json_insert(NULL, '$.b', json_compact(1)); +select json_insert('[1,2,3]', NULL, json_compact(1)); +select json_insert('[1,2,3]', '$[3]', NULL); + +# wrong # args +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_insert(NULL); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_insert(NULL, NULL); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_insert(NULL, NULL, NULL, NULL); + +# positive test cases + +select json_insert('[1,2,3]', '$[2]', 4); +select json_insert('[1,2,3]', '$[3]', 4); +select json_insert('[1,2,3]', '$[10]', 4); + +select json_insert('{"c":4}', '$.c', 4); +select json_insert('{"c":4}', '$.a', 4); + +select json_insert('1', '$', 4); +select json_insert('1', '$[0]', 4); +select json_insert('1', '$[1]', 4); +select json_insert('1', '$[10]', '4', '$[11]', 5); + +select json_insert('[1,2,3]', '$[2][0]', 4); +select json_insert('[1,2,3]', '$[2][2]', 4); + +select json_insert('{"a": 3}', '$.a[0]', 4); +select json_insert('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5'); + +# wild card & auto-wrap (scalars) +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('{"a": [1], "b": 2}'), '$.*[1]', 6); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('{"a": 1, "b": 2}'), '$.*[1]', 6); + +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('{"a": {"b": 3}}'), '$.a.*[1]', 6); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('{"a": {"b": [3]}}'), '$.a.*[1]', 6); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('{"a": {"b": 3}}'), '$**[1]', 6); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('{"a": {"b": [3]}}'), '$**[1]', 6); + +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('[1]'), '$[*][1]', 6); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('[1]'), '$**[1]', 6); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('[1, [2], 3]'), '$[*][1]', 6); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('[1, [2], 3]'), '$**[1]', 6); + +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('[[1]]'), '$[*][1]', 6); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert(json_compact('[[1]]'), '$**[1]', 6); + +# auto-wrap object +select json_insert(json_compact('{"a": 3}'), '$[1]', 6); + + +# Examples from the specification + +# returns the original document because the path does exist +SELECT JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.a', true); + +# inserts a number, returns '{ "a" : "foo", "b" : [ 1, 2, 3 ], "c" : 123 } +SELECT JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.c', 123); + +# inserts a string, returns '{ "a" : "foo", "b" : [ 1, 2, 3 ], "c" : "123" } +SELECT JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.c', '123'); + +# returns '{ "a" : [ "foo", true ], "b" : [ 1, 2, 3 ] }' +SELECT JSON_INSERT('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', '$.a[1]', true); + +# should return { "a" : "foo", "b": true } +SELECT JSON_INSERT('{ "a" : "foo"}', '$.b', true, '$.b', false); + +# examples from the wl7909 spec +# returns the original document because the path does exist +SELECT JSON_INSERT +( + '{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.a', + true +); + +# inserts a number, returns '{"a": "foo", "b": [1, 2, 3], "c": 123} +SELECT JSON_INSERT +( + '{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.c', + 123 +); + +# inserts a string, returns '{"a": "foo", "b": [1, 2, 3], "c": "123"} +SELECT JSON_INSERT +( + '{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.c', + '123' +); + +# returns '{"a": ["foo", true], "b": [1, 2, 3]}' +SELECT JSON_INSERT +( + '{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.a[1]', + true +); + +# returns {"a": "foo", "b": true} +SELECT JSON_INSERT +( + '{ "a" : "foo"}', + '$.b', true, + '$.b', false +); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_ARRAY_INSERT function. +--echo # ---------------------------------------------------------------------- + +# NULLs +select json_array_insert(NULL, '$.b[1]', 1); +select json_array_insert('[1,2,3]', NULL, 1); +select json_array_insert('[1,2,3]', '$[3]', NULL); + +# wrong # args +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_array_insert(NULL); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_array_insert(NULL, NULL); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_array_insert(NULL, NULL, NULL, NULL); + +# path does not indicate a cell position +--echo error ER_INVALID_JSON_PATH_ARRAY_CELL +select json_array_insert('true', '$', 1); +--echo error ER_INVALID_JSON_PATH_ARRAY_CELL +select json_array_insert('true', '$.a', 1); +--echo error ER_INVALID_JSON_PATH_ARRAY_CELL +select json_array_insert('true', '$.a[1].b', 1); + +# nop if there is no array at the path's parent +select json_array_insert( 'true', '$[0]', false ); +select json_array_insert( 'true', '$[1]', false ); +select json_array_insert( '{ "a": true }', '$.a[0]', false ); +select json_array_insert( '{ "a": true }', '$.a[1]', false ); + +# positive tests +select json_array_insert( '[]', '$[0]', false ); +select json_array_insert( '[]', '$[1]', false ); +select json_array_insert( '[true]', '$[0]', false ); +select json_array_insert( '[true]', '$[1]', false ); +select json_array_insert( '[true]', '$[2]', false ); +select json_array_insert( '{ "a": [] }', '$.a[0]', false ); +select json_array_insert( '{ "a": [] }', '$.a[1]', false ); +select json_array_insert( '{ "a": [true] }', '$.a[0]', false ); +select json_array_insert( '{ "a": [true] }', '$.a[1]', false ); +select json_array_insert( '{ "a": [true] }', '$.a[2]', false ); + +# insert into the middle of an array +select json_array_insert( '[1, 2, 3, 4]', '$[0]', false ); +select json_array_insert( '[1, 2, 3, 4]', '$[1]', false ); +select json_array_insert( '[1, 2, 3, 4]', '$[2]', false ); +select json_array_insert( '[1, 2, 3, 4]', '$[3]', false ); +select json_array_insert( '[1, 2, 3, 4]', '$[4]', false ); +select json_array_insert( '[1, 2, 3, 4]', '$[5]', false ); + +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[0]', false ); +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[1]', false ); +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[2]', false ); +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[3]', false ); +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[4]', false ); +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.a[5]', false ); + +# nop +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.b[0]', false ); +select json_array_insert( '{ "a": [1, 2, 3, 4] }', '$.b[1]', false ); + +# no auto-wrapping +select json_array_insert( '"a"', '$[0]', true ); +select json_array_insert( '[ "a" ]', '$[0][0]', true ); +select json_array_insert( '"a"', '$[1]', true ); + +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert('[]', '$.a.*[1]', 6); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert('[]', '$**[1]', 6); +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_insert('[]', '$[*][1]', 6); + +# multiple paths, +select json_array_insert( '[ 1, 2, 3 ]', '$[1]', true, '$[1]', false ); +select json_array_insert( '[ 1, 2, 3 ]', '$[1]', + json_compact( '[ "a", "b", "c", "d" ]'), '$[1][2]', false ); + +# test an error while evaluating the document expression +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_ARRAY_INSERT(JSON_EXTRACT('[1', '$'), '$[0]', 1); + +# error in reading new value +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +select json_array_insert( '[ 1, 2, 3 ]', '$[1]', json_extract( '[', '$' ) ); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_SET function. +--echo # ---------------------------------------------------------------------- + +# NULLs +select json_set(NULL, '$.b', json_compact(1)); +select json_set('[1,2,3]', NULL, json_compact(1)); +select json_set('[1,2,3]', '$[3]', NULL); + +# wrong # args +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_set(NULL); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_set(NULL, NULL); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_set(NULL, NULL, NULL, NULL); + +# Detect errors in nested function calls. +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_SET('{}', '$.name', JSON_EXTRACT('', '$')); + +# positive test cases + +select json_set('[1,2,3]', '$[2]', 4); +select json_set('[1,2,3]', '$[3]', 4); +select json_set('[1,2,3]', '$[10]', 4); + +select json_set('{"c":4}', '$.c', 5); +select json_set('{"c":4}', '$.a', 5); + +select json_set('1', '$', 4); +select json_set('1', '$[0]', 4); +select json_set('1', '$[1]', 4); +select json_set('1', '$[10]', '4', '$[11]', 5); + +select json_set('[1,2,3]', '$[2][0]', 4); +select json_set('[1,2,3]', '$[2][2]', 4); + +select json_set('{"a": 3}', '$.a[0]', 4); +select json_set('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5'); + +# auto-wrap plus ellipsis with nested hits should give: {"a": [{"b": [3, 6]}, 6]} +--echo error ER_INVALID_JSON_PATH_WILDCARD +select json_set(json_compact('{"a": {"b": [3]}}'), '$**[1]', 6); + +# Examples from the specification: Include when missing functions are +# available. + +# returns { "a" : {}, "b" : [ 1, 2, 3 ] } + SELECT JSON_SET('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.a', + JSON_OBJECT()); + +# # returns { "a" : "foo", "b" : [ 1, 2, 3 ], "c" : [ true, false ] } +# SELECT JSON_SET('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +# '$.c', +# JSON_ARRAY( true, false )); + +# # returns { "a" : "foo", "b" : [ 1, 2, 3 ], "c" : [ true, false ] } +# SELECT JSON_SET('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', +# '$.c', +# JSON_ARRAY( json_compact( 'true'), json_compact( 'false') )); + +# # returns [ 1, null, null, 2 ] +# SELECT JSON_SET('1', '$[3]', 2); + +# should return { "a": { "b": false, "c": true } } +SELECT JSON_SET('{ "a" : "foo"}', '$.a', + JSON_OBJECT( 'b', false ), '$.a.c', true); + +# returns { "a" : {}, "b" : [ 1, 2, 3 ] } +select json_set('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.a', + json_compact('{}')); + +# returns { "a" : "foo", "b" : [ 1, 2, 3 ], "c" : [ true, false ] } +select json_set('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.c', + json_compact('[true, false]')); + +# returns [ 1, null, null, 2 ] +select json_set('1', '$[3]', 2); + +# should return { "a": { "b": false, "c": true } } +select json_set('{ "a" : "foo"}', '$.a', + json_compact('{"b": false}'), '$.a.c', true); + +# examples from wl7909 spec +# returns {"a": {}, "b": [1, 2, 3]} +SELECT JSON_SET +( + '{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.a', + JSON_OBJECT() +); + +# returns {"a": "foo", "b": [1, 2, 3], "c": [true, false]} +SELECT JSON_SET +( + '{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.c', + JSON_ARRAY( true, false ) +); + +# returns {"a": "foo", "b": [1, 2, 3], "c": [true, false]} +SELECT JSON_SET +( + '{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.c', + JSON_ARRAY( json_compact( 'true'), json_compact( 'false') ) +); + +# returns [1, 2] +SELECT JSON_SET +( + '1', + '$[3]', + 2 +); + +# returns {"a": {"b": false, "c": true}} +SELECT JSON_SET +( + '{ "a" : "foo"}', + '$.a', JSON_OBJECT( 'b', false ), + '$.a.c', true +); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_REPLACE function. +--echo # ---------------------------------------------------------------------- + +# NULLs +select json_replace(NULL, '$.b', json_compact(1)); +select json_replace('[1,2,3]', NULL, json_compact(1)); +select json_replace('[1,2,3]', '$[2]', NULL); + +# wrong # args +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_replace(NULL); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_replace(NULL, NULL); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_replace(NULL, NULL, NULL, NULL); + +# positive test cases + +select json_replace('[1,2,3]', '$[2]', 4); +select json_replace('[1,2,3]', '$[3]', 4); +select json_replace('[1,2,3]', '$[10]', 4); + +select json_replace('{"c":4}', '$.c', 5); +select json_replace('{"c":4}', '$.a', 5); + +select json_replace('1', '$', 4); +select json_replace('1', '$[0]', 4); +select json_replace('1', '$[1]', 4); +select json_replace('1', '$[10]', '4', '$[11]', 5); + +select json_replace('[1,2,3]', '$[2][0]', 4); +select json_replace('[1,2,3]', '$[2][2]', 4); + +select json_replace('{"a": 3}', '$.a[0]', 4); +select json_replace('{"a": 3}', '$.a[1]', 4, '$.a[2]', '5'); + + +# Examples from the specification + +# returns the original document because the path doesn't exist +SELECT JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.c', + true); + +# returns '{ "a" : true, "b" : [ 1, 2, 3 ] }' +SELECT JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.a[0]', + true); + +# returns the original document because the path doesn't exist +SELECT JSON_REPLACE('{ "a" : "foo", "b" : [ 1, 2, 3 ] }', + '$.b[5]', + true); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_ARRAY function. +--echo # ---------------------------------------------------------------------- + +# NULLs +select json_array(NULL, '$.b', json_compact(1)); +select json_array('[1,2,3]', NULL, json_compact(1)); +select json_array('[1,2,3]', '$[3]', NULL); + + +# positive test cases +select json_array(); +select json_array(3.14); +select json_array('[1,2,3]'); +select json_array(json_compact('[1,2,3]')); +select json_array(1,2,3); +select json_array(b'0', b'1', b'10'); + +# returns the empty array: [] +SELECT JSON_ARRAY(); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_OBJECT function. +--echo # ---------------------------------------------------------------------- + +# odd number of args +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_object( 'a' ); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_object( 'a', 1, 'b' ); + +# null arg +--echo error ER_JSON_DOCUMENT_NULL_KEY +select json_object( null, 1 ); + +# positive tests +select json_object(); +select json_object( 'a', null ); +select json_object( 'a', 1 ); +select json_object( 'a', 1, 'b', 'foo' ); +select json_object( 'a', 1, 'b', 'foo', 'c', json_compact( '{ "d": "wibble" }') ); +select json_object( 'a', true, 'b', false, 'c', json_compact( 'null') ); +select json_valid( json_object( '"a"', 1 ) ); + +# long key +select json_object( REPEAT('a', 64 * 1024), 1 ); + +# non-string keyNames are cast to CHAR +select json_object(json_array(), json_array()); +select json_object( cast(json_array() as char), json_array()); + +select json_object( 1, json_array()); +select json_object( cast(1 as char), json_array()); + +# returns the empty object: {} +SELECT JSON_OBJECT(); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_SEARCH function. +--echo # ---------------------------------------------------------------------- + +# wrong number of args +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_search(); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_search( '{ "a": true }' ); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_search( '{ "a": true }', 'one' ); + +# null args +select json_search( null, 'one', 'foo' ); +select json_search( '{ "a": "foo" }', null, 'foo' ); +# FIXME. what should happen here? +#select json_search( '{ "a": "foo" }', 'one', null ); +select json_search( '{ "a": "foo" }', 'one', 'foo', null, null ); +select json_search( '{ "a": "foo" }', 'one', 'foo', null, '$.a', null ); + +# bad values for the oneOrAll arg +--echo error ER_JSON_BAD_ONE_OR_ALL_ARG +select json_search( '{ "a": "foo" }', 'twof', 'foo' ); +--echo error ER_JSON_BAD_ONE_OR_ALL_ARG +select json_search( '{ "a": "foo" }', 'two', 'foo' ); + +# bad escape arg +--error ER_WRONG_ARGUMENTS +select json_search( '{ "a": "foo" }', 'one', 'foo', 'ab' ); + +# bad path args +--echo error ER_INVALID_JSON_PATH +select json_search( '{ "a": "foo" }', 'one', 'foo', null, '$a' ); +--echo error ER_INVALID_JSON_PATH +select json_search( '{ "a": "foo" }', 'all', 'foo', null, '$.a', '$b' ); + +--error ER_BAD_FIELD_ERROR +select json_search(a, b, c); + +# simple tests for search without path arguments +select json_search( '{ "a": "foobar" }', 'one', 'foo%' ); +select json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'one', 'foo%' ); +select json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'all', 'foo%' ); +select json_search( '{ "a": "foobar", "b": "focus", "c": [ "arm", "foot", "shoulder" ] }', 'all', 'f__us' ); + +select json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'all', 'foo%', null, '$.a' ); +select json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'all', 'foo%', null, '$.a', '$.b' ); +select json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'one', 'foo%', null, '$.a', '$.b' ); + +select json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'ALL', 'foo%', null, '$.a' ); +select json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'aLl', 'foo%', null, '$.a', '$.b' ); +select json_search( '{ "a": [ "foolish", "folly", "foolhardy" ], "b" : "fool" }', 'ONE', 'foo%', null, '$.a', '$.b' ); + +# wildcards in the path expression +select json_search +( + '[ { "a": { "b": { "c": "fool" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "food"} } ]', + 'all', + 'foo%', + null, + '$**.c' +); + +select json_search +( + '[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]', + 'all', + 'sho%', + null, + '$**.c' +); + +select json_search +( + '[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]', + 'all', + 'sho%e', + null, + '$**.c' +); + +select json_search +( + '[ { "a": { "b": { "c": "showtime" } } }, { "b": { "c": "shoulder" } }, { "c": { "c": "shoe"} } ]', + 'all', + 'sho%', + null, + '$[*].c' +); + +select json_search +( + '[ { "a": { "b": { "c": "showtime" } } }, [ { "b": { "c": "shout" } }, { "c": { "c": "shoe"} } ] ]', + 'all', + 'sho%', + null, + '$[1]**.c' +); + +# escape character +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo%bar' ); +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar' ); +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|' ); +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]' ); +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]', '$[1]' ); +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]', '$[1]', '$[2]' ); + +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null ); +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null, '$[0]' ); +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo\%bar', null, '$[1]' ); +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[0]' ); +select json_search( '[ "footbar", "foo%bar" ]', 'all', 'foo|%bar', '|', '$[1]' ); + +# search is case-sensitive +select json_search( '[ "abc", "ABC" ]', 'all', 'aBc' ); +select json_search( '[ "abc", "ABC" ]', 'all', 'abc' ); +select json_search( '[ "abc", "ABC" ]', 'all', 'ABC' ); + +# only matches strings, not numerics +select json_search( '[ 10, "10", 1.0, "1.0" ]', 'all', '1%' ); + +# examples from the wl7909 spec +# returns null because numeric values don't match string values +SELECT JSON_SEARCH +( + '{ "a" : 123, "b" : [ 123, 456 ] }', + 'one', + '123' +); + +# returns "$.b[2]" +SELECT JSON_SEARCH +( + '{ "a" : "123", "b" : [ 123, "789", "123", "456", "123" ] }', + 'one', + '123', + null, + '$.b' +); + +# could return either "$.a" or "$.b.key" +SELECT JSON_SEARCH +( + '{ "a" : "123", "b" : { "key" : "123" } }', + 'one', + '123' +); + +# returns "$.b.key" +SELECT JSON_SEARCH +( + '{ "a" : "1243", "b" : { "key" : "1234" } }', + 'one', + '123%' +); + +# returns "$.b.c" +SELECT JSON_SEARCH +( + '{ "a" : "1243", "b" : { "key" : "1234", "c": "directorysub%directoryabc" } }', + 'one', + 'dir%torysub@%dir%', + '@' +); + +# returns null because the path doesn't exist +SELECT JSON_SEARCH +( + '{ "a" : "1243", "b" : { "key" : "1234" } }', + 'one', + '123%', + null, + '$.c' +); + +# returns $."one potato" +SELECT JSON_UNQUOTE +( + JSON_SEARCH + ( + '{ "onepotato": "foot", "one potato": "food" , "one \\"potato": "fool" }', + 'all', + 'food' + ) +); + +select json_type(case (null is null) when 1 then + json_compact('null') else + json_compact('[1,2,3]') end); + +select json_type(case (null is not null) when 1 then + json_compact('null') else + json_compact('[1,2,3]') end); + +select json_type( if(null is null, + json_compact('null'), + json_compact('[1,2,3]')) ); + +select json_type( if(null is not null, + json_compact('null'), + json_compact('[1,2,3]'))); + +select cast(json_extract(json_compact(concat('[', json_compact('["A",2]'), ']')), + '$[0][1]') as char) = 2; + +--echo # ---------------------------------------------------------------------- +--echo # Test of aggregate function MAX, MIN. +--echo # ---------------------------------------------------------------------- + +select max(json_compact('[1,2,3]')); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_QUOTE, JSON_UNQUOTE +--echo # ---------------------------------------------------------------------- + +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_quote(); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_quote('abc', 'def'); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_quote(NULL, 'def'); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_quote('abc', NULL); + +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_unquote(); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_unquote('"abc"', '"def"'); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_unquote(NULL, 'def'); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +select json_unquote('"abc"', NULL); + +select json_quote(NULL); +select json_unquote(NULL); + +select json_quote('abc'); +select json_quote(convert('abc' using ascii)); +select json_quote(convert('abc' using latin1)); +select json_quote(convert('abc' using utf8)); +select json_quote(convert('abc' using utf8mb4)); + +select json_unquote('abc'); # should do nothing + +select json_unquote('"abc"'); +select json_unquote(convert('"abc"' using ascii)); +select json_unquote(convert('"abc"' using latin1)); +select json_unquote(convert('"abc"' using utf8)); +select json_unquote(convert('"abc"' using utf8mb4)); + +select json_quote('"'); +select json_unquote('"'); # should do nothing + +--echo error ER_INCORRECT_TYPE +select json_quote(123); # integer not allowed +--echo error ER_INCORRECT_TYPE +select json_unquote(123); # integer not allowed + +select json_unquote('""'); # empty string +select char_length(json_unquote('""')); # verify empty string +select json_unquote('"" '); # unchanged: no final " +select json_unquote(json_compact(json_quote('abc'))); # round trip + +# No change in this JSON string: it is an object +select json_compact('{"abc": "foo"}'); +select json_unquote(json_compact('{"abc": "foo"}')); + +# This is a JSON string, so it is actually unquoted +select json_extract(json_compact('{"abc": "foo"}'), '$.abc'); +select json_unquote(json_extract(json_compact('{"abc": "foo"}'), '$.abc')); + +# Bug fix: thse should be the same +select json_unquote('["a", "b", "c"]'); +select json_unquote(json_compact('["a", "b", "c"]')); + +select charset(json_unquote('"abc"')); + +select json_quote(convert(X'e68891' using utf8)); # chinese "I" (wo3) +select json_quote(convert(X'e68891' using utf8mb4)); # chinese "I" (wo3) + +select json_compact(json_quote(convert(X'e68891' using utf8))); + +select json_unquote(convert(X'e68891' using utf8)); # chinese "I" (wo3) + +select json_quote(json_quote(json_quote('abc'))); # deep quote +select json_unquote(json_unquote(json_unquote( # long round trip of it + json_quote(json_quote(json_quote('abc')))))); + +# DATE/TIME will lose their quotes, too: +select json_compact(cast('2015-01-15 23:24:25' as datetime)); +select json_unquote(json_compact(cast('2015-01-15 23:24:25' as datetime))); + +# as well as opaque values: +select json_compact(st_geomfromtext('point(1 1)')); +select json_unquote(json_compact(st_geomfromtext('point(1 1)'))); + +# examples from the wl7909 spec +# returns the SQL string literal abc +SELECT JSON_UNQUOTE( '"abc"' ); + +# returns the SQL string literal "abc +SELECT JSON_UNQUOTE( '"abc' ); + +--echo error ER_INCORRECT_TYPE +SELECT JSON_UNQUOTE( 123 ); + +# returns the SQL string literal abc +SELECT JSON_UNQUOTE +( CAST( json_compact( '"abc"') AS CHAR ) ); + +# returns 1 +SELECT JSON_UNQUOTE +( + CAST( + JSON_EXTRACT( '{ "userName" : "fred" }', '$.userName' ) + AS CHAR + ) +) = 'fred'; + +# returns 0 +SELECT + CAST( + JSON_EXTRACT( '{ "userName" : "fred" }', '$.userName' ) + AS CHAR + ) = 'fred'; + +# returns "abc" +SELECT JSON_QUOTE( 'abc' ); + +--echo error ER_INCORRECT_TYPE +SELECT JSON_QUOTE( 123 ); + +# returns the JSON document consisting of the string scalar "123" +SELECT json_compact( JSON_QUOTE( '123' )); + +--echo # ---------------------------------------------------------------------- +--echo # Test of JSON_CONTAINS +--echo # ---------------------------------------------------------------------- + +--echo # should give NULL +select json_contains(NULL, NULL); +select json_contains(json_compact('{"a": 1, "b": 2}'), NULL); +select json_contains(NULL, json_compact('null')); +select json_contains(json_compact('[1]'), json_compact('[1]'), NULL); + +--echo # should give 0: +select json_contains(json_compact(3.14), json_compact(3)); + +--echo # should give 0: not at top level +select json_contains(json_compact('{"a": {"b": 7}}'), json_compact('{"b": 7}')); + +--echo # but path argument will fix it: +select json_contains(json_compact('{"a": {"b": 7}}'), json_compact('{"b": 7}'), '$.a'); + +--echo # but arrays "introspect" +select json_contains(json_compact('[1,[2.0, 3.0]]'), json_compact('[2.0]')); +select json_contains(json_compact('[1, 2, [3, [4, 5]], 6, 7]'), json_compact('5')); + +--echo # should give 0: just a key +select json_contains(json_compact('{"a": 1, "b": 2}'), json_compact('"a"')); + +--echo # should give 0: one candidate element doesn't match +select json_contains(json_compact('[1]'), json_compact('[1,2]')); + +--echo # should all give 1 +select json_contains(json_compact('null'), json_compact('null')); +--echo # simple object subset +select json_contains(json_compact('{"a": 1, "b": 2}'), json_compact( '{"a": 1}')); +--echo # simple vector subset +select json_contains(json_compact('[1, 2, 3]'), json_compact('[1, 3]')); +--echo # auto-wrap, should give 1 +select json_contains(json_compact('[1, 2, 3]'), json_compact(3)); +--echo # ok even with nested cast off elements +select json_contains(json_compact('{"person": {"id": 1, "country": "norway"}}'), + json_compact('{"person": {"country": "norway"}}')); +--echo # vector reordering and duplicates is ok +select json_contains(json_compact('[1,3,5]'), json_compact('[5,3,1,5]')); +--echo # ok even with more elts in candidate than in doc +select json_contains(json_compact('[{"b": 4, "a":7}]'), json_compact('[{"a":7},{"b":4}]')); +select json_contains(json_compact('[{"b": 4, "a":7}, 5]'), json_compact('[5, {"a":7, "b":4}]')); +--echo # ok even with mixed number types that compare equal +select json_contains(json_compact('[{"b": 4, "a":7}, 5.0]'), json_compact('[5, {"a":7.0E0, "b":4}]')); + +# Bug discovered by Rick: used to give 1 (true). +select json_contains( '{"customer": "cust3"}', '{"customer": "cust1"}' ); + +SELECT JSON_CONTAINS('[null,1,[2,3],true,false]', '[null,1,[3],false]'); +SELECT JSON_CONTAINS('[null,1,[2,3],true,false]', '[null,1,[4],false]'); +SELECT JSON_CONTAINS('[true,false]', '[[true]]'); +SELECT JSON_CONTAINS('[1,2]', '[[1]]'); +SELECT JSON_CONTAINS('[1,2]', '1', '$.abc'); +SELECT JSON_CONTAINS('{}', '{}'); +SELECT JSON_CONTAINS('{}', '{"a":1}'); +SELECT JSON_CONTAINS('{"a":1}', '{"a":1,"b":2}'); + +# examples from the wl7909 spec +# returns 1 +SELECT JSON_CONTAINS +( + json_compact('[1, 4, 6]'), + json_compact('[1, 6]') +); + +# returns 1; even with nested cast off elements +SELECT JSON_CONTAINS +( + json_compact('{"person": {"id": 1, "country": "norway"}}'), + json_compact('{"person": {"country": "norway"}}') +); + +# returns 1; reordering and duplicates are ok +SELECT JSON_CONTAINS +( + json_compact('[1,3,5]'), + json_compact('[5,3,1,5]') +); + +# return 0; no type conversion is performed +SELECT JSON_CONTAINS +( + json_compact('[3.14]'), + json_compact('[3]') +); + +# returns 1, due to auto-wrapping +SELECT JSON_CONTAINS +( + json_compact('[1, 2, 3]'), + json_compact(3) +); + +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT JSON_CONTAINS(); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT JSON_CONTAINS('[1]'); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT JSON_CONTAINS('[1]', '[1]', '$', '$[0]'); + +--echo # ---------------------------------------------------------------------- +--echo # Wrong collation from JSON_QUOTE caused problems: Set it in +--echo # Item_func_json_quote::fix_length_and_dec. Bug found by Knut. +--echo # Similar issue for JSON_UNQUOTE and JSON_TYPE. +--echo # ---------------------------------------------------------------------- +select json_object("a", ifnull(json_quote('test'), json_compact('null'))); +select json_compact(concat('[', json_quote('ab'), ']')); +select json_compact(concat('[', json_unquote('"12"'), ']')); +select json_compact(concat('["', json_type( json_compact(1)), '"]')); + +--echo # +--echo # Bug#20912438: ITEM_TYPE_HOLDER::DISPLAY_LENGTH(ITEM*): ASSERTION `0' FAILED +--echo # +(SELECT JSON_KEYS('{ "key80": "2015-04-20 11:53:55"}')) UNION ALL +(SELECT JSON_KEYS('{ "key80": "2015-04-20 11:53:55" }') LIMIT 0); +SELECT json_compact(1) UNION ALL SELECT json_compact(1); + +# Exercise NULL handling and error handling in Item_copy_json::copy(). +SELECT COUNT(*), json_compact(NULL); +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT COUNT(*), JSON_EXTRACT('not valid json!', '$'); + +--echo # ---------------------------------------------------------------------- +--echo # Bug report from John E. +--echo # Crash in Item_copy_json::~Item_copy_json +--echo # ---------------------------------------------------------------------- +EXPLAIN SELECT COUNT(*), JSON_KEYS('{}'); + +select json_search( '{ "a": "foo" }', 'one', 'foo', 'a' ); +select json_search( '{ "a": "foo" }', 'one', 'foo', null ); +select json_search( '{ "a": "foo" }', 'one', 'foo', convert(x'f8' using latin1) ); + +# bad escape arg +--error ER_WRONG_ARGUMENTS +select json_search( '{ "a": "foo" }', 'one', 'foo', 'ab' ); + +--echo # ---------------------------------------------------------------------- +--echo # Wrong results when Json_path_cache primed is accessed +--echo # during the prepare-phase. +--echo #---------------------------------------------------------------------- + +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', null ) is null; + +prepare stmt1 from 'select json_remove( ''[ 1, { "a": true, "b": false, "c": null }, 5 ]'', null ) is null'; +execute stmt1; + +--echo error ER_INVALID_JSON_PATH +select json_remove( '[ 1, { "a": true, "b": false, "c": null }, 5 ]', '$.' ) is null; + +--echo error ER_INVALID_JSON_PATH +prepare stmt1 from 'select json_remove( ''[ 1, { "a": true, "b": false, "c": null }, 5 ]'', ''$.'' ) is null'; + +--echo # ---------------------------------------------------------------------- +--echo # Bug#20987329 VALUE OF PREPARED STATEMENT PLACEHOLDER FOR PARAMETER +--echo # IN JSON_EXTRACT IS STICKY +--echo #---------------------------------------------------------------------- + +# should get different results with different parameter values + +# json_extract() + +# json_contains() + +prepare json_stmt1 FROM 'select json_contains( ''{ "keyA": [1, 2, 3], "keyB": [4, 5, 6] }'', ''[2]'', ? )'; +set @mypath = '$.keyA'; +execute json_stmt1 USING @mypath; +set @mypath = '$.keyB'; +execute json_stmt1 USING @mypath; + +# json_contains_path() + +prepare json_stmt2 FROM 'select json_contains_path( ''{ "keyA": [1, 2, 3] }'', ''all'', ? )'; +set @mypath = '$.keyA'; +execute json_stmt2 USING @mypath; +set @mypath = '$.keyB'; +execute json_stmt2 USING @mypath; + +# json_length() + +prepare json_stmt3 FROM 'select json_length( ''{ "keyA": [1, 2, 3], "keyB": [1, 2, 3, 4] }'', ? )'; +set @mypath = '$.keyA'; +execute json_stmt3 USING @mypath; +set @mypath = '$.keyB'; +execute json_stmt3 USING @mypath; + +# json_keys() + +prepare json_stmt4 FROM 'select json_keys( ''[ { "keyA": true }, { "keyB": false } ]'', ? )'; +set @mypath = '$[0]'; +execute json_stmt4 USING @mypath; +set @mypath = '$[1]'; +execute json_stmt4 USING @mypath; + +# json_array_append() + +prepare json_stmt5 FROM 'select json_array_append( ''{ "keyA": [1, 2], "keyB": [3, 4] }'', ?, 5 )'; +set @mypath = '$.keyA'; +execute json_stmt5 USING @mypath; +set @mypath = '$.keyB'; +execute json_stmt5 USING @mypath; + +# json_insert() + +prepare json_stmt6 FROM 'select json_insert( ''{ "keyA": [1, 2], "keyB": [3, 4] }'', ?, 5 )'; +set @mypath = '$.keyA[2]'; +execute json_stmt6 USING @mypath; +set @mypath = '$.keyB[2]'; +execute json_stmt6 USING @mypath; + +# json_set() + +prepare json_stmt7 FROM 'select json_set( ''{ "keyA": [1, 2], "keyB": [3, 4] }'', ?, 5 )'; +set @mypath = '$.keyA[2]'; +execute json_stmt7 USING @mypath; +set @mypath = '$.keyB[2]'; +execute json_stmt7 USING @mypath; + +# json_replace() + +prepare json_stmt8 FROM 'select json_replace( ''{ "keyA": [1, 2], "keyB": [3, 4] }'', ?, 5 )'; +set @mypath = '$.keyA[1]'; +execute json_stmt8 USING @mypath; +set @mypath = '$.keyB[1]'; +execute json_stmt8 USING @mypath; + +# json_search() + +prepare json_stmt9 FROM 'select json_search( ''{ "keyA": [ "foot" ], "keyB": [ "food" ] }'', ''all'', ''foo%'', null, ? )'; +set @mypath = '$.keyA'; +execute json_stmt9 USING @mypath; +set @mypath = '$.keyB'; +execute json_stmt9 USING @mypath; + +# json_remove() + +prepare json_stmt10 FROM 'select json_remove( ''{ "keyA": [ "foot" ], "keyB": [ "food" ] }'', ? )'; +set @mypath = '$.keyA'; +execute json_stmt10 USING @mypath; +set @mypath = '$.keyB'; +execute json_stmt10 USING @mypath; + +# similar caching problem for the oneOrAll args + +prepare json_stmt11 FROM 'select json_contains_path( ''{ "keyA": true }'', ?, ''$.keyA'', ''$.keyB'' )'; +set @mypath = 'one'; +execute json_stmt11 USING @mypath; +set @mypath = 'all'; +execute json_stmt11 USING @mypath; + +prepare json_stmt12 FROM 'select json_search( ''{ "keyA": [ "foot" ], "keyB": [ "food" ] }'', ?, ''foo%'' )'; +set @mypath = 'one'; +execute json_stmt12 USING @mypath; +set @mypath = 'all'; +execute json_stmt12 USING @mypath; + +--echo # +--echo # Bug#21128632 JSON_QUOTE(JSON_TYPE(...)) GIVES ERROR 3139 ER_INVALID_JSON_CHARSET +--echo # + +select json_quote( json_type( json_object() ) ); +select json_quote( json_type( json_compact('{}') ) ); + +--echo # +--echo # Bug#21148020 OUTPUT FROM JSON_TYPE() IS TRUNCATED +--echo # WHEN EXECUTED IN A VIEW OR JOIN +--echo # + +SELECT JSON_TYPE(JSON_OBJECT()); +CREATE VIEW v1 AS SELECT JSON_TYPE(JSON_OBJECT()); +SELECT * FROM v1; +drop view v1; + +# SELECT JSON_TYPE(json_compact(CAST('2015-05-25 11:23:55' AS DATETIME))); +# CREATE VIEW v2 AS SELECT JSON_TYPE(json_compact(CAST('2015-05-25 11:23:55' AS +# DATETIME))); +# SELECT * FROM v2; +# drop view v2; + +--echo # +--echo # Bug#21198333 SIG 6 IN ITEM_CACHE_JSON::CACHE_VALUE AT SQL/ITEM.CC:9470 +--echo # +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT MIN(JSON_EXTRACT('not json', '$')); + +--echo # +--echo # Bug#21200657 DATA FROM DERIVED TABLE BASED +--echo # ON JSN_QUOTE()/JSN_UNQUOTE() CALL IS TRUNCATED +--echo # +SELECT JSON_QUOTE('This is a string that should not be truncated') AS field1; +SELECT JSON_UNQUOTE(JSON_QUOTE('This is a string that should not be truncated')) AS field1; + +SELECT * FROM (SELECT JSON_QUOTE('This is a string that should not be truncated') AS field1) AS DERIVED_TABLE; +SELECT * FROM (SELECT JSON_UNQUOTE("This is a string that should not be truncated") AS field1) AS DERIVED_TABLE; +SELECT * FROM (SELECT JSON_UNQUOTE(JSON_QUOTE('This is a string that should not be truncated')) AS field1) AS DERIVED_TABLE; + +--echo # +--echo # Bug#21296173 JSON_OBJECT('KEY', BOOLEAN_LITERAL) USES VALUES 0, 1 +--echo # FOR BOOL WHEN USED VIA VIEW +--echo # + +SELECT JSON_OBJECT('key1', false, 'key2', true); +SELECT JSON_ARRAY('key1', false, 'key2', true); +CREATE VIEW v1 AS SELECT JSON_OBJECT('key1', false, 'key2', true); +SELECT * FROM v1; +CREATE VIEW v2 AS SELECT JSON_ARRAY('key1', false, 'key2', true); +SELECT * FROM v2; + +drop view v1; +drop view v2; + +--echo # +--echo # Bug#21293089 JSON_CONTAINS() RETURNS WRONG RESULT WITH EMPTY JSON ARRAY +--echo # +SELECT JSON_CONTAINS('[]', '{"a" : 1}'); +SELECT JSON_CONTAINS('[]', '[1, 2, 3, 4, 5]'); +SELECT JSON_CONTAINS('[]', '[1, 2, 3, 4, {"a" : 1}]'); +SELECT JSON_CONTAINS('[]', '{"a" : [1, 2, 3, 4, 5]}'); +SELECT JSON_CONTAINS('[]', '[]'); + +--echo # +--echo # Bug#21377136 STACK OVERFLOW IN RAPIDJSON::GENERICREADER +--echo # +--echo error ER_JSON_DOCUMENT_TOO_DEEP +SELECT JSON_VALID(REPEAT('[', 100000)); +--echo error ER_JSON_DOCUMENT_TOO_DEEP +SELECT JSON_VALID(REPEAT('{"a":', 100000)); +--echo error ER_JSON_DOCUMENT_TOO_DEEP +SELECT JSON_VALID(REPEAT('{"a":[', 100000)); +--echo error ER_JSON_DOCUMENT_TOO_DEEP +SELECT JSON_VALID(REPEAT('[{"a":', 100000)); + +--echo # +--echo # Bug#21381806 JSON: ASSERTION FAILED: ARG->NULL_VALUE +--echo # +SELECT JSON_SET(CASE WHEN 1 THEN NULL ELSE NULL END, '{}', '{}'); +SELECT JSON_VALID(CASE WHEN 1 THEN NULL ELSE NULL END); +SELECT JSON_ARRAY(CASE WHEN 1 THEN NULL ELSE NULL END); + +--echo # +--echo # Bug#21384048 ASSERTION FAILED: N >= 0 && N <= 308 +--echo # IN RAPIDJSON::INTERNAL::FASTPATH +--echo # +SELECT JSON_EXTRACT('-1E-36181012216111515851075235238', '$'); +SELECT JSON_EXTRACT('1E-36181012216111515851075235238', '$'); +SELECT JSON_EXTRACT('1E-325', '$'); +SELECT JSON_EXTRACT('1E-324', '$'); +SELECT JSON_EXTRACT('1E-323', '$'); +SELECT JSON_EXTRACT('1E+308', '$'); +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_EXTRACT('1E+309', '$'); +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_EXTRACT('1E+36181012216111515851075235238', '$'); +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT JSON_EXTRACT('-1E+36181012216111515851075235238', '$'); + +--echo # +--echo # Bug#21383284: ASSERTION IN SELECT_LEX::SETUP_CONDS +--echo # +--error ER_WRONG_ARGUMENTS +SELECT 1 FROM dual WHERE JSON_SEARCH('{}', 'one', 'foo', 'too-long-escape'); +--echo error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT 1 FROM dual WHERE JSON_SEARCH('{}', 'one', 'foo', JSON_EXTRACT('', '$')); + +--echo # +--echo # Bug#21442624 INCORRECT RESULT FROM JSON_SET WITH AUTO-WRAPPING +--echo # + +SELECT JSON_SET('1', '$', 100); +SELECT JSON_SET('1', '$[0]', 100); +SELECT JSON_SET('1', '$[0][0]', 100); +SELECT JSON_SET('1', '$[0][0][0]', 100); + +SELECT JSON_SET('[]', '$', 100); +SELECT JSON_SET('[]', '$[0]', 100); +SELECT JSON_SET('[]', '$[0][0]', 100); +SELECT JSON_SET('[]', '$[0][0][0]', 100); + +SELECT JSON_SET('[1]', '$', 100); +SELECT JSON_SET('[1]', '$[0]', 100); +SELECT JSON_SET('[1]', '$[0][0]', 100); +SELECT JSON_SET('[1]', '$[0][0][0]', 100); + +SELECT JSON_SET('[[1]]', '$', 100); +SELECT JSON_SET('[[1]]', '$[0]', 100); +SELECT JSON_SET('[[1]]', '$[0][0]', 100); +SELECT JSON_SET('[[1]]', '$[0][0][0]', 100); + +SELECT JSON_SET('[[[1]]]', '$', 100); +SELECT JSON_SET('[[[1]]]', '$[0]', 100); +SELECT JSON_SET('[[[1]]]', '$[0][0]', 100); +SELECT JSON_SET('[[[1]]]', '$[0][0][0]', 100); + +SELECT JSON_REPLACE('1', '$', 100); +SELECT JSON_REPLACE('1', '$[0]', 100); +SELECT JSON_REPLACE('1', '$[0][0]', 100); +SELECT JSON_REPLACE('1', '$[0][0][0]', 100); + +SELECT JSON_REPLACE('[]', '$', 100); +SELECT JSON_REPLACE('[]', '$[0]', 100); +SELECT JSON_REPLACE('[]', '$[0][0]', 100); +SELECT JSON_REPLACE('[]', '$[0][0][0]', 100); + +SELECT JSON_REPLACE('[1]', '$', 100); +SELECT JSON_REPLACE('[1]', '$[0]', 100); +SELECT JSON_REPLACE('[1]', '$[0][0]', 100); +SELECT JSON_REPLACE('[1]', '$[0][0][0]', 100); + +SELECT JSON_REPLACE('[[1]]', '$', 100); +SELECT JSON_REPLACE('[[1]]', '$[0]', 100); +SELECT JSON_REPLACE('[[1]]', '$[0][0]', 100); +SELECT JSON_REPLACE('[[1]]', '$[0][0][0]', 100); + +SELECT JSON_REPLACE('[[[1]]]', '$', 100); +SELECT JSON_REPLACE('[[[1]]]', '$[0]', 100); +SELECT JSON_REPLACE('[[[1]]]', '$[0][0]', 100); +SELECT JSON_REPLACE('[[[1]]]', '$[0][0][0]', 100); + + +--echo # +--echo # Bug#21828321: JSON FUNCS CALL DBUG_ABORT OR EXIT() ON WINDOWS! +--echo # +# LEAST and GREATEST treat JSON arguments as strings for now. They used to hit +# an assertion if used in a JSON context and all arguments were JSON values, or +# a mix of NULLs and JSON values. +SELECT JSON_ARRAY(LEAST(NULL, NULL), GREATEST(NULL, NULL), LEAST(j1, NULL), + GREATEST(NULL, j2), LEAST(j1, j2), GREATEST(j1, j2)) AS j +FROM (SELECT json_compact('1') AS j1, json_compact('2') AS j2) t; + diff --git a/mysql-test/suite/json/t/json_table.test b/mysql-test/suite/json/t/json_table.test new file mode 100644 index 00000000..05db8f66 --- /dev/null +++ b/mysql-test/suite/json/t/json_table.test @@ -0,0 +1,997 @@ +--source include/have_sequence.inc + +select * from json_table('[{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}]', '$[*]' COLUMNS( a INT PATH '$.a')) as tt; + +select * from JSON_TABLE( '[ {"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a', NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; + +SELECT * FROM JSON_TABLE( '[ {"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a', NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'), NESTED PATH '$.b[*]' COLUMNS (c INT PATH '$') ) ) jt; + +create table t1 (id varchar(5), json varchar(1024)); +insert into t1 values ('j1', '[{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}]'); +insert into t1 values ('j2', '[{"a": 3, "b": [11,111]}, {"a": 4, "b": [22,222]}, {"a": 5, "b": [22,222]}]'); +select id, json, a from t1, json_table(t1.json, '$[*]' COLUMNS(js_id FOR ORDINALITY, a INT PATH '$.a')) as tt; +select * from t1, JSON_TABLE(t1.json, '$[*]' COLUMNS(js_id FOR ORDINALITY, a INT PATH '$.a', NESTED PATH '$.b[*]' COLUMNS (l_js_id FOR ORDINALITY, b INT PATH '$'))) as jt; +--error ER_BAD_FIELD_ERROR +select * from t1, JSON_TABLE(t1.no_field, '$[*]' COLUMNS(js_id FOR ORDINALITY, a INT PATH '$.a', NESTED PATH '$.b[*]' COLUMNS (l_js_id FOR ORDINALITY, b INT PATH '$'))) as jt; + +--error ER_DUP_FIELDNAME +select * from t1, JSON_TABLE(t1.no_field, '$[*]' COLUMNS(js_id FOR ORDINALITY, a INT PATH '$.a', NESTED PATH '$.b[*]' COLUMNS (l_js_id FOR ORDINALITY, a INT PATH '$'))) as jt; + +DROP TABLE t1; + +create table t1 (item_name varchar(32), item_props varchar(1024)); +insert into t1 values ('Laptop', '{"color": "black", "price": 1000}'); +insert into t1 values ('Jeans', '{"color": "blue", "price": 50}'); + +select * from t1 left join json_table(t1.item_props,'$' columns( color varchar(100) path '$.color')) as T on 1; + +--error ER_BAD_FIELD_ERROR +select * from t1 right join json_table(t1.item_props,'$' columns( color varchar(100) path '$.color')) as T on 1; + +DROP TABLE t1; + +select * from JSON_TABLE( '[ {"xa": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a' default 101 on empty, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; + +select * from JSON_TABLE( '[ {"xa": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a' default 202 on error, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; + +select * from JSON_TABLE( '[ {"a": [1, 2], "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a' default '101' on empty, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; + +select * from JSON_TABLE( '[ {"a": [1, 2], "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a' default '202' on error default '101' on empty, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; + +--error ER_JSON_SYNTAX +select * from JSON_TABLE( '[{"a": [1, 2], "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3} xx YY]', '$[*]' COLUMNS( a INT PATH '$.a' default '202' on error default '101' on empty, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; + +--error ER_JSON_TABLE_SCALAR_EXPECTED +select * from JSON_TABLE( '[{"a": [1, 2], "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a' error on error default '101' on empty, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt; + +# +# MDEV-22290 JSON_TABLE: Decimal type with M equal D causes Assertion +# `scale <= precision' failure +# +select * from json_table('{"a":0}',"$" columns(a decimal(1,1) path '$.a')) foo; + + +# +# MDEV-22291 JSON_TABLE: SELECT from json_table does not work without default database +# +connect (con1,localhost,root,,); +select a from json_table('{"a":0}',"$" columns(a for ordinality)) foo; +connection default; +disconnect con1; + +create table t1 ( + color varchar(32), + price int + ); +insert into t1 values ("red", 100), ("blue", 50); +insert into t1 select * from t1; +insert into t1 select * from t1; + +set @save_optimizer_switch=@@optimizer_switch; +set optimizer_switch='firstmatch=off'; +select * from + json_table('[{"color": "blue", "price": 50}, + {"color": "red", "price": 100}]', + '$[*]' columns( color varchar(100) path '$.color', + price text path '$.price' + ) + ) as T + where + T.color in (select color from t1 where t1.price=T.price); +set @@optimizer_switch=@save_optimizer_switch; + +drop table t1; + +select * from +json_table(' [ {"color": "blue", "sizes": [1,2,3,4], "prices" : [10,20]}, + {"color": "red", "sizes": [10,11,12,13,14], "prices" : [100,200,300]} ]', + '$[*]' columns( + color varchar(4) path '$.color', + seq0 for ordinality, + nested path '$.sizes[*]' + columns (seq1 for ordinality, + size int path '$'), + nested path '$.prices[*]' + columns (seq2 for ordinality, + price int path '$') + ) + ) as T; + + +select * from json_table('[{"color": "blue", "price": 50}, + {"color": "red", "price": 100}, + {"color": "rojo", "price": 10.0}, + {"color": "blanco", "price": 11.0}]', + '$[*]' columns( color varchar(100) path '$.color', + price text path '$.price', seq for ordinality)) as T order by color desc; + +create view v as select * from json_table('{"as":"b", "x":123}',"$" columns(a varchar(8) path '$.a' default '-' on empty, x int path '$.x')) x; +select * from v; +show create table v; +drop view v; + +--error ER_PARSE_ERROR +select * from json_table('{"as":"b", "x":123}', + "$" columns(a varchar(8) path '$.a' default '-' on empty null on error null on empty, x int path '$.x')) x; + +select * from json_table('{"a":"foo","b":"bar"}', '$' + columns (v varchar(20) path '$.*')) as jt; + +select * from json_table('{"a":"foo","b":"bar"}', '$' + columns (v varchar(20) path '$.*' default '-' on error)) as jt; + +select * from json_table('{"b":"bar"}', '$' + columns (v varchar(20) path '$.*' default '-' on error)) as jt; + +create table t1 (a varchar(100)); +insert into t1 values ('1'); +--error ER_NONUNIQ_TABLE +select * from t1 as T, json_table(T.a, '$[*]' columns(color varchar(100) path '$.nonexistent', seq for ordinality)) as T; + +drop table t1; + +prepare s from 'select * from +json_table(?, + \'$[*]\' columns( color varchar(100) path \'$.color\', + price text path \'$.price\', + seq for ordinality)) as T +order by color desc; '; + +execute s using '[{"color": "red", "price":1}, {"color":"brown", "price":2}]'; +deallocate prepare s; + +create view v2 as select * from json_table('[{"co\\\\lor": "blue", "price": 50}]', '$[*]' columns( color varchar(100) path '$.co\\\\lor') ) as T; +select * from v2; +drop view v2; + +explain format=json select * from + json_table('[{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}]', '$[*]' COLUMNS( a INT PATH '$.a')) as tt; +explain select * from + json_table('[{"a": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}]', '$[*]' COLUMNS( a INT PATH '$.a')) as tt; + +create view v1 as select * from + json_table('[{"color": "blue", "price": 50}]', + '$[*]' columns(color text path '$.nonexistent', + seq for ordinality)) as `ALIAS NOT QUOTED`; +select * from v1; +drop view v1; +create view v1 as select * from + json_table('[{"color": "blue", "price": 50}, + {"color": "red", "price": 100}]', + '$[*]' columns( + color text path "$.QUOTES \" HERE \"", + color1 text path '$.QUOTES " HERE "', + color2 text path "$.QUOTES ' HERE '", + seq for ordinality)) as T; +select * from v1; +drop view v1; + +CREATE TABLE t1 (x INT); +INSERT INTO t1 VALUES (1), (2), (3); +--error ER_BAD_FIELD_ERROR +SELECT t1.x*2 m, jt.* FROM t1, + JSON_TABLE(m, '$[*]' COLUMNS (i INT PATH '$')) jt; +DROP TABLE t1; + +--error ER_BAD_FIELD_ERROR +select * +from + json_table(JS3.size, '$' columns (size INT PATH '$.size')) as JS1, + json_table(JS1.size, '$' columns (size INT PATH '$.size')) as JS2, + json_table(JS1.size, '$' columns (size INT PATH '$.size')) as JS3 where 1; + +create table t1 (json varchar(100) character set utf8); +insert into t1 values ('{"value":"АБВ"}'); +create table tj1 as +select T.value + from t1, json_table(t1.json, '$' columns (value varchar(32) PATH '$.value')) T; +show create table tj1; +drop table t1; +drop table tj1; + +CREATE TABLE t1(id INT, f1 JSON); +INSERT INTO t1 VALUES + (1, '{\"1\": 1}'), + (2, '{\"1\": 2}'), + (3, '{\"1\": 3}'), + (4, '{\"1\": 4}'), + (5, '{\"1\": 5}'), + (6, '{\"1\": 6}'); +ANALYZE TABLE t1; + +--error ER_BAD_FIELD_ERROR +SELECT * FROM JSON_TABLE(tt3.f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl STRAIGHT_JOIN t1 AS tt3; +--error ER_BAD_FIELD_ERROR +SELECT * FROM t1 as jj1, + (SELECT tt2.* + FROM + t1 as tt2, + JSON_TABLE(tt3.f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl + STRAIGHT_JOIN + t1 AS tt3 + ) dt +ORDER BY 1,3 LIMIT 10; + +drop table t1; + +select collation(x) from + JSON_TABLE('["abc"]', '$[*]' COLUMNS (x VARCHAR(10) CHARSET latin1 PATH '$')) tbl; + +SELECT * FROM JSON_TABLE('{"x":1, "y":2}', _utf8mb4'$' COLUMNS (NESTED PATH _utf8mb4'$.x' + COLUMNS(y INT PATH _utf8mb4'$.y' DEFAULT _utf8mb4'1' ON EMPTY DEFAULT _utf8mb4'2' ON ERROR))) jt; + +select * from json_table( +'{"name":"t-shirt", "colors": ["yellow", "blue"],"sizes": ["small", "medium", "large"]}', + '$' columns(name varchar(32) path '$.name', + nested path '$.colors[*]' columns ( + color varchar(32) path '$', + nested path '$.sizes[*]' columns ( + size varchar(32) path '$' +)))) as t; + +SELECT x, length(x) FROM + JSON_TABLE('{}', '$' COLUMNS (x VARCHAR(10) PATH '$.x' DEFAULT 'abcdefg' ON EMPTY)) jt; + +# check how conversion works for JSON NULL, TRUE and FALSE + +select * from + json_table('[{"a":"aa"}, {"b":null}]', '$[*]' + columns (col1 int path '$.b' default '456' on empty)) as tt; + +select * from + json_table('[{"a":"aa"}, {"b":true}]', '$[*]' + columns (col1 int path '$.b' default '456' on empty)) as tt; + +select * from + json_table('[{"a":"aa"}, {"b":false}]', '$[*]' + columns (col1 int path '$.b' default '456' on empty)) as tt; + +select * from + json_table('[{"a":"aa"}, {"b":null}]', '$[*]' + columns (col1 varchar(100) path '$.b' default '456' on empty)) as tt; + +select * from + json_table('[{"a":"aa"}, {"b":true}]', '$[*]' + columns (col1 varchar(100) path '$.b' default '456' on empty)) as tt; + +select * from + json_table('[{"a":"aa"}, {"b":false}]', '$[*]' + columns (col1 varchar(100) path '$.b' default '456' on empty)) as tt; + + +select * from + json_table( '[{"a":"asd"}, {"a":123}, {"a":[]}, {"a":{}} ]', '$[*]' + columns (id for ordinality, + intcol int path '$.a' default '1234' on empty default '5678' on error) + ) as tt; + +SELECT COUNT(*) FROM JSON_TABLE('[1, 2]', '$[*]' COLUMNS( I INT PATH '$')) tt; + +create table t1 (a int); +insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t2 (js json, b int); +insert into t2 select '[1,2,3]',A.a from t1 A, t1 B; + +explain select * from t1, + (select * from t2, json_table(t2.js, '$[*]' columns (o for ordinality)) as jt) as TT2 + where 1; + +drop table t1, t2; + +CREATE TABLE t1 (x INT); +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 (j JSON); +INSERT INTO t2 (j) VALUES ('[1,2,3]'); +--sorted_result +SELECT * FROM t1 RIGHT JOIN + (SELECT o FROM t2, JSON_TABLE(j, '$[*]' COLUMNS (o FOR ORDINALITY)) AS jt) AS t3 ON (t3.o = t1.x); +DROP TABLE t1, t2; + +create table t20 (a int not null); +create table t21 (a int not null primary key, js varchar(100)); +insert into t20 values (1),(2); +insert into t21 values (1, '{"a":100}'); + +explain select t20.a, jt1.ab + from t20 left join t21 on t20.a=t21.a + join JSON_TABLE(t21.js,'$' COLUMNS (ab INT PATH '$.a')) AS jt1; + +drop table t20, t21; + +select * from +json_table( +'[ + {"name": "X", + "colors":["blue"], "sizes": [1,2,3,4], "prices" : [10,20]}, + {"name": "Y", + "colors":["red"], "sizes": [10,11], "prices" : [100,200,300]} +]', +'$[*]' columns +( + seq0 for ordinality, + name varchar(4) path '$.name', + nested path '$.colors[*]' columns ( + seq1 for ordinality, + color text path '$' + ), + nested path '$.sizes[*]' columns ( + seq2 for ordinality, + size int path '$' + ), + nested path '$.prices[*]' columns ( + seq3 for ordinality, + price int path '$' + ) +) +) as T order by seq0, name; + +# MDEV-25140 Success of query execution depends on the outcome of previous queries. +--error ER_JSON_TABLE_ALIAS_REQUIRED +select * from json_table('[]', '$' COLUMNS(x FOR ORDINALITY)); +select min(x) from json_table('[]', '$' COLUMNS(x FOR ORDINALITY)) a; + +--echo # +--echo # Test for the problem with +--echo # - Cross-outer-join dependency +--echo # - dead-end join prefix +--echo # - join order pruning +--echo # + +create table t20 (a int not null); +create table t21 (a int not null primary key, js varchar(100)); + +insert into t20 select seq from seq_1_to_100; +insert into t21 select a, '{"a":100}' from t20; + +create table t31(a int); +create table t32(b int); +insert into t31 values (1); +insert into t32 values (1); + +explain +select + t20.a, jt1.ab +from + t20 + left join t21 on t20.a=t21.a + join + (t31 left join (t32 join JSON_TABLE(t21.js,'$' COLUMNS (ab INT PATH '$.a')) AS jt1) on t31.a<3); + +drop table t20,t21,t31,t32; + +--echo # +--echo # MDEV-25142: JSON_TABLE: CREATE VIEW involving EXISTS PATH ends up with invalid frm +--echo # +--disable_warnings +drop view if exists v1; +--enable_warnings + +CREATE VIEW v1 AS SELECT * FROM JSON_TABLE('[]', '$' COLUMNS (f INT EXISTS PATH '$')) a ; +show create view v1; +drop view v1; + +--echo # +--echo # MDEV-25145: JSON_TABLE: Assertion `fixed == 1' failed in Item_load_file::val_str on 2nd execution of PS +--echo # +PREPARE stmt FROM "SELECT * FROM (SELECT * FROM JSON_TABLE(LOAD_FILE('x'), '$' COLUMNS (a FOR ORDINALITY)) AS t) AS sq"; +EXECUTE stmt; +EXECUTE stmt; + +--echo # +--echo # MDEV-JSON_TABLE: Server crashes in handler::print_error / hton_name upon ERROR ON EMPTY +--echo # +--error ER_JSON_TABLE_ERROR_ON_FIELD +SELECT a, b FROM JSON_TABLE('[]', '$' COLUMNS (a FOR ORDINALITY, b INT PATH '$[*]' ERROR ON EMPTY)) AS t ORDER BY a; + +--echo # +--echo # MDEV-25151 JSON_TABLE: Unexpectedly padded values in a PATH column. +--echo # +SET @old_character_set_connection= @@character_set_connection; +SET @@character_set_connection= utf8; +select hex(a), b from json_table('["foo","bar"]','$[*]' columns (a char(3) path '$', b for ordinality)) t; +SET @@character_set_connection= @old_character_set_connection; + +--echo # +--echo # MDEV-25183 JSON_TABLE: CREATE VIEW involving NESTED PATH ends up with invalid frm +--echo # +CREATE VIEW v AS SELECT * FROM JSON_TABLE('{}', '$' COLUMNS(NESTED PATH '$**.*' COLUMNS(a FOR ORDINALITY), b VARCHAR(8) PATH '$')) AS jt; +SHOW CREATE VIEW v; +SELECT * FROM v; +DROP VIEW v; + +--echo # +--echo # MDEV-25178 JSON_TABLE: ASAN use-after-poison in my_fill_8bit / Json_table_column::On_response::respond +--echo # +SELECT * FROM JSON_TABLE('{}', '$' COLUMNS(a CHAR(100) PATH '$' DEFAULT "0" ON ERROR)) AS jt; + +--echo # +--echo # MDEV-25188 JSON_TABLE: ASAN use-after-poison in Field_long::reset / Table_function_json_table::setup or malloc(): invalid size. +--echo # +SELECT * FROM JSON_TABLE(CONVERT('{"x":1}' USING utf8mb4), '$' COLUMNS(a INT PATH '$', b CHAR(64) PATH '$.*', c INT EXISTS PATH '$**.*')) AS jt; + +--echo # +--echo # 25192 JSON_TABLE: ASAN use-after-poison in field_conv_memcpy / Create_tmp_table::finalize upon query with derived table. +--echo # +SET NAMES utf8; +SELECT * FROM ( SELECT * FROM JSON_TABLE('{}', '$' COLUMNS( a BINARY(12) PATH '$.*', b VARCHAR(40) PATH '$[*]', c VARCHAR(8) PATH '$**.*')) AS jt ) AS sq; +SET NAMES default; + +--echo # +--echo # MDEV-25189 JSON_TABLE: Assertion `l_offset >= 0 && table->s->rec_buff_length - l_offset > 0' failed upon CREATE .. SELECT. +--echo # +SET NAMES utf8; +CREATE TABLE t1 AS SELECT * FROM JSON_TABLE('{}', '$' COLUMNS(a CHAR(16) PATH '$.*', b TIMESTAMP PATH '$**.*')) AS jt; +DROP TABLE t1; +SET NAMES default; + + +--echo # +--echo # MDEV-25230 SON_TABLE: CREATE VIEW with 2nd level NESTED PATH ends up with invalid frm, Assertion `m_status == DA_ERROR || m_status == DA_OK || m_status == DA_OK_BULK' failed. +--echo # + +CREATE VIEW v AS SELECT * FROM JSON_TABLE('{}', '$' COLUMNS(NESTED PATH '$' COLUMNS(NESTED PATH '$.*' COLUMNS(o FOR ORDINALITY)))) AS jt; +SELECT * FROM v; +SHOW CREATE VIEW v; +DROP VIEW v; + +--echo # +--echo # MDEV-25229 JSON_TABLE: Server crashes in hton_name upon MATCH .. AGAINST. +--echo # + +--error ER_TABLE_CANT_HANDLE_FT +SELECT val, MATCH(val) AGAINST( 'MariaDB') FROM JSON_TABLE('{"db":"xx"}', '$' COLUMNS(val VARCHAR(32) PATH '$**.*')) AS jt; + +--echo # +--echo # MDEV-25138 JSON_TABLE: A space between JSON_TABLE and opening bracket causes syntax error +--echo # +select * from json_table ('{}', '$' COLUMNS(x FOR ORDINALITY)) a; +create table json_table(id int); +insert into json_table values (1), (2), (3); +select * from json_table; +drop table json_table; + +--echo # +--echo # MDEV-25146 JSON_TABLE: Non-descriptive + wrong error messages upon trying to store array or object. +--echo # +--error ER_JSON_TABLE_SCALAR_EXPECTED +select a from json_table('[[]]', '$' columns(a char(8) path '$' error on error)) t; +show warnings; + +--echo # +--echo # MDEV-JSON_TABLE: CREATE TABLE ignores NULL ON ERROR (implicit or explicit) and fails. +--echo # +CREATE TABLE t1 AS SELECT * FROM JSON_TABLE('{"x":1}', '$' COLUMNS(f DATE PATH '$.*')) AS jt; +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # MDEV-25254: JSON_TABLE: Inconsistent name resolution with right joins +--echo # +CREATE TABLE t1 (a INT); +--error ER_BAD_FIELD_ERROR +SELECT * FROM t1 RIGHT JOIN JSON_TABLE(t1.a,'$' COLUMNS(o FOR ORDINALITY)) jt ON TRUE; + +--error ER_BAD_FIELD_ERROR +CREATE VIEW v AS +SELECT * FROM t1 RIGHT JOIN JSON_TABLE(t1.a,'$' COLUMNS(o FOR ORDINALITY)) jt ON TRUE; + +insert into t1 values (1),(2),(3); +--error ER_BAD_FIELD_ERROR +SELECT * FROM t1 RIGHT JOIN JSON_TABLE(t1.a,'$' COLUMNS(o FOR ORDINALITY)) jt ON TRUE; + +drop table t1; +--echo # +--echo # MDEV-25202: JSON_TABLE: Early table reference leads to unexpected result set, server crash +--echo # +CREATE TABLE t1 (o INT); +INSERT INTO t1 VALUES (1),(2); + +CREATE TABLE t2 (a INT); +INSERT INTO t2 VALUES (3),(4); + +--error ER_BAD_FIELD_ERROR +SELECT * FROM JSON_TABLE(a, '$' COLUMNS(o FOR ORDINALITY)) AS jt1 NATURAL JOIN t1 JOIN t2; + +--error ER_BAD_FIELD_ERROR +SELECT * FROM JSON_TABLE(a, '$' COLUMNS(o FOR ORDINALITY)) AS jt1 NATURAL JOIN t1 STRAIGHT_JOIN t2; + +drop table t1,t2; + +--echo # Now, try a JSON_TABLE that has a subquery that has an outside reference: + +create table t1(a int, js varchar(32)); + +create table t2(a varchar(100)); +insert into t2 values(''); + +# First, without subquery: +explain +select * +from + t1 left join + json_table(concat('',js), + '$' columns ( color varchar(32) path '$.color') + ) as JT on 1; + +--error ER_BAD_FIELD_ERROR +explain +select * +from + t1 right join + json_table(concat('',js), + '$' columns ( color varchar(32) path '$.color') + ) as JT on 1; + +# Now, with subquery: +explain +select * +from + t1 left join + json_table((select concat(a,js) from t2), + '$' columns ( color varchar(32) path '$.color') + ) as JT on 1; + +--error ER_BAD_FIELD_ERROR +explain +select * +from + t1 right join + json_table((select concat(a,js) from t2), + '$' columns ( color varchar(32) path '$.color') + ) as JT on 1; + +drop table t1,t2; + +--echo # +--echo # Now, a testcase with JSON_TABLEs inside NATURAL JOIN +--echo # + +create table t1 (a int, b int); +create table t2 (a int, c int); + +--error ER_BAD_FIELD_ERROR +select * from + t1, + ( t2 + natural join + ( + json_table(JT2.d, '$' COLUMNS (d for ordinality)) as JT + natural join + json_table(JT.d, '$' COLUMNS (d for ordinality)) as JT2 + ) + ); + +drop table t1, t2; + +--echo # +--echo # MDEV-25352: JSON_TABLE: Inconsistent name resolution and ER_VIEW_INVALID ... +--echo # (Just the testcase) +--echo # + +CREATE TABLE t1 (a INT, b VARCHAR(8)); +INSERT INTO t1 VALUES (1,'{}'),(2,'[]'); + +CREATE TABLE t2 (a INT); +INSERT INTO t2 VALUES (2),(3); + +--error ER_BAD_FIELD_ERROR +SELECT t1.* +FROM + t1 NATURAL JOIN t2 + RIGHT JOIN + JSON_TABLE (t1.b, '$' COLUMNS(o FOR ORDINALITY)) AS jt ON (t1.a = jt.o) +WHERE t1.a = 1; + +--error ER_BAD_FIELD_ERROR +CREATE OR REPLACE VIEW v AS +SELECT t1.* FROM t1 NATURAL JOIN t2 RIGHT JOIN JSON_TABLE (t1.b, '$' COLUMNS(o FOR ORDINALITY)) AS jt ON (t1.a = jt.o) WHERE t1.a = 1; + +drop table t1,t2; + +--echo # +--echo # MDEV-25256: JSON_TABLE: Error ER_VIEW_INVALID upon running query via view +--echo # + +--error ER_BAD_FIELD_ERROR +SELECT * FROM +JSON_TABLE('[]', '$' COLUMNS(a TEXT PATH '$[*]')) AS jt1 + RIGHT JOIN JSON_TABLE(jt1.a, '$' COLUMNS(o2 FOR ORDINALITY)) AS jt2 + ON(1) + RIGHT JOIN JSON_TABLE('[]', '$' COLUMNS(o3 FOR ORDINALITY)) AS jt3 + ON(1) +WHERE 0; + +--echo # +--echo # MDEV-25346: JSON_TABLE: Server crashes in Item_field::fix_outer_field upon subquery with unknown column +--echo # +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (b INT); + +--error ER_BAD_FIELD_ERROR +SELECT * FROM ( SELECT * FROM t1 JOIN t2 ON (b IN(SELECT x FROM (SELECT 1 AS c) AS sq1))) AS sq2; + +DROP TABLE t1, t2; + +--echo # +--echo # Another testcase +--echo # +create table t1 (item_name varchar(32), item_props varchar(1024)); +insert into t1 values ('Jeans', '{"color": ["green", "brown"], "price": 50}'); +insert into t1 values ('Shirt', '{"color": ["blue", "white"], "price": 20}'); +insert into t1 values ('Jeans', '{"color": ["black"], "price": 60}'); +insert into t1 values ('Jeans', '{"color": ["gray"], "price": 60}'); +insert into t1 values ('Laptop', '{"color": ["black"], "price": 1000}'); +insert into t1 values ('Shirt', '{"color": ["black"], "price": 20}'); + +select + t.item_name, + jt.* +from + (select + t1.item_name, + concat( + concat( + concat( + "{\"color\": ", + concat( + concat("[\"", + group_concat( jt.color separator "\", \"") + ), + "\"]") + ),',' + ), + concat(concat("\"price\": ",jt.price),'}') + ) as item_props + from + t1, + json_table( + t1.item_props, + '$' columns ( + nested path '$.color[*]' columns (color varchar(32) path '$'), + price int path '$.price') + ) as jt + group by + t1.item_name, jt.price + ) as t, + + json_table(t.item_props, + '$' columns ( + nested path '$.color[*]' columns (color varchar(32) path '$'), + price int path '$.price') + ) as jt +order by + t.item_name, jt.price, jt.color; + +drop table t1; + +--echo # +--echo # MDEV-25380: JSON_TABLE: Assertion `join->best_read < double(1.797...) fails +--echo # + +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'{}'),(2,'[]'); + +explain +SELECT * +FROM t1 +WHERE + EXISTS(SELECT * + FROM JSON_TABLE(b, '$' COLUMNS(o FOR ORDINALITY)) AS jt + WHERE jt.o = t1.a); + +drop table t1; + +--echo # +--echo # MDEV-25381: JSON_TABLE: ER_WRONG_OUTER_JOIN upon query with LEFT and RIGHT joins and view +--echo # + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); + +CREATE TABLE t2 (b INT, c TEXT); +INSERT INTO t2 VALUES (1,'{}'),(2,'[]'); +CREATE VIEW v2 AS SELECT * FROM t2; + +SELECT * +FROM + t1 RIGHT JOIN + t2 AS tt + LEFT JOIN + JSON_TABLE(tt.c, '$' COLUMNS(o FOR ORDINALITY)) AS jt + ON tt.b = jt.o + ON t1.a = tt.b; + +SELECT * +FROM + t1 RIGHT JOIN + v2 AS tt + LEFT JOIN + JSON_TABLE(tt.c, '$' COLUMNS(o FOR ORDINALITY)) AS jt + ON tt.b = jt.o + ON t1.a = tt.b; + +SELECT * +FROM + t1 RIGHT JOIN + v2 AS tt + LEFT JOIN + JSON_TABLE(CONCAT(tt.c,''), '$' COLUMNS(o FOR ORDINALITY)) AS jt + ON tt.b = jt.o + ON t1.a = tt.b; + +prepare s from +"SELECT * +FROM + t1 RIGHT JOIN + v2 AS tt + LEFT JOIN + JSON_TABLE(CONCAT(tt.c,''), '$' COLUMNS(o FOR ORDINALITY)) AS jt + ON tt.b = jt.o + ON t1.a = tt.b"; +execute s; +execute s; + + +DROP VIEW v2; +DROP TABLE t1, t2; + +--echo # +--echo # MDEV-25259 JSON_TABLE: Illegal mix of collations upon executing query with combination of charsets via view. +--echo # + +CREATE VIEW v AS + SELECT * FROM JSON_TABLE(CONVERT('[]' USING dec8), + '$' COLUMNS(b VARCHAR(8) CHARSET utf8 PATH '$')) AS jt2 + WHERE (CONVERT('[]' USING cp1256) = b); + +SELECT * FROM v; + +DROP VIEW v; + +--echo # +--echo # MDEV-25397: JSON_TABLE: Unexpected ER_MIX_OF_GROUP_FUNC_AND_FIELDS upon query with JOIN +--echo # +set @save_sql_mode= @@sql_mode; +SET sql_mode='ONLY_FULL_GROUP_BY'; +CREATE TABLE t1 (a TEXT); +SELECT SUM(o) FROM t1 JOIN JSON_TABLE(t1.a, '$' COLUMNS(o FOR ORDINALITY)) jt; + +set sql_mode=@save_sql_mode; +drop table t1; + +--echo # +--echo # MDEV-25379 JSON_TABLE: ERROR ON clauses are ignored if a column is not on select list. +--echo # +--error ER_JSON_TABLE_ERROR_ON_FIELD +SELECT * FROM JSON_TABLE ('{}', '$' COLUMNS(a INT PATH '$.*' ERROR ON EMPTY, o FOR ORDINALITY)) AS jt; +--error ER_JSON_TABLE_ERROR_ON_FIELD +SELECT o FROM JSON_TABLE ('{}', '$' COLUMNS(a INT PATH '$.*' ERROR ON EMPTY, o FOR ORDINALITY)) AS jt; +--error ER_JSON_TABLE_ERROR_ON_FIELD +SELECT COUNT(*) FROM JSON_TABLE ('{}', '$' COLUMNS(a INT PATH '$.*' ERROR ON EMPTY, o FOR ORDINALITY)) AS jt; + + +--echo # +--echo # MDEV-25408 JSON_TABLE: AddressSanitizer CHECK failed in Binary_string::realloc_raw. +--echo # +SELECT x, COUNT(*) FROM JSON_TABLE( '{}', '$' COLUMNS( + a BIT(14) PATH '$', b CHAR(16) PATH '$', c INT PATH '$[0]', d INT PATH '$[1]', e INT PATH '$[2]', + f INT PATH '$[3]', g INT PATH '$[4]', h INT PATH '$[5]', i INT PATH '$[6]', j INT PATH '$[7]', + x TEXT PATH '$[9]')) AS jt GROUP BY x; + +--echo # +--echo # MDEV-25408 JSON_TABLE: AddressSanitizer CHECK failed in Binary_string::realloc_raw. +--echo # +SELECT * FROM JSON_TABLE('{}', '$' COLUMNS( + a TEXT EXISTS PATH '$', b VARCHAR(40) PATH '$', c BIT(60) PATH '$', d VARCHAR(60) PATH '$', e BIT(62) PATH '$', + f FOR ORDINALITY, g INT PATH '$', h VARCHAR(36) PATH '$', i DATE PATH '$', j CHAR(4) PATH '$' + )) AS jt; + +--echo # +--echo # MDEV-25373 JSON_TABLE: Illegal mix of collations upon executing PS once, or SP/function twice. +--echo # +SELECT * FROM JSON_TABLE (CONVERT('[1,2]' USING koi8u), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt1 NATURAL JOIN JSON_TABLE (CONVERT('[2,3]' USING eucjpms), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt2; + +PREPARE stmt1 FROM " +SELECT * FROM JSON_TABLE (CONVERT('[1,2]' USING koi8u), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt1 NATURAL JOIN JSON_TABLE (CONVERT('[2,3]' USING eucjpms), '$[*]' COLUMNS(a CHAR(8) PATH '$')) AS jt2; +"; +EXECUTE stmt1; +DEALLOCATE PREPARE stmt1; + +--echo # +--echo # MDEV-25149 JSON_TABLE: Inconsistency in implicit data type conversion. +--echo # +select * from json_table( '[{"a":"asd"}, {"a":123}, {"a":[]}, {"a":{}} ]', '$[*]' + columns ( id for ordinality, + intcol int path '$.a' default '1234' on empty default '5678' on error) + ) as tt; + +--echo # +--echo # MDEV-25377 JSON_TABLE: Wrong value with implicit conversion. +--echo # +select * from json_table('{"a":"foo", "b":1, "c":1000}', '$.*' columns(converted tinyint path '$', original text path '$')) as jt; + +select * from json_table('{"a":"foo", "b":1, "c":1000}', '$.*' columns(converted tinyint path '$', original text path '$')) as jt order by converted; + +select * from json_table('{"a":"foo", "b":1, "c":1000}', '$.*' columns(converted tinyint path '$', original text path '$')) as jt order by original; + +select * from + json_table('[{"color": "blue", "price": { "high": 10, "low": 5}}, + {"color": "white", "price": "pretty low"}, + {"color": "yellow", "price": 256.20}, + {"color": "red", "price": { "high": 20, "low": 8}}]', + '$[*]' columns(color varchar(100) path '$.color', + price json path '$.price' + ) + ) as T; + +--echo # +--echo # MDEV-27696 Json table columns accept redundant COLLATE syntax +--echo # + +--error ER_PARSE_ERROR +SELECT * FROM json_table('[{"name":"str"}]', '$[*]' + COLUMNS ( + name BLOB COLLATE `binary` PATH '$.name' + ) +) AS jt; + + +--error ER_PARSE_ERROR +SELECT * FROM json_table('[{"name":"str"}]', '$[*]' + COLUMNS ( + name VARCHAR(10) COLLATE latin1_bin COLLATE latin1_swedish_ci PATH '$.name' + ) +) AS jt; + + +--error ER_PARSE_ERROR +SELECT * FROM json_table('[{"name":"str"}]', '$[*]' + COLUMNS ( + name VARCHAR(10) BINARY COLLATE utf8_czech_ci path '$.name' + ) +) AS jt; + + +--echo # +--echo # MDEV-27690 Crash on `CHARACTER SET csname COLLATE DEFAULT` in column definition +--echo # + +SELECT * FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( + name VARCHAR(10) CHARACTER SET latin1 COLLATE DEFAULT PATH '$.name' + ) +) AS jt; + + +--echo # +--echo # MDEV-28480: Assertion `0' failed in Item_row::illegal_method_call +--echo # on SELECT FROM JSON_TABLE +--echo # + +--error ER_OPERAND_COLUMNS +SELECT 1 FROM JSON_TABLE (row(1,2), '$' COLUMNS (o FOR ORDINALITY)) AS j; + +--echo # +--echo # End of 10.6 tests +--echo # + +--echo # +--echo # Start of 10.9 tests +--echo # + +--echo # +--echo # MDEV-27743 Remove Lex::charset +--echo # + +SELECT collation(name) +FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( + name VARCHAR(10) PATH '$.name' + ) +) AS jt; + +SELECT collation(name) +FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( + name VARCHAR(10) COLLATE DEFAULT PATH '$.name' + ) +) AS jt; + +SELECT collation(name) +FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( + name VARCHAR(10) BINARY PATH '$.name' + ) +) AS jt; + + +CREATE VIEW v1 AS +SELECT * +FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( + name VARCHAR(10) PATH '$.name' + ) +) AS jt; +SHOW CREATE VIEW v1; +SELECT collation(name) FROM v1; +DROP VIEW v1; + +CREATE VIEW v1 AS +SELECT * +FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( + name VARCHAR(10) COLLATE DEFAULT PATH '$.name' + ) +) AS jt; +SHOW CREATE VIEW v1; +SELECT collation(name) FROM v1; +DROP VIEW v1; + +CREATE VIEW v1 AS +SELECT * +FROM json_table('[{"name":"Jeans"}]', '$[*]' + COLUMNS( + name VARCHAR(10) BINARY PATH '$.name' + ) +) AS jt; +SHOW CREATE VIEW v1; +SELECT collation(name) FROM v1; +DROP VIEW v1; + +--echo # +--echo # MDEV-28319: Assertion `cur_step->type & JSON_PATH_KEY' failed in json_find_path +--echo # + +SELECT * FROM JSON_TABLE('{"foo":{"bar":1},"qux":2}', '$' COLUMNS(c1 VARCHAR(8) PATH '$[0]', c2 CHAR(8) PATH '$.*.x')) AS js; + + +--echo # +--echo # MDEV-29446 Change SHOW CREATE TABLE to display default collations +--echo # + +CREATE VIEW v1 AS +SELECT * FROM +JSON_TABLE('[{"name":"Laptop"}]', '$[*]' +COLUMNS +( + name VARCHAR(10) CHARACTER SET latin1 PATH '$.name') +) AS jt; +SHOW CREATE VIEW v1; +DROP VIEW v1; + +CREATE VIEW v1 AS +SELECT * FROM +JSON_TABLE('[{"name":"Laptop"}]', '$[*]' +COLUMNS +( + name VARCHAR(10) CHARACTER SET utf8mb3 PATH '$.name') +) AS jt; +SHOW CREATE VIEW v1; +DROP VIEW v1; + +CREATE VIEW v1 AS +SELECT * FROM +JSON_TABLE('[{"name":"Laptop"}]', '$[*]' +COLUMNS +( + name VARCHAR(10) CHARACTER SET BINARY PATH '$.name') +) AS jt; +SHOW CREATE VIEW v1; +DROP VIEW v1; + +# ENUM is not supported yet in JSON_TABLE. +# But if it is eventually supported, the below +# test should be modified to make sure that "CHARACTER SET BINARY" +# is not followed by "COLLATE BINARY". +--error ER_PARSE_ERROR +CREATE VIEW v1 AS +SELECT * FROM +JSON_TABLE('[{"name":"Laptop"}]', '$[*]' +COLUMNS +( + name ENUM('Laptop') CHARACTER SET BINARY PATH '$.name') +) AS jt; + +--echo # +--echo # End of 10.9 tests +--echo # diff --git a/mysql-test/suite/json/t/json_table_binlog.test b/mysql-test/suite/json/t/json_table_binlog.test new file mode 100644 index 00000000..dcc05fb8 --- /dev/null +++ b/mysql-test/suite/json/t/json_table_binlog.test @@ -0,0 +1,25 @@ +--source include/have_binlog_format_mixed.inc + +--echo # +--echo # MDEV-25154: JSON_TABLE: Queries involving ordinality columns are unsafe for statement binlog and should be marked as such +--echo # + +create table t1 (a int); + +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +set binlog_format='statement'; +insert into t1 +select * +from json_table('[1,2,3]', '$[*]' columns (a for ordinality)) as T ; + +set binlog_format='mixed'; +let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); +let $binlog_file= LAST; + +insert into t1 +select * +from json_table('[1,2,3]', '$[*]' columns (a for ordinality)) as T ; + +--echo # This must show Annotate_rows, Write_rows_v1 events. Not the statement event +--source include/show_binlog_events.inc +drop table t1; diff --git a/mysql-test/suite/json/t/json_table_mysql.test b/mysql-test/suite/json/t/json_table_mysql.test new file mode 100644 index 00000000..9f77ad96 --- /dev/null +++ b/mysql-test/suite/json/t/json_table_mysql.test @@ -0,0 +1,1493 @@ +# For stable statistics +#--source include/have_innodb_16k.inc +--source include/have_innodb.inc +--echo # +--echo # WL#8867: Add JSON_TABLE table function +--echo # +select * from + json_table( + '[{"a":"3"},{"a":2},{"b":1},{"a":0}]', + '$[*]' columns (id for ordinality, + jpath varchar(100) path '\$.a', + jexst int exists path '\$.b') + ) as tt; + +#--error ER_INVALID_DEFAULT +select * from + json_table( + '[{"x":"3"},{"a":2},{"b":1},{"a":0}]', + '$[*]' columns (id for ordinality, + jpath varchar(100) path '$.a' default '[99]' on error, + jexst int exists path '$.b') + ) as tt; + +select * from + json_table( + '[{"x":"3"},{"a":2},{"b":1},{"a":0},{"a":[1,2]}]', + '$[*]' columns (id for ordinality, + jpath varchar(100) path '$.a' + default '33' on empty + default '66' on error, + jsn_path json path '\$.a' default '{"x":33}' on empty, + jexst int exists path '\$.b') + ) as tt; + +select * from + json_table( + '[{"a":"3"},{"a":2},{"b":1},{"a":0.33},{"a":"asd"}]', + '$[*]' columns (id for ordinality, + jpath_i int path '$.a' + default '33' on empty + default '66' on error, + jpath_r real path '$.a' + default '33.3' on empty + default '77.7' on error, + jsn_path json path '$.a' default '{"x":33}' on empty, + jexst int exists path '$.b') + ) as tt; +#eval $query; +#eval explain $query; + +select * from + json_table( + '[{"x":"3"},{"a":2},{"b":1},{"a":0},{"a":[1,2]}]', + '$[*]' columns (id for ordinality, + jpath varchar(100) path '$.a' + default '33' on empty + default '66' on error, + jsn_path json path '$.a' default '{"x":33}' on empty, + jexst int exists path '$.b') + ) as tt; +#eval $query; +#eval explain $query; + +select * from + json_table( + '[{"a":"3"},{"a":2},{"b":1},{"a":0}]', + '$[*]' columns (id for ordinality, + jpath varchar(100) path '$.a', + json_path json path '$.a', + jexst int exists path '$.b') + ) as tt; + +select * from + json_table( + '[{"a":"3"},{"a":2},{"b":1},{"a":0}]', + '$[*]' columns (id for ordinality, + jpath varchar(100) path '$.a', + json_path json path '$.a', + jexst int exists path '$.b') + ) as tt + where id = 3; +#eval $query; +#eval explain $query; + +--error ER_JSON_TABLE_ERROR_ON_FIELD +select * from + json_table( + '[{"a":"3"},{"a":2},{"b":1},{"a":0}]', + '$[*]' columns (id for ordinality, + jpath varchar(100) path '$.a' error on empty, + jexst int exists path '$.b') + ) as tt; + +--error ER_JSON_TABLE_SCALAR_EXPECTED +select * from + json_table( + '[{"a":"3"},{"a":2},{"a":1},{"a":[0,1]}]', + '$[*]' columns (id for ordinality, + jpath varchar(100) path '$.a' error on error, + jexst int exists path '$.b') + ) as tt; + +--error ER_JSON_SYNTAX +select * from + json_table( + '!#@$!@#$', + '$[*]' columns (id for ordinality, + jpath varchar(100) path '$.a', + jexst int exists path '$.b') + ) as tt; + +--error ER_JSON_SYNTAX +# psergey-done: CRASH1 +--disable_parsing +select * from + json_table( + '[{"a":"3"},{"a":2},{"b":1},{"a":0}]', + "!@#$!@#$" columns (id for ordinality, + jpath varchar(100) path '$.a', + jexst int exists path '$.b') + ) as tt; +--enable_parsing + +--error ER_JSON_SYNTAX +--disable_parsing +select * from + json_table( + '[{"a":"3"},{"a":2},{"b":1},{"a":0}]', + '$[*]' columns (id for ordinality, + jpath varchar(100) path "!@#$!@#$", + jexst int exists path '$.b') + ) as tt; +--enable_parsing + +--error ER_DUP_FIELDNAME +select * from + json_table( + '[{"a":"3"},{"a":2},{"b":1},{"a":0}]', + '$[*]' columns (id for ordinality, + id for ordinality) + ) as tt; + +select * from + json_table( + '[{"a":"3"},{"a":2},{"b":1},{"a":0}]', + '$[*]' columns (id for ordinality, + _id for ordinality) + ) as tt; + +select * from + json_table( + '[ + {"a":"3", "n": { "l": 1}}, + {"a":2, "n": { "l": 1}}, + {"b":1, "n": { "l": 1}}, + {"a":0, "n": { "l": 1}} + ]', + '$[*]' columns ( + id for ordinality, + jpath varchar(100) path '$.a', + jexst int exists path '$.b', + nested path '$.n' columns ( + id_n for ordinality, + jpath_n varchar(50) path '$.l') + ) + ) as tt; + +#eval $query; +#eval explain $query; +explain format=json +select * from + json_table( + '[ + {"a":"3", "n": { "l": 1}}, + {"a":2, "n": { "l": 1}}, + {"b":1, "n": { "l": 1}}, + {"a":0, "n": { "l": 1}} + ]', + '$[*]' columns ( + id for ordinality, + jpath varchar(100) path '$.a', + jexst int exists path '$.b', + nested path '$.n' columns ( + id_n for ordinality, + jpath_n varchar(50) path '$.l') + ) + ) as tt; + +select * from + json_table( + '[ + {"a":2, "n": [{ "l": 1}, {"l": 11}]}, + {"a":1, "n": [{ "l": 2}, {"l": 22}]} + ]', + '$[*]' columns ( + id for ordinality, + jpath varchar(50) path '$.a', + nested path '$.n[*]' columns ( + id_n for ordinality, + jpath_n varchar(50) path '$.l'), + nested path '$.n[*]' columns ( + id_m for ordinality, + jpath_m varchar(50) path '$.l') + ) + ) as tt; + + +select * from json_table( + '[ + {"a":"3", "n": ["b","a","c"]}, + {"a":2, "n": [1,2]}, + {"b":1, "n": ["zzz"]}, + {"a":0, "n": [0.1, 0.02]} + ]', + '$[*]' columns ( + id for ordinality, + jpath varchar(100) path '$.a', + jexst int exists path '$.b', + nested path '$.n[*]' columns ( + id_n for ordinality, + jpath_n varchar(50) path '$') + ) + ) as tt; + +select * from json_table( + '[ + {"a":"3", "n": ["b","a","c"]}, + {"a":2, "n": [1,2]}, + {"b":1, "n": ["zzz"]}, + {"a":0, "n": [0.1, 0.02]} + ]', + '$[*]' columns ( + id for ordinality, + jpath varchar(100) path '$.a', + jexst int exists path '$.b', + nested path '$.n[*]' columns ( + id_n1 for ordinality, + jpath_n1 varchar(50) path '$') , + nested path '$.n[*]' columns ( + id_n2 for ordinality, + jpath_n2 varchar(50) path '$') + ) + ) as tt; + +select * from json_table( + '[ + {"a":"3", "n": [ {"ll":["b1","b2","b3"]}, {"ll": ["a1","a2"]}, + {"ll":["c"]} ]}, + {"a":2, "n": [{"ll":[1,11,111]},{"ll":[2]}]}, + {"b":1, "n": [{"ll":["zzz"]}]}, + {"a":0, "n": [{"ll":[0.1,0.01]}, {"ll":[0.02,0.002,0.0002]}]} + ]', + '$[*]' columns ( + id1 for ordinality, + jpath varchar(100) path '$.a', + jexst int exists path '$.b', + nested path '$.n[*]' columns ( + id2 for ordinality, + nested path '$.ll[*]' columns ( + id3 for ordinality, + jpath_3 varchar(50) path '$') + ), + nested path '$.n[*]' columns ( + id4 for ordinality, + jpath_4 json path '$') + ) + ) as tt; + + +--echo ord should be 1,1,1,2, which tells that first two values of 'l' are +--echo from the same object, and next two are from different objects +SELECT * +FROM JSON_TABLE( + '[{"a": "a_val", + "b": [ + {"c": "c_val", + "l": [1,2]} + ] + }, {"a": "a_val", + "b": [ + {"c": "c_val", + "l": [11]}, + {"c": "c_val", + "l": [22]} + ] + }]', + '$[*]' COLUMNS ( + apath VARCHAR(10) PATH '$.a', + NESTED PATH '$.b[*]' COLUMNS ( + bpath VARCHAR(10) PATH '$.c', + ord FOR ORDINALITY, + NESTED PATH '$.l[*]' COLUMNS ( + lpath varchar(10) PATH '$' + ) + ) + )) as jt; + +CREATE TABLE jt( i JSON ); +SELECT * FROM jt, JSON_TABLE(jt.i, '$' COLUMNS (a INT PATH '$')) AS tt + WHERE a=1; +EXPLAIN SELECT * FROM jt, JSON_TABLE(jt.i, '$' COLUMNS (a INT PATH '$')) AS tt + WHERE a=1; + +SELECT * FROM ( + SELECT * FROM jt, JSON_TABLE(jt.i, '$' COLUMNS (a INT PATH '$')) AS tt + WHERE a=1) AS ttt; +EXPLAIN SELECT * FROM ( + SELECT * FROM jt, JSON_TABLE(jt.i, '$' COLUMNS (a INT PATH '$')) AS tt + WHERE a=1) AS ttt; +DROP TABLE jt; + +--disable_parsing +SELECT * FROM JSON_TABLE(CAST(CAST("11:22:33" AS TIME) AS JSON), + '$' COLUMNS (dt DATE PATH '$')) as tt; +SELECT * FROM JSON_TABLE(CAST(CAST("11:22:33" AS TIME) AS JSON), + '$' COLUMNS (dt TIME PATH '$')) as tt; +SELECT * FROM JSON_TABLE(CAST(CAST("2001.02.03" AS DATE) AS JSON), + '$' COLUMNS (dt DATE PATH '$')) as tt; +--enable_parsing + +CREATE VIEW v AS + SELECT * FROM JSON_TABLE('[1,2,3]', + '$[*]' COLUMNS (num INT PATH '$.a' + DEFAULT '123' ON EMPTY + DEFAULT '456' ON ERROR)) AS jt; +SELECT * FROM v; +SHOW CREATE VIEW v; +DROP VIEW v; + +#--error ER_JSON_TABLE_SCALAR_EXPECTED +SELECT * FROM JSON_TABLE('"asdf"', + '$' COLUMNS (a INT PATH '$' ERROR ON ERROR)) AS jt; +--error ER_JSON_TABLE_MULTIPLE_MATCHES +SELECT * FROM + JSON_TABLE('[{"a":1},{"a":2}]', + '$' COLUMNS (a INT PATH '$[*].a' ERROR ON ERROR)) AS jt; +# psergey-added: +--error ER_JSON_TABLE_MULTIPLE_MATCHES +SELECT * FROM + JSON_TABLE('[{"a":1},{"a":2}]', + '$' COLUMNS (a JSON PATH '$[*].a' ERROR ON ERROR)) AS jt; +#--error ER_JSON_TABLE_SCALAR_EXPECTED +SELECT * FROM + JSON_TABLE('123.456', '$' COLUMNS (a DECIMAL(2,1) PATH '$' ERROR ON ERROR)) AS jt; +SELECT * FROM + JSON_TABLE('123.456', '$' COLUMNS (a DECIMAL(2,1) PATH '$')) AS jt; + +#--error ER_JT_MAX_NESTED_PATH +SELECT * FROM + JSON_TABLE('{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{"a":1,"b":{}}}}}}}}}}}}}}}}}}}', + '$' COLUMNS (i0 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i1 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i2 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i3 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i4 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i5 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i6 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i7 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i8 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i9 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i10 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i11 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i12 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i13 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i14 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i15 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i16 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i17 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i18 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i19 INT PATH '$.a', + NESTED PATH '$.b' COLUMNS (i20 INT PATH '$.a' + )))))))))))))))))))))) jt; + +CREATE TABLE t1(id int, jd JSON); +INSERT INTO t1 values (1, '[1,3,5]'),(2,'[2,4,6]'); +SELECT id, jt.* FROM t1, + JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY, + val INT PATH '$')) AS jt; +SELECT /*+ JOIN_ORDER(jt, t1) */ id, jt.* + FROM t1, + JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY, + val INT PATH '$')) AS jt; + +EXPLAIN SELECT /*+ JOIN_ORDER(jt, t1) */ id, jt.* + FROM t1, + JSON_TABLE(jd, '$[*]' COLUMNS (jid FOR ORDINALITY, + val INT PATH '$')) AS jt; + +--sorted_result +SELECT /*+ JOIN_ORDER(t2,jt) */ t1.id, t2.id, jt.* + FROM t1, + JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY, + val INT PATH '$')) AS jt, + t1 AS t2; + +EXPLAIN SELECT t1.id, t2.id, jt.* + FROM t1, + JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY, + val INT PATH '$')) AS jt, + t1 AS t2; + +EXPLAIN SELECT /*+ JOIN_ORDER(t2,jt) */ t1.id, t2.id, jt.* + FROM t1, + JSON_TABLE(t1.jd, '$[*]' COLUMNS (jid FOR ORDINALITY, + val INT PATH '$')) AS jt, + t1 AS t2; + +SELECT * FROM t1 WHERE id IN + (SELECT * FROM JSON_TABLE('[1,2]', '$[*]' COLUMNS + (id INT PATH '$')) AS jt); +EXPLAIN SELECT * FROM t1 WHERE id IN + (SELECT * FROM JSON_TABLE('[1,2]', '$[*]' COLUMNS + (id INT PATH '$')) AS jt); + +--disable_parsing +(psergey:!) +# JSON_TABLE referring outer scope +SELECT * FROM t1 WHERE id IN + (SELECT * FROM JSON_TABLE(t1.jd, '$[*]' COLUMNS + (id INT PATH '$')) AS jt); +EXPLAIN SELECT * FROM t1 WHERE id IN + (SELECT * FROM JSON_TABLE(t1.jd, '$[*]' COLUMNS + (id INT PATH '$')) AS jt); +--enable_parsing + +# JSON_TABLE referring another JSON_TABLE +--disable_parsing +(psergey:!) +SELECT id, jt1.*, jt2.* + FROM t1, JSON_TABLE(jd, '$' COLUMNS (data1 JSON PATH '$')) AS jt1, + JSON_TABLE(data1, '$[*]' COLUMNS (id2 INT PATH '$')) AS jt2; + +EXPLAIN SELECT id, jt1.*, jt2.* + FROM t1, JSON_TABLE(jd, '$' COLUMNS (data1 JSON PATH '$')) AS jt1, + JSON_TABLE(data1, '$[*]' COLUMNS (id2 INT PATH '$')) AS jt2; +--enable_parsing + +DROP TABLE t1; + + +SELECT * FROM JSON_TABLE('"asdf"', '$' COLUMNS( + tm TIME PATH '$', + dt DATE PATH '$', + i INT PATH '$', + f FLOAT PATH '$', + d DECIMAL PATH '$')) AS jt; + +# DEFAULT NULL is not accepted syntax. +--error ER_PARSE_ERROR +SELECT * FROM + JSON_TABLE('{}', '$' COLUMNS (x INT PATH '$.x' DEFAULT NULL ON EMPTY)) jt; +--error ER_PARSE_ERROR +SELECT * FROM + JSON_TABLE('{}', '$' COLUMNS (x INT PATH '$.x' DEFAULT NULL ON ERROR)) jt; + +SELECT * FROM + JSON_TABLE('{}', '$' COLUMNS (x INT PATH '$.x' DEFAULT 0 ON EMPTY)) jt; +SELECT * FROM + JSON_TABLE('{}', '$' COLUMNS (x INT PATH '$.x' DEFAULT 0 ON ERROR)) jt; +# We don't accept dates in DEFAULT +--error 1064 +SELECT * FROM + JSON_TABLE('{}', '$' COLUMNS (x DATE + PATH '$.x' + DEFAULT DATE'2020-01-01' ON EMPTY)) jt; +--error 1064 +SELECT * FROM + JSON_TABLE('{}', '$' COLUMNS (x DATE + PATH '$.x' + DEFAULT DATE'2020-01-01' ON ERROR)) jt; + +--echo # +--echo # Bug#25413069: SIG11 IN CHECK_COLUMN_GRANT_IN_TABLE_REF +--echo # +--error ER_BAD_FIELD_ERROR +SELECT a FROM JSON_TABLE(abc, '$[*]' COLUMNS ( a int path '$.a')) AS jt; + +--echo # +--echo # Bug#25420680: ASSERTION `THD->IS_ERROR()' FAILED IN SQL/SQL_SELECT.CC +--echo # +SELECT * FROM JSON_TABLE('{"a":"2017-11-1"}', + '$' COLUMNS (jpath DATE PATH '$.a')) AS jt; +--echo # +--echo # Bug#25413826: ASSERTION `TABLE_LIST->ALIAS' FAILED +--echo # +--error ER_JSON_TABLE_ALIAS_REQUIRED +SELECT * FROM JSON_TABLE('[{"a": 1, "b": 2}]', + '$[*]' COLUMNS ( a int path '$.b')); + +--echo # +--echo # Bug#25421464: ASSERTION `!STRCMP(TABLE_REF->TABLE_NAME, ... +--echo # +CREATE VIEW v1 AS + SELECT * FROM JSON_TABLE('[{"a": 1, "b": 2}]', + '$[*]' COLUMNS ( a INT PATH '$.b')) AS jt; +SELECT * FROM v1; +SHOW CREATE VIEW v1; +DROP VIEW v1; + +--echo # +--echo # Bug#25427457: ASSERTION `!((*REG_FIELD)->FLAGS & 16)' +--echo # +SELECT * FROM JSON_TABLE('{"a":"1"}', + '$' COLUMNS (jpath JSON PATH '$.a', + o FOR ORDINALITY)) AS jt +WHERE o = 1; + +--echo # +--echo # Bug#25427982: ASSERTION `DERIVED' FAILED IN SQL/TABLE.H +--echo # +#--error ER_WRONG_FIELD_WITH_GROUP +SELECT je,o FROM JSON_TABLE('{"a":"1"}', + '$' COLUMNS (o FOR ORDINALITY, + je BIGINT EXISTS PATH '$.a')) AS jt +GROUP BY je; +SELECT je,COUNT(o) FROM JSON_TABLE('{"a":"1"}', + '$' COLUMNS (o FOR ORDINALITY, + je BIGINT EXISTS PATH '$.a')) AS jt +GROUP BY je; + +--echo # +--echo # Bug#25413194: ASSERTION `!(WANT_PRIVILEGE & ~(GRANT->WANT_PRIVILEGE +--echo # +CREATE TABLE t1 (j JSON); +SELECT * FROM t1,JSON_TABLE(t1.j, '$[*]' COLUMNS ( a int path '$.b')) AS jt; +DROP TABLE t1; + +--echo # +--echo # Bug#25460537:SIG 11 IN NEXT_FAST AT SQL/SQL_LIST.H +--echo # +PREPARE STMT FROM + "SELECT * FROM JSON_TABLE( + \'[{\"a\":\"3\"},{\"a\":2},{\"b\":1},{\"a\":0}]\', + \'$[*]\' COLUMNS (id + FOR ORDINALITY, + jpath VARCHAR(100) PATH \'$.a\', + jexst INT EXISTS PATH \'$.b\') + ) as tt"; +EXECUTE STMT; +EXECUTE STMT; +DEALLOCATE PREPARE stmt; + +--echo # +--echo # Bug#25522353: SIG 11 IN JOIN::MAKE_JOIN_PLAN | SQL/SQL_OPTIMIZER.CC +--echo # +CREATE TABLE t1 (id INT, jc JSON); + +# psergey! +#--error ER_UNKNOWN_TABLE +--error ER_BAD_FIELD_ERROR +SELECT * FROM t1 RIGHT JOIN JSON_TABLE(t1.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt ON t1.jc=jt.id; + +# psergey! +#--error ER_UNKNOWN_TABLE +--error ER_BAD_FIELD_ERROR +SELECT * FROM JSON_TABLE(t1.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt LEFT JOIN t1 ON t1.jc=jt.id; + +#--error ER_UNKNOWN_TABLE +SELECT * FROM JSON_TABLE(t1.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt RIGHT JOIN t1 ON t1.jc=jt.id; + +SELECT * FROM t1 LEFT JOIN JSON_TABLE(t1.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt ON t1.jc=jt.id; + +EXPLAIN SELECT * FROM t1 LEFT JOIN JSON_TABLE(t1.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt ON t1.jc=jt.id; + +SELECT * FROM t1 t1o RIGHT JOIN t1 ON t1o.id=t1.id + LEFT JOIN JSON_TABLE(t1.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt ON t1.jc=jt.id; + +EXPLAIN SELECT * FROM t1 t1o RIGHT JOIN t1 ON t1o.id=t1.id + LEFT JOIN JSON_TABLE(t1.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt ON t1.jc=jt.id; + +# Error code can be ER_UNKNOWN_TABLE or ER_BAD_FIELD_ERROR +# (see find_field_in_tables()), both are acceptable. + +# psergey: +#--error ER_BAD_FIELD_ERROR +--error ER_BAD_FIELD_ERROR +SELECT * FROM t1 AS t1o RIGHT JOIN + (t1 AS t1i JOIN JSON_TABLE(t1o.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt ON t1i.jc=jt.id) + ON t1o.id=t1i.id; + +# psergey: +#--error ER_UNKNOWN_TABLE +--error ER_BAD_FIELD_ERROR +SELECT * FROM t1 AS t1o RIGHT JOIN + (t1 AS t1i RIGHT JOIN JSON_TABLE(t1o.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt ON t1i.jc=jt.id) + ON t1o.id=t1i.id; + +# psergey: +#--error ER_UNKNOWN_TABLE +--error ER_BAD_FIELD_ERROR +WITH qn AS + (SELECT jt.* FROM t1 RIGHT JOIN JSON_TABLE(t1.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt ON t1.jc=jt.id) + SELECT * from qn; + +#--error ER_UNKNOWN_TABLE +--error ER_BAD_FIELD_ERROR +WITH qn AS + (SELECT 1 UNION + SELECT jt.id FROM t1 RIGHT JOIN JSON_TABLE(t1.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt ON t1.jc=jt.id) + SELECT * from qn; + +#--error ER_BAD_FIELD_ERROR +--error ER_BAD_FIELD_ERROR +SELECT * FROM t1 AS t1o RIGHT JOIN + (t1 AS t1i JOIN JSON_TABLE(t1o.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt ON t1i.jc=jt.id) + ON t1o.id=t1i.id; + +#--error ER_UNKNOWN_TABLE +--error ER_BAD_FIELD_ERROR +SELECT * FROM t1 AS t1o RIGHT JOIN + (t1 AS t1i RIGHT JOIN JSON_TABLE(t1o.jc, '$' COLUMNS + (id FOR ORDINALITY)) as jt ON t1i.jc=jt.id) + ON t1o.id=t1i.id; + +INSERT INTO t1 VALUES(1,"1"),(2,"4"),(3,"3"); + +ANALYZE TABLE t1; + +SELECT * FROM t1 LEFT JOIN JSON_TABLE(t1.jc, '$' COLUMNS + (id INT PATH '$')) as jt ON t1.id=jt.id; + +EXPLAIN SELECT * FROM t1 LEFT JOIN JSON_TABLE(t1.jc, '$' COLUMNS + (id INT PATH '$')) as jt ON t1.id=jt.id; + +--error ER_BAD_FIELD_ERROR +SELECT * FROM t1 + LEFT JOIN + JSON_TABLE(t1.jc, '$' COLUMNS (id FOR ORDINALITY)) as jt ON t1.jc=jt.id + RIGHT JOIN + JSON_TABLE(jt.id, '$' COLUMNS (id FOR ORDINALITY)) as jt1 ON jt.id=jt1.id; + +DROP TABLE t1; + +--echo # +--echo # Bug#25525409: ASSERTION `TABLE_LIST->TABLE' FAILED IN SQL/SQL_BASE.CC +--echo # +--error ER_BAD_FIELD_ERROR +SELECT * FROM JSON_TABLE( ( SELECT a ) , '$.*' COLUMNS (col1 FOR ORDINALITY) ) +AS alias1; + +SELECT * FROM JSON_TABLE( ( SELECT 1 ) , '$.*' COLUMNS (col1 FOR ORDINALITY) ) +AS alias1; + +# psergey: check this +--error ER_INVALID_GROUP_FUNC_USE +SELECT * FROM JSON_TABLE( ( SUM(1) ) , '$.*' COLUMNS (col1 FOR ORDINALITY) ) +AS alias1; + +--echo # +--echo # Bug# #25472875: ERROR SHOULD BE THROWN FOR INCORRECT VALUES +--echo # +#--error ER_JT_VALUE_OUT_OF_RANGE +SELECT * + FROM JSON_TABLE('{"a":"1993-01-01"}', + '$' COLUMNS (jp DATE PATH '$.b' DEFAULT '1000' ON EMPTY)) + AS jt; + +--echo # +--echo # Bug#25532429: INVALID JSON ERROR NOT THROWN WITH EMPTY TABLES JOIN +--echo # +CREATE TABLE t1(j JSON); +#--error ER_INVALID_JSON_TEXT_IN_PARAM +SELECT * FROM t1, + JSON_TABLE( 'dqwfjqjf' , '$[*]' COLUMNS (col5 FOR ORDINALITY) ) AS alias7; +DROP TABLE t1; + + +--echo # +--echo # Bug#25540370: SIG 11 IN SHOW_SQL_TYPE|SQL/SQL_SHOW.CC:7063 +--echo # + SELECT * FROM + JSON_TABLE('[3.14159]', + '$[*]' COLUMNS (col18 CHAR(70) PATH '$') + ) AS alias2; + +--echo # Too short field causes truncation, error and triggers ON ERROR clause + SELECT * FROM + JSON_TABLE('["3.14159"]', + '$[*]' COLUMNS (col18 CHAR(6) PATH '$') + ) AS alias2; + +--echo #Truncated space doesn't trigger ON ERROR + SELECT * FROM + JSON_TABLE('["3.14159 "]', + '$[*]' COLUMNS (col18 CHAR(7) PATH '$') + ) AS alias2; +SELECT * FROM + JSON_TABLE('[3.14159]', + '$[*]' COLUMNS (col18 CHAR(255) PATH '$') + ) AS alias2; + + SELECT * FROM + JSON_TABLE('[3.14159]', + '$[*]' COLUMNS (col18 VARCHAR(70) PATH '$') + ) AS alias2; + + SELECT * FROM + JSON_TABLE('[3.14159]', + '$[*]' COLUMNS (col18 VARCHAR(255) PATH '$') + ) AS alias2; + + SELECT * FROM + JSON_TABLE('[3.14159]', + '$[*]' COLUMNS (col18 FLOAT PATH '$') + ) AS alias2; + + SELECT * FROM + JSON_TABLE('[3.14159]', + '$[*]' COLUMNS (col18 DOUBLE PATH '$') + ) AS alias2; + + SELECT * FROM + JSON_TABLE('[3.14159]', + '$[*]' COLUMNS (col18 DECIMAL(3,3) PATH '$') + ) AS alias2; + +#--error ER_JT_VALUE_OUT_OF_RANGE +# --error ER_JSON_TABLE_SCALAR_EXPECTED +SELECT * FROM + JSON_TABLE('[3.14159]', + '$[*]' COLUMNS (col18 DECIMAL(3,3) PATH '$' ERROR ON ERROR) + ) AS alias2; + + SELECT * FROM + JSON_TABLE('[0.9]', + '$[*]' COLUMNS (col18 DECIMAL(3,3) PATH '$') + ) AS alias2; + +SELECT * FROM + JSON_TABLE('["asdf","ghjk"]', + '$[*]' COLUMNS (col18 DECIMAL(4,3) PATH '$' + DEFAULT "3.14159" ON ERROR) + ) AS alias2; + +CREATE TABLE t1(jd JSON); +INSERT INTO t1 VALUES('["asdf"]'),('["ghjk"]'); +SELECT * FROM t1, + JSON_TABLE(jd, + '$[*]' COLUMNS (col18 DECIMAL(4,3) PATH '$' + DEFAULT "3.14159" ON ERROR) + ) AS alias2; +DROP TABLE t1; +--echo # +--echo # Bug#25540027: SIG 11 IN FIND_FIELD_IN_TABLE | SQL/SQL_BASE.CC +--echo # +CREATE TABLE t1(c1 JSON); +--error ER_NON_UPDATABLE_TABLE +UPDATE t1, JSON_TABLE(t1.c1,'$[*]' COLUMNS (a INT PATH '$.a')) AS jt1 + SET jt1.a=1; +--error ER_PARSE_ERROR +DELETE JSON_TABLE(t1.c1,'$[*]' COLUMNS (a INT PATH '$.a')) AS jt1 + FROM t1; +--error ER_PARSE_ERROR +DELETE t1, JSON_TABLE(t1.c1,'$[*]' COLUMNS (a INT PATH '$.a')) AS jt1 + USING t1; + +DROP TABLE t1; + +--echo # +--echo # Bug#25547244: ASSERTION `!TABLE || (!TABLE->READ_SET || BITMAP_IS_SET( +--echo # +CREATE TABLE t1(i INT); +INSERT INTO t1 VALUES(1); +--disable_parsing +# Crash #3 (not reproducible anymore?) +WITH cte_query AS + (SELECT * FROM t1, JSON_TABLE( JSON_OBJECT('ISSKF',i) , + '$[*]' COLUMNS (jtcol1 INT EXISTS PATH '$[*]') ) AS alias2) +SELECT jtcol1 AS field1 FROM cte_query; +--enable_parsing + +DROP TABLE t1; + +--echo # +--echo # Bug#25540675: ASSERTION `!COL->CHILD_JDS->PRODUCING_RECORDS' FAILED +--echo # +CREATE TABLE j1(j JSON); +INSERT INTO j1 VALUES('[1,2,3]'),('[1,2,4]'); +SELECT * FROM j1, + JSON_TABLE( JSON_OBJECT('key1', j) , + '$.*' COLUMNS (NESTED PATH '$.*' COLUMNS (col11 FOR ORDINALITY))) AS alias2; +DROP TABLE j1; + +--echo # +--echo # Bug#25584335: SIG 11 IN TABLE_LIST::FETCH_NUMBER_OF_ROWS +--echo # +CREATE TABLE t1(i INT); + +PREPARE stmt FROM "SELECT alias1.i AS field1 FROM ( + t1 AS alias1, + (SELECT * FROM + JSON_TABLE('[1,2,3]' , + '$[*]' COLUMNS (`col_varchar` FOR ORDINALITY)) AS SQ1_alias1 + ) AS alias2 )"; + +EXECUTE stmt; +DEALLOCATE PREPARE stmt; +DROP TABLE t1; + +--echo # +--echo # Bug#25604048: COLUMN NAMES WITH SAME 33-CHAR PREFIX ARE EQUAL +--echo # +SELECT * FROM JSON_TABLE( '{"key1": "test"}' , '$' COLUMNS( + column_name_is_thirty_four_or_more VARCHAR(17) PATH '$.key1', + column_name_is_thirty_four_or_more_yes_indeed VARCHAR(17) PATH '$.key1' +) ) AS alias1; + +#--error ER_WRONG_COLUMN_NAME +SELECT * FROM JSON_TABLE( '{"key1": "test"}' , '$' COLUMNS( + `column_name_is_thirty_four_or_more ` VARCHAR(17) PATH '$.key1' +) ) AS alias1; + +--echo # +--echo # Bug#25604404: JSON_TABLE MORE RESTRICTIVE WITH IDENTIFIERS THAN +--echo # CREATE TABLE +--echo # +SELECT * FROM JSON_TABLE( '[1, 2]', '$' COLUMNS( + one INT PATH '$[0]', two INT PATH '$[1]' +)) AS jt; + +--echo # +--echo # Bug#25588450: SIG 6 IN JSON_WRAPPER::SEEK|SQL/JSON_DOM.CC +--echo # +CREATE TABLE t1(c VARCHAR(10)) ENGINE=MEMORY; +INSERT INTO t1 VALUES('fiheife'); +#--error ER_INVALID_JSON_TEXT_IN_PARAM +--error ER_JSON_SYNTAX +SELECT * FROM `t1` AS alias1, JSON_TABLE( `c` , '$[*]' COLUMNS (jtcol1 JSON +PATH '$.*')) AS alias2 WHERE jtcol1 <= 'kjfh'; +DROP TABLE t1; + +--echo # +--echo # Bug#25587754: ASSERTION `FIXED == 0 || BASIC_CONST_ITEM()' FAILED +--echo # +PREPARE stmt FROM + "SELECT * FROM JSON_TABLE( '[1,2]', '$[*]' + COLUMNS (jtcol1 JSON PATH '$.*')) AS alias2"; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +--echo # +--echo # Bug#25584593: UNABLE TO USE JSON_TABLE() ON TEXT/BLOB JSON DATA +--echo # +SELECT * FROM JSON_TABLE(NULL, '$.k' COLUMNS (id FOR ORDINALITY)) AS aLias; +SELECT * FROM JSON_TABLE(@myjson, '$.k' COLUMNS (id FOR ORDINALITY)) AS alias; +SET @myjson = '{"k": 42}'; +SELECT * FROM JSON_TABLE(@myjson, '$.k' COLUMNS (id FOR ORDINALITY)) AS alias; + +CREATE TABLE t1( + txt TEXT, ty TINYTEXT, tm MEDIUMTEXT, tl LONGTEXT); +INSERT INTO t1 values ( + '{"k": "text"}','{"k": "tinytext"}','{"k": "mediumtext"}','{"k": "longtext"}'); +SELECT alias.* FROM t1, JSON_TABLE(t1.txt,'$.k' COLUMNS (id VARCHAR(10) PATH '$')) AS alias; +SELECT alias.* FROM t1, JSON_TABLE(t1.ty, '$.k' COLUMNS (id VARCHAR(10) PATH '$')) AS alias; +SELECT alias.* FROM t1, JSON_TABLE(t1.tm, '$.k' COLUMNS (id VARCHAR(10) PATH '$')) AS alias; +SELECT alias.* FROM t1, JSON_TABLE(t1.tl, '$.k' COLUMNS (id VARCHAR(10) PATH '$')) AS alias; +SELECT alias.* FROM t1, JSON_TABLE(t1.txt,'$.k' COLUMNS (id TEXT PATH '$')) AS alias; +SELECT alias.* FROM t1, JSON_TABLE(t1.txt,'$.k' COLUMNS (id TINYTEXT PATH '$')) AS alias; +SELECT alias.* FROM t1, JSON_TABLE(t1.txt,'$.k' COLUMNS (id MEDIUMTEXT PATH '$')) AS alias; +SELECT alias.* FROM t1, JSON_TABLE(t1.txt,'$.k' COLUMNS (id LONGTEXT PATH '$')) AS alias; + +# BLOB can store data from JSON +SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb BLOB PATH '$')) as alias; +# Check that type is printed correctly +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb BLOB PATH '$')) as alias; +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb TINYBLOB PATH '$')) as alias; +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb MEDIUMBLOB PATH '$')) as alias; +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb LONGBLOB PATH '$')) as alias; +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb TEXT PATH '$')) as alias; +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb TINYTEXT PATH '$')) as alias; +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb MEDIUMTEXT PATH '$')) as alias; +EXPLAIN SELECT alias.* FROM JSON_TABLE('"asd123"', '$' COLUMNS (blb LONGTEXT PATH '$')) as alias; +# But can't be used as a data source +#--error ER_WRONG_ARGUMENTS +--error ER_PARSE_ERROR +SELECT * FROM + (SELECT CAST(blb AS JSON) jf FROM + JSON_TABLE('"asd123"', '$' COLUMNS (blb BLOB PATH '$')) AS jti) AS dt, + JSON_TABLE(jf, '$' COLUMNS (blb BLOB PATH '$')) AS jto; +DROP TABLE t1; + +--echo # +--echo # Bug#26500384: ASSERT FAILURE IN QUERY WITH WINDOW FUNCTION AND +--echo # JSON_TABLE +--echo # +CREATE TABLE t (x INT); +INSERT INTO t VALUES (1), (2), (3); +--error ER_BAD_FIELD_ERROR +SELECT MAX(t.x) OVER () m, jt.* FROM t, + JSON_TABLE(JSON_ARRAY(m), '$[*]' COLUMNS (i INT PATH '$')) jt; +DROP TABLE t; + +--echo # +--echo # Bug#26583283: ASSERTION `!THD->IS_ERROR()' FAILED IN SQL_RESOLVER.CC +--echo # +EXPLAIN SELECT * FROM JSON_TABLE('null', '$' COLUMNS(AA DECIMAL PATH '$')) tt; + +CREATE VIEW v1 AS SELECT * FROM + JSON_TABLE( 'null', '$' COLUMNS (c1 DECIMAL PATH '$' ) ) AS jt; +SELECT * FROM v1; +EXPLAIN SELECT * FROM v1; +DROP VIEW v1; + +--echo # +--echo # Bug#25822408: ASSERTION `!COL->CHILD_JDS->PRODUCING_RECORDS' FAILED +--echo # +PREPARE stmt FROM "SELECT * FROM + JSON_TABLE('{\"a\":1}','$' COLUMNS (c1 CHAR(20) PATH '$.b' ERROR ON EMPTY)) jt"; +--error ER_JSON_TABLE_ERROR_ON_FIELD +EXECUTE stmt; +--error ER_JSON_TABLE_ERROR_ON_FIELD +EXECUTE stmt; + +--echo # +--echo # Bug#25594571: CRASH AT ITEM::CONST_ITEM|SQL/ITEM.H +--echo # +CREATE TABLE t1 (i INT); + +INSERT INTO t1 VALUES(1),(2),(3),(4),(5),(6),(7); + +PREPARE stmt FROM "SELECT * FROM t1 AS alias1 LEFT JOIN t1 AS alias2 +LEFT JOIN JSON_TABLE('[1,2,3]', '$[*]' COLUMNS (i FOR ORDINALITY )) AS +alias3 ON alias2 . `i` = alias3 . `i` ON alias1 . `i` = alias2 . `i`"; + +EXECUTE stmt; +EXECUTE stmt; + +DROP TABLE t1; + +--echo # +--echo # Bug#26648617: ASSERTION `IS_VIEW_OR_DERIVED() && +--echo # USES_MATERIALIZATION()' FAILED. +--echo # +CREATE TABLE t1 ( + col_varchar_key varchar(1) DEFAULT NULL +) ENGINE=InnoDB; + +INSERT INTO t1 VALUES(1),(4); + +SELECT * FROM t1 WHERE col_varchar_key NOT IN ( + SELECT col_varchar_key FROM JSON_TABLE( + '[{"col_key": 1},{"col_key": 2}]', "$[*]" COLUMNS + (col_varchar_key VARCHAR(10) PATH "$.col_key")) AS innr1); + +EXPLAIN SELECT * FROM t1 WHERE col_varchar_key NOT IN ( + SELECT col_varchar_key FROM JSON_TABLE( + '[{"col_key": 1},{"col_key": 2}]', "$[*]" COLUMNS + (col_varchar_key VARCHAR(10) PATH "$.col_key")) AS innr1); + +SELECT * FROM t1 WHERE col_varchar_key IN ( + SELECT col_varchar_key FROM JSON_TABLE( + '[{"col_key": 1},{"col_key": 2}]', "$[*]" COLUMNS + (col_varchar_key VARCHAR(10) PATH "$.col_key")) AS innr1); + +EXPLAIN SELECT * FROM t1 WHERE col_varchar_key IN ( + SELECT col_varchar_key FROM JSON_TABLE( + '[{"col_key": 1},{"col_key": 2}]', "$[*]" COLUMNS + (col_varchar_key VARCHAR(10) PATH "$.col_key")) AS innr1); + +DROP TABLE t1; + +--echo # +--echo # Bug#26711551: WL8867:CONDITIONAL JUMP IN JSON_TABLE_COLUMN::CLEANUP +--echo # +CREATE TABLE t(x int, y int); +INSERT INTO t(x) VALUES (1); +UPDATE t t1, JSON_TABLE('[2]', '$[*]' COLUMNS (x INT PATH '$')) t2 +SET t1.y = t2.x; +SELECT * FROM t; +DROP TABLE t; + +--echo # +--echo # Bug#26679671: SIG 11 IN JSON_BINARY::PARSE_BINARY() +--echo # +CREATE TABLE t1(id INT, f1 JSON); +INSERT INTO t1 VALUES (1, '{\"1\": 1}'), (2, '{\"1\": 2}'), (3, '{\"1\": 3}'), +(4, '{\"1\": 4}'), (5, '{\"1\": 5}'), (6, '{\"1\": 6}'); +ANALYZE TABLE t1; + +ANALYZE TABLE t1; + +--sorted_result +SELECT * FROM t1 as jj1, + (SELECT tt2.* FROM t1 as tt2, + JSON_TABLE(f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl) dt; +EXPLAIN SELECT * FROM t1 as jj1, + (SELECT tt2.* FROM t1 as tt2, + JSON_TABLE(f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl) dt; + +# psergey:name resolution +# HF --error ER_NON_UNIQ_ERROR +SELECT * FROM t1 as jj1, + (SELECT tt2.* FROM t1 as tt2, + JSON_TABLE(f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl STRAIGHT_JOIN + t1 AS tt3) dt ORDER BY 1,3 LIMIT 10; +# psergey:name resolution +# HF --error ER_NON_UNIQ_ERROR +EXPLAIN SELECT * FROM t1 as jj1, + (SELECT tt2.* FROM t1 as tt2, + JSON_TABLE(f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl STRAIGHT_JOIN + t1 AS tt3) dt ORDER BY 1,3 LIMIT 11; + +SELECT * FROM t1 WHERE id IN + (SELECT id FROM t1 as tt2, + JSON_TABLE(f1, "$" COLUMNS (jf FOR ORDINALITY)) AS tbl); +EXPLAIN SELECT * FROM t1 WHERE id IN + (SELECT id FROM t1 as tt2, + JSON_TABLE(f1, "$" COLUMNS (jf FOR ORDINALITY)) AS tbl); + +DROP TABLE t1; + +--echo # +--echo # Bug#26760811: WL#8867: MEMORY LEAK REPORTED BY ASAN AND VALGRIND +--echo # +CREATE TABLE t (j JSON); +INSERT INTO t VALUES +('[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]'), +('[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]'); +SELECT COUNT(*) FROM t, JSON_TABLE(j, '$[*]' COLUMNS (i INT PATH '$')) AS jt; +PREPARE ps FROM +'SELECT COUNT(*) FROM t, JSON_TABLE(j, ''$[*]'' COLUMNS (i INT PATH ''$'')) AS jt'; +EXECUTE ps; +EXECUTE ps; +DROP PREPARE ps; +DROP TABLE t; + +--echo # +--echo # Bug #26781759: NON-UNIQUE ALIAS ERROR NOT BEING THROWN +--echo # +--error ER_NONUNIQ_TABLE +SELECT * FROM JSON_TABLE(NULL, '$' COLUMNS(j1 FOR ORDINALITY)) AS jalias, +JSON_TABLE(NULL, '$' COLUMNS(j1 FOR ORDINALITY)) AS jalias; + +# --echo # +# --echo # Bug #26761470: WL#8867: JOIN::MAKE_JOIN_PLAN(): +# --echo # ASSERTION `SELECT_LEX->IS_RECURSIVE()' FAILED +# --echo # +# CREATE TABLE t1 (x INT); +# INSERT INTO t1 VALUES (1); +# CREATE TABLE t2 (j JSON); +# INSERT INTO t2 (j) VALUES ('[1,2,3]'); +# --sorted_result +# # psergey:name resolution +# --error ER_WRONG_OUTER_JOIN +# SELECT * FROM t1 RIGHT JOIN +# (SELECT o FROM t2, JSON_TABLE(j, '$[*]' COLUMNS (o FOR ORDINALITY)) AS jt) AS t3 +# ON (t3.o = t1.x); +# DROP TABLE t1, t2; + +--echo # +--echo # Bug#27152428 JSON_TABLE + PREPARED STATEMENT + VIEW HAS PROBLEM IN DURING RESOLUTION +--echo # + +CREATE TABLE t1 (a INT, b INT); + +CREATE VIEW v2 AS SELECT * FROM t1 LIMIT 2; + +--disable_parsing +# psergey-done: crash in name resolution: +SELECT b + FROM (SELECT * FROM v2) vq1, + JSON_TABLE(CONCAT(vq1.b,'[{\"a\":\"3\"}]'), + '$[*]' COLUMNS (id FOR ORDINALITY, + jpath VARCHAR(100) PATH '$.a', + JEXST INT EXISTS PATH '$.b') + ) AS dt; +--enable_parsing + +DROP TABLE t1; +DROP VIEW v2; + + +--echo # +--echo # Bug#27189940: CREATE VIEW FAILS ON JSON_TABLE() IN SCHEMA-LESS CONNECTIONS +--echo # BUG#27217897: JSON_TABLE() FAILS IF NO DATABASE SELECTED +--echo # + + +# Connect without a schema name: +connect (conn1,localhost,root,,*NO-ONE*); +connection conn1; + +CREATE VIEW test.v AS SELECT * FROM JSON_TABLE('[1,2,3]', '$[*]' COLUMNS (num INT PATH '$[0]')) AS jt; +SELECT * FROM JSON_TABLE('[1,2,3]', '$[*]' COLUMNS (num INT PATH '$[0]')) AS jt; + +connection default; +disconnect conn1; +use test; + +SHOW CREATE VIEW test.v; +SELECT * FROM test.v; +DROP VIEW test.v; + +--echo # +--echo # Bug#27729112 JSON_TABLE SHOULD DECODE BASE64-ENCODED STRINGS +--echo # +SELECT v +FROM JSON_TABLE(JSON_OBJECT('foo', _binary'bar'), '$' + COLUMNS(v VARCHAR(255) PATH '$.foo')) tbl; + +--disable_parsing +# not supported +CREATE TABLE t1 (col1 VARCHAR(255) CHARACTER SET ucs2, + col2 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE + utf8mb4_unicode_cs); +INSERT INTO t1 VALUES ("æ", "ハ"), ("å", "ø"), ("ø", "パ"), ("@", "バ"); + +ANALYZE TABLE t1 UPDATE HISTOGRAM ON col1, col2; +SELECT v value, c cumulfreq +FROM INFORMATION_SCHEMA.COLUMN_STATISTICS, + JSON_TABLE(histogram->'$.buckets', '$[*]' + COLUMNS(v VARCHAR(255) CHARACTER SET ucs2 PATH '$[0]', + c double PATH '$[1]')) hist +WHERE column_name = "col1"; +SELECT v value, c cumulfreq +FROM INFORMATION_SCHEMA.COLUMN_STATISTICS, + JSON_TABLE(histogram->'$.buckets', '$[*]' + COLUMNS(v VARCHAR(255) CHARACTER SET utf8mb4 PATH '$[0]', + c double PATH '$[1]')) hist +WHERE column_name = "col2"; +DROP TABLE t1; + +--enable_parsing +--echo # +--echo # Bug#28254268: JSON_TABLE() FUNCTION REJECTS SELECT PERMISSIONS +--echo # +CREATE DATABASE db2; +USE db2; +CREATE TABLE t1 (c JSON); +INSERT INTO t1 VALUES('[1,2,3]'); + +CREATE USER user1@localhost; +GRANT SELECT ON db2.t1 TO user1@localhost; + +connect (conn1,localhost,user1,,); +connection conn1; +USE db2; +SELECT t1.c FROM t1; +SELECT jt.* FROM t1, JSON_TABLE(t1.c, '$[*]' COLUMNS (num INT PATH '$[0]')) +AS jt; + +disconnect conn1; +connection default; + +DROP USER user1@localhost; +DROP DATABASE db2; + +--echo # +--echo # Bug#27856835 JSON_TABLE RETURNS WRONG DATATYPE WHEN INT-VALUE IS GRATER +--echo # THAN (2^31-1) +--echo # +SELECT id FROM JSON_TABLE('[{"id":"9223372036854775807"}]', '$[*]' COLUMNS +(id BIGINT PATH '$.id')) AS json; + +--echo # As we currently have no way of telling if a JSON string value is +--echo # signed or unsigned, this value will overflow. +SELECT id FROM JSON_TABLE('[{"id":"9223372036854775808"}]', '$[*]' COLUMNS +(id BIGINT PATH '$.id')) AS json; + +--echo # Here the JSON value is a NUMERIC value, and we thus know if the value +--echo # is signed or unsigned. +SELECT id FROM JSON_TABLE('[{"id":9223372036854775808}]', '$[*]' COLUMNS +(id BIGINT PATH '$.id')) AS json; + +--echo # If we tell the JSON table column to be unsigned, we get to store the +--echo # full value correctly. +SELECT id FROM JSON_TABLE('[{"id":"9223372036854775808"}]', '$[*]' COLUMNS +(id BIGINT UNSIGNED PATH '$.id')) AS json; + +SELECT id FROM JSON_TABLE('[{"id":"2147483648"}]', '$[*]' COLUMNS +(id INT UNSIGNED PATH '$.id')) AS json; + +--echo # Check that we preserve the signedness of the columns. +USE test; +CREATE TABLE t1 AS SELECT id, value FROM + JSON_TABLE('[{"id":9223372036854775808, "value":9223372036854775807}]', + '$[*]' COLUMNS (id BIGINT UNSIGNED PATH '$.id', + value BIGINT PATH '$.value')) + AS json; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo # +--echo # Bug#28255453: VIEW USING JSON_TABLE FAILS IF NO SCHEMA IS SELECTED +--echo # +connect (conn1,localhost,root,,*NO-ONE*); +CREATE VIEW test.v AS SELECT * FROM JSON_TABLE('[1,2,3]', '$[*]' COLUMNS (num INT PATH '$[0]')) AS jt; +SELECT * FROM test.v; +DROP VIEW test.v; + +--echo # Check that a user with access to the schema 'foo' can do a SELECT with +--echo # a JSON_TABLE function. +CREATE SCHEMA foo; +CREATE USER foo@localhost; +GRANT EXECUTE ON foo.* TO foo@localhost; +connect (con1,localhost,foo,,foo); +SELECT 1 FROM JSON_TABLE('[1,2,3]', '$[*]' COLUMNS (num INT PATH '$.a')) AS jt; +connection default; +disconnect con1; +DROP USER foo@localhost; +DROP SCHEMA foo; + +--echo # +--echo # Bug#27923406 ERROR 1142 (42000) WHEN USING JSON_TABLE +--echo # +CREATE SCHEMA my_schema; + +CREATE USER foo@localhost; +GRANT EXECUTE ON my_schema.* TO foo@localhost; +connect (con1,localhost,foo,,my_schema); + +SELECT + * +FROM + JSON_TABLE( + '[{"x":2,"y":"8"},{"x":"3","y":"7"},{"x":"4","y":6}]', + "$[*]" COLUMNS( + xval VARCHAR(100) PATH "$.x", + yval VARCHAR(100) PATH "$.y" + ) + ) AS jt1; + +connection default; +disconnect con1; +DROP USER foo@localhost; +DROP SCHEMA my_schema; + +--echo # +--echo # Bug#28538315: JSON_TABLE() COLUMN TYPES DON'T SUPPORT COLLATE CLAUSE +--echo # + +CREATE TABLE t1 SELECT * + FROM JSON_TABLE('"test"', '$' COLUMNS(x VARCHAR(10) + CHARSET utf8mb4 + PATH '$')) AS jt1; +SHOW CREATE TABLE t1; + +--disable_parsing +CREATE TABLE t2 SELECT * + FROM JSON_TABLE('"test"', '$' COLUMNS(x VARCHAR(10) + CHARSET utf8mb4 COLLATE utf8mb4_bin + PATH '$')) AS jt1; +SHOW CREATE TABLE t2; + +CREATE TABLE t3 AS SELECT * + FROM JSON_TABLE('"a"', '$' COLUMNS (a VARCHAR(10) + COLLATE ascii_bin + PATH '$')) jt; +SHOW CREATE TABLE t3; +--enable_parsing + +DROP TABLE t1; + +--echo # +--echo # Bug#28643862 JSON_TABLE'S "COLUMNS" CLAUSE USES +--echo # GLOBAL.CHARACTER_SET_RESULTS DEFAULT CHARSET +--echo # + +SET @@SESSION.character_set_connection = ascii; + +CREATE TABLE t1 SELECT a.col + FROM JSON_TABLE('"test"', '$' COLUMNS(col VARCHAR(10) PATH '$')) AS a; + +SHOW CREATE TABLE t1; + +SET @@SESSION.collation_connection = latin1_bin; + +CREATE TABLE t2 SELECT a.col + FROM JSON_TABLE('"test"', '$' COLUMNS(col VARCHAR(10) PATH '$')) AS a; + +SHOW CREATE TABLE t2; + +DROP TABLE t1, t2; + +SET @@SESSION.character_set_connection = DEFAULT; + +--echo # +--echo # Bug#28851656: JSON_TABLE RETURN "UNKNOWN DATABASE ''" FROM A FUNCTION +--echo # +CREATE FUNCTION FN_COUNT_ROWS(X JSON) +RETURNS INT DETERMINISTIC + RETURN ( + SELECT COUNT(*) FROM JSON_TABLE( X, '$[*]' COLUMNS( I INT PATH '$')) der + ); + +SELECT FN_COUNT_ROWS('[1, 2]') CNT; +SELECT FN_COUNT_ROWS('[1, 2, 3]') CNT; +SELECT FN_COUNT_ROWS('[1, 2, 3, 4]') CNT; + +DROP FUNCTION FN_COUNT_ROWS; + +--echo # +--echo # Bug#30310265: VIEWS LOSE THE CHARACTER SET OF JSON_TABLE'S +--echo # PATH ARGUMENTS +--echo # + +CREATE VIEW v1 AS + SELECT * FROM JSON_TABLE('{"å":{"å":1}}', '$.å' COLUMNS (x INT PATH '$.å')) t; +SELECT * FROM v1; +SET NAMES latin1; +# Used to return zero rows. +SELECT * FROM v1; +SET NAMES DEFAULT; +DROP VIEW v1; + +CREATE VIEW v2 AS + SELECT * FROM JSON_TABLE('{}', '$' COLUMNS ( + x VARCHAR(10) PATH '$.a' DEFAULT '"isn''t here"' ON EMPTY) + ) t; +# SHOW CREATE VIEW and SELECT from the view used to fail with a syntax error. +--disable_parsing +# psergey-done +SHOW CREATE VIEW v2; + +SELECT * FROM v2; +--enable_parsing +DROP VIEW v2; + +# The string literals in JSON_TABLE didn't accept character set +# introducers. Verify that they are accepted now. +--disable_parsing +# psergey: it's a bug! +SELECT * FROM + JSON_TABLE(JSON_OBJECT(), + _utf8mb4'$' COLUMNS (NESTED PATH _utf8mb4'$.x' COLUMNS + (y INT PATH _utf8mb4'$.y' + DEFAULT _utf8mb4'1' ON EMPTY + DEFAULT _utf8mb4'2' ON ERROR))) jt; +--enable_parsing + +--echo # +--echo # Bug#30382156: STORED PROCEDURE, JSON_TABLE AND "CONST" JOIN TYPE +--echo # +CREATE TABLE t (id INT PRIMARY KEY, j JSON); +INSERT INTO t VALUES (1, '{"x":1}'); +CREATE PROCEDURE p() + SELECT * FROM t, JSON_TABLE(j, '$' COLUMNS (x INT PATH '$.x')) jt + WHERE id = 1; +CALL p(); +CALL p(); +CALL p(); +DROP PROCEDURE p; +DROP TABLE t; + +--echo # +--echo # WL#13512: Deprecate ON ERROR before ON EMPTY in JSON_TABLE syntax +--echo # +SELECT * FROM + JSON_TABLE('{}', '$' COLUMNS (x VARCHAR(10) PATH '$.x' + DEFAULT '"a"' ON ERROR DEFAULT '"b"' ON EMPTY)) jt; +SELECT * FROM + JSON_TABLE('{}', '$' COLUMNS (x VARCHAR(10) PATH '$.x' + NULL ON ERROR NULL ON EMPTY)) jt; +SELECT * FROM + JSON_TABLE('{"x":"c"}', '$' COLUMNS (x VARCHAR(10) PATH '$.x' + ERROR ON ERROR ERROR ON EMPTY)) jt; +--echo # +--echo # Bug#30628330: INSERT WITH JSON_TABLE FAILS DUE TO WARNING INVOKED +--echo # WITH ON ERROR CLAUSE +--echo # +CREATE TABLE t(id INT, a TINYINT, b VARCHAR(3), c DATE, d DECIMAL); +# This statement used to fail with "data too long". +INSERT INTO t SELECT * FROM + JSON_TABLE(JSON_ARRAY(JSON_OBJECT('a', 1, 'b', 'abc'), + JSON_OBJECT('a', 2, 'b', 'abcd'), + JSON_OBJECT('a', 1000, 'b', 'xyz'), + JSON_OBJECT('c', TIME'12:00:00', 'd', 1e308)), + '$[*]' COLUMNS (id FOR ORDINALITY, + a TINYINT PATH '$.a' DEFAULT '111' ON ERROR, + b VARCHAR(3) PATH '$.b' DEFAULT '"ERR"' ON ERROR, + c DATE PATH '$.c' DEFAULT '"2001-01-01"' ON ERROR, + d DECIMAL PATH '$.c' DEFAULT '999' ON ERROR) + ) AS jt; +SELECT * FROM t ORDER BY id; +DROP TABLE t; + +--echo # +--echo # Bug#30263373: INCORRECT OUTPUT FROM TABLE_FUNCTION_JSON::PRINT() +--echo # + +CREATE VIEW v AS SELECT * FROM + JSON_TABLE('[123]', '$[*]' COLUMNS (`name with space 1` INT PATH '$', + `name with space 2` FOR ORDINALITY)) jt; +# Used to fail with a syntax error, due to unquoted column names in +# the view definition. +SELECT * FROM v; +DROP VIEW v; + +CREATE VIEW v AS SELECT HEX(x), HEX(y) FROM + JSON_TABLE('["abc"]', '$[*]' COLUMNS (x BINARY(10) PATH '$', + y VARBINARY(10) PATH '$')) jt; +# Used to say CHAR(10) and VARCHAR(10) instead of BINARY(10) and VARBINARY(10). +SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS + WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v'; +SELECT * FROM v; +DROP VIEW v; + +CREATE VIEW v AS SELECT * FROM + JSON_TABLE('[123]', '$[*]' COLUMNS(ti TINYINT PATH '$', + si SMALLINT PATH '$', + mi MEDIUMINT PATH '$', + i INT PATH '$', + bi BIGINT PATH '$', + tiu TINYINT UNSIGNED PATH '$', + siu SMALLINT UNSIGNED PATH '$', + miu MEDIUMINT UNSIGNED PATH '$', + iu INT UNSIGNED PATH '$', + biu BIGINT UNSIGNED PATH '$')) jt; +# Used to lack the UNSIGNED attribute for the unsigned columns. +SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS + WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v'; +SELECT * FROM v; +DROP VIEW v; + +--disable_parsing +CREATE VIEW v AS SELECT * FROM + JSON_TABLE('[]', '$[*]' COLUMNS (g GEOMETRY PATH '$', + ls LINESTRING PATH '$')) AS jt; +# Used to say GEOMETRY for both columns. +SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS + WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v'; +SELECT * FROM v; +DROP VIEW v; +--enable_parsing + +--disable_parsing +CREATE VIEW v AS SELECT * FROM + JSON_TABLE('["abc"]', '$[*]' COLUMNS + (x VARCHAR(10) CHARSET latin1 PATH '$', + y VARCHAR(10) COLLATE utf8mb4_de_pb_0900_ai_ci PATH '$', + z LONGTEXT COLLATE utf8mb4_bin PATH '$')) jt; +# Character set and collation information wasn't included. +SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS + WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v'; +# Used to return the default collation instead of the collation +# specified in the JSON_TABLE column definitions. +SELECT x, y, z, COLLATION(x) c_x, COLLATION(y) c_y, COLLATION(z) c_z FROM v; +DROP VIEW v; +--enable_parsing + +--echo # +--echo # Bug#31345503 JSON_TABLE SHOULD RETURN SQL NULL FOR JSON NULL +--echo # + +SELECT * +FROM +JSON_TABLE( +'[ + {"c1": null, + "c2": [{"c": "c_val", "l": [1,2]}], + "c3": null}, + {"c1": true, + "c2": [{"c": "c_val","l": [11]}, {"c": "c_val", "l": [false]}], + "c3": true}, + {"c1": false, + "c2": [{"c": null,"l": [true]}, {"c": "c_val", "l": [null]}], + "c3": false} + ]', + '$[*]' COLUMNS( + top_ord FOR ORDINALITY, + c1path VARCHAR(10) PATH '$.c1' ERROR ON ERROR, + NESTED PATH '$.c2[*]' COLUMNS ( + c2path VARCHAR(10) PATH '$.c' ERROR ON ERROR, + ord FOR ORDINALITY, + NESTED PATH '$.l[*]' COLUMNS (lpath_c VARCHAR(10) PATH '$' ERROR ON ERROR, + lpath_i INT PATH '$' ERROR ON ERROR) + ), + c3path INT PATH '$.c3' ERROR ON ERROR + ) +) as jt; + +--echo # +--echo # Bug #31327187 UBSAN: JSON_TABLE: NULL POINTER PASSED AS ARGUMENT 2, +--echo # WHICH IS DECLARED TO NEVER BE NULL +--echo # + +SELECT HEX(a) FROM JSON_TABLE( + '[{"E":{"e":true,"~":1,"S3":"sTa"},"r":3,"":6.7},"",6.5]', + '$' + COLUMNS(a BINARY(5) PATH '$[1]' NULL ON EMPTY) +) e; diff --git a/mysql-test/suite/json/t/json_table_notembedded.test b/mysql-test/suite/json/t/json_table_notembedded.test new file mode 100644 index 00000000..32bc0422 --- /dev/null +++ b/mysql-test/suite/json/t/json_table_notembedded.test @@ -0,0 +1,30 @@ +source include/not_embedded.inc; + +# +# MDEV-22302 JSON_TABLE: Column privilege is insufficient for query with json_table +# + +create database db; +use db; +create table t (a text); +insert into t values ('{"foo":"bar"}'); +create user u@localhost; +grant select (a) on db.t to u@localhost; + +--connect (con1,localhost,u,,db) +select a from t; +select * from t, json_table(t.a, '$' columns(f varchar(20) path '$.foo')) as jt; + +# +# MDEV-25141 JSON_TABLE: SELECT into outfile bypasses file privilege check +# +--error ER_ACCESS_DENIED_ERROR +select * into outfile 'f' from json_table('[]', '$' columns(x for ordinality)) q; + +connection default; +disconnect con1; + +drop user u@localhost; +drop database db; + +use test; diff --git a/mysql-test/suite/json/t/rpl_json_char.test b/mysql-test/suite/json/t/rpl_json_char.test new file mode 100644 index 00000000..51ad345a --- /dev/null +++ b/mysql-test/suite/json/t/rpl_json_char.test @@ -0,0 +1,27 @@ +--source include/master-slave.inc + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-27018 IF and COALESCE lose "json" property +--echo # + +CREATE TABLE t1 (a CHAR(100) CHECK(JSON_VALID(a))); + +--sync_slave_with_master + +--connection master +INSERT INTO t1 VALUES (JSON_OBJECT('a','b')); +--sync_slave_with_master +SELECT * FROM t1 ORDER BY a; + +--connection master +DROP TABLE t1; + +--echo # +--echo # End of 10.5 tests +--echo # + +--source include/rpl_end.inc diff --git a/mysql-test/suite/json/t/rpl_json_longtext.test b/mysql-test/suite/json/t/rpl_json_longtext.test new file mode 100644 index 00000000..01558344 --- /dev/null +++ b/mysql-test/suite/json/t/rpl_json_longtext.test @@ -0,0 +1,27 @@ +--source include/master-slave.inc + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-27018 IF and COALESCE lose "json" property +--echo # + +CREATE TABLE t1 (a LONGTEXT CHECK(JSON_VALID(a))); + +--sync_slave_with_master + +--connection master +INSERT INTO t1 VALUES (JSON_OBJECT('a','b')); +--sync_slave_with_master +SELECT * FROM t1 ORDER BY a; + +--connection master +DROP TABLE t1; + +--echo # +--echo # End of 10.5 tests +--echo # + +--source include/rpl_end.inc diff --git a/mysql-test/suite/json/t/rpl_json_mediumtext.test b/mysql-test/suite/json/t/rpl_json_mediumtext.test new file mode 100644 index 00000000..f4a52a19 --- /dev/null +++ b/mysql-test/suite/json/t/rpl_json_mediumtext.test @@ -0,0 +1,27 @@ +--source include/master-slave.inc + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-27018 IF and COALESCE lose "json" property +--echo # + +CREATE TABLE t1 (a MEDIUMTEXT CHECK(JSON_VALID(a))); + +--sync_slave_with_master + +--connection master +INSERT INTO t1 VALUES (JSON_OBJECT('a','b')); +--sync_slave_with_master +SELECT * FROM t1 ORDER BY a; + +--connection master +DROP TABLE t1; + +--echo # +--echo # End of 10.5 tests +--echo # + +--source include/rpl_end.inc diff --git a/mysql-test/suite/json/t/rpl_json_text.test b/mysql-test/suite/json/t/rpl_json_text.test new file mode 100644 index 00000000..7c7def76 --- /dev/null +++ b/mysql-test/suite/json/t/rpl_json_text.test @@ -0,0 +1,27 @@ +--source include/master-slave.inc + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-27018 IF and COALESCE lose "json" property +--echo # + +CREATE TABLE t1 (a TEXT CHECK(JSON_VALID(a))); + +--sync_slave_with_master + +--connection master +INSERT INTO t1 VALUES (JSON_OBJECT('a','b')); +--sync_slave_with_master +SELECT * FROM t1 ORDER BY a; + +--connection master +DROP TABLE t1; + +--echo # +--echo # End of 10.5 tests +--echo # + +--source include/rpl_end.inc diff --git a/mysql-test/suite/json/t/rpl_json_tinytext.test b/mysql-test/suite/json/t/rpl_json_tinytext.test new file mode 100644 index 00000000..99a7c8c8 --- /dev/null +++ b/mysql-test/suite/json/t/rpl_json_tinytext.test @@ -0,0 +1,27 @@ +--source include/master-slave.inc + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-27018 IF and COALESCE lose "json" property +--echo # + +CREATE TABLE t1 (a TINYTEXT CHECK(JSON_VALID(a))); + +--sync_slave_with_master + +--connection master +INSERT INTO t1 VALUES (JSON_OBJECT('a','b')); +--sync_slave_with_master +SELECT * FROM t1 ORDER BY a; + +--connection master +DROP TABLE t1; + +--echo # +--echo # End of 10.5 tests +--echo # + +--source include/rpl_end.inc diff --git a/mysql-test/suite/json/t/rpl_json_varchar.test b/mysql-test/suite/json/t/rpl_json_varchar.test new file mode 100644 index 00000000..9464f670 --- /dev/null +++ b/mysql-test/suite/json/t/rpl_json_varchar.test @@ -0,0 +1,27 @@ +--source include/master-slave.inc + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-27018 IF and COALESCE lose "json" property +--echo # + +CREATE TABLE t1 (a VARCHAR(100) CHECK(JSON_VALID(a))); + +--sync_slave_with_master + +--connection master +INSERT INTO t1 VALUES (JSON_OBJECT('a','b')); +--sync_slave_with_master +SELECT * FROM t1 ORDER BY a; + +--connection master +DROP TABLE t1; + +--echo # +--echo # End of 10.5 tests +--echo # + +--source include/rpl_end.inc diff --git a/mysql-test/suite/json/t/type_json.test b/mysql-test/suite/json/t/type_json.test new file mode 100644 index 00000000..f84bef78 --- /dev/null +++ b/mysql-test/suite/json/t/type_json.test @@ -0,0 +1,143 @@ +--echo # +--echo # Start of 10.5 tests +--echo # + + +--echo # +--echo # MDEV-27361 Hybrid functions with JSON arguments do not send format metadata +--echo # + +# Mix all columns in the given table tbl to each other and calculate expr. + +DELIMITER $$; +CREATE PROCEDURE p1(tbl TEXT, expr TEXT) +BEGIN + DECLARE t1cols INT DEFAULT (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME=tbl AND TABLE_SCHEMA='test'); + FOR a IN 0..(t1cols-1) DO + FOR b IN 0..(t1cols-1) DO + BEGIN + DECLARE query TEXT DEFAULT CONCAT('SELECT ', expr, ' FROM ', tbl); + SET query= REPLACE(query, 'olt1', a); + SET query= REPLACE(query, 'olt2', b); + EXECUTE IMMEDIATE query; + END; + END FOR; + END FOR; +END; +$$ +DELIMITER ;$$ + + +# Mix all columns in table t1 to all columns in table t2 and calculate expr + +DELIMITER $$; +CREATE PROCEDURE p2(expr TEXT) +BEGIN + DECLARE t1cols INT DEFAULT (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'); + DECLARE t2cols INT DEFAULT (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME='t2' AND TABLE_SCHEMA='test'); + FOR a IN 0..(t1cols-1) DO + FOR b IN 0..(t2cols-1) DO + BEGIN + DECLARE query TEXT DEFAULT CONCAT('SELECT ', expr, ' FROM t1, t2'); + SET query= REPLACE(query, 'olt1', a); + SET query= REPLACE(query, 'olt2', b); + EXECUTE IMMEDIATE query; + END; + END FOR; + END FOR; +END; +$$ +DELIMITER ;$$ + + + +CREATE TABLE t1 +( + c0 CHAR(30) DEFAULT '1' CHECK(JSON_VALID(c0)), + c1 VARCHAR(30) DEFAULT '1' CHECK(JSON_VALID(c1)), + c2 TINYTEXT DEFAULT '1' CHECK(JSON_VALID(c2)), + c3 TEXT DEFAULT '1' CHECK(JSON_VALID(c3)), + c4 MEDIUMTEXT DEFAULT '1' CHECK(JSON_VALID(c4)), + c5 LONGTEXT DEFAULT '1' CHECK(JSON_VALID(c5)), +# The below data types do not have any special JSON properties. +# Just checking CHECK(JSON_VALID()) does not give any unexpected surprises. + c6 INT DEFAULT '1' CHECK(JSON_VALID(c6)), + c7 ENUM('1') DEFAULT '1' CHECK(JSON_VALID(c7)) +); +INSERT INTO t1 VALUES (); + + +CREATE TABLE t1c +( + c0 CHAR(30) DEFAULT '1' CHECK(JSON_VALID(c0)), + c1 VARCHAR(30) COMPRESSED DEFAULT '1' CHECK(JSON_VALID(c1)), + c2 TINYTEXT COMPRESSED DEFAULT '1' CHECK(JSON_VALID(c2)), + c3 TEXT COMPRESSED DEFAULT '1' CHECK(JSON_VALID(c3)), + c4 MEDIUMTEXT COMPRESSED DEFAULT '1' CHECK(JSON_VALID(c4)), + c5 LONGTEXT COMPRESSED DEFAULT '1' CHECK(JSON_VALID(c5)), +# The below data types do not have any special JSON properties. +# Just checking CHECK(JSON_VALID()) does not give any unexpected surprises. + c6 INT DEFAULT '1' CHECK(JSON_VALID(c6)), + c7 ENUM('1') DEFAULT '1' CHECK(JSON_VALID(c7)) +); +INSERT INTO t1c VALUES (); + + + +CREATE TABLE t2 +( + c0 CHAR(30) DEFAULT '1', + c1 VARCHAR(30) DEFAULT '1', + c2 TINYTEXT DEFAULT '1', + c3 TEXT DEFAULT '1', + c4 MEDIUMTEXT DEFAULT '1', + c5 LONGTEXT DEFAULT '1', + c6 INT DEFAULT 1, + c7 DOUBLE DEFAULT 1, + c8 DECIMAL(10,2) DEFAULT 1.23, + c9 TIME DEFAULT '10:20:30', + c10 DATE DEFAULT '2001-01-01', + c11 DATETIME DEFAULT '2001-01-01 10:20:30', + c12 ENUM('1','2') DEFAULT '1' +); +INSERT INTO t2 VALUES (); + + +--disable_ps_protocol +--enable_metadata +CALL p1('t1', 'COALESCE(colt1, colt2)'); +CALL p1('t1', 'LEAST(colt1, colt2)'); +CALL p1('t1', 'colt1+colt2'); +--disable_metadata +--disable_ps_protocol + + +--disable_ps_protocol +--enable_metadata +CALL p1('t1c', 'COALESCE(colt1, colt2)'); +CALL p1('t1c', 'LEAST(colt1, colt2)'); +CALL p1('t1c', 'colt1+colt2'); +--disable_metadata +--disable_ps_protocol + + +--disable_ps_protocol +--enable_metadata +CALL p2('COALESCE(t1.colt1, t2.colt2)'); +CALL p2('LEAST(t1.colt1, t2.colt2)'); +CALL p2('t1.colt1+t2.colt2'); +--disable_metadata +--disable_ps_protocol + + +DROP PROCEDURE p1; +DROP PROCEDURE p2; + +DROP TABLE t1, t1c, t2; + +--echo # +--echo # End of 10.5 tests +--echo # |