@@ -5263,4 +5263,199 @@ SET @obj1='{ "a": 1,"b": 2,"c": 3}';
52635263SELECT JSON_OBJECT_FILTER_KEYS (@obj1,@arr1);
52645264JSON_OBJECT_FILTER_KEYS (@obj1,@arr1)
52655265NULL
5266+ #
5267+ # MDEV-37072: Implement IS JSON predicate
5268+ #
5269+ set names utf8mb4;
5270+ SELECT '[1, 2]' IS JSON;
5271+ '[1, 2]' IS JSON
5272+ 1
5273+ SELECT '{"key1":1, "key2":[2,3]}' IS JSON;
5274+ '{"key1":1, "key2":[2,3]}' IS JSON
5275+ 1
5276+ SELECT '123' IS JSON;
5277+ '123' IS JSON
5278+ 1
5279+ SELECT 'null' IS JSON;
5280+ 'null' IS JSON
5281+ 1
5282+ SELECT 'invalid' IS JSON;
5283+ 'invalid' IS JSON
5284+ 0
5285+ SELECT '{"key1":1, "key2":[2,3]' IS JSON;
5286+ '{"key1":1, "key2":[2,3]' IS JSON
5287+ 0
5288+ SELECT '[1, 2' IS JSON;
5289+ '[1, 2' IS JSON
5290+ 0
5291+ SELECT 'NULL' IS JSON;
5292+ 'NULL' IS JSON
5293+ 0
5294+ SELECT 'invalid' IS NOT JSON;
5295+ 'invalid' IS NOT JSON
5296+ 1
5297+ SELECT '{"key1":1, "key2":[2,3]' IS NOT JSON;
5298+ '{"key1":1, "key2":[2,3]' IS NOT JSON
5299+ 1
5300+ SELECT '[1, 2]' IS NOT JSON;
5301+ '[1, 2]' IS NOT JSON
5302+ 0
5303+ SELECT '{"key1":1, "key2":[2,3]}' IS NOT JSON;
5304+ '{"key1":1, "key2":[2,3]}' IS NOT JSON
5305+ 0
5306+ # Type constraints
5307+ SELECT js,
5308+ js IS JSON "json?",
5309+ js IS JSON VALUE "value?",
5310+ js IS JSON SCALAR "scalar?",
5311+ js IS JSON OBJECT "object?",
5312+ js IS JSON ARRAY "array?"
5313+ FROM (VALUES
5314+ ('123'), ('"string"'), ('{"key":1}'), ('[1,2,3]'), ('[]'), ('{}'),
5315+ ('true'), ('false'), ('null')) foo(js);
5316+ js json? value? scalar? object? array?
5317+ 123 1 1 1 0 0
5318+ "string" 1 1 1 0 0
5319+ {"key":1} 1 1 0 1 0
5320+ [1,2,3] 1 1 0 0 1
5321+ [] 1 1 0 0 1
5322+ {} 1 1 0 1 0
5323+ true 1 1 1 0 0
5324+ false 1 1 1 0 0
5325+ null 1 1 1 0 0
5326+ # UNIQUE KEYS constraint
5327+ SELECT js,
5328+ js IS JSON OBJECT WITH UNIQUE KEYS "object_with_unique",
5329+ js IS JSON OBJECT WITHOUT UNIQUE KEYS "object_without_unique",
5330+ js IS JSON ARRAY WITH UNIQUE KEYS "array_with_unique",
5331+ js IS JSON ARRAY WITHOUT UNIQUE KEYS "array_without_unique"
5332+ FROM (VALUES
5333+ ('{"a":1, "b":2, "c":3}'),
5334+ ('{"a":1, "a":2, "a":3}'),
5335+ ('[{"a":"1"},{"c":"2","c":"3"}]'),
5336+ ('[{"a":"1"},{"b":"2","c":"3"}]'),
5337+ ('[1,2,3]'), ('[1,1,1]'), ('[]'), ('123'),
5338+ ('"string"'), ('true'), ('null')) foo(js);
5339+ js object_with_unique object_without_unique array_with_unique array_without_unique
5340+ {"a":1, "b":2, "c":3} 1 1 0 0
5341+ {"a":1, "a":2, "a":3} 0 1 0 0
5342+ [{"a":"1"},{"c":"2","c":"3"}] 0 0 0 1
5343+ [{"a":"1"},{"b":"2","c":"3"}] 0 0 1 1
5344+ [1,2,3] 0 0 1 1
5345+ [1,1,1] 0 0 1 1
5346+ [] 0 0 1 1
5347+ 123 0 0 0 0
5348+ "string" 0 0 0 0
5349+ true 0 0 0 0
5350+ null 0 0 0 0
5351+ # Test with table data
5352+ CREATE TABLE test_json (
5353+ json_col JSON,
5354+ text_col TEXT
5355+ );
5356+ INSERT INTO test_json VALUES
5357+ ('{"name":"Alice", "age":25}', '{"name":"Alice", "age":25}'),
5358+ ('[1,2,3]', '[1,2,3]'),
5359+ ('42', '42'),
5360+ ('"hello"', '"hello"'),
5361+ ('true', 'true'),
5362+ ('null', 'null'),
5363+ ('"invalid"', 'invalid'),
5364+ ('{"key1":1, "key2":2}', '{"key1":1, "key2":2}'),
5365+ ('{"key1":1, "key1":2}', '{"key1":1, "key1":2}');
5366+ SELECT
5367+ json_col,
5368+ json_col IS JSON as is_json,
5369+ json_col IS JSON VALUE as is_value,
5370+ json_col IS JSON SCALAR as is_scalar,
5371+ json_col IS JSON OBJECT as is_object,
5372+ json_col IS JSON ARRAY as is_array,
5373+ json_col IS JSON OBJECT WITH UNIQUE KEYS as object_with_unique,
5374+ json_col IS JSON OBJECT WITHOUT UNIQUE KEYS as object_without_unique
5375+ FROM test_json;
5376+ json_col is_json is_value is_scalar is_object is_array object_with_unique object_without_unique
5377+ {"name":"Alice", "age":25} 1 1 0 1 0 1 1
5378+ [1,2,3] 1 1 0 0 1 0 0
5379+ 42 1 1 1 0 0 0 0
5380+ "hello" 1 1 1 0 0 0 0
5381+ true 1 1 1 0 0 0 0
5382+ null 1 1 1 0 0 0 0
5383+ "invalid" 1 1 1 0 0 0 0
5384+ {"key1":1, "key2":2} 1 1 0 1 0 1 1
5385+ {"key1":1, "key1":2} 1 1 0 1 0 0 1
5386+ SELECT
5387+ text_col,
5388+ text_col IS JSON as is_json,
5389+ text_col IS JSON VALUE as is_value,
5390+ text_col IS JSON SCALAR as is_scalar,
5391+ text_col IS JSON OBJECT as is_object,
5392+ text_col IS JSON ARRAY as is_array
5393+ FROM test_json;
5394+ text_col is_json is_value is_scalar is_object is_array
5395+ {"name":"Alice", "age":25} 1 1 0 1 0
5396+ [1,2,3] 1 1 0 0 1
5397+ 42 1 1 1 0 0
5398+ "hello" 1 1 1 0 0
5399+ true 1 1 1 0 0
5400+ null 1 1 1 0 0
5401+ invalid 0 0 0 0 0
5402+ {"key1":1, "key2":2} 1 1 0 1 0
5403+ {"key1":1, "key1":2} 1 1 0 1 0
5404+ SELECT
5405+ COUNT(*) as total_rows,
5406+ SUM(json_col IS JSON) as valid_json_count,
5407+ SUM(json_col IS JSON OBJECT) as object_count,
5408+ SUM(json_col IS JSON ARRAY) as array_count,
5409+ SUM(json_col IS JSON SCALAR) as scalar_count
5410+ FROM test_json;
5411+ total_rows valid_json_count object_count array_count scalar_count
5412+ 9 9 3 1 5
5413+ # Edge cases
5414+ SELECT js,
5415+ js IS JSON "json?",
5416+ js IS JSON VALUE "value?",
5417+ js IS JSON SCALAR "scalar?",
5418+ js IS JSON OBJECT "object?",
5419+ js IS JSON ARRAY "array?"
5420+ FROM (VALUES
5421+ (NULL), (''), (' '), ('\n'), ('\t'),
5422+ ('{"key":1,}'), ('{"key":1, "key2":}'), ('{key:1}'),
5423+ ('{"emoji":"😊"}'), ('{"unicode":"\\u0041"}'),
5424+ (x'48656C6C6F'), ('2'), (CONCAT('{"a":', 1, '}')),
5425+ (JSON_OBJECT('a', 1, 'b', 2)), (JSON_ARRAY(1, 2, 3)), (JSON_QUOTE('hello'))) foo(js);
5426+ js json? value? scalar? object? array?
5427+ NULL NULL NULL NULL NULL NULL
5428+ 0 0 0 0 0
5429+ 0 0 0 0 0
5430+
5431+ 0 0 0 0 0
5432+ 0 0 0 0 0
5433+ {"key":1,} 0 0 0 0 0
5434+ {"key":1, "key2":} 0 0 0 0 0
5435+ {key:1} 0 0 0 0 0
5436+ {"emoji":"😊"} 1 1 0 1 0
5437+ {"unicode":"\u0041"} 1 1 0 1 0
5438+ Hello 0 0 0 0 0
5439+ 2 1 1 1 0 0
5440+ {"a":1} 1 1 0 1 0
5441+ {"a": 1, "b": 2} 1 1 0 1 0
5442+ [1, 2, 3] 1 1 0 0 1
5443+ "hello" 1 1 1 0 0
5444+ # Large json object with unique keys
5445+ CREATE PROCEDURE build_large_json()
5446+ BEGIN
5447+ SET @json='{"key1":1';
5448+ SET @i=2;
5449+ WHILE @i <= 1000 DO
5450+ SET @json = CONCAT(@json, ',"key', @i, '":', @i);
5451+ SET @i = @i + 1;
5452+ END WHILE;
5453+ SET @json = CONCAT(@json, '}');
5454+ END|
5455+ CALL build_large_json()|
5456+ SELECT @json IS JSON OBJECT WITH UNIQUE KEYS AS unique_keys|
5457+ unique_keys
5458+ 1
5459+ DROP PROCEDURE build_large_json|
5460+ DROP TABLE test_json;
52665461# End of 11.2 Test
0 commit comments