Commit 95a9078e authored by Rucha Deodhar's avatar Rucha Deodhar

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.
parent e6511a39
......@@ -1751,11 +1751,6 @@ JSON_OVERLAPS('true','tr')
Warnings:
Warning 4037 Unexpected end of JSON text in argument 2 to function 'json_overlaps'
#
# End of 10.9 test
#
#
# Beginning of 10.9 Test
#
# MDEV-22224: Support JSON Path negative index
#
SET @json='{
......@@ -2218,5 +2213,1089 @@ NULL
Warnings:
Warning 4044 Wildcards or range in JSON path not allowed in argument 2 to function 'json_keys'
#
# End of 10.9 Test
# MDEV-28071: JSON_EXISTS returns always 1 if it is used range notation
# for json path
#
<<<<<<< HEAD
||||||| parent of 3834536ced0... MDEV-28071: JSON_EXISTS returns always 1 if it is used range notation for
||||||| constructed merge base
=======
#
# Beginning of 10.9 Test
#
# MDEV-22224: Support JSON Path negative index
#
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);
JSON_ARRAY_APPEND(@json, '$.A[-2][-1]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, [15, 5]], true], "B": {"C": 1}, "D": 2}
SELECT JSON_ARRAY_APPEND(@json, '$.A[last-1][last]', 5);
JSON_ARRAY_APPEND(@json, '$.A[last-1][last]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, [15, 5]], true], "B": {"C": 1}, "D": 2}
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);
JSON_ARRAY_INSERT(@json, '$.A[-2][-2]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, 5, [15]], true], "B": {"C": 1}, "D": 2}
SELECT JSON_ARRAY_INSERT(@json, '$.A[last-1][last-1]', 5);
JSON_ARRAY_INSERT(@json, '$.A[last-1][last-1]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, 5, [15]], true], "B": {"C": 1}, "D": 2}
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]');
JSON_CONTAINS(@json, '15', '$.A[-2][-1]')
1
SELECT JSON_CONTAINS(@json, '15', '$.A[last-1][last]');
JSON_CONTAINS(@json, '15', '$.A[last-1][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_CONTAINS_PATH(@json, 'one', '$.A[-2]');
JSON_CONTAINS_PATH(@json, 'one', '$.A[-2]')
1
SELECT JSON_CONTAINS_PATH(@json, 'one', '$.A[last-1]');
JSON_CONTAINS_PATH(@json, 'one', '$.A[last-1]')
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]');
JSON_EXISTS(@json, '$.A[-2][-1]')
1
SELECT JSON_EXISTS(@json, '$.A[last-1][last]');
JSON_EXISTS(@json, '$.A[last-1][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_EXTRACT(@json, '$.A[-8][1]');
JSON_EXTRACT(@json, '$.A[-8][1]')
5
SELECT JSON_EXTRACT(@json, '$.A[last-7][1]');
JSON_EXTRACT(@json, '$.A[last-7][1]')
5
SET @json= '[{"A": 1, "B": 2, "C": {"D": 3}},{"A": 1, "B": 2, "C": {"D": 3}}]';
SELECT JSON_KEYS(@json, '$[-1].C');
JSON_KEYS(@json, '$[-1].C')
["D"]
SELECT JSON_KEYS(@json, '$[last].C');
JSON_KEYS(@json, '$[last].C')
["D"]
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]');
JSON_LENGTH(@json, '$.A[-2][-3]')
2
SELECT JSON_LENGTH(@json, '$.A[last-1][last-2]');
JSON_LENGTH(@json, '$.A[last-1][last-2]')
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]');
JSON_QUERY(@json, '$.A[-8]')
[4, 5, 6]
SELECT JSON_QUERY(@json, '$.A[last-7]');
JSON_QUERY(@json, '$.A[last-7]')
[4, 5, 6]
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]');
JSON_REMOVE(@json, '$.A[-10]')
{"A": [[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[last-9]');
JSON_REMOVE(@json, '$.A[last-9]')
{"A": [[1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], true], "B": {"C": 1}, "D": 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_REPLACE(@json, '$.A[-1]', 4);
JSON_REPLACE(@json, '$.A[-1]', 4)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], 4], "B": {"C": 1}, "D": 2}
SELECT JSON_REPLACE(@json, '$.A[last]', 4);
JSON_REPLACE(@json, '$.A[last]', 4)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], 4], "B": {"C": 1}, "D": 2}
SET @json = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';
SELECT JSON_SEARCH(@json, 'all', 'abc', NULL, '$[-2]');
JSON_SEARCH(@json, 'all', 'abc', NULL, '$[-2]')
"$[2].x"
SELECT JSON_SEARCH(@json, 'all', 'abc', NULL, '$[last-1]');
JSON_SEARCH(@json, 'all', 'abc', NULL, '$[last-1]')
"$[2].x"
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);
JSON_SET(@json, '$.A[-4]', 100)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, 100, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], true], "B": {"C": 1}, "D": 2}
SELECT JSON_SET(@json, '$.A[last-3]', 100);
JSON_SET(@json, '$.A[last-3]', 100)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, 100, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], true], "B": {"C": 1}, "D": 2}
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');
JSON_VALUE(@json, '$.A[-2][-2].key1')
123
SELECT JSON_VALUE(@json, '$.A[last-1][last-1].key1');
JSON_VALUE(@json, '$.A[last-1][last-1].key1')
123
#
# End of 10.9 Test
#
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]');
JSON_EXISTS(@json, '$[2][2][1 to 2]')
1
SELECT JSON_EXISTS(@json, '$[2][2][4 to 6]');
JSON_EXISTS(@json, '$[2][2][4 to 6]')
0
SELECT JSON_EXISTS(@json, '$[2][2][1 to 4]');
JSON_EXISTS(@json, '$[2][2][1 to 4]')
1
#
# MDEV-22224: Support JSON Path negative index
#
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);
JSON_ARRAY_APPEND(@json, '$.A[-2][-1]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, [15, 5]], true], "B": {"C": 1}, "D": 2}
SELECT JSON_ARRAY_APPEND(@json, '$.A[last-1][last]', 5);
JSON_ARRAY_APPEND(@json, '$.A[last-1][last]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, [15, 5]], true], "B": {"C": 1}, "D": 2}
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);
JSON_ARRAY_INSERT(@json, '$.A[-2][-2]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, 5, [15]], true], "B": {"C": 1}, "D": 2}
SELECT JSON_ARRAY_INSERT(@json, '$.A[last-1][last-1]', 5);
JSON_ARRAY_INSERT(@json, '$.A[last-1][last-1]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, 5, [15]], true], "B": {"C": 1}, "D": 2}
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]');
JSON_CONTAINS(@json, '15', '$.A[-2][-1]')
1
SELECT JSON_CONTAINS(@json, '15', '$.A[last-1][last]');
JSON_CONTAINS(@json, '15', '$.A[last-1][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_CONTAINS_PATH(@json, 'one', '$.A[-2]');
JSON_CONTAINS_PATH(@json, 'one', '$.A[-2]')
1
SELECT JSON_CONTAINS_PATH(@json, 'one', '$.A[last-1]');
JSON_CONTAINS_PATH(@json, 'one', '$.A[last-1]')
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]');
JSON_EXISTS(@json, '$.A[-2][-1]')
1
SELECT JSON_EXISTS(@json, '$.A[last-1][last]');
JSON_EXISTS(@json, '$.A[last-1][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_EXTRACT(@json, '$.A[-8][1]');
JSON_EXTRACT(@json, '$.A[-8][1]')
5
SELECT JSON_EXTRACT(@json, '$.A[last-7][1]');
JSON_EXTRACT(@json, '$.A[last-7][1]')
5
SET @json= '[{"A": 1, "B": 2, "C": {"D": 3}},{"A": 1, "B": 2, "C": {"D": 3}}]';
SELECT JSON_KEYS(@json, '$[-1].C');
JSON_KEYS(@json, '$[-1].C')
["D"]
SELECT JSON_KEYS(@json, '$[last].C');
JSON_KEYS(@json, '$[last].C')
["D"]
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]');
JSON_LENGTH(@json, '$.A[-2][-3]')
2
SELECT JSON_LENGTH(@json, '$.A[last-1][last-2]');
JSON_LENGTH(@json, '$.A[last-1][last-2]')
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]');
JSON_QUERY(@json, '$.A[-8]')
[4, 5, 6]
SELECT JSON_QUERY(@json, '$.A[last-7]');
JSON_QUERY(@json, '$.A[last-7]')
[4, 5, 6]
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]');
JSON_REMOVE(@json, '$.A[-10]')
{"A": [[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[last-9]');
JSON_REMOVE(@json, '$.A[last-9]')
{"A": [[1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], true], "B": {"C": 1}, "D": 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_REPLACE(@json, '$.A[-1]', 4);
JSON_REPLACE(@json, '$.A[-1]', 4)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], 4], "B": {"C": 1}, "D": 2}
SELECT JSON_REPLACE(@json, '$.A[last]', 4);
JSON_REPLACE(@json, '$.A[last]', 4)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], 4], "B": {"C": 1}, "D": 2}
SET @json = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';
SELECT JSON_SEARCH(@json, 'all', 'abc', NULL, '$[-2]');
JSON_SEARCH(@json, 'all', 'abc', NULL, '$[-2]')
"$[2].x"
SELECT JSON_SEARCH(@json, 'all', 'abc', NULL, '$[last-1]');
JSON_SEARCH(@json, 'all', 'abc', NULL, '$[last-1]')
"$[2].x"
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);
JSON_SET(@json, '$.A[-4]', 100)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, 100, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], true], "B": {"C": 1}, "D": 2}
SELECT JSON_SET(@json, '$.A[last-3]', 100);
JSON_SET(@json, '$.A[last-3]', 100)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, 100, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], true], "B": {"C": 1}, "D": 2}
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');
JSON_VALUE(@json, '$.A[-2][-2].key1')
123
SELECT JSON_VALUE(@json, '$.A[last-1][last-1].key1');
JSON_VALUE(@json, '$.A[last-1][last-1].key1')
123
#
# MDEV-22224: Support JSON Path negative index
#
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);
JSON_ARRAY_APPEND(@json, '$.A[-2][-1]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, [15, 5]], true], "B": {"C": 1}, "D": 2}
SELECT JSON_ARRAY_APPEND(@json, '$.A[last-1][last]', 5);
JSON_ARRAY_APPEND(@json, '$.A[last-1][last]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, [15, 5]], true], "B": {"C": 1}, "D": 2}
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);
JSON_ARRAY_INSERT(@json, '$.A[-2][-2]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, 5, [15]], true], "B": {"C": 1}, "D": 2}
SELECT JSON_ARRAY_INSERT(@json, '$.A[last-1][last-1]', 5);
JSON_ARRAY_INSERT(@json, '$.A[last-1][last-1]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, 5, [15]], true], "B": {"C": 1}, "D": 2}
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]');
JSON_CONTAINS(@json, '15', '$.A[-2][-1]')
1
SELECT JSON_CONTAINS(@json, '15', '$.A[last-1][last]');
JSON_CONTAINS(@json, '15', '$.A[last-1][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_CONTAINS_PATH(@json, 'one', '$.A[-2]');
JSON_CONTAINS_PATH(@json, 'one', '$.A[-2]')
1
SELECT JSON_CONTAINS_PATH(@json, 'one', '$.A[last-1]');
JSON_CONTAINS_PATH(@json, 'one', '$.A[last-1]')
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]');
JSON_EXISTS(@json, '$.A[-2][-1]')
1
SELECT JSON_EXISTS(@json, '$.A[last-1][last]');
JSON_EXISTS(@json, '$.A[last-1][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_EXTRACT(@json, '$.A[-8][1]');
JSON_EXTRACT(@json, '$.A[-8][1]')
5
SELECT JSON_EXTRACT(@json, '$.A[last-7][1]');
JSON_EXTRACT(@json, '$.A[last-7][1]')
5
SET @json= '[{"A": 1, "B": 2, "C": {"D": 3}},{"A": 1, "B": 2, "C": {"D": 3}}]';
SELECT JSON_KEYS(@json, '$[-1].C');
JSON_KEYS(@json, '$[-1].C')
["D"]
SELECT JSON_KEYS(@json, '$[last].C');
JSON_KEYS(@json, '$[last].C')
["D"]
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]');
JSON_LENGTH(@json, '$.A[-2][-3]')
2
SELECT JSON_LENGTH(@json, '$.A[last-1][last-2]');
JSON_LENGTH(@json, '$.A[last-1][last-2]')
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]');
JSON_QUERY(@json, '$.A[-8]')
[4, 5, 6]
SELECT JSON_QUERY(@json, '$.A[last-7]');
JSON_QUERY(@json, '$.A[last-7]')
[4, 5, 6]
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]');
JSON_REMOVE(@json, '$.A[-10]')
{"A": [[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[last-9]');
JSON_REMOVE(@json, '$.A[last-9]')
{"A": [[1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], true], "B": {"C": 1}, "D": 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_REPLACE(@json, '$.A[-1]', 4);
JSON_REPLACE(@json, '$.A[-1]', 4)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], 4], "B": {"C": 1}, "D": 2}
SELECT JSON_REPLACE(@json, '$.A[last]', 4);
JSON_REPLACE(@json, '$.A[last]', 4)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], 4], "B": {"C": 1}, "D": 2}
SET @json = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';
SELECT JSON_SEARCH(@json, 'all', 'abc', NULL, '$[-2]');
JSON_SEARCH(@json, 'all', 'abc', NULL, '$[-2]')
"$[2].x"
SELECT JSON_SEARCH(@json, 'all', 'abc', NULL, '$[last-1]');
JSON_SEARCH(@json, 'all', 'abc', NULL, '$[last-1]')
"$[2].x"
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);
JSON_SET(@json, '$.A[-4]', 100)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, 100, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], true], "B": {"C": 1}, "D": 2}
SELECT JSON_SET(@json, '$.A[last-3]', 100);
JSON_SET(@json, '$.A[last-3]', 100)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, 100, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], true], "B": {"C": 1}, "D": 2}
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');
JSON_VALUE(@json, '$.A[-2][-2].key1')
123
SELECT JSON_VALUE(@json, '$.A[last-1][last-1].key1');
JSON_VALUE(@json, '$.A[last-1][last-1].key1')
123
#
# MDEV-28075: JSON_VALUE returns first value from array not from range
#
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');
JSON_VALUE(@json1, '$[2][1 to 2].key1')
value7
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]');
JSON_VALUE(@json, '$[*][0]')
1.1
SELECT JSON_VALUE(@json, '$[2 to 3][0]');
JSON_VALUE(@json, '$[2 to 3][0]')
7
#
# Beginning of 10.9 Test
#
# MDEV-22224: Support JSON Path negative index
#
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);
JSON_ARRAY_APPEND(@json, '$.A[-2][-1]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, [15, 5]], true], "B": {"C": 1}, "D": 2}
SELECT JSON_ARRAY_APPEND(@json, '$.A[last-1][last]', 5);
JSON_ARRAY_APPEND(@json, '$.A[last-1][last]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, [15, 5]], true], "B": {"C": 1}, "D": 2}
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);
JSON_ARRAY_INSERT(@json, '$.A[-2][-2]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, 5, [15]], true], "B": {"C": 1}, "D": 2}
SELECT JSON_ARRAY_INSERT(@json, '$.A[last-1][last-1]', 5);
JSON_ARRAY_INSERT(@json, '$.A[last-1][last-1]', 5)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, 13, {"key1": "value1"}, 5, [15]], true], "B": {"C": 1}, "D": 2}
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]');
JSON_CONTAINS(@json, '15', '$.A[-2][-1]')
1
SELECT JSON_CONTAINS(@json, '15', '$.A[last-1][last]');
JSON_CONTAINS(@json, '15', '$.A[last-1][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_CONTAINS_PATH(@json, 'one', '$.A[-2]');
JSON_CONTAINS_PATH(@json, 'one', '$.A[-2]')
1
SELECT JSON_CONTAINS_PATH(@json, 'one', '$.A[last-1]');
JSON_CONTAINS_PATH(@json, 'one', '$.A[last-1]')
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]');
JSON_EXISTS(@json, '$.A[-2][-1]')
1
SELECT JSON_EXISTS(@json, '$.A[last-1][last]');
JSON_EXISTS(@json, '$.A[last-1][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_EXTRACT(@json, '$.A[-8][1]');
JSON_EXTRACT(@json, '$.A[-8][1]')
5
SELECT JSON_EXTRACT(@json, '$.A[last-7][1]');
JSON_EXTRACT(@json, '$.A[last-7][1]')
5
SET @json= '[{"A": 1, "B": 2, "C": {"D": 3}},{"A": 1, "B": 2, "C": {"D": 3}}]';
SELECT JSON_KEYS(@json, '$[-1].C');
JSON_KEYS(@json, '$[-1].C')
["D"]
SELECT JSON_KEYS(@json, '$[last].C');
JSON_KEYS(@json, '$[last].C')
["D"]
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]');
JSON_LENGTH(@json, '$.A[-2][-3]')
2
SELECT JSON_LENGTH(@json, '$.A[last-1][last-2]');
JSON_LENGTH(@json, '$.A[last-1][last-2]')
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]');
JSON_QUERY(@json, '$.A[-8]')
[4, 5, 6]
SELECT JSON_QUERY(@json, '$.A[last-7]');
JSON_QUERY(@json, '$.A[last-7]')
[4, 5, 6]
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]');
JSON_REMOVE(@json, '$.A[-10]')
{"A": [[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[last-9]');
JSON_REMOVE(@json, '$.A[last-9]')
{"A": [[1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], true], "B": {"C": 1}, "D": 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_REPLACE(@json, '$.A[-1]', 4);
JSON_REPLACE(@json, '$.A[-1]', 4)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], 4], "B": {"C": 1}, "D": 2}
SELECT JSON_REPLACE(@json, '$.A[last]', 4);
JSON_REPLACE(@json, '$.A[last]', 4)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, false, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], 4], "B": {"C": 1}, "D": 2}
SET @json = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';
SELECT JSON_SEARCH(@json, 'all', 'abc', NULL, '$[-2]');
JSON_SEARCH(@json, 'all', 'abc', NULL, '$[-2]')
"$[2].x"
SELECT JSON_SEARCH(@json, 'all', 'abc', NULL, '$[last-1]');
JSON_SEARCH(@json, 'all', 'abc', NULL, '$[last-1]')
"$[2].x"
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);
JSON_SET(@json, '$.A[-4]', 100)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, 100, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], true], "B": {"C": 1}, "D": 2}
SELECT JSON_SET(@json, '$.A[last-3]', 100);
JSON_SET(@json, '$.A[last-3]', 100)
{"A": [0, [1, 2, 3], [4, 5, 6], "seven", 0.8, true, 100, "eleven", [12, [13, 14], {"key1": "value1"}, [15]], true], "B": {"C": 1}, "D": 2}
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');
JSON_VALUE(@json, '$.A[-2][-2].key1')
123
SELECT JSON_VALUE(@json, '$.A[last-1][last-1].key1');
JSON_VALUE(@json, '$.A[last-1][last-1].key1')
123
#
# End of 10.9 Test
#
\ No newline at end of file
......@@ -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 #
......@@ -1373,7 +1373,7 @@ static int handle_match(json_engine_t *je, json_path_t *p,
(int) (next_step->type & JSON_PATH_KEY_OR_ARRAY))
return json_skip_level(je);
if (next_step->type == JSON_PATH_ARRAY)
if (next_step->type & JSON_PATH_ARRAY)
{
int array_size;
if (next_step->n_item >= 0)
......@@ -1418,6 +1418,7 @@ int json_find_path(json_engine_t *je,
int *array_counters)
{
json_string_t key_name;
int res= 0;
json_string_set_cs(&key_name, p->s.cs);
......@@ -1444,8 +1445,15 @@ int json_find_path(json_engine_t *je,
break;
case JST_VALUE:
DBUG_ASSERT(cur_step->type & JSON_PATH_ARRAY);
if (cur_step->type & (JSON_PATH_WILD | JSON_PATH_ARRAY_RANGE) ||
cur_step->n_item == array_counters[cur_step - p->steps]++)
if (cur_step->type & JSON_PATH_ARRAY_RANGE)
{
res= (cur_step->n_item <= array_counters[cur_step - p->steps] &&
cur_step->n_item_end >= array_counters[cur_step - p->steps]);
array_counters[cur_step - p->steps]++;
}
else
res= cur_step->n_item == array_counters[cur_step - p->steps]++;
if ((cur_step->type & JSON_PATH_WILD) || res)
{
/* Array item matches. */
if (cur_step == p->last_step ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment