summaryrefslogtreecommitdiffstats
path: root/mysql-test/suite/json
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 12:24:36 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 12:24:36 +0000
commit06eaf7232e9a920468c0f8d74dcf2fe8b555501c (patch)
treee2c7b5777f728320e5b5542b6213fd3591ba51e2 /mysql-test/suite/json
parentInitial commit. (diff)
downloadmariadb-06eaf7232e9a920468c0f8d74dcf2fe8b555501c.tar.xz
mariadb-06eaf7232e9a920468c0f8d74dcf2fe8b555501c.zip
Adding upstream version 1:10.11.6.upstream/1%10.11.6
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'mysql-test/suite/json')
-rw-r--r--mysql-test/suite/json/r/json_no_table.result3614
-rw-r--r--mysql-test/suite/json/r/json_table.result1145
-rw-r--r--mysql-test/suite/json/r/json_table_binlog.result26
-rw-r--r--mysql-test/suite/json/r/json_table_mysql.result1666
-rw-r--r--mysql-test/suite/json/r/json_table_notembedded.result20
-rw-r--r--mysql-test/suite/json/r/rpl_json_char.result22
-rw-r--r--mysql-test/suite/json/r/rpl_json_longtext.result22
-rw-r--r--mysql-test/suite/json/r/rpl_json_mediumtext.result22
-rw-r--r--mysql-test/suite/json/r/rpl_json_text.result22
-rw-r--r--mysql-test/suite/json/r/rpl_json_tinytext.result22
-rw-r--r--mysql-test/suite/json/r/rpl_json_varchar.result22
-rw-r--r--mysql-test/suite/json/r/type_json.result2884
-rw-r--r--mysql-test/suite/json/t/json_no_table.test2288
-rw-r--r--mysql-test/suite/json/t/json_table.test997
-rw-r--r--mysql-test/suite/json/t/json_table_binlog.test25
-rw-r--r--mysql-test/suite/json/t/json_table_mysql.test1493
-rw-r--r--mysql-test/suite/json/t/json_table_notembedded.test30
-rw-r--r--mysql-test/suite/json/t/rpl_json_char.test27
-rw-r--r--mysql-test/suite/json/t/rpl_json_longtext.test27
-rw-r--r--mysql-test/suite/json/t/rpl_json_mediumtext.test27
-rw-r--r--mysql-test/suite/json/t/rpl_json_text.test27
-rw-r--r--mysql-test/suite/json/t/rpl_json_tinytext.test27
-rw-r--r--mysql-test/suite/json/t/rpl_json_varchar.test27
-rw-r--r--mysql-test/suite/json/t/type_json.test143
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 #