Skip to content

Commit 0225159

Browse files
UnrealQuestermariadb-RuchaDeodhar
authored andcommitted
MDEV-29381: SON paths containing dashes are reported as syntax errors in
procedures MDEV-22224 caused the parsing of keys with hyphens to break by setting the state transitions for parsing keys to JE_SYN (syntax error) when they encounter a hyphen. However json key names may contain hyphens and still be considered valid json. This patch changes the state transition table so that key names with hyphens remain valid. Note that unquoted key names in paths like $.key-name are also valid again. This restores the previous behaviour when hyphens were considered part of the P_ETC character class.
1 parent 5bb2cc8 commit 0225159

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

mysql-test/main/func_json.result

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2350,3 +2350,12 @@ JSON_OVERLAPS(@json1, @json2)
23502350
#
23512351
# End of 10.9 Test
23522352
#
2353+
#
2354+
# MDEV-29381: JSON paths containing dashes are reported as syntax errors in procedures
2355+
#
2356+
SELECT JSON_EXTRACT('{ "my-key": 1 }', '$."my-key"');
2357+
JSON_EXTRACT('{ "my-key": 1 }', '$."my-key"')
2358+
1
2359+
SELECT JSON_EXTRACT('{ "my-key": 1 }', '$.my-key');
2360+
JSON_EXTRACT('{ "my-key": 1 }', '$.my-key')
2361+
1

mysql-test/main/func_json.test

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1608,3 +1608,10 @@ SELECT JSON_OVERLAPS(@json1, @json2);
16081608
--echo #
16091609
--echo # End of 10.9 Test
16101610
--echo #
1611+
1612+
--echo #
1613+
--echo # MDEV-29381: JSON paths containing dashes are reported as syntax errors in procedures
1614+
--echo #
1615+
1616+
SELECT JSON_EXTRACT('{ "my-key": 1 }', '$."my-key"');
1617+
SELECT JSON_EXTRACT('{ "my-key": 1 }', '$.my-key');

strings/json_lib.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,7 +1096,7 @@ static int json_path_transitions[N_PATH_STATES][N_PATH_CLASSES]=
10961096
/* KEY */ { JE_EOS, PS_KNM, PS_KWD, JE_SYN, PS_KNM, PS_KNM, JE_SYN, JE_SYN,
10971097
PS_KNM, PS_KNM, PS_KNM, PS_KNM, PS_KNM, JE_SYN, PS_KEYX, PS_KNM,
10981098
JE_NOT_JSON_CHR, JE_BAD_CHR},
1099-
/* KNM */ { PS_KOK, PS_KNM, PS_AST, PS_EAR, PS_KNM, PS_KNM, PS_EKY, JE_SYN,
1099+
/* KNM */ { PS_KOK, PS_KNM, PS_AST, PS_EAR, PS_KNM, PS_KNM, PS_EKY, PS_KNM,
11001100
PS_KNM, PS_KNM, PS_KNM, PS_KNM, PS_KNM, PS_ESC, PS_KNM, PS_KNM,
11011101
JE_NOT_JSON_CHR, JE_BAD_CHR},
11021102
/* KWD */ { PS_OK, JE_SYN, JE_SYN, PS_AR, JE_SYN, JE_SYN, PS_EKY, JE_SYN,
@@ -1111,7 +1111,7 @@ static int json_path_transitions[N_PATH_STATES][N_PATH_CLASSES]=
11111111
/* KEYX*/ { JE_EOS, PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, JE_SYN,
11121112
PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, PS_ESCX, PS_EKYX, PS_KNMX,
11131113
JE_NOT_JSON_CHR, JE_BAD_CHR},
1114-
/* KNMX */{ JE_EOS, PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, JE_SYN,
1114+
/* KNMX */{ JE_EOS, PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX,
11151115
PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, PS_KNMX, PS_ESCX, PS_EKYX, PS_KNMX,
11161116
JE_NOT_JSON_CHR, JE_BAD_CHR},
11171117
/* LAST */{ JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_SYN, PS_PT, JE_SYN, PS_NEG,

0 commit comments

Comments
 (0)