diff --git a/mysql-test/r/func_json.result b/mysql-test/r/func_json.result index b60f6e970e1..2ffeb83b0de 100644 --- a/mysql-test/r/func_json.result +++ b/mysql-test/r/func_json.result @@ -736,3 +736,6 @@ insert into t1 values (2),(1); select 1 from t1 where json_extract(a,'$','$[81]'); 1 drop table t1; +select json_extract('{"test":8.437e-5}','$.test'); +json_extract('{"test":8.437e-5}','$.test') +8.437e-5 diff --git a/mysql-test/suite/json/r/json_no_table.result b/mysql-test/suite/json/r/json_no_table.result index 034a4e6c0a6..41150032e51 100644 --- a/mysql-test/suite/json/r/json_no_table.result +++ b/mysql-test/suite/json/r/json_no_table.result @@ -1061,9 +1061,7 @@ json_type(json_compact(3.14)) DOUBLE select json_type(json_compact(3.14E30)); json_type(json_compact(3.14E30)) -NULL -Warnings: -Warning 4038 Syntax error in JSON text in argument 1 to function 'json_type' at position 7 +DOUBLE select json_type(json_compact(cast('10101abcde' as binary))); json_type(json_compact(cast('10101abcde' as binary))) INTEGER @@ -3445,52 +3443,34 @@ JSON_ARRAY(CASE WHEN 1 THEN NULL ELSE NULL END) # SELECT JSON_EXTRACT('-1E-36181012216111515851075235238', '$'); JSON_EXTRACT('-1E-36181012216111515851075235238', '$') -NULL -Warnings: -Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 33 +-1E-36181012216111515851075235238 SELECT JSON_EXTRACT('1E-36181012216111515851075235238', '$'); JSON_EXTRACT('1E-36181012216111515851075235238', '$') -NULL -Warnings: -Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 32 +1E-36181012216111515851075235238 SELECT JSON_EXTRACT('1E-325', '$'); JSON_EXTRACT('1E-325', '$') -NULL -Warnings: -Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 6 +1E-325 SELECT JSON_EXTRACT('1E-324', '$'); JSON_EXTRACT('1E-324', '$') -NULL -Warnings: -Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 6 +1E-324 SELECT JSON_EXTRACT('1E-323', '$'); JSON_EXTRACT('1E-323', '$') -NULL -Warnings: -Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 6 +1E-323 SELECT JSON_EXTRACT('1E+308', '$'); JSON_EXTRACT('1E+308', '$') -NULL -Warnings: -Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 6 +1E+308 error ER_INVALID_JSON_TEXT_IN_PARAM SELECT JSON_EXTRACT('1E+309', '$'); JSON_EXTRACT('1E+309', '$') -NULL -Warnings: -Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 6 +1E+309 error ER_INVALID_JSON_TEXT_IN_PARAM SELECT JSON_EXTRACT('1E+36181012216111515851075235238', '$'); JSON_EXTRACT('1E+36181012216111515851075235238', '$') -NULL -Warnings: -Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 32 +1E+36181012216111515851075235238 error ER_INVALID_JSON_TEXT_IN_PARAM SELECT JSON_EXTRACT('-1E+36181012216111515851075235238', '$'); JSON_EXTRACT('-1E+36181012216111515851075235238', '$') -NULL -Warnings: -Warning 4038 Syntax error in JSON text in argument 1 to function 'json_extract' at position 33 +-1E+36181012216111515851075235238 # # Bug#21383284: ASSERTION IN SELECT_LEX::SETUP_CONDS # diff --git a/mysql-test/t/func_json.test b/mysql-test/t/func_json.test index 0b3cb938098..a6ae934f7b4 100644 --- a/mysql-test/t/func_json.test +++ b/mysql-test/t/func_json.test @@ -392,3 +392,9 @@ insert into t1 values (2),(1); select 1 from t1 where json_extract(a,'$','$[81]'); drop table t1; +# +# MDEV-15561 json_extract returns NULL with numbers in scientific notation. +# + +select json_extract('{"test":8.437e-5}','$.test'); + diff --git a/strings/json_lib.c b/strings/json_lib.c index 413ce128149..cbf672f5887 100644 --- a/strings/json_lib.c +++ b/strings/json_lib.c @@ -475,8 +475,8 @@ static int json_num_states[NS_NUM_STATES][N_NUM_CLASSES]= /*ZE1*/ { JE_SYN, JE_SYN, JE_SYN, JE_SYN, NS_FRAC, JE_SYN, NS_OK, JE_BAD_CHR }, /*INT*/ { JE_SYN, JE_SYN, NS_INT, NS_INT, NS_FRAC, NS_EX, NS_OK, JE_BAD_CHR }, /*FRAC*/ { JE_SYN, JE_SYN, NS_FRAC, NS_FRAC,JE_SYN, NS_EX, NS_OK, JE_BAD_CHR }, -/*EX*/ { NS_EX1, NS_EX1, NS_EX1, NS_EX1, JE_SYN, JE_SYN, JE_SYN, JE_BAD_CHR }, -/*EX1*/ { JE_SYN, JE_SYN, NS_EX1, NS_EX1, JE_SYN, JE_SYN, JE_SYN, JE_BAD_CHR } +/*EX*/ { NS_EX, NS_EX, NS_EX1, NS_EX1, JE_SYN, JE_SYN, JE_SYN, JE_BAD_CHR }, +/*EX1*/ { JE_SYN, JE_SYN, NS_EX1, NS_EX1, JE_SYN, JE_SYN, NS_OK, JE_BAD_CHR } };