diff --git a/mysql-test/main/func_json.result b/mysql-test/main/func_json.result index 5bcd90f3410..18a700607ab 100644 --- a/mysql-test/main/func_json.result +++ b/mysql-test/main/func_json.result @@ -2013,5 +2013,21 @@ SELECT JSON_VALUE(@json, '$.A[last-1][last-1].key1'); JSON_VALUE(@json, '$.A[last-1][last-1].key1') 123 # +# MDEV-27972: Unexpected behavior with negative zero (-0) in JSON Path +# +SET @json='{ "x": [0,1]}'; +SELECT JSON_VALUE(@json,'$.x[last]'); +JSON_VALUE(@json,'$.x[last]') +1 +SELECT JSON_VALUE(@json,'$.x[last-0]'); +JSON_VALUE(@json,'$.x[last-0]') +1 +SELECT JSON_VALUE(@json,'$.x[-0]'); +JSON_VALUE(@json,'$.x[-0]') +0 +SELECT JSON_VALUE(@json,'$.x[0]'); +JSON_VALUE(@json,'$.x[0]') +0 +# # End of 10.9 Test # diff --git a/mysql-test/main/func_json.test b/mysql-test/main/func_json.test index ea7358f4563..34a4b30b0ab 100644 --- a/mysql-test/main/func_json.test +++ b/mysql-test/main/func_json.test @@ -1306,6 +1306,16 @@ SET @json='{ SELECT JSON_VALUE(@json, '$.A[-2][-2].key1'); SELECT JSON_VALUE(@json, '$.A[last-1][last-1].key1'); +--echo # +--echo # MDEV-27972: Unexpected behavior with negative zero (-0) in JSON Path +--echo # + +SET @json='{ "x": [0,1]}'; +SELECT JSON_VALUE(@json,'$.x[last]'); +SELECT JSON_VALUE(@json,'$.x[last-0]'); +SELECT JSON_VALUE(@json,'$.x[-0]'); +SELECT JSON_VALUE(@json,'$.x[0]'); + --echo # --echo # End of 10.9 Test --echo # diff --git a/strings/json_lib.c b/strings/json_lib.c index 526a55b7179..602a57cc03b 100644 --- a/strings/json_lib.c +++ b/strings/json_lib.c @@ -1079,7 +1079,7 @@ static int json_path_transitions[N_PATH_STATES][N_PATH_CLASSES]= /* AWD */ { JE_EOS, JE_SYN, JE_SYN, JE_SYN, PS_PT, JE_SYN,JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_SYN, PS_AS, JE_SYN, JE_SYN, JE_SYN, JE_NOT_JSON_CHR, JE_BAD_CHR}, -/* NEG */ { JE_EOS, JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_SYN,JE_SYN, +/* NEG */ { JE_EOS, JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_SYN, PS_INT, PS_INT, JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_NOT_JSON_CHR, JE_BAD_CHR}, /* Z */ { JE_EOS, JE_SYN, JE_SYN, JE_SYN, PS_PT, JE_SYN,JE_SYN, JE_SYN,