mysql-server/mysql-test/t/persisted_variables_bugs.test
2025-03-05 14:31:37 +07:00

573 lines
19 KiB
Text

--source include/have_log_bin.inc
--source include/have_binlog_format_row.inc
--echo #
--echo # Bug #27016247: SET PERSIST_ONLY DOES NOT CONSIDER RUNTIME VALIDATION
--echo #
--echo # Should fail: event_scheduler does not allow setting to DISABLED at runtime
--error ER_WRONG_VALUE_FOR_VAR
SET PERSIST event_scheduler=DISABLED;
--echo # Should fail: data type still checked even with persist_only
--error ER_WRONG_TYPE_FOR_VAR
SET PERSIST_ONLY event_scheduler=123.456;
--echo # Should work: check not called for PERSIST_ONLY
SET PERSIST_ONLY event_scheduler=DISABLED;
--echo # cleanup
RESET PERSIST event_scheduler;
--echo #
--echo # Bug #27374791: RESET PERSIST DOES IMPLICIT COMMIT AND DOESN'T NEED
--echo # RELOAD PRIVILEGES
--echo #
CREATE DATABASE bug27374791;
USE bug27374791;
CREATE TABLE T( i int);
# Get rid of previous tests binlog
--disable_query_log
RESET BINARY LOGS AND GTIDS;
--enable_query_log
--source include/rpl/deprecated/show_binlog_events.inc
BEGIN;
INSERT INTO T values (9);
--source include/rpl/deprecated/show_binlog_events.inc
SET PERSIST max_connections=31;
--source include/rpl/deprecated/show_binlog_events.inc
RESET PERSIST;
# There should be no COMMIT event in binlog
--source include/rpl/deprecated/show_binlog_events.inc
# cleanup
SET GLOBAL max_connections=DEFAULT;
DROP DATABASE bug27374791;
--echo #
--echo # Bug #27322254: WITH PERSIST_ONLY, VARIABLE VALUE EQUALS 18446744073709547520
--echo # IS STORED AS -4096
--echo #
SELECT @@max_binlog_cache_size;
SET PERSIST max_binlog_cache_size= @@global.max_binlog_cache_size;
SELECT * FROM performance_schema.persisted_variables WHERE
VARIABLE_NAME= 'max_binlog_cache_size';
SET PERSIST_ONLY max_binlog_cache_size= @@global.max_binlog_cache_size;
SELECT * FROM performance_schema.persisted_variables WHERE
VARIABLE_NAME= 'max_binlog_cache_size';
# Similar test which fixes this bug without SET PERSIST_ONLY
SET @a=cast(@@max_binlog_cache_size as char);
SELECT @a;
# Cleanup
RESET PERSIST;
SET GLOBAL max_binlog_cache_size= DEFAULT;
--echo #
--echo # Bug #27536421: SET PERSIST CHANGES THE VALUE OF OPTIMIZER_TRACE_OFFSET
--echo # AFTER RESTART
--echo #
# default value
--replace_column 6 ###
SELECT @@global.optimizer_trace_offset, @@global.activate_all_roles_on_login,
@@global.auto_increment_increment, @@global.auto_increment_offset,
@@global.binlog_error_action, @@global.binlog_format,
@@global.cte_max_recursion_depth, @@global.eq_range_index_dive_limit,
@@global.innodb_monitor_disable, @@global.histogram_generation_max_mem_size,
@@global.innodb_max_dirty_pages_pct, @@global.init_connect,
@@global.max_join_size;
# SHOW_SIGNED_LONG
SET PERSIST optimizer_trace_offset = default;
# SHOW_MY_BOOL
SET PERSIST activate_all_roles_on_login= ON;
# SHOW_LONG
SET PERSIST auto_increment_increment= 4, auto_increment_offset= 2;
# SHOW_CHAR
SET PERSIST binlog_error_action= IGNORE_ERROR, binlog_format= ROW;
# SHOW_INT
SET PERSIST cte_max_recursion_depth= 4294967295, eq_range_index_dive_limit= 4294967295;
# SHOW_CHAR_PTR
SET PERSIST innodb_monitor_disable='latch';
# SHOW_DOUBLE
SET PERSIST innodb_max_dirty_pages_pct= 97.3;
# SHOW_LEX_STRING
SET PERSIST init_connect='SET autocommit=0';
# SHOW_HA_ROWS
SET PERSIST max_join_size= 18446744073709551615;
# persisted value
--replace_column 6 ###
SELECT @@global.optimizer_trace_offset, @@global.activate_all_roles_on_login,
@@global.auto_increment_increment, @@global.auto_increment_offset,
@@global.binlog_error_action, @@global.binlog_format,
@@global.cte_max_recursion_depth, @@global.eq_range_index_dive_limit,
@@global.innodb_monitor_disable,
@@global.innodb_max_dirty_pages_pct, @@global.init_connect,
@@global.max_join_size;
SELECT * FROM performance_schema.persisted_variables ORDER BY 1;
--echo # Restart server
--source include/restart_mysqld.inc
# persisted value after restart
--replace_column 6 ###
SELECT @@global.optimizer_trace_offset, @@global.activate_all_roles_on_login,
@@global.auto_increment_increment, @@global.auto_increment_offset,
@@global.binlog_error_action, @@global.binlog_format,
@@global.cte_max_recursion_depth, @@global.eq_range_index_dive_limit,
@@global.innodb_monitor_disable,
@@global.innodb_max_dirty_pages_pct, @@global.init_connect,
@@global.max_join_size;
SELECT * FROM performance_schema.persisted_variables ORDER BY 1;
--echo # Cleanup
RESET PERSIST;
SET GLOBAL optimizer_trace_offset = default, activate_all_roles_on_login = default,
auto_increment_increment = default, auto_increment_offset = default,
binlog_error_action = default, binlog_format = default,
cte_max_recursion_depth = default, eq_range_index_dive_limit = default,
innodb_monitor_disable = default,
innodb_max_dirty_pages_pct = default, init_connect = default,
max_join_size = default;
--echo #
--echo # Bug #27629719: SET PERSIST STORES TRUNCATED TIMESTAMPS
--echo #
--echo # Set one variable in the mysqld-auto.cnf
SET PERSIST max_join_size= 10000000;
--echo # Set another variable in the mysqld-auto.cnf
SET PERSIST init_connect='';
--echo # Restart the server so it sets the variable time from mysqld-auto.cnf
--source include/restart_mysqld.inc
--echo # Check the microseconds of set_time: must be 2 (i.e. different for the two vars)
SELECT COUNT(DISTINCT MICROSECOND(set_time)) FROM performance_schema.variables_info
WHERE variable_name IN ('max_join_size', 'init_connect');
--echo # Cleanup
SET GLOBAL max_join_size=DEFAULT, init_connect=DEFAULT;
RESET PERSIST;
--echo #
--echo # Bug #27489026: PERSIST_ONLY DOESN'T RESPECT DEFAULT INSTEAD COPIES GLOBAL VALUE
--echo #
SELECT @@global.binlog_cache_size;
SELECT @@global.collation_database;
# test SIGNED long value
SELECT @@global.optimizer_trace_offset;
# test Sys_var_flagset type
SELECT @@global.optimizer_switch;
# test Sys_var_multi_enum type
SELECT @@global.enforce_gtid_consistency;
# test Sys_var_set type
SELECT @@global.sql_mode;
# set value different from default
SET @@global.binlog_cache_size= 4096;
# persist default values
SET @@persist_only.binlog_cache_size= default,
@@persist_only.collation_database= default,
@@persist_only.optimizer_trace_offset= default,
@@persist_only.optimizer_switch= default,
@@persist_only.enforce_gtid_consistency= default,
@@persist_only.sql_mode= default;
SELECT * FROM performance_schema.persisted_variables ORDER BY 1;
--echo # Restart server
--source include/restart_mysqld.inc
# must have default values.
SELECT @@global.binlog_cache_size;
SELECT @@global.collation_database;
SELECT @@global.optimizer_trace_offset;
SELECT @@global.optimizer_switch;
SELECT @@global.enforce_gtid_consistency;
SELECT @@global.sql_mode;
SELECT * FROM performance_schema.persisted_variables ORDER BY 1;
--echo # Cleanup
RESET PERSIST;
--echo #
--echo # Bug #27523095: SET PERSIST MANDATORY_ROLES FAILS TO START THE SERVER
--echo #
SET PERSIST mandatory_roles= default;
--echo # Restart server and check if server starts
--source include/restart_mysqld.inc
SELECT * FROM performance_schema.persisted_variables ORDER BY 1;
# Cleanup
RESET PERSIST;
--echo #
--echo # Bug #27903874: [MYSQL 8.0 GA DEBUG BUILD] ASSERTION `!THD ||
--echo # THD->LOCKED_TABLES_MODE || !THD->M
--echo #
CREATE DATABASE bug27903874;
USE bug27903874;
SET @@autocommit=FALSE;
CREATE TABLE t(a CHAR (1))ENGINE=InnoDB;
--error ER_VAR_DOES_NOT_EXIST
RESET PERSIST size;
--error ER_BAD_FIELD_ERROR
SELECT JSON_OBJECTAGG(id,x) FROM t;
RESET REPLICA;
# cleanup
DROP DATABASE bug27903874;
--echo #
--echo # Bug #27512616: SET PERSIST COMMAND FAILS TO MAP DEFAULT(NULL) VALUES IN
--echo # MYSQLD-AUTO.CNF
--echo #
SELECT @@global.innodb_tmpdir;
SET PERSIST innodb_tmpdir = default;
SELECT @@global.innodb_ft_user_stopword_table;
SET PERSIST innodb_ft_user_stopword_table = NULL;
--echo # Restart server and check if server starts
--source include/restart_mysqld.inc
SELECT variable_name FROM performance_schema.variables_info WHERE variable_source='PERSISTED';
SELECT @@global.innodb_tmpdir, @@global.innodb_ft_user_stopword_table;
# Cleanup
RESET PERSIST;
--echo #
--echo # Bug #28564239: RESET PERSIST REQUIRES NO PRIVILEGES
--echo #
CREATE USER u1;
# persist some static and dynamic variables
SET PERSIST_ONLY ft_query_expansion_limit=80, innodb_api_enable_mdl=1;
SET PERSIST sort_buffer_size=156000,max_connections= 52;
SET PERSIST max_heap_table_size=887808, replica_net_timeout=160;
--connect(con1, localhost, u1)
SHOW GRANTS;
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
RESET PERSIST max_heap_table_size;
--error ER_PERSIST_ONLY_ACCESS_DENIED_ERROR
RESET PERSIST ft_query_expansion_limit;
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
RESET PERSIST;
connection default;
GRANT SUPER ON *.* TO u1;
disconnect con1;
# grant SUPER only
--connect(con1, localhost, u1)
SHOW GRANTS;
RESET PERSIST max_heap_table_size;
--error ER_PERSIST_ONLY_ACCESS_DENIED_ERROR
RESET PERSIST ft_query_expansion_limit;
--error ER_PERSIST_ONLY_ACCESS_DENIED_ERROR
RESET PERSIST;
connection default;
REVOKE SUPER ON *.* FROM u1;
GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO u1;
disconnect con1;
# grant SYSTEM_VARIABLES_ADMIN only
--connect(con1, localhost, u1)
SHOW GRANTS;
RESET PERSIST max_connections;
--error ER_PERSIST_ONLY_ACCESS_DENIED_ERROR
RESET PERSIST ft_query_expansion_limit;
--error ER_PERSIST_ONLY_ACCESS_DENIED_ERROR
RESET PERSIST;
connection default;
REVOKE SYSTEM_VARIABLES_ADMIN ON *.* FROM u1;
GRANT PERSIST_RO_VARIABLES_ADMIN ON *.* TO u1;
disconnect con1;
# grant PERSIST_RO_VARIABLES_ADMIN only
--connect(con1, localhost, u1)
SHOW GRANTS;
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
RESET PERSIST replica_net_timeout;
--error ER_PERSIST_ONLY_ACCESS_DENIED_ERROR
RESET PERSIST ft_query_expansion_limit;
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
RESET PERSIST;
connection default;
GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO u1;
disconnect con1;
# grant SYSTEM_VARIABLES_ADMIN and PERSIST_RO_VARIABLES_ADMIN
--connect(con1, localhost, u1)
SHOW GRANTS;
RESET PERSIST replica_net_timeout;
RESET PERSIST ft_query_expansion_limit;
RESET PERSIST;
connection default;
# ensure no persisted variables exists
SELECT * FROM performance_schema.persisted_variables;
# set variables to default
SET GLOBAL sort_buffer_size = default, max_connections = default,
replica_net_timeout = default, max_heap_table_size = default;
DROP USER u1;
disconnect con1;
--echo #
--echo # Bug #28466045: SET PERSIST NOT SETTING CORRECT VALUES FOR VARIABLES
--echo # LIKE INNODB_STRICT_MODE
--echo #
SELECT @@global.innodb_strict_mode, @@global.innodb_lock_wait_timeout;
SELECT @@global.myisam_sort_buffer_size;
# enum variable type
SELECT @@global.myisam_stats_method;
SET PERSIST innodb_strict_mode=0;
SET GLOBAL innodb_lock_wait_timeout = 150;
SELECT @@global.innodb_lock_wait_timeout;
SET PERSIST innodb_lock_wait_timeout = 110;
SELECT @@global.innodb_lock_wait_timeout;
SET GLOBAL myisam_sort_buffer_size=16777216;
SET PERSIST myisam_sort_buffer_size=default;
SELECT @@global.innodb_lock_wait_timeout;
SET PERSIST myisam_stats_method=nulls_equal;
--echo # Restart server
--source include/restart_mysqld.inc
SELECT @@global.innodb_strict_mode;
SELECT @@global.innodb_lock_wait_timeout;
SELECT @@global.myisam_sort_buffer_size;
SELECT @@global.myisam_stats_method;
SELECT variable_name FROM performance_schema.variables_info WHERE variable_source='PERSISTED';
SET GLOBAL innodb_strict_mode=default, innodb_lock_wait_timeout=default,
myisam_stats_method=default;
RESET PERSIST;
--echo #
--echo # Bug #30030648: NO DEPRECATION WARNING ON SERVER RESTART FOR SET PERSISTED OPTIONS
--echo #
--echo # should report warning
SET GLOBAL delayed_insert_limit=100;
--echo # should report warning
SET PERSIST_ONLY delayed_insert_limit=100;
--echo # should report warning
SET PERSIST delayed_insert_limit=100;
--let $ofile= $MYSQLTEST_VARDIR/tmp/server_log.err
--echo # Restart server
--let $restart_parameters=restart:--log_error=$MYSQLTEST_VARDIR/tmp/server_log.err
--replace_result $MYSQLTEST_VARDIR tmp_dir
--source include/restart_mysqld_no_echo.inc
--let $assert_text= Assert that there is a warning at bootstrap when setting --delayed_insert_limit
--let $assert_file= $MYSQLTEST_VARDIR/tmp/server_log.err
--let $assert_select= '@@delayed_insert_limit' is deprecated and will be removed in a future release.
--let $assert_count= 1
--source include/assert_grep.inc
--remove_file $MYSQLTEST_VARDIR/tmp/server_log.err
RESET PERSIST;
--echo #
--echo # Bug #28749668: SKIP_NAME_RESOLVE CAN BE PERSIT_ONLY-ED TO ON, BUT NOT OFF
--echo #
SELECT @@global.skip_name_resolve;
CREATE USER 'bug28749668'@'%';
GRANT ALL ON *.* TO 'bug28749668'@'%';
--connect(con1, localhost, bug28749668)
SET PERSIST_ONLY skip_name_resolve=0;
disconnect con1;
connection default;
--echo # Restart server and check if server starts
--let $restart_parameters=restart:
--source include/restart_mysqld.inc
--connect(con1, localhost, bug28749668)
SELECT @@global.skip_name_resolve;
SELECT * FROM performance_schema.persisted_variables;
connection default;
RESET PERSIST;
#cleanup
DROP USER 'bug28749668'@'%';
disconnect con1;
--echo #
--echo # Bug #30169731: MYSQL SERVER DOESN'T START AND NO ERROR IN THE LOG
--echo #
# Set variables to be used in parameters of mysqld.
let $MYSQLD_DATADIR= `SELECT @@datadir`;
let $MYSQL_BASEDIR= `SELECT @@basedir`;
let $MYSQL_SOCKET= `SELECT @@socket`;
let $MYSQL_PIDFILE= `SELECT @@pid_file`;
let $MYSQL_PORT= `SELECT @@port`;
let $MYSQL_MESSAGESDIR= `SELECT @@lc_messages_dir`;
let MYSQLD_LOG=$MYSQL_TMP_DIR/server.log;
--source include/shutdown_mysqld.inc
--remove_file $MYSQLD_DATADIR/mysqld-auto.cnf
--echo # config file is in wrong json format
--write_file $MYSQLD_DATADIR/mysqld-auto.cnf
{ Version" : 1 , "mysql_server" : { "max_connections" : { "Value" : "23" , "Metadata" : { "Timestamp" : 1573471430265110 , "User" : "root" , "Host" : "localhost" } } } }
EOF
--echo # server should fail to start
--error 0,1
--exec $MYSQLD_CMD --basedir=$MYSQL_BASEDIR --datadir=$MYSQLD_DATADIR --socket=$MYSQL_SOCKET --pid-file=$MYSQL_PIDFILE --port=$MYSQL_PORT --lc-messages-dir=$MYSQL_MESSAGESDIR --daemonize --secure-file-priv="" > $MYSQLD_LOG 2>&1
--remove_file $MYSQLD_DATADIR/mysqld-auto.cnf
--echo # start server with all defaults
--source include/start_mysqld.inc
--let $assert_text=Server should fail to start as mysqld-auto.cnf file is with wrong JSON format.
--let $assert_file=$MYSQLD_LOG
--let $assert_select=Persisted config file is corrupt. Please ensure mysqld-auto.cnf file is valid JSON.
--let $assert_count=1
--source include/assert_grep.inc
--remove_file $MYSQLD_LOG
--echo #
--echo # Bug #32761053: SET PERSIST_ONLY ... = DEFAULT IS BROKEN FOR ENUM VARIABLES
--echo #
SET PERSIST_ONLY replica_exec_mode = DEFAULT;
SELECT * FROM performance_schema.persisted_variables
WHERE variable_name='replica_exec_mode';
RESET PERSIST;
--echo #
--echo # Bug #32640588: SOURCE FOR SKIP_SLAVE_START DISPLAYED AS COMPILED
--echo # WHEN IT IS PERSISTED
--echo #
--echo # Should both be "COMPILED"
SELECT VARIABLE_NAME, VARIABLE_SOURCE FROM performance_schema.variables_info
WHERE variable_name LIKE 'skip_%_start' ORDER BY 1;
SET PERSIST_ONLY skip_replica_start = ON;
--echo # Should still be "COMPILED" pre-restart
SELECT VARIABLE_NAME, VARIABLE_SOURCE FROM performance_schema.variables_info
WHERE variable_name LIKE 'skip_%_start' ORDER BY 1;
--source include/restart_mysqld.inc
--echo # Success criteria: Should be "PERSISTED" post-restart
SELECT VARIABLE_NAME, VARIABLE_SOURCE FROM performance_schema.variables_info
WHERE variable_name LIKE 'skip_%_start' ORDER BY 1;
RESET PERSIST;
--source include/restart_mysqld.inc
--echo #
--echo # Bug #33388488: NO DEPRECATION WARNING ON SERVER RESTART IF TWO OR MORE
--echo # PERSISTED OPTIONS
--echo #
SET PERSIST temptable_use_mmap=FALSE;
SET PERSIST delayed_insert_limit=100;
--let LOG_ERR=$MYSQLTEST_VARDIR/tmp/myerror.err
--let $restart_parameters=restart:--log_error=$LOG_ERR --no-console
--replace_result $LOG_ERR LOG_ERR
--source include/restart_mysqld.inc
--let $assert_text= Assert that there is a warning at bootstrap when setting temptable_use_mmap
--let $assert_file= $LOG_ERR
--let $assert_select= 'temptable_use_mmap' is deprecated and will be removed in a future release.
--let $assert_count= 1
--source include/assert_grep.inc
--let $assert_text= Assert that there is a warning at bootstrap when setting delayed_insert_limit
--let $assert_file= $LOG_ERR
--let $assert_select= '@@delayed_insert_limit' is deprecated and will be removed in a future release.
--let $assert_count= 1
--source include/assert_grep.inc
RESET PERSIST;
--remove_file $LOG_ERR
SET PERSIST_ONLY temptable_use_mmap=FALSE;
SET PERSIST_ONLY delayed_insert_limit=100;
--let $restart_parameters=restart:--log_error=$LOG_ERR --no-console
--replace_result $LOG_ERR LOG_ERR
--source include/restart_mysqld.inc
--let $assert_text= Assert that there is a warning at bootstrap when setting temptable_use_mmap
--let $assert_file= $LOG_ERR
--let $assert_select= 'temptable_use_mmap' is deprecated and will be removed in a future release.
--let $assert_count= 1
--source include/assert_grep.inc
--let $assert_text= Assert that there is a warning at bootstrap when setting delayed_insert_limit
--let $assert_file= $LOG_ERR
--let $assert_select= '@@delayed_insert_limit' is deprecated and will be removed in a future release.
--let $assert_count= 1
--source include/assert_grep.inc
RESET PERSIST;
--remove_file $LOG_ERR
# set to default
--let $restart_parameters=restart:
--source include/restart_mysqld.inc
--echo #
--echo # Bug #34751419: component system variable behaves differently from command-line and set persist
--echo #
call mtr.add_suppression("Duplicate variable name 'test_component.int_sys_var'");
INSTALL COMPONENT "file://component_test_sys_var_service";
SET PERSIST test_component.bool_sys_var = OFF;
SET PERSIST test_component.bool_ro_sys_var = OFF;
SET PERSIST replica_preserve_commit_order = OFF;
--source include/restart_mysqld.inc
UNINSTALL COMPONENT "file://component_test_sys_var_service";
INSTALL COMPONENT "file://component_test_sys_var_service";
--echo # Test: Should be set to OFF
SHOW VARIABLES LIKE 'test_component.bool_sys_var';
--echo # Test read only: Should be set to OFF
SHOW VARIABLES LIKE 'test_component.bool_ro_sys_var';
# Cleanup
RESET PERSIST test_component.bool_sys_var;
RESET PERSIST test_component.bool_ro_sys_var;
RESET PERSIST replica_preserve_commit_order;
SET GLOBAL replica_preserve_commit_order = DEFAULT;
UNINSTALL COMPONENT "file://component_test_sys_var_service";
--echo #
--echo # Bug #34897517: Can't set report_host to NULL
--echo #
--error ER_NULL_CANT_BE_PERSISTED_FOR_READONLY
SET PERSIST_ONLY report_host = NULL;
--error ER_NULL_CANT_BE_PERSISTED_FOR_READONLY
SET PERSIST_ONLY report_host = DEFAULT;
SET PERSIST ssl_crl = NULL;
RESET PERSIST ssl_crl;
SET GLOBAL ssl_crl = DEFAULT;
--echo # End of the 8.0 tests