mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-11461 JSON_TYPE does not recognize integer/double types.
Integer/Double recognition added.
This commit is contained in:
@ -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)
|
||||
|
Reference in New Issue
Block a user