support json type

This commit is contained in:
xj0
2022-02-08 14:58:13 +08:00
committed by LINxiansheng
parent 4b25bac8d0
commit e5f59ea074
241 changed files with 46116 additions and 749 deletions

View File

@ -102,6 +102,7 @@
%left '|'
%left '&'
%left SHIFT_LEFT SHIFT_RIGHT
%left JSON_EXTRACT JSON_EXTRACT_UNQUOTED MEMBER
%left '+' '-'
%left '*' '/' '%' MOD DIV POW
%left '^'
@ -214,7 +215,7 @@ END_P SET_VAR DELIMITER
DIRECTORY DISABLE DISCARD DISK DISKGROUP DO DUMP DUMPFILE DUPLICATE DUPLICATE_SCOPE DYNAMIC
DATABASE_ID DEFAULT_TABLEGROUP
EFFECTIVE ENABLE ENCRYPTION END ENDS ENGINE_ ENGINES ENUM ENTITY ERROR_CODE ERROR_P ERRORS
EFFECTIVE EMPTY ENABLE ENCRYPTION END ENDS ENGINE_ ENGINES ENUM ENTITY ERROR_CODE ERROR_P ERRORS
ESCAPE EVENT EVENTS EVERY EXCHANGE EXECUTE EXPANSION EXPIRE EXPIRE_INFO EXPORT OUTLINE EXTENDED
EXTENDED_NOADDR EXTENT_SIZE EXTRACT EXCEPT EXPIRED
@ -230,7 +231,7 @@ END_P SET_VAR DELIMITER
INNODB INSERT_METHOD INSTALL INSTANCE INVOKER IO IO_THREAD IPC ISOLATE ISOLATION ISSUER
IS_TENANT_SYS_POOL INVISIBLE MERGE ISNULL INTERSECT INCREMENTAL INNER_PARSE ILOGCACHE INPUT
JOB JSON
JOB JSON JSON_ARRAYAGG JSON_OBJECTAGG JSON_VALUE
KEY_BLOCK_SIZE KEY_VERSION KVCACHE
@ -246,7 +247,7 @@ END_P SET_VAR DELIMITER
MAX_UPDATES_PER_HOUR MAX_USER_CONNECTIONS MEDIUM MEMORY MEMTABLE MESSAGE_TEXT META MICROSECOND
MIGRATE MIN MIN_CPU MIN_IOPS MIN_MEMORY MINOR MIN_ROWS MINUS MINUTE MODE MODIFY MONTH MOVE
MULTILINESTRING MULTIPOINT MULTIPOLYGON MUTEX MYSQL_ERRNO MIGRATION MAX_USED_PART_ID MAXIMIZE
MATERIALIZED MEMSTORE_PERCENT
MATERIALIZED MEMBER MEMSTORE_PERCENT
NAME NAMES NATIONAL NCHAR NDB NDBCLUSTER NEW NEXT NO NOAUDIT NODEGROUP NONE NORMAL NOW NOWAIT
NO_WAIT NULLS NUMBER NVARCHAR NTILE NTH_VALUE NOARCHIVELOG NETWORK NOPARALLEL
@ -264,7 +265,7 @@ END_P SET_VAR DELIMITER
REBUILD RECOVER RECYCLE REDO_BUFFER_SIZE REDOFILE REDUNDANT REFRESH REGION RELAY RELAYLOG
RELAY_LOG_FILE RELAY_LOG_POS RELAY_THREAD RELOAD REMOVE REORGANIZE REPAIR REPEATABLE REPLICA
REPLICA_NUM REPLICA_TYPE REPLICATION REPORT RESET RESOURCE RESOURCE_POOL_LIST RESPECT RESTART
RESTORE RESUME RETURNED_SQLSTATE RETURNS REVERSE REWRITE_MERGE_VERSION ROLLBACK ROLLUP ROOT
RESTORE RESUME RETURNED_SQLSTATE RETURNING RETURNS REVERSE REWRITE_MERGE_VERSION ROLLBACK ROLLUP ROOT
ROOTTABLE ROOTSERVICE ROOTSERVICE_LIST ROUTINE ROW ROLLING ROW_COUNT ROW_FORMAT ROWS RTREE RUN
RECYCLEBIN ROTATE ROW_NUMBER RUDUNDANT RECURSIVE RANDOM REDO_TRANSPORT_OPTIONS REMOTE_OSS RT
RANK READ_ONLY RECOVERY
@ -347,7 +348,7 @@ END_P SET_VAR DELIMITER
%type <node> tracing_num_list
%type <node> qb_name_option
%type <node> join_condition inner_join_type opt_inner outer_join_type opt_outer natural_join_type except_full_outer_join_type opt_full_table_factor
%type <ival> string_length_i opt_string_length_i opt_string_length_i_v2 opt_int_length_i opt_bit_length_i opt_datetime_fsp_i opt_unsigned_i opt_zerofill_i opt_year_i opt_time_func_fsp_i
%type <ival> string_length_i opt_string_length_i opt_string_length_i_v2 opt_int_length_i opt_bit_length_i opt_datetime_fsp_i opt_unsigned_i opt_zerofill_i opt_year_i opt_time_func_fsp_i opt_cast_float_precision
%type <node> opt_float_precision opt_number_precision
%type <node> opt_equal_mark opt_default_mark read_only_or_write not not2 opt_disk_alias
%type <node> int_or_decimal
@ -429,6 +430,7 @@ END_P SET_VAR DELIMITER
%type <node> opt_force_purge
%type <node> opt_sql_throttle_for_priority opt_sql_throttle_using_cond sql_throttle_one_or_more_metrics sql_throttle_metric get_format_unit
%type <node> opt_copy_id opt_backup_dest opt_preview opt_backup_backup_dest opt_tenant_info opt_with_active_piece
%type <node> on_empty on_error json_on_response opt_returning_type opt_on_empty_or_error json_value_expr
%type <node> ws_nweights opt_ws_as_char opt_ws_levels ws_level_flag_desc ws_level_flag_reverse ws_level_flags ws_level_list ws_level_list_item ws_level_number ws_level_range ws_level_list_or_range
%start sql_stmt
@ -988,6 +990,11 @@ bool_pri IS NULLX %prec IS
}
;
opt_of:
OF
|
;
predicate:
bit_expr IN in_expr
{
@ -1199,6 +1206,17 @@ bit_expr IN in_expr
malloc_non_terminal_node(concat_node, result->malloc_pool_, T_FUN_SYS, 2, concat_node, string_list_node);
malloc_non_terminal_node($$, result->malloc_pool_, T_OP_NOT_REGEXP, 2, $1, concat_node);
}
| bit_expr MEMBER opt_of '(' simple_expr ')' %prec LOWER_THAN_COMP
{
(void)($2);
ParseNode *json_member_of_node = NULL;
make_name_node(json_member_of_node, result->malloc_pool_, "JSON_MEMBER_OF");
ParseNode *link_params = NULL;
malloc_non_terminal_node(link_params, result->malloc_pool_, T_LINK_NODE, 2, $1, $5);
ParseNode *params = NULL;
merge_nodes(params, result, T_EXPR_LIST, link_params);
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_SYS, 2, json_member_of_node, params);
}
| bit_expr %prec LOWER_THAN_COMP
{ $$ = $1; }
;
@ -1443,6 +1461,32 @@ simple_expr collation %prec NEG
{
malloc_non_terminal_node($$, result->malloc_pool_, T_OP_GET_USER_VAR, 1, $1);
}
| column_definition_ref JSON_EXTRACT complex_string_literal
{
ParseNode *json_extract_node = NULL;
make_name_node(json_extract_node, result->malloc_pool_, "JSON_EXTRACT");
ParseNode *link_params = NULL;
malloc_non_terminal_node(link_params, result->malloc_pool_, T_LINK_NODE, 2, $1, $3);
ParseNode *params = NULL;
merge_nodes(params, result, T_EXPR_LIST, link_params);
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_SYS, 2, json_extract_node, params);
store_pl_ref_object_symbol($$, result, REF_FUNC);
}
| column_definition_ref JSON_EXTRACT_UNQUOTED complex_string_literal
{
ParseNode *json_extract_node = NULL;
make_name_node(json_extract_node, result->malloc_pool_, "JSON_EXTRACT");
ParseNode *link_params = NULL;
malloc_non_terminal_node(link_params, result->malloc_pool_, T_LINK_NODE, 2, $1, $3);
ParseNode *params = NULL;
merge_nodes(params, result, T_EXPR_LIST, link_params);
malloc_non_terminal_node(json_extract_node, result->malloc_pool_, T_FUN_SYS, 2, json_extract_node, params);
ParseNode *json_unquoted_node = NULL;
make_name_node(json_unquoted_node, result->malloc_pool_, "JSON_UNQUOTE");
merge_nodes(params, result, T_EXPR_LIST, json_extract_node);
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_SYS, 2, json_unquoted_node, params);
store_pl_ref_object_symbol($$, result, REF_FUNC);
}
;
opt_mode_flag:
@ -1625,6 +1669,16 @@ COUNT '(' opt_all '*' ')' OVER new_generalized_window_clause
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_AVG, 2, $3, $4);
malloc_non_terminal_node($$, result->malloc_pool_, T_WINDOW_FUNCTION, 2, $$, $7);
}
| JSON_ARRAYAGG '(' opt_distinct_or_all expr ')' OVER new_generalized_window_clause
{
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_JSON_ARRAYAGG, 2, $3, $4);
malloc_non_terminal_node($$, result->malloc_pool_, T_WINDOW_FUNCTION, 2, $$, $7);
}
| JSON_OBJECTAGG '(' expr ',' expr ')' OVER new_generalized_window_clause
{
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_JSON_OBJECTAGG, 2, $3, $5);
malloc_non_terminal_node($$, result->malloc_pool_, T_WINDOW_FUNCTION, 2, $$, $8);
}
| STD '(' opt_all expr ')' OVER new_generalized_window_clause
{
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_STDDEV, 2, $3, $4);
@ -2052,6 +2106,14 @@ MOD '(' expr ',' expr ')'
{
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_AVG, 2, $3, $4);
}
| JSON_ARRAYAGG '(' opt_distinct_or_all expr ')'
{
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_JSON_ARRAYAGG, 2, $3, $4);
}
| JSON_OBJECTAGG '(' expr ',' expr ')'
{
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_JSON_OBJECTAGG, 2, $3, $5);
}
| STD '(' opt_all expr ')'
{
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_STDDEV, 2, $3, $4);
@ -2546,6 +2608,10 @@ MOD '(' expr ',' expr ')'
make_name_node($$, result->malloc_pool_, "weight_string");
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_SYS, 2, $$, params);
}
| json_value_expr
{
$$ = $1;
}
;
sys_interval_func:
@ -4075,6 +4141,12 @@ column_definition
malloc_non_terminal_node($$, result->malloc_pool_, T_CHECK_CONSTRAINT, 2, $2, $5);
$$->value_ = 1;
}
| CHECK '(' expr ')'
{
// just compatible with mysql, do nothing
(void)($3);
malloc_terminal_node($$, result->malloc_pool_, T_EMPTY);
}
| opt_constraint FOREIGN KEY opt_index_name '(' column_name_list ')' REFERENCES relation_factor '(' column_name_list ')' opt_match_option opt_reference_option_list
{
ParseNode *child_col_list= NULL;
@ -4235,6 +4307,12 @@ NOT NULLX
{
malloc_non_terminal_node($$, result->malloc_pool_, T_COLUMN_ID, 1, $2);
}
| CHECK '(' expr ')'
{
// just compatible with mysql, do nothing
(void)($3);
malloc_terminal_node($$, result->malloc_pool_, T_EMPTY);
}
;
opt_storage_type:
@ -4356,6 +4434,25 @@ BINARY opt_string_length_i_v2
$$->int16_values_[OB_NODE_CAST_N_SCALE_IDX] = -1; /* scale */
$$->param_num_ = 0;
}
| FLOAT opt_cast_float_precision
{ /* If p is provided and 0 <= < p <= 24, the result is of type FLOAT. */
/* If 25 <= p <= 53, the result is of type DOUBLE. If p < 0 or p > 53, an error is returned. */
malloc_terminal_node($$, result->malloc_pool_, T_CAST_ARGUMENT);
$$->value_ = 0;
$$->int16_values_[OB_NODE_CAST_TYPE_IDX] = T_FLOAT;
$$->int16_values_[OB_NODE_CAST_N_PREC_IDX] = $2[0]; /* precision */
$$->int16_values_[OB_NODE_CAST_N_SCALE_IDX] = -1; /* scale */
$$->param_num_ = $2[1]; /* param only use to choose float or double convert */
}
| JSON
{
malloc_terminal_node($$, result->malloc_pool_, T_CAST_ARGUMENT);
$$->value_ = 0;
$$->int16_values_[OB_NODE_CAST_TYPE_IDX] = T_JSON; /* data type */
$$->int16_values_[OB_NODE_CAST_COLL_IDX] = INVALID_COLLATION;
$$->int32_values_[OB_NODE_CAST_C_LEN_IDX] = 0; /* length */
$$->param_num_ = 0;
}
;
opt_integer:
@ -4367,6 +4464,7 @@ cast_datetime_type_i:
DATETIME { $$[0] = T_DATETIME; $$[1] = 0; }
| DATE { $$[0] = T_DATE; $$[1] = 0; }
| TIME { $$[0] = T_TIME; $$[1] = 0; }
| YEAR { $$[0] = T_YEAR; $$[1] = 0; }
;
get_format_unit:
@ -4532,6 +4630,11 @@ int_type_i opt_int_length_i opt_unsigned_i opt_zerofill_i
$$->int32_values_[0] = 0;//not used so far
$$->int32_values_[1] = 0; /* is char */
}
| JSON
{
malloc_terminal_node($$, result->malloc_pool_, T_JSON);
$$->int32_values_[0] = 0; /* length */
}
;
string_list:
@ -4668,7 +4771,12 @@ opt_year_i:
opt_datetime_fsp_i:
'(' INTNUM ')' { $$[0] = $2->value_; $$[1] = 1; }
| /*EMPTY*/ { $$[0] = 0; $$[1] = 0;}
| /*EMPTY*/ { $$[0] = 0; $$[1] = 0; }
;
opt_cast_float_precision:
'(' INTNUM ')' { $$[0] = $2->value_; $$[1] = 1; }
| /*EMPTY*/ { $$[0] = 0; $$[1] = 0;}
;
string_length_i:
@ -4902,6 +5010,12 @@ not NULLX
{
malloc_non_terminal_node($$, result->malloc_pool_, T_COLUMN_ID, 1, $2);
}
| CHECK '(' expr ')'
{
// just compatible with mysql, do nothing
(void)($3);
malloc_terminal_node($$, result->malloc_pool_, T_EMPTY);
}
;
now_or_signed_literal:
@ -9285,7 +9399,7 @@ format_name:
TRADITIONAL
{ malloc_terminal_node($$, result->malloc_pool_, T_TRADITIONAL); }
| JSON
{ malloc_terminal_node($$, result->malloc_pool_, T_JSON); }
{ malloc_terminal_node($$, result->malloc_pool_, T_FORMAT_JSON); }
;
@ -13304,6 +13418,145 @@ DAY
}
;
/*===========================================================
*
* json value
*
*===========================================================*/
json_value_expr:
JSON_VALUE '(' simple_expr ',' complex_string_literal opt_returning_type opt_on_empty_or_error ')'
{
ParseNode *empty_value = $7->children_[1];
ParseNode *error_value = $7->children_[3];
malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_SYS_JSON_VALUE, 7, $3, $5, $6, $7->children_[0], empty_value, $7->children_[2], error_value);
}
;
opt_returning_type:
RETURNING cast_data_type
{
$$ = $2;
}
| // The default returning type is CHAR(512).
{
malloc_terminal_node($$, result->malloc_pool_, T_CAST_ARGUMENT);
$$->value_ = 0;
$$->int16_values_[OB_NODE_CAST_TYPE_IDX] = T_CHAR; // to keep consitent with mysql
$$->int16_values_[OB_NODE_CAST_COLL_IDX] = INVALID_COLLATION; /* is char */
$$->int32_values_[OB_NODE_CAST_C_LEN_IDX] = 512; /* length */
$$->param_num_ = 1; /* 1 */
$$->is_hidden_const_ = 1;
}
;
opt_on_empty_or_error:
/* empty */
{
ParseNode *empty_type = NULL;
malloc_terminal_node(empty_type, result->malloc_pool_, T_INT);
empty_type->value_ = 3;
empty_type->is_hidden_const_ = 1;
ParseNode *empty_node = NULL;
malloc_terminal_node(empty_node, result->malloc_pool_, T_NULL);
empty_node->is_hidden_const_ = 1;
ParseNode *error_type = NULL;
malloc_terminal_node(error_type, result->malloc_pool_, T_INT);
error_type->value_ = 3;
error_type->is_hidden_const_ = 1;
ParseNode *error_node = NULL;
malloc_terminal_node(error_node, result->malloc_pool_, T_NULL);
error_node->is_hidden_const_ = 1;
malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 4, empty_type, empty_node, error_type, error_node);
}
| on_empty
{
ParseNode *error_type = NULL;
malloc_terminal_node(error_type, result->malloc_pool_, T_INT);
error_type->value_ = 3;
error_type->is_hidden_const_ = 1;
ParseNode *error_node = NULL;
malloc_terminal_node(error_node, result->malloc_pool_, T_NULL);
error_node->is_hidden_const_ = 1;
malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 4, $1->children_[0], $1->children_[1], error_type, error_node);
}
| on_error
{
ParseNode *empty_type = NULL;
malloc_terminal_node(empty_type, result->malloc_pool_, T_INT);
empty_type->value_ = 3;
empty_type->is_hidden_const_ = 1;
ParseNode *empty_node = NULL;
malloc_terminal_node(empty_node, result->malloc_pool_, T_NULL);
empty_node->is_hidden_const_ = 1;
malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 4, empty_type, empty_node, $1->children_[0], $1->children_[1]);
}
| on_empty on_error
{
malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 4, $1->children_[0], $1->children_[1], $2->children_[0], $2->children_[1]);
}
on_empty:
json_on_response ON EMPTY
{
$$ = $1;
}
;
on_error:
json_on_response ON ERROR_P
{
$$ = $1;
}
;
// type : { error : 0, null : 1, default : 2, implict : 3 }
json_on_response:
ERROR_P
{
ParseNode *type_node = NULL;
malloc_terminal_node(type_node, result->malloc_pool_, T_INT);
type_node->value_ = 0;
type_node->is_hidden_const_ = 1;
ParseNode *v_node = NULL;
malloc_terminal_node(v_node, result->malloc_pool_, T_NULL);
v_node->is_hidden_const_ = 1;
malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 2, type_node, v_node);
}
| NULLX
{
(void)($1) ; /* make bison mute */
ParseNode *type_node = NULL;
malloc_terminal_node(type_node, result->malloc_pool_, T_INT);
type_node->value_ = 1;
type_node->is_hidden_const_ = 1;
ParseNode *v_node = NULL;
malloc_terminal_node(v_node, result->malloc_pool_, T_NULL);
malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 2, type_node, v_node);
}
| DEFAULT signed_literal
{
ParseNode *type_node = NULL;
malloc_terminal_node(type_node, result->malloc_pool_, T_INT);
type_node->value_ = 2;
type_node->is_hidden_const_ = 1;
malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 2, type_node, $2);
}
;
unreserved_keyword:
unreserved_keyword_normal { $$=$1;}
| unreserved_keyword_special { $$=$1;}
@ -13451,6 +13704,7 @@ ACCOUNT
| DYNAMIC
| DEFAULT_TABLEGROUP
| EFFECTIVE
| EMPTY
| ENABLE
| ENCRYPTION
| END
@ -13543,6 +13797,9 @@ ACCOUNT
| ISSUER
| JOB
| JSON
| JSON_VALUE
| JSON_ARRAYAGG
| JSON_OBJECTAGG
| KEY_BLOCK_SIZE
| KEY_VERSION
| LAG
@ -13604,6 +13861,7 @@ ACCOUNT
| MAX_UPDATES_PER_HOUR
| MAX_USER_CONNECTIONS
| MEDIUM
| MEMBER
| MEMORY
| MEMTABLE
| MERGE
@ -13753,6 +14011,7 @@ ACCOUNT
| RESTORE
| RESUME
| RETURNED_SQLSTATE
| RETURNING
| RETURNS
| REVERSE
| REWRITE_MERGE_VERSION