diff --git a/mysql-test/main/change_master_default.result b/mysql-test/main/change_master_default.result index 71d76cca8182a..3bc203cc3a22c 100644 --- a/mysql-test/main/change_master_default.result +++ b/mysql-test/main/change_master_default.result @@ -258,6 +258,14 @@ master_ssl_crlpath using_gtid Slave_Pos master_retry_count 100000 slave_heartbeat_period 60.000 +# +# MDEV-40122: `+DEFAULT` is not a valid value for master_heartbeat_period +# +CHANGE MASTER TO master_heartbeat_period= +DEFAULT; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DEFAULT' at line 1 +CHANGE MASTER 'mdev40122' TO master_heartbeat_period= +45; +CHANGE MASTER 'mdev40122' TO master_heartbeat_period= DEFAULT; +RESET SLAVE 'mdev40122' ALL; # Clean-up DROP PROCEDURE show_defaultable_fields; RESET SLAVE 'unset' ALL; diff --git a/mysql-test/main/change_master_default.test b/mysql-test/main/change_master_default.test index 971013dc3feed..6a2e5413351bc 100644 --- a/mysql-test/main/change_master_default.test +++ b/mysql-test/main/change_master_default.test @@ -138,6 +138,20 @@ FROM information_schema.slave_status ORDER BY connection_name; --query_vertical CALL show_defaultable_fields() +--echo # +--echo # MDEV-40122: `+DEFAULT` is not a valid value for master_heartbeat_period +--echo # + +# The `+` prefix may only precede a numeric literal, not `DEFAULT` +--error ER_PARSE_ERROR +CHANGE MASTER TO master_heartbeat_period= +DEFAULT; + +# `+` with a number and `DEFAULT` itself remain valid +CHANGE MASTER 'mdev40122' TO master_heartbeat_period= +45; +CHANGE MASTER 'mdev40122' TO master_heartbeat_period= DEFAULT; +RESET SLAVE 'mdev40122' ALL; + + --echo # Clean-up DROP PROCEDURE show_defaultable_fields; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 83f8edd72630a..9d3cc35dda539 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1628,7 +1628,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %type NUM_literal - num_or_default %type text_literal @@ -2423,34 +2422,33 @@ master_def: { mi->master_ssl_crlpath= path; }; } - | MASTER_HEARTBEAT_PERIOD_SYM '=' opt_plus num_or_default - { - if ($4) - { - uint32_t milliseconds; - bool overprecise; - auto decimal_buf= my_decimal(), - *decimal= $4->val_decimal(&decimal_buf); - DBUG_ASSERT(decimal); - if (Master_info_file::Heartbeat_period_value::from_decimal( - milliseconds, *decimal, overprecise - )) - my_yyabort_error((ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE, MYF(0), - Master_info_file::Heartbeat_period_value::MAX)); - if (unlikely(milliseconds > slave_net_timeout*1000ULL)) - push_warning(thd, Sql_condition::WARN_LEVEL_WARN, - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX, - ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX)); - else if (unlikely(!milliseconds && overprecise)) - push_warning(thd, Sql_condition::WARN_LEVEL_WARN, - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN, - ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN)); - Lex->mi.heartbeat_period= [milliseconds](Master_info_file *mi) - { mi->master_heartbeat_period= milliseconds; }; - } - else - Lex->mi.heartbeat_period= [](Master_info_file *mi) - { mi->master_heartbeat_period.set_default(); }; + | MASTER_HEARTBEAT_PERIOD_SYM '=' opt_plus NUM_literal + { + uint32_t milliseconds; + bool overprecise; + auto decimal_buf= my_decimal(), + *decimal= $4->val_decimal(&decimal_buf); + DBUG_ASSERT(decimal); + if (Master_info_file::Heartbeat_period_value::from_decimal( + milliseconds, *decimal, overprecise + )) + my_yyabort_error((ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE, MYF(0), + Master_info_file::Heartbeat_period_value::MAX)); + if (unlikely(milliseconds > slave_net_timeout*1000ULL)) + push_warning(thd, Sql_condition::WARN_LEVEL_WARN, + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX, + ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX)); + else if (unlikely(!milliseconds && overprecise)) + push_warning(thd, Sql_condition::WARN_LEVEL_WARN, + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN, + ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN)); + Lex->mi.heartbeat_period= [milliseconds](Master_info_file *mi) + { mi->master_heartbeat_period= milliseconds; }; + } + | MASTER_HEARTBEAT_PERIOD_SYM '=' DEFAULT + { + Lex->mi.heartbeat_period= [](Master_info_file *mi) + { mi->master_heartbeat_period.set_default(); }; } | IGNORE_SERVER_IDS_SYM '=' '(' ignore_server_id_list ')' { @@ -2487,12 +2485,8 @@ master_use_gtid_enum: NO_SYM { $$= enum_master_use_gtid::NO; } | CURRENT_POS_SYM { $$= enum_master_use_gtid::CURRENT_POS; } | SLAVE_POS_SYM { $$= enum_master_use_gtid::SLAVE_POS; } - | DEFAULT { $$= enum_master_use_gtid::DEFAULT; } - ; -num_or_default: - NUM_literal { DBUG_ASSERT($$); } - | DEFAULT { $$= nullptr; } - ; + | DEFAULT { $$= enum_master_use_gtid::DEFAULT; } + ; ignore_server_id_list: /* Empty */