diff --git a/include/typelib.h b/include/typelib.h index 9a8ee802cae..054370b5f3a 100644 --- a/include/typelib.h +++ b/include/typelib.h @@ -25,9 +25,10 @@ typedef struct st_typelib { /* Different types saved here */ const char *name; /* Name of typelib */ const char **type_names; unsigned int *type_lengths; + const int *hidden_values; } TYPELIB; -#define CREATE_TYPELIB_FOR(X) { (unsigned int)(sizeof(X)/sizeof(X[0])) - 1, "", X, NULL } +#define CREATE_TYPELIB_FOR(X) { (unsigned int)(sizeof(X)/sizeof(X[0])) - 1, "", X, NULL, NULL } extern my_ulonglong find_typeset(const char *x, TYPELIB *typelib, int *error_position); diff --git a/mysql-test/main/mysqld--help.result b/mysql-test/main/mysqld--help.result index c12e8a2176f..ca455b9ce36 100644 --- a/mysql-test/main/mysqld--help.result +++ b/mysql-test/main/mysqld--help.result @@ -774,6 +774,9 @@ The following specify which files/extra groups are read (specified before remain --net-write-timeout=# Number of seconds to wait for a block to be written to a connection before aborting the write + --new-mode=name Used to introduce new behavior to existing MariaDB + versions. Any combination of: FIX_DISK_TMPTABLE_COSTS, or + ALL to set all combinations --note-verbosity=name Verbosity level for note-warnings given to the user. See also @@sql_notes. Any combination of: basic, @@ -1861,6 +1864,7 @@ net-buffer-length 16384 net-read-timeout 30 net-retry-count 10 net-write-timeout 60 +new-mode note-verbosity basic,explain old FALSE old-mode UTF8_IS_UTF8MB3 diff --git a/mysql-test/suite/sys_vars/r/new_mode.result b/mysql-test/suite/sys_vars/r/new_mode.result new file mode 100644 index 00000000000..370c8f74024 --- /dev/null +++ b/mysql-test/suite/sys_vars/r/new_mode.result @@ -0,0 +1,83 @@ +SET @global_start_value = @@global.new_mode; +SELECT @global_start_value; +@global_start_value + +SET @session_start_value = @@session.new_mode; +SELECT @session_start_value; +@session_start_value + +SET @@global.new_mode = "FIX_DISK_TMPTABLE_COSTS"; +SELECT @@global.new_mode; +@@global.new_mode +FIX_DISK_TMPTABLE_COSTS +SELECT @@session.new_mode; +@@session.new_mode + +SET @@global.new_mode = DEFAULT; +SELECT @@global.new_mode; +@@global.new_mode + +SELECT @@session.new_mode; +@@session.new_mode + +SET @@session.new_mode = "FIX_DISK_TMPTABLE_COSTS,TEST_WARNING1"; +Warnings: +Warning 4209 'TEST_WARNING1' is default and ignored +SET @@session.new_mode = "FIX_DISK_TMPTABLE_COSTS,TEST_WARNING1,TEST_WARNING2"; +Warnings: +Warning 4209 'TEST_WARNING1' is default and ignored +Warning 4209 'TEST_WARNING2' is default and ignored +SET @@session.new_mode = "FIX_DISK_TMPTABLE_COSTS,TEST_WARNING1,TEST_WARNING2,TEST_WARNING3"; +ERROR 42000: Variable 'new_mode' can't be set to the value of 'TEST_WARNING3' +SET @@session.new_mode = "ALL"; +select @@session.new_mode; +@@session.new_mode +FIX_DISK_TMPTABLE_COSTS +SET @@global.new_mode = NULL; +ERROR 42000: Variable 'new_mode' can't be set to the value of 'NULL' +SET @@global.new_mode = ''; +SELECT @@global.new_mode; +@@global.new_mode + +SET @@global.new_mode = ' '; +SELECT @@global.new_mode; +@@global.new_mode + +SET @@session.new_mode = NULL; +ERROR 42000: Variable 'new_mode' can't be set to the value of 'NULL' +SET @@session.new_mode = ''; +SELECT @@session.new_mode; +@@session.new_mode + +SET @@session.new_mode = ' '; +SELECT @@session.new_mode; +@@session.new_mode + +SET @@global.new_mode = OFF; +ERROR 42000: Variable 'new_mode' can't be set to the value of 'OFF' +SET @@session.new_mode = OFF; +ERROR 42000: Variable 'new_mode' can't be set to the value of 'OFF' +SET @debug_dbug_safe = @@global.debug_dbug; +SET @@global.debug_dbug = 'd,check_new_mode_mdev_37784'; +create table t1 (a int); +insert into t1 values (1), (2); +create table t2 (b int); +insert into t2 values (3), (4); +select * from t1 where a in (select b from t2); +a +SET @@new_mode = "FIX_DISK_TMPTABLE_COSTS"; +select * from t1 where a in (select b from t2); +a +Warnings: +Note 1003 YES +Note 1003 YES +drop table t1, t2; +SET @@global.debug_dbug = @debug_dbug_safe; +SET @@global.new_mode = @global_start_value; +SELECT @@global.new_mode; +@@global.new_mode + +SET @@session.new_mode = @session_start_value; +SELECT @@session.new_mode; +@@session.new_mode + 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 6ccffdf2c12..d0db9345d52 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result @@ -2392,6 +2392,16 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME NEW_MODE +VARIABLE_SCOPE SESSION +VARIABLE_TYPE SET +VARIABLE_COMMENT Used to introduce new behavior to existing MariaDB versions +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST FIX_DISK_TMPTABLE_COSTS +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NOTE_VERBOSITY VARIABLE_SCOPE SESSION VARIABLE_TYPE SET 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 beb8311ad94..b71e63ad28f 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -2602,6 +2602,16 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME NEW_MODE +VARIABLE_SCOPE SESSION +VARIABLE_TYPE SET +VARIABLE_COMMENT Used to introduce new behavior to existing MariaDB versions +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST FIX_DISK_TMPTABLE_COSTS +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NOTE_VERBOSITY VARIABLE_SCOPE SESSION VARIABLE_TYPE SET diff --git a/mysql-test/suite/sys_vars/t/new_mode.test b/mysql-test/suite/sys_vars/t/new_mode.test new file mode 100644 index 00000000000..9df55a18374 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/new_mode.test @@ -0,0 +1,67 @@ +--source include/load_sysvars.inc +--source include/have_debug.inc + +SET @global_start_value = @@global.new_mode; +SELECT @global_start_value; + +SET @session_start_value = @@session.new_mode; +SELECT @session_start_value; + +SET @@global.new_mode = "FIX_DISK_TMPTABLE_COSTS"; +SELECT @@global.new_mode; +SELECT @@session.new_mode; +SET @@global.new_mode = DEFAULT; +SELECT @@global.new_mode; +SELECT @@session.new_mode; + +SET @@session.new_mode = "FIX_DISK_TMPTABLE_COSTS,TEST_WARNING1"; +SET @@session.new_mode = "FIX_DISK_TMPTABLE_COSTS,TEST_WARNING1,TEST_WARNING2"; +--Error ER_WRONG_VALUE_FOR_VAR +SET @@session.new_mode = "FIX_DISK_TMPTABLE_COSTS,TEST_WARNING1,TEST_WARNING2,TEST_WARNING3"; + +SET @@session.new_mode = "ALL"; +select @@session.new_mode; + +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.new_mode = NULL; + +SET @@global.new_mode = ''; +SELECT @@global.new_mode; + +SET @@global.new_mode = ' '; +SELECT @@global.new_mode; + +--Error ER_WRONG_VALUE_FOR_VAR +SET @@session.new_mode = NULL; + +SET @@session.new_mode = ''; +SELECT @@session.new_mode; + +SET @@session.new_mode = ' '; +SELECT @@session.new_mode; + +--Error ER_WRONG_VALUE_FOR_VAR +SET @@global.new_mode = OFF; + +--Error ER_WRONG_VALUE_FOR_VAR +SET @@session.new_mode = OFF; + +SET @debug_dbug_safe = @@global.debug_dbug; +SET @@global.debug_dbug = 'd,check_new_mode_mdev_37784'; + +create table t1 (a int); +insert into t1 values (1), (2); +create table t2 (b int); +insert into t2 values (3), (4); +select * from t1 where a in (select b from t2); +SET @@new_mode = "FIX_DISK_TMPTABLE_COSTS"; +select * from t1 where a in (select b from t2); +drop table t1, t2; + +SET @@global.debug_dbug = @debug_dbug_safe; + +SET @@global.new_mode = @global_start_value; +SELECT @@global.new_mode; + +SET @@session.new_mode = @session_start_value; +SELECT @@session.new_mode; diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c index d8e7348b968..614cc60320f 100644 --- a/mysys/my_getopt.c +++ b/mysys/my_getopt.c @@ -1684,6 +1684,22 @@ void my_print_help(const struct my_option *options) col= print_comment(optp->typelib->type_names[0], col, name_space, comment_space); for (i= 1; i < count; i++) { + my_bool skip_value= 0; + /* Do not print the value if it is listed in hidden_values */ + if (optp->typelib->hidden_values) + { + for (const int *value= optp->typelib->hidden_values; + *value >= 0; value++) + { + if (*value == (int)i) + { + skip_value= 1; + break; + } + } + } + if (skip_value) + continue; col= print_comment(", ", col, name_space, comment_space); col= print_comment(optp->typelib->type_names[i], col, name_space, comment_space); } diff --git a/sql/handler.cc b/sql/handler.cc index fafb2e3c02a..217f5a85bb4 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -155,7 +155,7 @@ const char *tx_isolation_names[]= NullS}; TYPELIB tx_isolation_typelib= CREATE_TYPELIB_FOR(tx_isolation_names); -static TYPELIB known_extensions= {0,"known_exts", NULL, NULL}; +static TYPELIB known_extensions= {0,"known_exts", NULL, NULL, NULL}; uint known_extensions_id= 0; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 5b4aa041646..ae7f92b214e 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -301,7 +301,7 @@ static const char *tc_heuristic_recover_names[]= static TYPELIB tc_heuristic_recover_typelib= { array_elements(tc_heuristic_recover_names)-1,"", - tc_heuristic_recover_names, NULL + tc_heuristic_recover_names, NULL, NULL }; const char *first_keyword= "first"; @@ -8755,6 +8755,9 @@ static void option_error_reporter(enum loglevel level, const char *format, ...) C_MODE_END +extern const char **new_mode_default_names; + + /** Get server options from the command line, and perform related server initializations. @@ -8813,6 +8816,8 @@ static int get_options(int *argc_ptr, char ***argv_ptr) OLD_MODE_COMPAT_5_1_CHECKSUM); } + check_new_mode_value(NULL, &global_system_variables.new_behavior); + if (global_system_variables.net_buffer_length > global_system_variables.max_allowed_packet) { diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index ff0e09ee5f7..ad51a7b0797 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -2767,6 +2767,15 @@ get_tmp_table_costs(THD *thd, double row_count, uint row_size, bool blobs_used, row_size+= sizeof(char*)*2; row_size= MY_ALIGN(MY_MAX(row_size, sizeof(char*)) + 1, sizeof(char*)); + /* remove this once TEST_NEW_MODE_FLAG is used elsewhere */ + DBUG_EXECUTE_IF("check_new_mode_mdev_37784", + { + if (TEST_NEW_MODE_FLAG(thd, NEW_MODE_FIX_DISK_TMPTABLE_COSTS)) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, ER_YES, "YES" ); + } + }); + if (row_count > thd->variables.max_heap_table_size / (double) row_size || blobs_used) { diff --git a/sql/set_var.cc b/sql/set_var.cc index 6359eb9ab3f..d6acb80d8fe 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -1232,9 +1232,21 @@ int fill_sysvars(THD *thd, TABLE_LIST *tables, COND *cond) strbuf.length(0); for (i=0; i < tl->count; i++) { - const char *name= tl->type_names[i]; - strbuf.append(name, strlen(name)); - strbuf.append(','); + bool show= TRUE; + if (tl->hidden_values) + { + for (uint j= 0; tl->hidden_values[j] >= 0; j++) + { + if (tl->hidden_values[j] == (int)i) + show= FALSE; + } + } + if (show) + { + const char *name= tl->type_names[i]; + strbuf.append(name, strlen(name)); + strbuf.append(','); + } } if (!strbuf.is_empty()) strbuf.chop(); diff --git a/sql/set_var.h b/sql/set_var.h index 607b8127b6a..859cf6d9ac1 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -488,4 +488,6 @@ void free_engine_list(plugin_ref *list); plugin_ref *copy_engine_list(plugin_ref *list); plugin_ref *temp_copy_engine_list(THD *thd, plugin_ref *list); char *pretty_print_engine_list(THD *thd, plugin_ref *list); +void check_new_mode_value(THD *thd, ulonglong *v); + #endif diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index 6449819036f..6ac24cc7562 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -12297,3 +12297,8 @@ WARN_INDEX_HINTS_IGNORED ukr "Підказки по використанню индексів ігноруются тому що вони несумісні з RETURNING" ER_SIGNAL_SKIP_ROW_FROM_TRIGGER eng "The row is skipped by a trigger implementation" +ER_WARN_DEFAULT_SYNTAX + chi "'%s' 默认并被忽略" + eng "'%s' is default and ignored" + ger "'%s' ist Standard und wird ignoriert" + spa "'%s' Es predeterminado e ignorado" diff --git a/sql/sql_class.h b/sql/sql_class.h index 1a27eb546d0..3a0cc891d8e 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -216,6 +216,24 @@ enum enum_binlog_row_image { void old_mode_deprecated_warnings(ulonglong v); + +/* + Bits for @@new_mode -> thd->variables.new_behaviour system variable + See sys_vars.cc /new_mode_all_names +*/ + +#define NEW_MODE_FIX_DISK_TMPTABLE_COSTS (1 << 0) +#define NEW_MODE_MAX 1 + +/* Definitions above that have transitioned from new behaviour to default */ + +#define NOW_DEFAULT -1 +#define NEW_MODE_TEST_WARNING1 NOW_DEFAULT +#define NEW_MODE_TEST_WARNING2 NOW_DEFAULT + +#define TEST_NEW_MODE_FLAG(thd, flag) \ + (flag == NOW_DEFAULT ? TRUE : thd->variables.new_behavior & flag) + extern char internal_table_name[2]; extern char empty_c_string[1]; extern MYSQL_PLUGIN_IMPORT const char **errmesg; @@ -724,6 +742,7 @@ typedef struct system_variables ulonglong optimizer_trace; sql_mode_t sql_mode; ///< which non-standard SQL behaviour should be enabled sql_mode_t old_behavior; ///< which old SQL behaviour should be enabled + sql_mode_t new_behavior; ///< which new SQL behaviour should be enabled ulonglong option_bits; ///< OPTION_xxx constants, e.g. OPTION_PROFILING ulonglong join_buff_space_limit; ulonglong log_slow_filter; diff --git a/sql/sql_locale.cc b/sql/sql_locale.cc index da9c81a3153..33b9260c28c 100644 --- a/sql/sql_locale.cc +++ b/sql/sql_locale.cc @@ -3194,25 +3194,25 @@ static const char *my_locale_ab_day_names_el_GR[8]= static TYPELIB my_locale_typelib_month_names_el_GR= { array_elements(my_locale_month_names_el_GR) - 1, - "", my_locale_month_names_el_GR, NULL + "", my_locale_month_names_el_GR, NULL, NULL }; static TYPELIB my_locale_typelib_ab_month_names_el_GR= { array_elements(my_locale_ab_month_names_el_GR)-1, - "", my_locale_ab_month_names_el_GR, NULL + "", my_locale_ab_month_names_el_GR, NULL, NULL }; static TYPELIB my_locale_typelib_day_names_el_GR= { array_elements(my_locale_day_names_el_GR)-1, - "", my_locale_day_names_el_GR, NULL + "", my_locale_day_names_el_GR, NULL, NULL }; static TYPELIB my_locale_typelib_ab_day_names_el_GR= { array_elements(my_locale_ab_day_names_el_GR) - 1, - "", my_locale_ab_day_names_el_GR, NULL + "", my_locale_ab_day_names_el_GR, NULL, NULL }; MY_LOCALE my_locale_el_GR @@ -3262,25 +3262,25 @@ static const char *my_locale_ab_day_names_rm_CH[8]= static TYPELIB my_locale_typelib_month_names_rm_CH= { array_elements(my_locale_month_names_rm_CH) - 1, - "", my_locale_month_names_rm_CH, NULL + "", my_locale_month_names_rm_CH, NULL, NULL }; static TYPELIB my_locale_typelib_ab_month_names_rm_CH= { array_elements(my_locale_ab_month_names_rm_CH) - 1, - "", my_locale_ab_month_names_rm_CH, NULL + "", my_locale_ab_month_names_rm_CH, NULL, NULL }; static TYPELIB my_locale_typelib_day_names_rm_CH= { array_elements(my_locale_day_names_rm_CH) - 1, - "", my_locale_day_names_rm_CH, NULL + "", my_locale_day_names_rm_CH, NULL, NULL }; static TYPELIB my_locale_typelib_ab_day_names_rm_CH= { array_elements(my_locale_ab_day_names_rm_CH) - 1, - "", my_locale_ab_day_names_rm_CH, NULL + "", my_locale_ab_day_names_rm_CH, NULL, NULL }; MY_LOCALE my_locale_rm_CH diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 704487f7ce1..70c4333474b 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -4105,6 +4105,81 @@ static Sys_var_set Sys_old_behavior( old_mode_names, DEFAULT(OLD_MODE_DEFAULT_VALUE), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(old_mode_deprecated)); + +/* + Current 'not yet default' @@new_mode flag names see sql_class.h /NEW_MODE_ + These need to be be kept in the same order as the value of definitions above +*/ +static const char *new_mode_all_names[]= +{ + "FIX_DISK_TMPTABLE_COSTS", + "TEST_WARNING1", // Default from here, See NEW_MODE_MAX + "TEST_WARNING2", + 0 +}; + +static int new_mode_hidden_names[] = +{ + 1, // TEST_WARNING1 + 2, // TEST_WARNING2 + -1 // End of list +}; + +/* + @@new_mode flag names that are now default and thus not configurable + see previous comment +*/ +const char **new_mode_default_names= &new_mode_all_names[NEW_MODE_MAX]; + + +/* + @brief + Emit warnings if the value of @@new_mode in *v contains flags that are + already included in the default behavior. + + @param v INOUT Bitmap where bits represent indexes in new_mode_all_names + array. + Bits representing obsolete elements will be cleared. +*/ + +void check_new_mode_value(THD *thd, ulonglong *v) +{ + ulonglong vl= *v >> NEW_MODE_MAX; + for (uint i=0; new_mode_default_names[i]; i++) + { + if ((1ULL<save_result.ulonglong_value); + return false; +} + +static Sys_var_set Sys_new_behavior( + "new_mode", + "Used to introduce new behavior to existing MariaDB versions", + SESSION_VAR(new_behavior), CMD_LINE(REQUIRED_ARG), + new_mode_all_names, DEFAULT(0), + NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_new_mode_var_value), 0, 0, + new_mode_hidden_names); + #if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) #define SSL_OPT(X) CMD_LINE(REQUIRED_ARG,X) #else diff --git a/sql/sys_vars.inl b/sql/sys_vars.inl index eef17c13181..02d42d1065d 100644 --- a/sql/sys_vars.inl +++ b/sql/sys_vars.inl @@ -320,7 +320,7 @@ public: ulonglong def_val, PolyLock *lock, enum binlog_status_enum binlog_status_arg, on_check_function on_check_func, on_update_function on_update_func, - const char *substitute) + const char *substitute, int *hidden_values) : sys_var(&all_sys_vars, name_arg, comment, flag_args, off, getopt.id, getopt.arg_type, show_val_type_arg, def_val, lock, binlog_status_arg, on_check_func, @@ -329,6 +329,7 @@ public: for (typelib.count= 0; values[typelib.count]; typelib.count++) /*no-op */; typelib.name=""; typelib.type_names= values; + typelib.hidden_values= hidden_values; typelib.type_lengths= 0; // only used by Fields_enum and Field_set option.typelib= &typelib; } @@ -390,7 +391,7 @@ public: : Sys_var_typelib(name_arg, comment, flag_args, off, getopt, SHOW_CHAR, values, def_val, lock, binlog_status_arg, on_check_func, on_update_func, - substitute) + substitute, nullptr) { option.var_type|= GET_ENUM; option.min_value= 0; @@ -461,7 +462,7 @@ public: : Sys_var_typelib(name_arg, comment, flag_args, off, getopt, SHOW_MY_BOOL, bool_values, def_val, lock, binlog_status_arg, on_check_func, on_update_func, - substitute) + substitute, nullptr) { option.var_type|= GET_BOOL; global_var(my_bool)= def_val; @@ -1407,11 +1408,11 @@ public: enum binlog_status_enum binlog_status_arg=VARIABLE_NOT_IN_BINLOG, on_check_function on_check_func=0, on_update_function on_update_func=0, - const char *substitute=0) + const char *substitute=0, int *hidden_values=nullptr) : Sys_var_typelib(name_arg, comment, flag_args, off, getopt, SHOW_CHAR, values, def_val, lock, binlog_status_arg, on_check_func, on_update_func, - substitute) + substitute, hidden_values) { option.var_type|= GET_FLAGSET; global_var(ulonglong)= def_val; @@ -1520,11 +1521,11 @@ public: enum binlog_status_enum binlog_status_arg=VARIABLE_NOT_IN_BINLOG, on_check_function on_check_func=0, on_update_function on_update_func=0, - const char *substitute=0) + const char *substitute=0,int *hidden_values=nullptr) : Sys_var_typelib(name_arg, comment, flag_args, off, getopt, SHOW_CHAR, values, def_val, lock, binlog_status_arg, on_check_func, on_update_func, - substitute) + substitute, hidden_values) { option.var_type|= GET_SET; option.min_value= 0; @@ -1573,6 +1574,13 @@ public: !my_charset_latin1.strnncollsp(res->to_lex_cstring(), all_clex_str)) { var->save_result.ulonglong_value= ((1ULL << (typelib.count)) -1); + if (typelib.hidden_values) + { + for (const int *p= typelib.hidden_values; *p >= 0; p++) + { + var->save_result.ulonglong_value &= ~(1ull << *p); + } + } error_len= 0; } /* @@ -1971,11 +1979,11 @@ public: enum binlog_status_enum binlog_status_arg=VARIABLE_NOT_IN_BINLOG, on_check_function on_check_func=0, on_update_function on_update_func=0, - const char *substitute=0) + const char *substitute=0, int *hidden_values=nullptr) : Sys_var_typelib(name_arg, comment, flag_args, off, getopt, SHOW_MY_BOOL, bool_values, def_val, lock, binlog_status_arg, on_check_func, on_update_func, - substitute) + substitute, nullptr) { option.var_type|= GET_BIT; reverse_semantics= my_count_bits(bitmask_arg) > 1; diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 570e534da8d..157e48f3cca 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -346,7 +346,7 @@ TYPELIB innodb_linux_aio_typelib = { array_elements(innodb_linux_aio_names) - 1, "innodb_linux_aio_typelib", innodb_linux_aio_names, - NULL + NULL, NULL }; #endif diff --git a/storage/maria/s3_func.c b/storage/maria/s3_func.c index 587e9b19f21..73c9cffed26 100644 --- a/storage/maria/s3_func.c +++ b/storage/maria/s3_func.c @@ -43,7 +43,7 @@ static const char *protocol_types[]= {"Auto", "Original", "Amazon", "Legacy", "P TYPELIB s3_protocol_typelib= CREATE_TYPELIB_FOR(protocol_types); static const char *providers[]= {"Default", "Amazon", "Huawei", NullS}; -TYPELIB s3_provider_typelib = {array_elements(providers)-1,"",providers, NULL}; +TYPELIB s3_provider_typelib = {array_elements(providers)-1,"",providers, NULL, NULL}; /****************************************************************************** Allocations handler for libmarias3