diff --git a/mysql-test/main/mysqld--help.result b/mysql-test/main/mysqld--help.result index 7cbfa52b846..b5820e64c2a 100644 --- a/mysql-test/main/mysqld--help.result +++ b/mysql-test/main/mysqld--help.result @@ -683,7 +683,8 @@ The following specify which files/extra groups are read (specified before remain --old-mode=name Used to emulate old behavior from earlier MariaDB or MySQL versions. Any combination of: NO_DUP_KEY_WARNINGS_WITH_IGNORE, NO_PROGRESS_INFO, - ZERO_DATE_TIME_CAST, UTF8_IS_UTF8MB3 + ZERO_DATE_TIME_CAST, UTF8_IS_UTF8MB3, + IGNORE_INDEX_ONLY_FOR_JOIN, COMPAT_5_1_CHECKSUM --old-passwords Use old password encryption method (needed for 4.0 and older clients) --old-style-user-limits diff --git a/mysql-test/suite/sys_vars/r/old_basic.result b/mysql-test/suite/sys_vars/r/old_basic.result index bafe7128821..1eba60ed4a7 100644 --- a/mysql-test/suite/sys_vars/r/old_basic.result +++ b/mysql-test/suite/sys_vars/r/old_basic.result @@ -17,7 +17,11 @@ select * from information_schema.session_variables where variable_name='old'; VARIABLE_NAME VARIABLE_VALUE OLD OFF set global old=1; +Warnings: +Warning 1287 '@@old' is deprecated and will be removed in a future release. Please use '@@old_mode' instead set session old=1; +Warnings: +Warning 1287 '@@old' is deprecated and will be removed in a future release. Please use '@@old_mode' instead select @@global.old; @@global.old 1 @@ -25,3 +29,5 @@ select @@session.old; @@session.old 1 set @@global.old=DEFAULT; +Warnings: +Warning 1287 '@@old' is deprecated and will be removed in a future release. Please use '@@old_mode' instead diff --git a/mysql-test/suite/sys_vars/r/old_mode_basic.result b/mysql-test/suite/sys_vars/r/old_mode_basic.result index a6b95f1c60c..252316dc1cb 100644 --- a/mysql-test/suite/sys_vars/r/old_mode_basic.result +++ b/mysql-test/suite/sys_vars/r/old_mode_basic.result @@ -114,8 +114,8 @@ SET @@global.old_mode = 4; SELECT @@global.old_mode; @@global.old_mode ZERO_DATE_TIME_CAST -SET @@global.old_mode = 16; -ERROR 42000: Variable 'old_mode' can't be set to the value of '16' +SET @@global.old_mode = 64; +ERROR 42000: Variable 'old_mode' can't be set to the value of '64' SELECT @@global.old_mode; @@global.old_mode ZERO_DATE_TIME_CAST @@ -264,3 +264,42 @@ SET @@collation_database = @save_collation_database; # # End of 10.6 test # +# +# Beginning of 10.9 test +# +# +# MDEV-24920: Merge "old" SQL variable to "old_mode" sql variable +# +# Checking that setting old will also set old_mode +SELECT @@OLD_MODE; +@@OLD_MODE +UTF8_IS_UTF8MB3 +SET old= 1; +Warnings: +Warning 1287 '@@old' is deprecated and will be removed in a future release. Please use '@@old_mode' instead +SELECT @@OLD_MODE; +@@OLD_MODE +NO_PROGRESS_INFO,UTF8_IS_UTF8MB3,IGNORE_INDEX_ONLY_FOR_JOIN,COMPAT_5_1_CHECKSUM +SET old= DEFAULT; +Warnings: +Warning 1287 '@@old' is deprecated and will be removed in a future release. Please use '@@old_mode' instead +SELECT @@OLD_MODE; +@@OLD_MODE +UTF8_IS_UTF8MB3 +# Checking that old_mode can be set independently as well +SELECT @@OLD_MODE; +@@OLD_MODE +UTF8_IS_UTF8MB3 +SET @save_old_mode = @@OLD_MODE; +SET @@OLD_MODE= IGNORE_INDEX_ONLY_FOR_JOIN; +SELECT @@OLD_MODE; +@@OLD_MODE +IGNORE_INDEX_ONLY_FOR_JOIN +SET @@OLD_MODE= COMPAT_5_1_CHECKSUM; +SELECT @@OLD_MODE; +@@OLD_MODE +COMPAT_5_1_CHECKSUM +SET @@OLD_MODE= @save_old_mode; +# +# End of 10.9 test +# diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result index fc9d8db4b9f..906da9edace 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result @@ -2219,7 +2219,7 @@ VARIABLE_COMMENT Used to emulate old behavior from earlier MariaDB or MySQL vers NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -ENUM_VALUE_LIST NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO,ZERO_DATE_TIME_CAST,UTF8_IS_UTF8MB3 +ENUM_VALUE_LIST NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO,ZERO_DATE_TIME_CAST,UTF8_IS_UTF8MB3,IGNORE_INDEX_ONLY_FOR_JOIN,COMPAT_5_1_CHECKSUM READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OLD_PASSWORDS diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result index 35235a17f18..b9444a92cbe 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -2389,7 +2389,7 @@ VARIABLE_COMMENT Used to emulate old behavior from earlier MariaDB or MySQL vers NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -ENUM_VALUE_LIST NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO,ZERO_DATE_TIME_CAST,UTF8_IS_UTF8MB3 +ENUM_VALUE_LIST NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO,ZERO_DATE_TIME_CAST,UTF8_IS_UTF8MB3,IGNORE_INDEX_ONLY_FOR_JOIN,COMPAT_5_1_CHECKSUM READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OLD_PASSWORDS diff --git a/mysql-test/suite/sys_vars/t/old_mode_basic.test b/mysql-test/suite/sys_vars/t/old_mode_basic.test index f2fba791859..631d638767f 100644 --- a/mysql-test/suite/sys_vars/t/old_mode_basic.test +++ b/mysql-test/suite/sys_vars/t/old_mode_basic.test @@ -172,7 +172,7 @@ SET @@global.old_mode = 4; SELECT @@global.old_mode; --Error ER_WRONG_VALUE_FOR_VAR -SET @@global.old_mode = 16; +SET @@global.old_mode = 64; SELECT @@global.old_mode; # use of decimal values @@ -314,6 +314,39 @@ SET @@collation_database = @save_collation_database; --echo # End of 10.6 test --echo # +--echo # +--echo # Beginning of 10.9 test +--echo # +--echo # +--echo # MDEV-24920: Merge "old" SQL variable to "old_mode" sql variable +--echo # + +--echo # Checking that setting old will also set old_mode +SELECT @@OLD_MODE; + +SET old= 1; +SELECT @@OLD_MODE; + +SET old= DEFAULT; +SELECT @@OLD_MODE; + +--echo # Checking that old_mode can be set independently as well + +SELECT @@OLD_MODE; + +SET @save_old_mode = @@OLD_MODE; + +SET @@OLD_MODE= IGNORE_INDEX_ONLY_FOR_JOIN; +SELECT @@OLD_MODE; + +SET @@OLD_MODE= COMPAT_5_1_CHECKSUM; +SELECT @@OLD_MODE; + +SET @@OLD_MODE= @save_old_mode; + +--echo # +--echo # End of 10.9 test +--echo # ################################################################ # END OF old_mode TESTS # ################################################################ diff --git a/sql/handler.cc b/sql/handler.cc index c5bd441eaf0..991c0d5aae5 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -5810,7 +5810,8 @@ int handler::calculate_checksum() { Field *f= table->field[i]; - if (! thd->variables.old_mode && f->is_real_null(0)) + if (! (thd->variables.old_behavior & OLD_MODE_COMPAT_5_1_CHECKSUM) && + f->is_real_null(0)) { flush_checksum(&row_crc, &checksum_start, &checksum_length); continue; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 4789ed1b8ae..5c0e845a4f9 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -8490,6 +8490,14 @@ static int get_options(int *argc_ptr, char ***argv_ptr) between options, setting of multiple variables, etc. Do them here. */ + + if (global_system_variables.old_mode) + { + global_system_variables.old_behavior|= (OLD_MODE_NO_PROGRESS_INFO | + OLD_MODE_IGNORE_INDEX_ONLY_FOR_JOIN | + OLD_MODE_COMPAT_5_1_CHECKSUM); + } + if (global_system_variables.net_buffer_length > global_system_variables.max_allowed_packet) { diff --git a/sql/sql_class.h b/sql/sql_class.h index f7f646e8310..4ea74b479e7 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -192,6 +192,8 @@ enum enum_binlog_row_image { #define OLD_MODE_NO_PROGRESS_INFO (1 << 1) #define OLD_MODE_ZERO_DATE_TIME_CAST (1 << 2) #define OLD_MODE_UTF8_IS_UTF8MB3 (1 << 3) +#define OLD_MODE_IGNORE_INDEX_ONLY_FOR_JOIN (1 << 4) +#define OLD_MODE_COMPAT_5_1_CHECKSUM (1 << 5) extern char internal_table_name[2]; extern char empty_c_string[1]; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index bed3d055c09..56ad6469cfd 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2921,8 +2921,7 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) Item_empty_string(thd, "Info", arg.max_query_length), mem_root); field->set_maybe_null();; - if (!thd->variables.old_mode && - !(thd->variables.old_behavior & OLD_MODE_NO_PROGRESS_INFO)) + if (!(thd->variables.old_behavior & OLD_MODE_NO_PROGRESS_INFO)) { field_list.push_back(field= new (mem_root) Item_float(thd, "Progress", 0.0, 3, 7), @@ -2964,8 +2963,7 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) thd_info->query_string.charset()); else protocol->store_null(); - if (!thd->variables.old_mode && - !(thd->variables.old_behavior & OLD_MODE_NO_PROGRESS_INFO)) + if (!(thd->variables.old_behavior & OLD_MODE_NO_PROGRESS_INFO)) protocol->store_double(thd_info->progress, 3); if (protocol->write()) break; /* purecov: inspected */ diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 1d5b1d4b59e..24c4a08ea4b 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -11901,8 +11901,10 @@ bool mysql_checksum_table(THD *thd, TABLE_LIST *tables, { /* Call ->checksum() if the table checksum matches 'old_mode' settings */ if (!(check_opt->flags & T_EXTEND) && - (((t->file->ha_table_flags() & HA_HAS_OLD_CHECKSUM) && thd->variables.old_mode) || - ((t->file->ha_table_flags() & HA_HAS_NEW_CHECKSUM) && !thd->variables.old_mode))) + (((t->file->ha_table_flags() & HA_HAS_OLD_CHECKSUM) && + (thd->variables.old_behavior & OLD_MODE_COMPAT_5_1_CHECKSUM)) || + ((t->file->ha_table_flags() & HA_HAS_NEW_CHECKSUM) && + !(thd->variables.old_behavior & OLD_MODE_COMPAT_5_1_CHECKSUM)))) { if (t->file->info(HA_STATUS_VARIABLE) || t->file->stats.checksum_null) protocol->store_null(); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index ff648545be5..a6bf384706d 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -11757,7 +11757,8 @@ opt_outer: index_hint_clause: /* empty */ { - $$= thd->variables.old_mode ? INDEX_HINT_MASK_JOIN : INDEX_HINT_MASK_ALL; + $$= (thd->variables.old_behavior & OLD_MODE_IGNORE_INDEX_ONLY_FOR_JOIN) ? + INDEX_HINT_MASK_JOIN : INDEX_HINT_MASK_ALL; } | FOR_SYM JOIN_SYM { $$= INDEX_HINT_MASK_JOIN; } | FOR_SYM ORDER_SYM BY { $$= INDEX_HINT_MASK_ORDER; } diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 0303cf8308b..505a05637d6 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -2654,9 +2654,28 @@ static Sys_var_ulong Sys_net_retry_count( BLOCK_SIZE(1), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(fix_net_retry_count)); +static bool set_old_mode (sys_var *self, THD *thd, enum_var_type type) +{ + if (thd->variables.old_mode) + { + thd->variables.old_behavior|= (OLD_MODE_NO_PROGRESS_INFO | + OLD_MODE_IGNORE_INDEX_ONLY_FOR_JOIN | + OLD_MODE_COMPAT_5_1_CHECKSUM); + } + else + { + thd->variables.old_behavior&= ~(OLD_MODE_NO_PROGRESS_INFO| + OLD_MODE_IGNORE_INDEX_ONLY_FOR_JOIN | + OLD_MODE_COMPAT_5_1_CHECKSUM); + } + + return false; +} + static Sys_var_mybool Sys_old_mode( "old", "Use compatible behavior from previous MariaDB version. See also --old-mode", - SESSION_VAR(old_mode), CMD_LINE(OPT_ARG), DEFAULT(FALSE)); + SESSION_VAR(old_mode), CMD_LINE(OPT_ARG), DEFAULT(FALSE), 0, NOT_IN_BINLOG, ON_CHECK(0), + ON_UPDATE(set_old_mode), DEPRECATED("'@@old_mode'")); static const char *alter_algorithm_modes[]= {"DEFAULT", "COPY", "INPLACE", "NOCOPY", "INSTANT", NULL}; @@ -3772,6 +3791,8 @@ static const char *old_mode_names[]= "NO_PROGRESS_INFO", "ZERO_DATE_TIME_CAST", "UTF8_IS_UTF8MB3", + "IGNORE_INDEX_ONLY_FOR_JOIN", + "COMPAT_5_1_CHECKSUM", 0 }; diff --git a/storage/rocksdb/mysql-test/rocksdb/r/checksum_table.result b/storage/rocksdb/mysql-test/rocksdb/r/checksum_table.result index bb209856a97..85cf53044e1 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/checksum_table.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/checksum_table.result @@ -70,6 +70,8 @@ col3 double # Enable the old algorithm: set @tmp_old=@@old; set old=1; +Warnings: +Warning 1287 '@@old' is deprecated and will be removed in a future release. Please use '@@old_mode' instead checksum table t1; Table Checksum test.t1 0 @@ -89,4 +91,6 @@ checksum table t1; Table Checksum test.t1 3183101003 set old=@tmp_old; +Warnings: +Warning 1287 '@@old' is deprecated and will be removed in a future release. Please use '@@old_mode' instead drop table t1;