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

@ -19,7 +19,8 @@ static t_node* mysql_none_reserved_keywords_root = NULL;
static t_node* mysql_sql_keywords_in_pl_root = NULL;
/* List of non-reserved keywords */
static const NonReservedKeyword Mysql_none_reserved_keywords[] = {{"access", ACCESS},
static const NonReservedKeyword Mysql_none_reserved_keywords[] = {
{"access", ACCESS},
{"account", ACCOUNT},
{"action", ACTION},
{"activate", ACTIVATE},
@ -150,6 +151,7 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {{"access", ACC
{"dynamic", DYNAMIC},
{"default_tablegroup", DEFAULT_TABLEGROUP},
{"effective", EFFECTIVE},
{"empty", EMPTY},
{"enable", ENABLE},
{"encryption", ENCRYPTION},
{"end", END},
@ -242,6 +244,9 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {{"access", ACC
{"issuer", ISSUER},
{"job", JOB},
{"json", JSON},
{"json_arrayagg", JSON_ARRAYAGG},
{"json_objectagg", JSON_OBJECTAGG},
{"json_value", JSON_VALUE},
{"key_block_size", KEY_BLOCK_SIZE},
{"key_version", KEY_VERSION},
{"kvcache", KVCACHE},
@ -309,6 +314,7 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {{"access", ACC
{"max_used_part_id", MAX_USED_PART_ID},
{"max_user_connections", MAX_USER_CONNECTIONS},
{"medium", MEDIUM},
{"member", MEMBER},
{"memory", MEMORY},
{"memstore_percent", MEMSTORE_PERCENT},
{"memtable", MEMTABLE},
@ -461,6 +467,7 @@ static const NonReservedKeyword Mysql_none_reserved_keywords[] = {{"access", ACC
{"restore", RESTORE},
{"resume", RESUME},
{"returned_sqlstate", RETURNED_SQLSTATE},
{"returning", RETURNING},
{"returns", RETURNS},
{"reverse", REVERSE},
{"rewrite_merge_version", REWRITE_MERGE_VERSION},

View File

@ -18,7 +18,8 @@
#ifdef __cplusplus
extern "C" {
#endif
typedef enum ObItemType {
typedef enum ObItemType
{
T_INVALID = -1, // Attention: add a new type after T_INVALID
/* Literal data type tags, the same as ObObjType */
@ -77,6 +78,7 @@ typedef enum ObItemType {
T_NCHAR = 44,
T_UROWID = 45,
T_LOB = 46,
T_JSON = 47,
T_BOOL = 63, /*@todo remove later*/
T_MAX_CONST = 64,
@ -596,8 +598,39 @@ typedef enum ObItemType {
T_FUN_SYS_UTC_TIME = 1593,
T_FUN_SYS_UTC_DATE = 1594,
T_FUN_SYS_TIME_FORMAT = 1595,
///< @note add new oracle only function type before this line
T_FUN_SYS_CONVERT_TZ = 1596,
T_FUN_SYS_JSON_OBJECT = 1597,
T_FUN_SYS_JSON_EXTRACT = 1598,
T_FUN_SYS_JSON_CONTAINS = 1599,
T_FUN_SYS_JSON_CONTAINS_PATH = 1600,
T_FUN_SYS_JSON_DEPTH = 1601,
T_FUN_SYS_JSON_KEYS = 1602,
T_FUN_SYS_JSON_ARRAY = 1603,
T_FUN_SYS_JSON_QUOTE = 1604,
T_FUN_SYS_JSON_UNQUOTE = 1605,
T_FUN_SYS_JSON_OVERLAPS = 1606,
T_FUN_SYS_JSON_REMOVE = 1607,
T_FUN_SYS_JSON_SEARCH = 1608,
T_FUN_SYS_JSON_VALID = 1609,
T_FUN_SYS_JSON_ARRAY_APPEND = 1610,
T_FUN_SYS_JSON_ARRAY_INSERT = 1611,
T_FUN_SYS_JSON_REPLACE = 1612,
T_FUN_SYS_JSON_TYPE = 1613,
T_FUN_SYS_JSON_LENGTH = 1614,
T_FUN_SYS_JSON_INSERT = 1615,
T_FUN_SYS_JSON_STORAGE_SIZE = 1616,
T_FUN_SYS_JSON_STORAGE_FREE = 1617,
T_FUN_SYS_JSON_MERGE_PRESERVE = 1618,
T_FUN_SYS_JSON_MERGE = 1619,
T_FUN_SYS_JSON_MERGE_PATCH = 1620,
T_FUN_SYS_JSON_PRETTY = 1621,
T_FUN_SYS_JSON_SET = 1622,
T_FUN_SYS_JSON_MEMBER_OF = 1623,
T_FUN_SYS_JSON_VALUE = 1624,
T_FUN_JSON_ARRAYAGG = 1625,
T_FUN_JSON_OBJECTAGG = 1626,
///< @note add new oracle only function type before this line
T_FUN_SYS_END = 2000,
T_MAX_OP = 3000,
@ -1116,7 +1149,7 @@ typedef enum ObItemType {
T_EXTENDED,
T_PARTITIONS,
T_TRADITIONAL,
T_JSON,
T_FORMAT_JSON,
T_EXTENDED_NOADDR,
T_PLANREGRESS,
@ -1751,7 +1784,19 @@ typedef enum ObCacheType {
CACHE_TYPE_MAX // Attention: add a new type before CACHE_TYPE_MAX
} ObCacheType;
#define IS_BOOL_OP(op) (((op) >= T_OP_EQ && (op) <= T_OP_NOT_IN) || ((op) == T_OP_EXISTS) || ((op) == T_BOOL))
#define IS_BOOL_OP(op) \
(((op) >= T_OP_EQ && (op) <= T_OP_NOT_IN && (op) != T_OP_POW) \
|| ((op) == T_OP_EXISTS) \
|| ((op) == T_OP_XOR) \
|| ((op) == T_OP_NOT_EXISTS) \
|| ((op) == T_FUN_SYS_STRCMP) \
|| ((op) == T_FUN_SYS_JSON_VALID) \
|| ((op) == T_FUN_SYS_JSON_CONTAINS) \
|| ((op) == T_FUN_SYS_JSON_MEMBER_OF) \
|| ((op) == T_FUN_SYS_JSON_OVERLAPS) \
|| ((op) == T_FUN_SYS_JSON_CONTAINS) \
|| ((op) == T_FUN_SYS_JSON_CONTAINS_PATH) \
|| ((op) == T_BOOL)) \
#define IS_RANGE_CMP_OP(op) ((op) >= T_OP_LE && (op) <= T_OP_GT)
// we will extract query range from following OP expressions
@ -1804,6 +1849,7 @@ extern const char* get_type_name(int type);
(((op) >= T_FUN_MAX && (op) <= T_FUN_APPROX_COUNT_DISTINCT_SYNOPSIS_MERGE) || \
((op) >= T_FUN_CORR && (op) <= T_FUN_REGR_SXY) || \
((op) >= T_FUN_GROUP_RANK && (op) <= T_FUN_GROUP_PERCENTILE_DISC) || (op) == T_FUN_GROUPING || \
(op) == T_FUN_JSON_ARRAYAGG || (op) == T_FUN_JSON_OBJECTAGG || \
(op) == T_FUN_KEEP_WM_CONCAT || (op) == T_FUN_WM_CONCAT)
#define MAYBE_ROW_OP(op) ((op) >= T_OP_EQ && (op) <= T_OP_NE)
#define IS_PSEUDO_COLUMN_TYPE(op) \

View File

@ -120,7 +120,8 @@ typedef struct _ParseNode {
uint16_t is_assigned_from_child_ : 1;
uint16_t is_num_must_be_pos_ : 1;
uint16_t is_date_unit_ : 1;
uint16_t reserved_ : 3;
uint16_t is_literal_bool_ : 1; // indicate node is a literal TRUE/FALSE
uint16_t reserved_ : 2;
};
union {
int64_t value_;

View File

@ -1398,6 +1398,8 @@ BEGIN(in_c_comment);
"!="|"<>" {return COMP_NE;}
"<<" {return SHIFT_LEFT;}
">>" {return SHIFT_RIGHT;}
"->" {return JSON_EXTRACT;}
"->>" {return JSON_EXTRACT_UNQUOTED;}
"?" {
//use for outline now, means any value

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