Commit 78dc7c3a authored by Alexey Botchkov's avatar Alexey Botchkov

MDEV-11461 JSON_TYPE does not recognize integer/double types.

        Integer/Double recognition added.
parent 54545005
......@@ -172,6 +172,14 @@ enum json_value_types
};
enum json_num_flags
{
JSON_NUM_NEG=1, /* Number is negative. */
JSON_NUM_FRAC_PART=2, /* The fractional part is not empty. */
JSON_NUM_EXP=4, /* The number has the 'e' part. */
};
typedef struct st_json_engine_t
{
json_string_t s; /* String to parse. */
......@@ -185,6 +193,9 @@ typedef struct st_json_engine_t
enum json_value_types value_type; /* type of the value.*/
const uchar *value; /* Points to the value. */
const uchar *value_begin;/* Points to where the value starts in the JSON. */
uint num_flags; /* the details of the JSON_VALUE_NUMBER, is it negative,
or if it has the fractional part.
See the enum json_num_flags. */
/*
In most cases the 'value' and 'value_begin' are equal.
......
......@@ -215,7 +215,10 @@ json_type("true")
BOOLEAN
select json_type('123');
json_type('123')
NUMBER
INTEGER
select json_type('123.12');
json_type('123.12')
DOUBLE
select json_keys('{"a":{"c":1, "d":2}, "b":2}');
json_keys('{"a":{"c":1, "d":2}, "b":2}')
["a", "b"]
......
......@@ -93,6 +93,7 @@ select json_type('{"k1":123, "k2":345}');
select json_type('[123, "k2", 345]');
select json_type("true");
select json_type('123');
select json_type('123.12');
select json_keys('{"a":{"c":1, "d":2}, "b":2}');
select json_keys('{"a":{"c":1, "d":2}, "b":2}', "$.a");
......
......@@ -1310,7 +1310,7 @@ String *Item_func_json_type::val_str(String *str)
type= "STRING";
break;
case JSON_VALUE_NUMBER:
type= "NUMBER";
type= (je.num_flags & JSON_NUM_FRAC_PART) ? "DOUBLE" : "INTEGER";
break;
case JSON_VALUE_TRUE:
case JSON_VALUE_FALSE:
......
......@@ -477,13 +477,29 @@ static int json_num_states[NS_NUM_STATES][N_NUM_CLASSES]=
};
static uint json_num_state_flags[NS_NUM_STATES]=
{
/*OK*/ 0,
/*GO*/ 0,
/*GO1*/ JSON_NUM_NEG,
/*ZERO*/ 0,
/*ZE1*/ 0,
/*INT*/ 0,
/*FRAC*/ JSON_NUM_FRAC_PART,
/*EX*/ JSON_NUM_EXP,
/*EX1*/ 0,
};
static int skip_num_constant(json_engine_t *j)
{
int state= json_num_states[NS_GO][json_num_chr_map[j->s.c_next]];
int c_len;
j->num_flags= 0;
for (;;)
{
j->num_flags|= json_num_state_flags[state];
if ((c_len= json_next_char(&j->s)) > 0)
{
if ((state= json_num_states[state][json_num_chr_map[j->s.c_next]]) > 0)
......
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