mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-28071: JSON_EXISTS returns always 1 if it is used range notation for
json path Analysis: When searching for the given path in json string, if the current step is of array range type, then path was considered reached which meant path exists. So output was always true. The end indexes of range were not evaluated. Fix: If the current step type for a path is array range, then check if the value array_counter[] is in range of n_item and n_item_end. If it is, then path exists. Only then return true. If the range criteria is never met then return false.
This commit is contained in:
@ -1477,6 +1477,477 @@ SET @json='{
|
||||
}';
|
||||
SELECT JSON_KEYS(@json, '$.A[8][1 to 3]');
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-28071: JSON_EXISTS returns always 1 if it is used range notation
|
||||
--echo # for json path
|
||||
--echo #
|
||||
|
||||
SET @json= '[
|
||||
[1, {"key1": "value1"}, 3],
|
||||
[false, 5, 6],
|
||||
[7, 8, [9, {"key2": 2}, 11]],
|
||||
[15, 1.34, [14], ["string1", [16, {"key1":[1,2,3,[4,5,6]]}, 18]]],
|
||||
[19, 20],
|
||||
21, 22
|
||||
]';
|
||||
SELECT JSON_EXISTS(@json, '$[2][2][1 to 2]');
|
||||
SELECT JSON_EXISTS(@json, '$[2][2][4 to 6]');
|
||||
SELECT JSON_EXISTS(@json, '$[2][2][1 to 4]');
|
||||
--echo #
|
||||
--echo # MDEV-22224: Support JSON Path negative index
|
||||
--echo #
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, 13, {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_ARRAY_APPEND(@json, '$.A[-2][-1]', 5);
|
||||
SELECT JSON_ARRAY_APPEND(@json, '$.A[last-1][last]', 5);
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, 13, {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_ARRAY_INSERT(@json, '$.A[-2][-2]', 5);
|
||||
SELECT JSON_ARRAY_INSERT(@json, '$.A[last-1][last-1]', 5);
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, 13, {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_CONTAINS(@json, '15', '$.A[-2][-1]');
|
||||
SELECT JSON_CONTAINS(@json, '15', '$.A[last-1][last]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, 13, {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_CONTAINS_PATH(@json, 'one', '$.A[-2]');
|
||||
SELECT JSON_CONTAINS_PATH(@json, 'one', '$.A[last-1]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, 13, {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_EXISTS(@json, '$.A[-2][-1]');
|
||||
SELECT JSON_EXISTS(@json, '$.A[last-1][last]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_EXTRACT(@json, '$.A[-8][1]');
|
||||
SELECT JSON_EXTRACT(@json, '$.A[last-7][1]');
|
||||
|
||||
SET @json= '[{"A": 1, "B": 2, "C": {"D": 3}},{"A": 1, "B": 2, "C": {"D": 3}}]';
|
||||
SELECT JSON_KEYS(@json, '$[-1].C');
|
||||
SELECT JSON_KEYS(@json, '$[last].C');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_LENGTH(@json, '$.A[-2][-3]');
|
||||
SELECT JSON_LENGTH(@json, '$.A[last-1][last-2]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_QUERY(@json, '$.A[-8]');
|
||||
SELECT JSON_QUERY(@json, '$.A[last-7]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_REMOVE(@json, '$.A[-10]');
|
||||
SELECT JSON_REMOVE(@json, '$.A[last-9]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_REPLACE(@json, '$.A[-1]', 4);
|
||||
SELECT JSON_REPLACE(@json, '$.A[last]', 4);
|
||||
|
||||
SET @json = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';
|
||||
SELECT JSON_SEARCH(@json, 'all', 'abc', NULL, '$[-2]');
|
||||
SELECT JSON_SEARCH(@json, 'all', 'abc', NULL, '$[last-1]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_SET(@json, '$.A[-4]', 100);
|
||||
SELECT JSON_SET(@json, '$.A[last-3]', 100);
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":123},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_VALUE(@json, '$.A[-2][-2].key1');
|
||||
SELECT JSON_VALUE(@json, '$.A[last-1][last-1].key1');
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-22224: Support JSON Path negative index
|
||||
--echo #
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, 13, {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_ARRAY_APPEND(@json, '$.A[-2][-1]', 5);
|
||||
SELECT JSON_ARRAY_APPEND(@json, '$.A[last-1][last]', 5);
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, 13, {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_ARRAY_INSERT(@json, '$.A[-2][-2]', 5);
|
||||
SELECT JSON_ARRAY_INSERT(@json, '$.A[last-1][last-1]', 5);
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, 13, {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_CONTAINS(@json, '15', '$.A[-2][-1]');
|
||||
SELECT JSON_CONTAINS(@json, '15', '$.A[last-1][last]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, 13, {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_CONTAINS_PATH(@json, 'one', '$.A[-2]');
|
||||
SELECT JSON_CONTAINS_PATH(@json, 'one', '$.A[last-1]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, 13, {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_EXISTS(@json, '$.A[-2][-1]');
|
||||
SELECT JSON_EXISTS(@json, '$.A[last-1][last]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_EXTRACT(@json, '$.A[-8][1]');
|
||||
SELECT JSON_EXTRACT(@json, '$.A[last-7][1]');
|
||||
|
||||
SET @json= '[{"A": 1, "B": 2, "C": {"D": 3}},{"A": 1, "B": 2, "C": {"D": 3}}]';
|
||||
SELECT JSON_KEYS(@json, '$[-1].C');
|
||||
SELECT JSON_KEYS(@json, '$[last].C');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_LENGTH(@json, '$.A[-2][-3]');
|
||||
SELECT JSON_LENGTH(@json, '$.A[last-1][last-2]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_QUERY(@json, '$.A[-8]');
|
||||
SELECT JSON_QUERY(@json, '$.A[last-7]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_REMOVE(@json, '$.A[-10]');
|
||||
SELECT JSON_REMOVE(@json, '$.A[last-9]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_REPLACE(@json, '$.A[-1]', 4);
|
||||
SELECT JSON_REPLACE(@json, '$.A[last]', 4);
|
||||
|
||||
SET @json = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';
|
||||
SELECT JSON_SEARCH(@json, 'all', 'abc', NULL, '$[-2]');
|
||||
SELECT JSON_SEARCH(@json, 'all', 'abc', NULL, '$[last-1]');
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":"value1"},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_SET(@json, '$.A[-4]', 100);
|
||||
SELECT JSON_SET(@json, '$.A[last-3]', 100);
|
||||
|
||||
SET @json='{
|
||||
"A": [0,
|
||||
[1, 2, 3],
|
||||
[4, 5, 6],
|
||||
"seven",
|
||||
0.8,
|
||||
true,
|
||||
false,
|
||||
"eleven",
|
||||
[12, [13, 14], {"key1":123},[15]],
|
||||
true],
|
||||
"B": {"C": 1},
|
||||
"D": 2
|
||||
}';
|
||||
SELECT JSON_VALUE(@json, '$.A[-2][-2].key1');
|
||||
SELECT JSON_VALUE(@json, '$.A[last-1][last-1].key1');
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-28075: JSON_VALUE returns first value from array not from range
|
||||
--echo #
|
||||
|
||||
SET @json1= '[
|
||||
[{"key1": "value1"}, {"key2": "value2"}],
|
||||
[{"key3": "value3"}, {"key1": "value4"}],
|
||||
[{"key1": "value5"}, {"key4": "value6"}, {"key1": "value7"}]
|
||||
]';
|
||||
SELECT JSON_VALUE(@json1, '$[2][1 to 2].key1');
|
||||
|
||||
|
||||
SET @json= '[
|
||||
[1.1, {"key1": "value1"}, 3],
|
||||
[false, 5, 6],
|
||||
[7, 8, [9, {"key2": 2}, 11]],
|
||||
[11, 1.34, [14], ["string1", [16, {"key1":[1,2,3,[4,5,6]]}, 18]]],
|
||||
[19, 20]
|
||||
]';
|
||||
SELECT JSON_VALUE(@json, '$[*][0]');
|
||||
SELECT JSON_VALUE(@json, '$[2 to 3][0]');
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.9 Test
|
||||
--echo #
|
||||
|
Reference in New Issue
Block a user