|
|
|
|
@ -210,7 +210,6 @@ SELECT_HINT_BEGIN UPDATE_HINT_BEGIN DELETE_HINT_BEGIN INSERT_HINT_BEGIN REPLACE_
|
|
|
|
|
LOAD_DATA_HINT_BEGIN CREATE_HINT_BEGIN ALTER_HINT_BEGIN
|
|
|
|
|
END_P SET_VAR DELIMITER
|
|
|
|
|
|
|
|
|
|
/*reserved keyword*/
|
|
|
|
|
%token <reserved_keyword>
|
|
|
|
|
/*
|
|
|
|
|
* MySQL 5.7 Reserved Keywords(mysql5.7一共有235个保留关键字,这里兼容mysql5.7的229个,NULL关键字在
|
|
|
|
|
@ -220,6 +219,7 @@ END_P SET_VAR DELIMITER
|
|
|
|
|
* https://dev.mysql.com/doc/refman/5.7/en/keywords.html
|
|
|
|
|
* 注意!!!非特殊情况,禁止将关键字放到该区域
|
|
|
|
|
* */
|
|
|
|
|
//-----------------------------reserved keyword begin-----------------------------------------------
|
|
|
|
|
ACCESSIBLE ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE
|
|
|
|
|
BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY
|
|
|
|
|
CALL CASCADE CASE CHANGE CHAR CHARACTER CHECK COLLATE COLUMN CONDITION CONSTRAINT CONTINUE
|
|
|
|
|
@ -256,12 +256,13 @@ END_P SET_VAR DELIMITER
|
|
|
|
|
|
|
|
|
|
/*OB 特有的保留关键字*/
|
|
|
|
|
TABLEGROUP
|
|
|
|
|
|
|
|
|
|
//-----------------------------reserved keyword end-------------------------------------------------
|
|
|
|
|
%token <non_reserved_keyword>
|
|
|
|
|
//-----------------------------non_reserved keyword begin-------------------------------------------
|
|
|
|
|
ACCESS ACCOUNT ACTION ACTIVE ADDDATE AFTER AGAINST AGGREGATE ALGORITHM ALL_META ALL_USER ALWAYS ANALYSE ANY
|
|
|
|
|
APPROX_COUNT_DISTINCT APPROX_COUNT_DISTINCT_SYNOPSIS APPROX_COUNT_DISTINCT_SYNOPSIS_MERGE
|
|
|
|
|
ARBITRATION ASCII AT AUTHORS AUTO AUTOEXTEND_SIZE AUTO_INCREMENT AUTO_INCREMENT_MODE AVG AVG_ROW_LENGTH
|
|
|
|
|
ACTIVATE AVAILABILITY ARCHIVELOG ASYNCHRONOUS AUDIT
|
|
|
|
|
ACTIVATE AVAILABILITY ARCHIVELOG ASYNCHRONOUS AUDIT ADMIN
|
|
|
|
|
|
|
|
|
|
BACKUP BACKUP_COPIES BALANCE BANDWIDTH BASE BASELINE BASELINE_ID BASIC BEGI BINDING SHARDING BINLOG BIT BIT_AND
|
|
|
|
|
BIT_OR BIT_XOR BLOCK BLOCK_INDEX BLOCK_SIZE BLOOM_FILTER BOOL BOOLEAN BOOTSTRAP BTREE BYTE
|
|
|
|
|
@ -338,7 +339,7 @@ END_P SET_VAR DELIMITER
|
|
|
|
|
RESTORE RESUME RETURNED_SQLSTATE RETURNS RETURNING REVERSE ROLLBACK ROLLUP ROOT
|
|
|
|
|
ROOTTABLE ROOTSERVICE ROOTSERVICE_LIST ROUTINE ROW ROLLING ROWID ROW_COUNT ROW_FORMAT ROWS RTREE RUN
|
|
|
|
|
RECYCLEBIN ROTATE ROW_NUMBER RUDUNDANT RECURSIVE RANDOM REDO_TRANSPORT_OPTIONS REMOTE_OSS RT
|
|
|
|
|
RANK READ_ONLY RECOVERY REJECT
|
|
|
|
|
RANK READ_ONLY RECOVERY REJECT ROLE
|
|
|
|
|
|
|
|
|
|
SAMPLE SAVEPOINT SCHEDULE SCHEMA_NAME SCN SCOPE SECOND SECURITY SEED SEQUENCES SERIAL SERIALIZABLE SERVER
|
|
|
|
|
SERVER_IP SERVER_PORT SERVER_TYPE SERVICE SESSION SESSION_USER SET_MASTER_CLUSTER SET_SLAVE_CLUSTER
|
|
|
|
|
@ -439,17 +440,18 @@ END_P SET_VAR DELIMITER
|
|
|
|
|
%type <ival> opt_scope opt_drop_behavior opt_integer scope_or_scope_alias global_or_session_alias
|
|
|
|
|
%type <ival> int_type_i float_type_i datetime_type_i date_year_type_i cast_datetime_type_i text_type_i blob_type_i
|
|
|
|
|
%type <node> create_user_stmt user_specification user_specification_list user password opt_host_name user_with_host_name opt_auth_plugin
|
|
|
|
|
%type <node> drop_user_stmt user_list
|
|
|
|
|
%type <node> drop_user_stmt user_list user_specification_without_password user_specification_with_password
|
|
|
|
|
%type <node> create_role_stmt drop_role_stmt role_list role_with_host role user_specification_without_password_list
|
|
|
|
|
%type <node> set_password_stmt opt_for_user
|
|
|
|
|
%type <node> rename_user_stmt rename_info rename_list
|
|
|
|
|
%type <node> rename_table_stmt rename_table_actions rename_table_action
|
|
|
|
|
%type <node> truncate_table_stmt
|
|
|
|
|
%type <node> lock_user_stmt lock_spec_mysql57
|
|
|
|
|
%type <node> grant_stmt grant_privileges priv_type_list priv_type priv_level opt_privilege grant_options
|
|
|
|
|
%type <node> revoke_stmt
|
|
|
|
|
%type <node> opt_limit opt_for_grant_user
|
|
|
|
|
%type <node> grant_stmt grant_privileges role_or_priv_list role_or_priv priv_level opt_privilege grant_options object_type
|
|
|
|
|
%type <node> revoke_stmt opt_with_admin_option opt_ignore_unknown_user set_role_stmt default_set_role_clause set_role_clause
|
|
|
|
|
%type <node> opt_limit opt_for_grant_user opt_using_role
|
|
|
|
|
%type <node> parameterized_trim
|
|
|
|
|
%type <ival> opt_with_consistent_snapshot opt_config_scope opt_index_keyname opt_full
|
|
|
|
|
%type <ival> opt_with_consistent_snapshot opt_config_scope opt_index_keyname opt_full opt_extended opt_extended_or_full
|
|
|
|
|
%type <node> opt_work begin_stmt commit_stmt rollback_stmt opt_ignore xa_begin_stmt xa_end_stmt xa_prepare_stmt xa_commit_stmt xa_rollback_stmt
|
|
|
|
|
%type <node> alter_table_stmt alter_table_actions alter_table_action_list alter_table_action alter_column_option alter_index_option alter_constraint_option standalone_alter_action alter_partition_option opt_to alter_tablegroup_option opt_table opt_tablegroup_option_list alter_tg_partition_option alter_column_group_option
|
|
|
|
|
%type <node> tablegroup_option_list tablegroup_option alter_tablegroup_actions alter_tablegroup_action tablegroup_option_list_space_seperated
|
|
|
|
|
@ -464,7 +466,7 @@ END_P SET_VAR DELIMITER
|
|
|
|
|
%type <node> opt_when check_state constraint_definition
|
|
|
|
|
%type <node> create_mlog_stmt opt_mlog_option_list opt_mlog_options mlog_option opt_mlog_with mlog_with_values mlog_with_special_columns mlog_with_reference_columns mlog_with_special_column_list mlog_with_reference_column_list mlog_with_special_column mlog_with_reference_column opt_mlog_new_values mlog_including_or_excluding opt_mlog_purge mlog_purge_values mlog_purge_immediate_sync_or_async mlog_purge_start mlog_purge_next
|
|
|
|
|
%type <node> drop_mlog_stmt
|
|
|
|
|
%type <non_reserved_keyword> unreserved_keyword unreserved_keyword_normal unreserved_keyword_special unreserved_keyword_extra
|
|
|
|
|
%type <non_reserved_keyword> unreserved_keyword unreserved_keyword_normal unreserved_keyword_special unreserved_keyword_extra unreserved_keyword_ambiguous_roles unreserved_keyword_for_role_name
|
|
|
|
|
%type <reserved_keyword> mysql_reserved_keyword
|
|
|
|
|
%type <ival> set_type_other set_type_union audit_by_session_access_option audit_whenever_option audit_or_noaudit
|
|
|
|
|
%type <ival> consistency_level use_plan_cache_type
|
|
|
|
|
@ -618,6 +620,9 @@ stmt:
|
|
|
|
|
| deallocate_prepare_stmt { $$ = $1; check_question_mark($$, result); }
|
|
|
|
|
| create_user_stmt { $$ = $1; check_question_mark($$, result); }
|
|
|
|
|
| drop_user_stmt { $$ = $1; check_question_mark($$, result); }
|
|
|
|
|
| create_role_stmt { $$ = $1; check_question_mark($$, result); }
|
|
|
|
|
| drop_role_stmt { $$ = $1; check_question_mark($$, result); }
|
|
|
|
|
| set_role_stmt { $$ = $1; check_question_mark($$, result); }
|
|
|
|
|
| set_password_stmt { $$ = $1; check_question_mark($$, result); }
|
|
|
|
|
| rename_user_stmt { $$ = $1; check_question_mark($$, result); }
|
|
|
|
|
| lock_user_stmt { $$ = $1; check_question_mark($$, result); }
|
|
|
|
|
@ -13330,7 +13335,7 @@ CLASS_ORIGIN
|
|
|
|
|
*
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
show_stmt:
|
|
|
|
|
SHOW opt_full TABLES opt_from_or_in_database_clause opt_show_condition
|
|
|
|
|
SHOW opt_extended_or_full TABLES opt_from_or_in_database_clause opt_show_condition
|
|
|
|
|
{
|
|
|
|
|
ParseNode *value = NULL;
|
|
|
|
|
malloc_terminal_node(value, result->malloc_pool_, T_INT);
|
|
|
|
|
@ -13343,7 +13348,7 @@ SHOW opt_full TABLES opt_from_or_in_database_clause opt_show_condition
|
|
|
|
|
//(void)$3;
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_DATABASES, 2, $4, $3);
|
|
|
|
|
}
|
|
|
|
|
| SHOW opt_full columns_or_fields from_or_in relation_factor opt_from_or_in_database_clause opt_show_condition
|
|
|
|
|
| SHOW opt_extended_or_full columns_or_fields from_or_in relation_factor opt_from_or_in_database_clause opt_show_condition
|
|
|
|
|
{
|
|
|
|
|
(void)$3;
|
|
|
|
|
(void)$4;
|
|
|
|
|
@ -13424,9 +13429,13 @@ SHOW opt_full TABLES opt_from_or_in_database_clause opt_show_condition
|
|
|
|
|
malloc_non_terminal_node(fun, result->malloc_pool_, T_FUN_COUNT, 1, node);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_ERRORS, 1, fun);
|
|
|
|
|
}
|
|
|
|
|
| SHOW GRANTS opt_for_grant_user
|
|
|
|
|
| SHOW GRANTS opt_for_grant_user opt_using_role
|
|
|
|
|
{
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_GRANTS, 1, $3);
|
|
|
|
|
if (NULL != $4 && NULL == $3) {
|
|
|
|
|
yyerror(&@4, result, "");
|
|
|
|
|
YYERROR;
|
|
|
|
|
}
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_GRANTS, 2, $3, $4);
|
|
|
|
|
}
|
|
|
|
|
| SHOW charset_key opt_show_condition
|
|
|
|
|
{
|
|
|
|
|
@ -13489,11 +13498,14 @@ SHOW opt_full TABLES opt_from_or_in_database_clause opt_show_condition
|
|
|
|
|
{
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_PARAMETERS, 2, $3, $4);
|
|
|
|
|
}
|
|
|
|
|
| SHOW index_or_indexes_or_keys from_or_in relation_factor opt_from_or_in_database_clause opt_where
|
|
|
|
|
| SHOW opt_extended index_or_indexes_or_keys from_or_in relation_factor opt_from_or_in_database_clause opt_where
|
|
|
|
|
{
|
|
|
|
|
(void)$2;//useless
|
|
|
|
|
(void)$3;//useless
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_INDEXES, 3, $4, $5, $6);
|
|
|
|
|
(void)$4;//useless
|
|
|
|
|
ParseNode *value = NULL;
|
|
|
|
|
malloc_terminal_node(value, result->malloc_pool_, T_INT);
|
|
|
|
|
value->value_ = $2[0];
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_INDEXES, 4, $5, $6, $7, value);
|
|
|
|
|
}
|
|
|
|
|
| SHOW opt_full PROCESSLIST
|
|
|
|
|
{
|
|
|
|
|
@ -13584,6 +13596,15 @@ opt_for_user
|
|
|
|
|
{ $$ = NULL; }
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
opt_using_role:
|
|
|
|
|
USING role_list
|
|
|
|
|
{
|
|
|
|
|
merge_nodes($$, result, T_USERS, $2);
|
|
|
|
|
}
|
|
|
|
|
| /* EMPTY */
|
|
|
|
|
{ $$ = NULL; }
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
opt_status:
|
|
|
|
|
STATUS { malloc_terminal_node($$, result->malloc_pool_, T_SHOW_STATUS); }
|
|
|
|
|
| /* EMPTY */ { $$ = NULL; }
|
|
|
|
|
@ -13888,6 +13909,17 @@ WITH STRING_VALUE
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
user_specification:
|
|
|
|
|
user_specification_without_password
|
|
|
|
|
{
|
|
|
|
|
$$ = $1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
user_specification_with_password
|
|
|
|
|
{
|
|
|
|
|
$$ = $1;
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
user_specification_without_password:
|
|
|
|
|
user opt_host_name
|
|
|
|
|
{
|
|
|
|
|
ParseNode *need_enc_node = NULL;
|
|
|
|
|
@ -13895,7 +13927,10 @@ user opt_host_name
|
|
|
|
|
need_enc_node->value_ = 0;
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER_SPEC, 5, $1, NULL, need_enc_node, $2, NULL);
|
|
|
|
|
}
|
|
|
|
|
| user opt_host_name IDENTIFIED opt_auth_plugin BY password
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
user_specification_with_password:
|
|
|
|
|
user opt_host_name IDENTIFIED opt_auth_plugin BY password
|
|
|
|
|
{
|
|
|
|
|
ParseNode *need_enc_node = NULL;
|
|
|
|
|
malloc_terminal_node(need_enc_node, result->malloc_pool_, T_BOOL);
|
|
|
|
|
@ -14080,6 +14115,78 @@ user_with_host_name
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* role grammar
|
|
|
|
|
*
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
create_role_stmt:
|
|
|
|
|
create_with_opt_hint ROLE opt_if_not_exists role_list
|
|
|
|
|
{
|
|
|
|
|
ParseNode *role_list_node = NULL;
|
|
|
|
|
(void)($1);
|
|
|
|
|
merge_nodes(role_list_node, result, T_USERS, $4);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_ROLE, 2, role_list_node, $3);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
role_list:
|
|
|
|
|
role_with_host
|
|
|
|
|
{
|
|
|
|
|
$$ = $1;
|
|
|
|
|
}
|
|
|
|
|
| role_list ',' role_with_host
|
|
|
|
|
{
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 2, $1, $3);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
user_specification_without_password_list:
|
|
|
|
|
user_specification_without_password
|
|
|
|
|
{
|
|
|
|
|
$$ = $1;
|
|
|
|
|
}
|
|
|
|
|
| user_specification_without_password_list ',' user_specification_without_password
|
|
|
|
|
{
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 2, $1, $3);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
drop_role_stmt:
|
|
|
|
|
DROP ROLE opt_if_not_exists user_list
|
|
|
|
|
{
|
|
|
|
|
ParseNode *user_list_node = NULL;
|
|
|
|
|
merge_nodes(user_list_node, result, T_USERS, $4);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_DROP_ROLE, 2, user_list_node, $3);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
role_with_host:
|
|
|
|
|
role opt_host_name
|
|
|
|
|
{
|
|
|
|
|
ParseNode *need_enc_node = NULL;
|
|
|
|
|
malloc_terminal_node(need_enc_node, result->malloc_pool_, T_BOOL);
|
|
|
|
|
need_enc_node->value_ = 0;
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER_SPEC, 5, $1, NULL, need_enc_node, $2, NULL);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
role:
|
|
|
|
|
STRING_VALUE
|
|
|
|
|
{
|
|
|
|
|
$$ = $1;
|
|
|
|
|
}
|
|
|
|
|
| NAME_OB
|
|
|
|
|
{
|
|
|
|
|
$$ = $1;
|
|
|
|
|
}
|
|
|
|
|
| unreserved_keyword_for_role_name
|
|
|
|
|
{
|
|
|
|
|
get_non_reserved_node($$, result->malloc_pool_, @1.first_column, @1.last_column);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* set password grammar
|
|
|
|
|
@ -14692,12 +14799,53 @@ GRANT grant_privileges ON priv_level TO user_specification_list grant_options
|
|
|
|
|
merge_nodes(privileges_node, result, T_PRIVILEGES, privileges_list_node);
|
|
|
|
|
merge_nodes(users_node, result, T_USERS, $6);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_GRANT,
|
|
|
|
|
3, privileges_node, $4, users_node);
|
|
|
|
|
4, privileges_node, NULL, $4, users_node);
|
|
|
|
|
}
|
|
|
|
|
| GRANT grant_privileges ON object_type priv_level TO user_specification_list grant_options
|
|
|
|
|
{
|
|
|
|
|
ParseNode *privileges_list_node = NULL;
|
|
|
|
|
ParseNode *privileges_node = NULL;
|
|
|
|
|
ParseNode *users_node = NULL;
|
|
|
|
|
malloc_non_terminal_node(privileges_list_node, result->malloc_pool_,
|
|
|
|
|
T_LINK_NODE, 2, $2, $8);
|
|
|
|
|
merge_nodes(privileges_node, result, T_PRIVILEGES, privileges_list_node);
|
|
|
|
|
merge_nodes(users_node, result, T_USERS, $7);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_GRANT,
|
|
|
|
|
4, privileges_node, $4, $5, users_node);
|
|
|
|
|
}
|
|
|
|
|
| GRANT role_or_priv_list TO user_specification_without_password_list opt_with_admin_option
|
|
|
|
|
{
|
|
|
|
|
ParseNode *roles_node = NULL;
|
|
|
|
|
ParseNode *grantees_node = NULL;
|
|
|
|
|
ParseNode *grantees_list = NULL;
|
|
|
|
|
|
|
|
|
|
merge_nodes(roles_node, result, T_USERS, $2);
|
|
|
|
|
merge_nodes(grantees_list, result, T_USERS, $4);
|
|
|
|
|
malloc_non_terminal_node(grantees_node, result->malloc_pool_, T_USERS, 1, grantees_list);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < roles_node->num_child_; i++) {
|
|
|
|
|
if (T_PRIV_TYPE == roles_node->children_[i]->type_) {
|
|
|
|
|
yyerror(&@2, result, "");
|
|
|
|
|
YYERROR;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_GRANT_ROLE, 3, roles_node, grantees_node, $5);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
opt_with_admin_option:
|
|
|
|
|
WITH ADMIN OPTION
|
|
|
|
|
{
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_WITH_ADMIN_OPTION);
|
|
|
|
|
}
|
|
|
|
|
| /*empty*/
|
|
|
|
|
{
|
|
|
|
|
$$ = NULL;
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
grant_privileges:
|
|
|
|
|
priv_type_list
|
|
|
|
|
role_or_priv_list
|
|
|
|
|
{
|
|
|
|
|
$$ = $1;
|
|
|
|
|
}
|
|
|
|
|
@ -14709,25 +14857,29 @@ priv_type_list
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
priv_type_list:
|
|
|
|
|
priv_type
|
|
|
|
|
role_or_priv_list:
|
|
|
|
|
role_or_priv
|
|
|
|
|
{
|
|
|
|
|
$$ = $1;
|
|
|
|
|
}
|
|
|
|
|
| priv_type_list ',' priv_type
|
|
|
|
|
| role_or_priv_list ',' role_or_priv
|
|
|
|
|
{
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 2, $1, $3);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
priv_type:
|
|
|
|
|
alter_with_opt_hint
|
|
|
|
|
role_or_priv:
|
|
|
|
|
role_with_host
|
|
|
|
|
{
|
|
|
|
|
$$ = $1;
|
|
|
|
|
}
|
|
|
|
|
| alter_with_opt_hint
|
|
|
|
|
{
|
|
|
|
|
(void)($1);
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE);
|
|
|
|
|
$$->value_ = OB_PRIV_ALTER;
|
|
|
|
|
}
|
|
|
|
|
|create_with_opt_hint
|
|
|
|
|
| create_with_opt_hint
|
|
|
|
|
{
|
|
|
|
|
(void)($1);
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE);
|
|
|
|
|
@ -14769,6 +14921,27 @@ alter_with_opt_hint
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE);
|
|
|
|
|
$$->value_ = OB_PRIV_SELECT;
|
|
|
|
|
}
|
|
|
|
|
| INSERT '(' column_name_list ')'
|
|
|
|
|
{
|
|
|
|
|
ParseNode *col_list = NULL;
|
|
|
|
|
merge_nodes(col_list, result, T_COLUMN_LIST, $3);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE, 1, col_list);
|
|
|
|
|
$$->value_ = OB_PRIV_INSERT;
|
|
|
|
|
}
|
|
|
|
|
| UPDATE '(' column_name_list ')'
|
|
|
|
|
{
|
|
|
|
|
ParseNode *col_list = NULL;
|
|
|
|
|
merge_nodes(col_list, result, T_COLUMN_LIST, $3);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE, 1, col_list);
|
|
|
|
|
$$->value_ = OB_PRIV_UPDATE;
|
|
|
|
|
}
|
|
|
|
|
| SELECT '(' column_name_list ')'
|
|
|
|
|
{
|
|
|
|
|
ParseNode *col_list = NULL;
|
|
|
|
|
merge_nodes(col_list, result, T_COLUMN_LIST, $3);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE, 1, col_list);
|
|
|
|
|
$$->value_ = OB_PRIV_SELECT;
|
|
|
|
|
}
|
|
|
|
|
| INDEX
|
|
|
|
|
{
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE);
|
|
|
|
|
@ -14854,7 +15027,21 @@ alter_with_opt_hint
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE);
|
|
|
|
|
$$->value_ = OB_PRIV_CREATE_DATABASE_LINK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
| EXECUTE
|
|
|
|
|
{
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE);
|
|
|
|
|
$$->value_ = OB_PRIV_EXECUTE;
|
|
|
|
|
}
|
|
|
|
|
| ALTER ROUTINE
|
|
|
|
|
{
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE);
|
|
|
|
|
$$->value_ = OB_PRIV_ALTER_ROUTINE;
|
|
|
|
|
}
|
|
|
|
|
| CREATE ROUTINE
|
|
|
|
|
{
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_PRIV_TYPE);
|
|
|
|
|
$$->value_ = OB_PRIV_CREATE_ROUTINE;
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
opt_privilege:
|
|
|
|
|
@ -14868,6 +15055,24 @@ PRIVILEGES
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
object_type:
|
|
|
|
|
TABLE
|
|
|
|
|
{
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_PRIV_OBJECT);
|
|
|
|
|
$$->value_ = 1;
|
|
|
|
|
}
|
|
|
|
|
| PROCEDURE
|
|
|
|
|
{
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_PRIV_OBJECT);
|
|
|
|
|
$$->value_ = 2;
|
|
|
|
|
}
|
|
|
|
|
| FUNCTION
|
|
|
|
|
{
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_PRIV_OBJECT);
|
|
|
|
|
$$->value_ = 3;
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
priv_level:
|
|
|
|
|
'*'
|
|
|
|
|
{
|
|
|
|
|
@ -14922,22 +15127,63 @@ WITH GRANT OPTION
|
|
|
|
|
*
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
revoke_stmt:
|
|
|
|
|
REVOKE grant_privileges ON priv_level FROM user_list
|
|
|
|
|
REVOKE opt_if_exists grant_privileges ON priv_level FROM user_list opt_ignore_unknown_user
|
|
|
|
|
{
|
|
|
|
|
ParseNode *privileges_node = NULL;
|
|
|
|
|
ParseNode *users_node = NULL;
|
|
|
|
|
merge_nodes(privileges_node, result, T_PRIVILEGES, $2);
|
|
|
|
|
merge_nodes(users_node, result, T_USERS, $6);
|
|
|
|
|
merge_nodes(privileges_node, result, T_PRIVILEGES, $3);
|
|
|
|
|
merge_nodes(users_node, result, T_USERS, $7);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_REVOKE,
|
|
|
|
|
3, privileges_node, $4, users_node);
|
|
|
|
|
6, privileges_node, NULL, $5, users_node, $2, $8);
|
|
|
|
|
}
|
|
|
|
|
| REVOKE ALL opt_privilege ',' GRANT OPTION FROM user_list
|
|
|
|
|
| REVOKE opt_if_exists grant_privileges ON object_type priv_level FROM user_list opt_ignore_unknown_user
|
|
|
|
|
{
|
|
|
|
|
(void)$3;//useless
|
|
|
|
|
ParseNode *privileges_node = NULL;
|
|
|
|
|
ParseNode *users_node = NULL;
|
|
|
|
|
merge_nodes(privileges_node, result, T_PRIVILEGES, $3);
|
|
|
|
|
merge_nodes(users_node, result, T_USERS, $8);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_REVOKE,
|
|
|
|
|
6, privileges_node, $5, $6, users_node, $2, $9);
|
|
|
|
|
}
|
|
|
|
|
| REVOKE opt_if_exists ALL opt_privilege ',' GRANT OPTION FROM user_list opt_ignore_unknown_user
|
|
|
|
|
{
|
|
|
|
|
(void)$4;//useless
|
|
|
|
|
ParseNode *users_node = NULL;
|
|
|
|
|
merge_nodes(users_node, result, T_USERS, $9);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_REVOKE_ALL,
|
|
|
|
|
1, users_node);
|
|
|
|
|
3, users_node, $2, $10);
|
|
|
|
|
}
|
|
|
|
|
| REVOKE opt_if_exists role_or_priv_list FROM user_specification_without_password_list opt_ignore_unknown_user
|
|
|
|
|
{
|
|
|
|
|
ParseNode *roles_node = NULL;
|
|
|
|
|
ParseNode *grantees_node = NULL;
|
|
|
|
|
ParseNode *grantees_list = NULL;
|
|
|
|
|
ParseNode *revoke_type_node = NULL;
|
|
|
|
|
|
|
|
|
|
merge_nodes(roles_node, result, T_USERS, $3);
|
|
|
|
|
merge_nodes(grantees_list, result, T_USERS, $5);
|
|
|
|
|
malloc_non_terminal_node(grantees_node, result->malloc_pool_, T_USERS, 1, grantees_list);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < roles_node->num_child_; i++) {
|
|
|
|
|
if (T_PRIV_TYPE == roles_node->children_[i]->type_) {
|
|
|
|
|
yyerror(&@3, result, "");
|
|
|
|
|
YYERROR;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
malloc_non_terminal_node(revoke_type_node, result->malloc_pool_, T_REVOKE_ROLE, 4, roles_node, grantees_node, $2, $6);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_SYSTEM_REVOKE, 1, revoke_type_node);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
opt_ignore_unknown_user:
|
|
|
|
|
/* empty */
|
|
|
|
|
{
|
|
|
|
|
$$ = NULL;
|
|
|
|
|
}
|
|
|
|
|
| IGNORE UNKNOWN USER
|
|
|
|
|
{
|
|
|
|
|
malloc_terminal_node($$, result->malloc_pool_, T_IGNORE_UNKNOWN_USER);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
@ -15130,6 +15376,78 @@ TO { $$ = NULL; }
|
|
|
|
|
| COMP_EQ { $$ = NULL; }
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
set_role_stmt:
|
|
|
|
|
SET ROLE set_role_clause
|
|
|
|
|
{
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_SET_ROLE, 1, $3);
|
|
|
|
|
}
|
|
|
|
|
| SET DEFAULT ROLE default_set_role_clause TO user_list
|
|
|
|
|
{
|
|
|
|
|
ParseNode *user_list = NULL;
|
|
|
|
|
merge_nodes(user_list, result, T_USERS, $6);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_ALTER_USER_DEFAULT_ROLE, 2, user_list, $4);
|
|
|
|
|
}
|
|
|
|
|
| alter_with_opt_hint USER user_with_host_name DEFAULT ROLE default_set_role_clause
|
|
|
|
|
{
|
|
|
|
|
(void)($1);
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_ALTER_USER_DEFAULT_ROLE, 2, $3, $6);
|
|
|
|
|
};
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
default_set_role_clause:
|
|
|
|
|
role_list
|
|
|
|
|
{
|
|
|
|
|
ParseNode *type_node = NULL;
|
|
|
|
|
malloc_terminal_node(type_node, result->malloc_pool_, T_INT);
|
|
|
|
|
type_node->value_ = 0;
|
|
|
|
|
|
|
|
|
|
ParseNode *role_list = NULL;
|
|
|
|
|
merge_nodes(role_list, result, T_LINK_NODE, $1);
|
|
|
|
|
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_DEFAULT_ROLE, 2, type_node, role_list);
|
|
|
|
|
}
|
|
|
|
|
| NONE
|
|
|
|
|
{
|
|
|
|
|
ParseNode *type_node = NULL;
|
|
|
|
|
malloc_terminal_node(type_node, result->malloc_pool_, T_INT);
|
|
|
|
|
type_node->value_ = 3;
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_DEFAULT_ROLE, 1, type_node);
|
|
|
|
|
}
|
|
|
|
|
| ALL
|
|
|
|
|
{
|
|
|
|
|
ParseNode *type_node = NULL;
|
|
|
|
|
malloc_terminal_node(type_node, result->malloc_pool_, T_INT);
|
|
|
|
|
type_node->value_ = 1;
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_DEFAULT_ROLE, 1, type_node);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
set_role_clause:
|
|
|
|
|
default_set_role_clause
|
|
|
|
|
{
|
|
|
|
|
$$ = $1;
|
|
|
|
|
}
|
|
|
|
|
| ALL EXCEPT grant_privileges
|
|
|
|
|
{
|
|
|
|
|
ParseNode *type_node = NULL;
|
|
|
|
|
malloc_terminal_node(type_node, result->malloc_pool_, T_INT);
|
|
|
|
|
type_node->value_ = 2;
|
|
|
|
|
|
|
|
|
|
ParseNode *role_list = NULL;
|
|
|
|
|
merge_nodes(role_list, result, T_LINK_NODE, $3);
|
|
|
|
|
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_DEFAULT_ROLE, 2, type_node, role_list);
|
|
|
|
|
}
|
|
|
|
|
| DEFAULT
|
|
|
|
|
{
|
|
|
|
|
ParseNode *type_node = NULL;
|
|
|
|
|
malloc_terminal_node(type_node, result->malloc_pool_, T_INT);
|
|
|
|
|
type_node->value_ = 4;
|
|
|
|
|
malloc_non_terminal_node($$, result->malloc_pool_, T_DEFAULT_ROLE, 1, type_node);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* execute grammar
|
|
|
|
|
@ -18662,6 +18980,24 @@ FULL
|
|
|
|
|
{$$[0]=0;}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
opt_extended:
|
|
|
|
|
EXTENDED
|
|
|
|
|
{$$[0]=1;}
|
|
|
|
|
| /* EMPTY */
|
|
|
|
|
{$$[0]=0;}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
opt_extended_or_full:
|
|
|
|
|
FULL
|
|
|
|
|
{$$[0]=1;}
|
|
|
|
|
| EXTENDED
|
|
|
|
|
{$$[0]=2;}
|
|
|
|
|
| EXTENDED FULL
|
|
|
|
|
{$$[0]=3;}
|
|
|
|
|
| /* EMPTY */
|
|
|
|
|
{$$[0]=0;}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
opt_config_scope:
|
|
|
|
|
SCOPE COMP_EQ MEMORY
|
|
|
|
|
{ $$[0] = 0; } /* same as ObConfigType */
|
|
|
|
|
@ -19966,6 +20302,11 @@ JSON '(' column_name ')' STORE AS '(' lob_storage_parameters ')'
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
unreserved_keyword:
|
|
|
|
|
unreserved_keyword_for_role_name { $$=$1;}
|
|
|
|
|
| unreserved_keyword_ambiguous_roles { $$=$1;}
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
unreserved_keyword_for_role_name:
|
|
|
|
|
unreserved_keyword_normal { $$=$1;}
|
|
|
|
|
| unreserved_keyword_special { $$=$1;}
|
|
|
|
|
| unreserved_keyword_extra { $$=$1;}
|
|
|
|
|
@ -19976,6 +20317,7 @@ ACCOUNT
|
|
|
|
|
| ACTION
|
|
|
|
|
| ACTIVE
|
|
|
|
|
| ADDDATE
|
|
|
|
|
| ADMIN
|
|
|
|
|
| AFTER
|
|
|
|
|
| AGAINST
|
|
|
|
|
| AGGREGATE
|
|
|
|
|
@ -20155,13 +20497,11 @@ ACCOUNT
|
|
|
|
|
| ERRORS
|
|
|
|
|
| ESCAPE
|
|
|
|
|
| ESTIMATE
|
|
|
|
|
| EVENT
|
|
|
|
|
| EVENTS
|
|
|
|
|
| EVERY
|
|
|
|
|
| EXCEPT %prec HIGHER_PARENS
|
|
|
|
|
| EXCHANGE
|
|
|
|
|
| EXCLUDING
|
|
|
|
|
| EXECUTE
|
|
|
|
|
| EXPANSION
|
|
|
|
|
| EXPIRE
|
|
|
|
|
| EXPIRED
|
|
|
|
|
@ -20179,7 +20519,6 @@ ACCOUNT
|
|
|
|
|
| FIELDS
|
|
|
|
|
| FIELD_DELIMITER
|
|
|
|
|
| FIELD_OPTIONALLY_ENCLOSED_BY
|
|
|
|
|
| FILEX
|
|
|
|
|
| FILE_ID
|
|
|
|
|
| FINAL_COUNT
|
|
|
|
|
| FIRST
|
|
|
|
|
@ -20362,7 +20701,6 @@ ACCOUNT
|
|
|
|
|
| NODEGROUP
|
|
|
|
|
| NOMINVALUE
|
|
|
|
|
| NOMAXVALUE
|
|
|
|
|
| NONE
|
|
|
|
|
| NOORDER
|
|
|
|
|
| NOPARALLEL
|
|
|
|
|
| NORMAL
|
|
|
|
|
@ -20432,12 +20770,10 @@ ACCOUNT
|
|
|
|
|
| PREV
|
|
|
|
|
| PRIMARY_ZONE
|
|
|
|
|
| PRIVILEGES
|
|
|
|
|
| PROCESS
|
|
|
|
|
| PROCESSLIST
|
|
|
|
|
| PROFILE
|
|
|
|
|
| PROFILES
|
|
|
|
|
| PROGRESSIVE_MERGE_NUM
|
|
|
|
|
| PROXY
|
|
|
|
|
| PS
|
|
|
|
|
| PUBLIC
|
|
|
|
|
| PCTFREE
|
|
|
|
|
@ -20471,7 +20807,6 @@ ACCOUNT
|
|
|
|
|
| RELAY_LOG_FILE
|
|
|
|
|
| RELAY_LOG_POS
|
|
|
|
|
| RELAY_THREAD
|
|
|
|
|
| RELOAD
|
|
|
|
|
| REMAP
|
|
|
|
|
| REMOVE
|
|
|
|
|
| REORGANIZE
|
|
|
|
|
@ -20480,10 +20815,8 @@ ACCOUNT
|
|
|
|
|
| REPLICA
|
|
|
|
|
| REPLICA_NUM
|
|
|
|
|
| REPLICA_TYPE
|
|
|
|
|
| REPLICATION
|
|
|
|
|
| REPORT
|
|
|
|
|
| RESET
|
|
|
|
|
| RESOURCE
|
|
|
|
|
| RESOURCE_POOL
|
|
|
|
|
| RESOURCE_POOL_LIST
|
|
|
|
|
| RESPECT
|
|
|
|
|
@ -20494,6 +20827,7 @@ ACCOUNT
|
|
|
|
|
| RETURNING
|
|
|
|
|
| RETURNS
|
|
|
|
|
| REVERSE
|
|
|
|
|
| ROLE
|
|
|
|
|
| ROLLBACK
|
|
|
|
|
| ROLLING
|
|
|
|
|
| ROLLUP
|
|
|
|
|
@ -20602,7 +20936,6 @@ ACCOUNT
|
|
|
|
|
| SUBSTRING
|
|
|
|
|
| SUCCESSFUL
|
|
|
|
|
| SUM
|
|
|
|
|
| SUPER
|
|
|
|
|
| SUSPEND
|
|
|
|
|
| SWAPS
|
|
|
|
|
| SWITCH
|
|
|
|
|
@ -20612,6 +20945,7 @@ ACCOUNT
|
|
|
|
|
| SYSTEM
|
|
|
|
|
| SYSTEM_USER
|
|
|
|
|
| SYSDATE
|
|
|
|
|
| SLOG
|
|
|
|
|
| TABLE_CHECKSUM
|
|
|
|
|
| TABLE_MODE
|
|
|
|
|
| TABLEGROUPS
|
|
|
|
|
@ -20747,6 +21081,22 @@ unreserved_keyword_extra:
|
|
|
|
|
ACCESS
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
These non-reserved keywords cannot be used as unquoted role names:
|
|
|
|
|
*/
|
|
|
|
|
unreserved_keyword_ambiguous_roles:
|
|
|
|
|
SUPER
|
|
|
|
|
| FILEX
|
|
|
|
|
| PROCESS
|
|
|
|
|
| NONE
|
|
|
|
|
| EVENT
|
|
|
|
|
| PROXY
|
|
|
|
|
| RELOAD
|
|
|
|
|
| REPLICATION
|
|
|
|
|
| RESOURCE
|
|
|
|
|
| EXECUTE
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
/*注释掉的关键字有规约冲突暂时注释了,都是一些sql中常用的关键字,后面按需打开,增加这块代码逻辑是为了支持在mysql中允许以
|
|
|
|
|
表名+列名的方式使用关键字,比如"select key.key from test.key"(
|
|
|
|
|
*/
|
|
|
|
|
|