From a4990f59a62c68673ef3f0a0c76aea70292deba8 Mon Sep 17 00:00:00 2001 From: "chengxiang.luo" Date: Wed, 5 Apr 2023 10:44:23 +0800 Subject: [PATCH] fixed #{1330} : add "lock in share mode" function support. --- src/sql/parser/sql_parser_mysql_mode.y | 67 +++++++++++++++++--------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/src/sql/parser/sql_parser_mysql_mode.y b/src/sql/parser/sql_parser_mysql_mode.y index 860bba457d..a81f12ab91 100755 --- a/src/sql/parser/sql_parser_mysql_mode.y +++ b/src/sql/parser/sql_parser_mysql_mode.y @@ -388,7 +388,7 @@ END_P SET_VAR DELIMITER %type simple_select no_table_select limit_clause select_expr_list %type with_select with_clause with_list common_table_expr opt_column_alias_name_list alias_name_list column_alias_name %type opt_where opt_hint_value opt_groupby opt_rollup opt_order_by order_by opt_having groupby_clause -%type opt_limit_clause limit_expr opt_for_update opt_for_update_wait +%type opt_limit_clause limit_expr opt_lock_type opt_for_update opt_for_update_wait opt_lock_in_share_mode %type sort_list sort_key opt_asc_desc sort_list_for_group_by sort_key_for_group_by opt_asc_desc_for_group_by opt_column_id %type opt_query_expression_option_list query_expression_option_list query_expression_option opt_distinct opt_distinct_or_all opt_separator projection %type from_list table_references table_reference table_factor normal_relation_factor dot_relation_factor relation_factor @@ -2831,11 +2831,11 @@ INTERVAL '(' expr ',' expr ')' merge_nodes(params_node, result, T_EXPR_LIST, params); malloc_non_terminal_node($$, result->malloc_pool_, T_FUN_SYS_INTERVAL, 2, $3, params_node); } -| CHECK '(' expr ')' -{ - // just compatible with mysql, do nothing - (void)($3); - malloc_terminal_node($$, result->malloc_pool_, T_EMPTY); +| CHECK '(' expr ')' +{ + // just compatible with mysql, do nothing + (void)($3); + malloc_terminal_node($$, result->malloc_pool_, T_EMPTY); } ; @@ -4864,7 +4864,7 @@ BINARY opt_string_length_i_v2 { /* 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; + $$->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 */ @@ -5907,7 +5907,7 @@ TABLE_MODE opt_equal_mark STRING_VALUE (void)($2); malloc_non_terminal_node($$, result->malloc_pool_, T_AUTO_INCREMENT_MODE, 1, $3); } -| ENABLE_EXTENDED_ROWID opt_equal_mark BOOL_VALUE +| ENABLE_EXTENDED_ROWID opt_equal_mark BOOL_VALUE { (void)($2); malloc_non_terminal_node($$, result->malloc_pool_, T_ENABLE_EXTENDED_ROWID, 1, $3); @@ -6887,8 +6887,8 @@ create_with_opt_hint opt_replace opt_algorithm opt_definer opt_sql_security VIEW ; opt_algorithm: -ALGORITHM COMP_EQ view_algorithm -{ +ALGORITHM COMP_EQ view_algorithm +{ (void)($3); $$ = NULL; } @@ -7679,23 +7679,36 @@ select_with_parens: | '(' with_select ')' { $$ = $2; }; select_no_parens: -select_clause opt_for_update +select_clause opt_lock_type { $$ = $1; $$->children_[PARSE_SELECT_FOR_UPD] = $2; } -| select_clause_set opt_for_update +| select_clause_set opt_lock_type { $$ = $1; $$->children_[PARSE_SELECT_FOR_UPD] = $2; } -| select_clause_set_with_order_and_limit opt_for_update +| select_clause_set_with_order_and_limit opt_lock_type { $$ = $1; $$->children_[PARSE_SELECT_FOR_UPD] = $2; } ; +opt_lock_type: +/* EMPTY */ +{ $$ = NULL; } +| opt_for_update +{ + $$ = $1; +} +| opt_lock_in_share_mode +{ + $$ = $1; +} +; + no_table_select: select_with_opt_hint opt_query_expression_option_list select_expr_list into_opt %prec LOWER_PARENS { @@ -9124,14 +9137,20 @@ opt_limit_clause: ; opt_for_update: -/* EMPTY */ -{ $$ = NULL; } -| FOR UPDATE opt_for_update_wait +FOR UPDATE opt_for_update_wait { $$ = $3; } ; +opt_lock_in_share_mode: +LOCK_ IN SHARE MODE +{ + malloc_terminal_node($$, result->malloc_pool_, T_SFU_INT); + $$->value_ = -1; +} +; + opt_for_update_wait: /* EMPTY */ { @@ -10908,7 +10927,7 @@ INTNUM ; get_statement_diagnostics_stmt: -GET DIAGNOSTICS statement_information_item_list +GET DIAGNOSTICS statement_information_item_list { ParseNode *is_condition = NULL; ParseNode *is_current = NULL; @@ -11160,7 +11179,7 @@ SHOW opt_full TABLES opt_from_or_in_database_clause opt_show_condition malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_CREATE_DATABASE, 2, $4, $5); } | SHOW create_with_opt_hint TABLE relation_factor -{ +{ (void)($2); malloc_non_terminal_node($$, result->malloc_pool_, T_SHOW_CREATE_TABLE, 1, $4); } @@ -12420,7 +12439,7 @@ ALTER 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); @@ -14327,7 +14346,7 @@ ALTER SYSTEM BACKUP INCREMENTAL DATABASE opt_backup_to PLUS ARCHIVELOG opt_descr ParseNode *tenant = NULL; malloc_terminal_node(tenant, result->malloc_pool_, T_INT); tenant->value_ = 0; - malloc_non_terminal_node($$, result->malloc_pool_, T_BACKUP_DATABASE, 5, tenant, compl_log, incremental, $6, $9); + malloc_non_terminal_node($$, result->malloc_pool_, T_BACKUP_DATABASE, 5, tenant, compl_log, incremental, $6, $9); } | ALTER SYSTEM BACKUP opt_backup_tenant_list opt_backup_to PLUS ARCHIVELOG opt_description @@ -14473,7 +14492,7 @@ ALTER SYSTEM CANCEL ALL BACKUP FORCE malloc_non_terminal_node($$, result->malloc_pool_, T_BACKUP_MANAGE, 2, type, value); } | -ALTER SYSTEM DELETE BACKUPSET INTNUM opt_copy_id opt_backup_tenant_list opt_description +ALTER SYSTEM DELETE BACKUPSET INTNUM opt_copy_id opt_backup_tenant_list opt_description { ParseNode *type = NULL; malloc_terminal_node(type, result->malloc_pool_, T_INT); @@ -14499,7 +14518,7 @@ ALTER SYSTEM DELETE BACKUPPIECE INTNUM opt_copy_id opt_backup_tenant_list opt_de malloc_non_terminal_node($$, result->malloc_pool_, T_BACKUP_CLEAN, 5, type, value, $8, $6, $7); } | -ALTER SYSTEM DELETE OBSOLETE BACKUP opt_backup_tenant_list opt_description +ALTER SYSTEM DELETE OBSOLETE BACKUP opt_backup_tenant_list opt_description { ParseNode *type = NULL; malloc_terminal_node(type, result->malloc_pool_, T_INT); @@ -14537,7 +14556,7 @@ ALTER SYSTEM DROP DELETE BACKUP policy_name opt_backup_tenant_list malloc_terminal_node(type, result->malloc_pool_, T_INT); type->value_ = 1; malloc_non_terminal_node($$, result->malloc_pool_, T_DELETE_POLICY, 3, type, $7, $6); -} +} | ALTER SYSTEM BACKUP BACKUPSET ALL opt_tenant_info opt_backup_backup_dest { @@ -15978,7 +15997,7 @@ opt_description: ; opt_restore_until: -/*EMPTY*/ { $$ = NULL; } +/*EMPTY*/ { $$ = NULL; } | UNTIL TIME COMP_EQ STRING_VALUE { ParseNode *is_scn = NULL;