# The test contains a storage engine limited to statement-based logging, since, # 'example' plugin doesn't support binlog_format=ROW. Thus, test now sets # binlog_format=STATEMENT when log-bin is enabled and binlog_format=ROW. if (`SELECT @@global.log_bin AND @@global.binlog_format = 'ROW'`) { --disable_query_log SET @saved_binlog_format= @@SESSION.binlog_format; SET SESSION binlog_format= STATEMENT; --enable_query_log } --source include/have_example_plugin.inc --source include/have_debug.inc --source include/have_debug_sync.inc # Save the initial number of concurrent sessions --source include/count_sessions.inc --error ER_UNKNOWN_STORAGE_ENGINE CREATE TABLE t1(a int) ENGINE=EXAMPLE; --replace_regex /\.dll/.so/ eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; --replace_regex /\.dll/.so/ --error 1125 eval INSTALL PLUGIN EXAMPLE SONAME '$EXAMPLE_PLUGIN'; UNINSTALL PLUGIN example; --replace_regex /\.dll/.so/ eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; --echo # Example engine does not support indexes --error ER_TOO_MANY_KEYS CREATE TABLE t1 (a int PRIMARY KEY) ENGINE=EXAMPLE; --error ER_TOO_MANY_KEYS CREATE TABLE t1 (a int, KEY (a)) ENGINE=EXAMPLE; CREATE TABLE t1(a int) ENGINE=EXAMPLE; SHOW CREATE TABLE t1; --echo # Let's do some advanced ops with the example engine :) INSERT INTO t1 VALUES (0); --echo # Only supports table scans (and does always return zero rows :) SELECT * FROM t1; SELECT * FROM t1 WHERE a = 0; --echo # Since there are no rows found, it will never do update_row. UPDATE t1 SET a = 1 WHERE a = 0; --echo # Since there are no rows found, it will never do delete_row. DELETE FROM t1 WHERE a = 0; --echo # No support for SQL HANDLER statement --error ER_ILLEGAL_HA HANDLER t1 OPEN; --echo # Try to delete table when plugin is not loaded. --echo # Remove table from TDC to allow plugin unload. FLUSH TABLE t1; UNINSTALL PLUGIN example; --error ER_UNKNOWN_STORAGE_ENGINE DROP TABLE t1; --replace_regex /\.dll/.so/ eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; DROP TABLE t1; # a couple of tests for variables set global example_ulong_var=500; set global example_enum_var= e1; --disable_warnings select * from performance_schema.global_status where variable_name like 'example%' order by variable_name; --enable_warnings --replace_regex /^Last creation.*t1'$/Last creation 't1'/ show variables like 'example%'; UNINSTALL PLUGIN example; --error 1305 UNINSTALL PLUGIN EXAMPLE; --error 1305 UNINSTALL PLUGIN non_exist; --echo # --echo # Bug#32034: check_func_enum() does not check correct values but set it --echo # to impossible int val --echo # --replace_regex /\.dll/.so/ eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; SET GLOBAL example_enum_var= e1; SET GLOBAL example_enum_var= e2; --error 1231 SET GLOBAL example_enum_var= impossible; UNINSTALL PLUGIN example; # # Bug #32757 hang with sql_mode set when setting some global variables # --replace_regex /\.dll/.so/ eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; select @@session.sql_mode into @old_sql_mode; # first, try normal sql_mode (no error, send OK) set session sql_mode=''; set global example_ulong_var=500; select @@global.example_ulong_var; # overflow -- correct value, but throw warning set global example_ulong_var=1111; select @@global.example_ulong_var; # now, try STRICT (error occurrs, no message is sent, so send default) set session sql_mode='STRICT_ALL_TABLES'; set global example_ulong_var=500; select @@global.example_ulong_var; # overflow -- throw warning, do NOT change value --error ER_WRONG_VALUE_FOR_VAR set global example_ulong_var=1111; select @@global.example_ulong_var; set session sql_mode=@old_sql_mode; # finally, show that conditions that already raised an error are not # adversely affected (error was already sent, do nothing) --error ER_INCORRECT_GLOBAL_LOCAL_VAR set session old=bla; UNINSTALL PLUGIN example; --echo # --echo # Bug #16194302 SUPPORT FOR FLOATING-POINT SYSTEM --echo # VARIABLES USING THE PLUGIN INTERFACE. --echo # --replace_regex /\.dll/.so/ eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; SET GLOBAL example_double_var = -0.1; SELECT @@GLOBAL.example_double_var; SET GLOBAL example_double_var = 0.000001; SELECT @@GLOBAL.example_double_var; SET GLOBAL example_double_var = 0.4; SELECT @@GLOBAL.example_double_var; SET GLOBAL example_double_var = 123.456789; SELECT @@GLOBAL.example_double_var; SET GLOBAL example_double_var = 500; SELECT @@GLOBAL.example_double_var; SET GLOBAL example_double_var = 999.999999; SELECT @@GLOBAL.example_double_var; SET GLOBAL example_double_var = 1000.51; SELECT @@GLOBAL.example_double_var; SET SESSION example_double_thdvar = -0.1; SELECT @@SESSION.example_double_thdvar; SET SESSION example_double_thdvar = 0.000001; SELECT @@SESSION.example_double_thdvar; SET SESSION example_double_thdvar = 0.4; SELECT @@SESSION.example_double_thdvar; SET SESSION example_double_thdvar = 123.456789; SELECT @@SESSION.example_double_thdvar; SET SESSION example_double_thdvar = 500; SELECT @@SESSION.example_double_thdvar; SET SESSION example_double_thdvar = 999.999999; SELECT @@SESSION.example_double_thdvar; SET SESSION example_double_thdvar = 1000.51; SELECT @@SESSION.example_double_thdvar; UNINSTALL PLUGIN example; --echo # --echo # BUG#18008907 - DEADLOCK BETWEEN MYSQL_CHANGE_USER(), SHOW VARIABLES AND INSTALL PLUGIN --echo # --enable_connect_log delimiter |; CREATE PROCEDURE p_install() BEGIN INSTALL PLUGIN no_such_plugin SONAME 'no_such_object'; END | CREATE PROCEDURE p_show_vars() BEGIN SELECT COUNT(*) FROM performance_schema.global_variables; END| delimiter ;| connect(con1, localhost, root,,); --echo # Case 18008907_1: Deadlock situation cause by --echo # con1: has LOCK_system_variables_hash and waits on LOCK_plugin AND --echo # default: has LOCK_plugin and waits on LOCK_system_variables_hash. --echo # SET DEBUG_SYNC='acquired_LOCK_system_variables_hash SIGNAL install_plugin WAIT_FOR cont_show_vars'; --send call p_show_vars(); connection default; SET DEBUG_SYNC='now WAIT_FOR install_plugin'; SET DEBUG_SYNC='acquired_LOCK_plugin SIGNAL cont_show_vars'; --send call p_install(); connection con1; # Without fix, reap will hang. --disable_warnings --replace_column 1 # --reap; --enable_warnings SET DEBUG_SYNC='RESET'; connection default; --replace_regex /(Can\'t open shared library).*$/\1/ --error ER_CANT_OPEN_LIBRARY --reap; SET DEBUG_SYNC='RESET'; --echo # Case 18008907_2: Deadlock situation caused by --echo # default: has LOCK_system_variables_hash and waits on LOCK_global_system_variables, --echo # con1: has LOCK_plugin and waits on LOCK_system_variables_hash AND --echo # con2: has LOCK_global_system_variables and waits on LOCK_plugin. SET DEBUG_SYNC='acquired_LOCK_system_variables_hash SIGNAL install_plugin WAIT_FOR nothing TIMEOUT 10'; --send call p_show_vars(); connection con1; SET DEBUG_SYNC='now WAIT_FOR install_plugin'; SET DEBUG_SYNC='acquired_LOCK_plugin SIGNAL create_connection WAIT_FOR nothing TIMEOUT 10'; --send call p_install(); connect(con2, localhost, root,,); SET DEBUG_SYNC='now WAIT_FOR create_connection'; # Without fix, deadlock situation will occur on timeout of debug_syncs in # default and con1. Because of this, change_user operation hangs. change_user; connection con1; --replace_regex /(Can\'t open shared library).*$/\1/ --error ER_CANT_OPEN_LIBRARY --reap; connection default; # Note: This masks 1639 debug sync point timed out warning --disable_warnings --replace_column 1 # --reap; --enable_warnings disconnect con2; --echo # Case 18008907_3: Testing Concurrent "Show Variables" and "Plugin Uninstall" operations. #Installing plugin --replace_regex /\.dll/.so/ eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; connection con1; #Acquiring LOCK_system_variables_hash and LOCK_plugin_delete SET DEBUG_SYNC='acquired_LOCK_system_variables_hash SIGNAL uninstall_plugin WAIT_FOR go'; --send call p_show_vars(); connect(con2, localhost, root,,); SET DEBUG_SYNC='now WAIT_FOR uninstall_plugin'; --send UNINSTALL PLUGIN example; connection default; #Plugin Uninstall operation will wait until show variables operations releases LOCK_plugin_delete. let $wait_condition= SELECT count(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO='UNINSTALL PLUGIN example' and STATE='System lock'; --source include/wait_condition.inc SET DEBUG_SYNC='now SIGNAL go'; connection con1; --disable_warnings --replace_column 1 # --reap --enable_warnings connection con2; --reap connection default; DROP PROCEDURE p_show_vars; DROP PROCEDURE p_install; SET DEBUG_SYNC='RESET'; disconnect con1; disconnect con2; --disable_connect_log --echo # --echo # Bug #11759453: UNINSTALL PLUGIN MISLEADING ERROR --echo # MESSAGE FOR NON-DYNAMIC PLUGINS --echo # # Innodb is now builtin plugin and not dynamically loaded --error ER_PLUGIN_DELETE_BUILTIN UNINSTALL PLUGIN innodb; --echo # --echo # Bug #19917521: MEMORY LEAK WITH STRING THREAD VARIABLE --echo # THAT SET MEMALLOC FLAG --echo # --replace_regex /\.dll/.so/ eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; SET SESSION example_create_count_thdvar = 0; SET SESSION example_last_create_thdvar = ''; CREATE TABLE t10(a INT) ENGINE=EXAMPLE; SELECT @@SESSION.example_create_count_thdvar; --replace_regex /^Last creation.*t10'$/Last creation 't10'/ SELECT @@SESSION.example_last_create_thdvar; CREATE TABLE t20(a INT) ENGINE=EXAMPLE; SELECT @@SESSION.example_create_count_thdvar; --replace_regex /^Last creation.*t20'$/Last creation 't20'/ SELECT @@SESSION.example_last_create_thdvar; DROP TABLE t10, t20; UNINSTALL PLUGIN example; --echo # --echo # BUG#24344026 - SIG 11 IN MY_VALID_MBCHARLEN_UTF8 AT STRINGS/CTYPE-UTF8.CC:9437 --echo # SET GLOBAL DEBUG='+d,set_uninstall_sync_point'; connect(con1, localhost, root,,); connection default; --replace_regex /\.dll/.so/ eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; SET DEBUG_SYNC='before_store_plugin_name SIGNAL uninstall_plugin WAIT_FOR plugin_uninstalled'; --send SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME='example'; connection con1; SET DEBUG_SYNC='now WAIT_FOR uninstall_plugin'; UNINSTALL PLUGIN example; SET DEBUG_SYNC='now SIGNAL plugin_uninstalled'; connection default; --reap SET DEBUG_SYNC='RESET'; SET GLOBAL DEBUG='-d,set_uninstall_sync_point'; disconnect con1; # Wait till we reached the initial number of concurrent sessions --source include/wait_until_count_sessions.inc --echo # --echo # Bug#51770: UNINSTALL PLUGIN requires no privileges --echo # CREATE USER bug51770@localhost; GRANT INSERT ON mysql.plugin TO bug51770@localhost; connect(con1,localhost,bug51770,,); --replace_regex /\.dll/.so/ eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; --error ER_TABLEACCESS_DENIED_ERROR UNINSTALL PLUGIN example; connection default; GRANT DELETE ON mysql.plugin TO bug51770@localhost; connection con1; UNINSTALL PLUGIN example; disconnect con1; connection default; DROP USER bug51770@localhost; # # BUG#58246: INSTALL PLUGIN not secure & crashable # # The bug consisted of not recognizing / on Windows, so checking / on # all platforms should cover this case. let $path = `select CONCAT_WS('/', '..', '$EXAMPLE_PLUGIN')`; --replace_regex /\.dll/.so/ --error ER_UDF_NO_PATHS eval INSTALL PLUGIN example SONAME '$path'; if (`SELECT @@global.log_bin AND @@global.binlog_format = 'ROW'`) { --disable_query_log SET SESSION binlog_format= @saved_binlog_format; --enable_query_log } --echo # --echo # Bug #28534414: NEGATIVE NUMBERS IN PLUGIN VARIABLES --echo # NOT DISPLAYED CORRECTLY --echo # --replace_regex /\.dll/.so/ eval INSTALL PLUGIN example SONAME '$EXAMPLE_PLUGIN'; SELECT * FROM performance_schema.global_status WHERE variable_name LIKE 'example_func_example' ORDER BY variable_name; #Test for signed int plugin global variable SHOW VARIABLES LIKE 'example_signed_int_var'; SELECT @@GLOBAL.example_signed_int_var; SET GLOBAL example_signed_int_var = -2147483648; SELECT @@GLOBAL.example_signed_int_var; SET GLOBAL example_signed_int_var = -100; SELECT @@GLOBAL.example_signed_int_var; SET GLOBAL example_signed_int_var = 0; SELECT @@GLOBAL.example_signed_int_var; SET GLOBAL example_signed_int_var = 100; SELECT @@GLOBAL.example_signed_int_var; SET GLOBAL example_signed_int_var = 2147483647; SELECT @@GLOBAL.example_signed_int_var; SET GLOBAL example_signed_int_var = -2147483649; SELECT @@GLOBAL.example_signed_int_var; SET GLOBAL example_signed_int_var = 2147483648; SELECT @@GLOBAL.example_signed_int_var; #Test for signed int plugin session variable SHOW SESSION VARIABLES LIKE 'example_signed_int_thdvar'; SELECT @@SESSION.example_signed_int_thdvar; SET SESSION example_signed_int_thdvar = -2147483648; SELECT @@SESSION.example_signed_int_thdvar; SET SESSION example_signed_int_thdvar = -100; SELECT @@SESSION.example_signed_int_thdvar; SET SESSION example_signed_int_thdvar = 0; SELECT @@SESSION.example_signed_int_thdvar; SET SESSION example_signed_int_thdvar = 100; SELECT @@SESSION.example_signed_int_thdvar; SET SESSION example_signed_int_thdvar = 2147483647; SELECT @@SESSION.example_signed_int_thdvar; SET SESSION example_signed_int_thdvar = -2147483649; SELECT @@SESSION.example_signed_int_thdvar; SET SESSION example_signed_int_thdvar = 2147483648; SELECT @@SESSION.example_signed_int_thdvar; #Test for signed long plugin global variable SHOW VARIABLES LIKE 'example_signed_long_var'; SELECT @@GLOBAL.example_signed_long_var; --disable_warnings SET GLOBAL example_signed_long_var = -9223372036854775808; SELECT @@GLOBAL.example_signed_long_var IN (-2147483648, -9223372036854775808); SET GLOBAL example_signed_long_var = -100; SELECT @@GLOBAL.example_signed_long_var; SET GLOBAL example_signed_long_var = 0; SELECT @@GLOBAL.example_signed_long_var; SET GLOBAL example_signed_long_var = 100; SELECT @@GLOBAL.example_signed_long_var; SET GLOBAL example_signed_long_var = 9223372036854775807; SELECT @@GLOBAL.example_signed_long_var IN (2147483647, 9223372036854775807); --error ER_WRONG_TYPE_FOR_VAR SET GLOBAL example_signed_long_var = -9223372036854775809; SELECT @@GLOBAL.example_signed_long_var IN (2147483647, 9223372036854775807); SET GLOBAL example_signed_long_var = 9223372036854775808; SELECT @@GLOBAL.example_signed_long_var IN (2147483647, 9223372036854775807); #Test for signed long plugin session variable SHOW SESSION VARIABLES LIKE 'example_signed_long_thdvar'; SELECT @@SESSION.example_signed_long_thdvar; SET SESSION example_signed_long_thdvar = -9223372036854775808; SELECT @@SESSION.example_signed_long_thdvar IN (-2147483648, -9223372036854775808); SET SESSION example_signed_long_thdvar = -100; SELECT @@SESSION.example_signed_long_thdvar; SET SESSION example_signed_long_thdvar = 0; SELECT @@SESSION.example_signed_long_thdvar; SET SESSION example_signed_long_thdvar = 100; SELECT @@SESSION.example_signed_long_thdvar; SET SESSION example_signed_long_thdvar = 9223372036854775807; SELECT @@SESSION.example_signed_long_thdvar IN (2147483647, 9223372036854775807); --error ER_WRONG_TYPE_FOR_VAR SET SESSION example_signed_long_thdvar = -9223372036854775809; SELECT @@SESSION.example_signed_long_thdvar IN (2147483647, 9223372036854775807); SET SESSION example_signed_long_thdvar = 9223372036854775808; SELECT @@SESSION.example_signed_long_thdvar IN (2147483647, 9223372036854775807); --enable_warnings #Test for signed longlong plugin global variable SHOW VARIABLES LIKE 'example_signed_longlong_var'; SELECT @@GLOBAL.example_signed_longlong_var; SET GLOBAL example_signed_longlong_var = -9223372036854775808; SELECT @@GLOBAL.example_signed_longlong_var; SET GLOBAL example_signed_longlong_var = -100; SELECT @@GLOBAL.example_signed_longlong_var; SET GLOBAL example_signed_longlong_var = 0; SELECT @@GLOBAL.example_signed_longlong_var; SET GLOBAL example_signed_longlong_var = 100; SELECT @@GLOBAL.example_signed_longlong_var; SET GLOBAL example_signed_longlong_var = 9223372036854775807; SELECT @@GLOBAL.example_signed_longlong_var; --error ER_WRONG_TYPE_FOR_VAR SET GLOBAL example_signed_longlong_var = -9223372036854775809; SELECT @@GLOBAL.example_signed_longlong_var; SET GLOBAL example_signed_longlong_var = 9223372036854775808; SELECT @@GLOBAL.example_signed_longlong_var; #Test for signed longlong plugin session variable SHOW SESSION VARIABLES LIKE 'example_signed_longlong_thdvar'; SELECT @@SESSION.example_signed_longlong_thdvar; SET SESSION example_signed_longlong_thdvar = -9223372036854775808; SELECT @@SESSION.example_signed_longlong_thdvar; SET SESSION example_signed_longlong_thdvar = -100; SELECT @@SESSION.example_signed_longlong_thdvar; SET SESSION example_signed_longlong_thdvar = 0; SELECT @@SESSION.example_signed_longlong_thdvar; SET SESSION example_signed_longlong_thdvar = 100; SELECT @@SESSION.example_signed_longlong_thdvar; SET SESSION example_signed_longlong_thdvar = 9223372036854775807; SELECT @@SESSION.example_signed_longlong_thdvar; --error ER_WRONG_TYPE_FOR_VAR SET SESSION example_signed_longlong_thdvar = -9223372036854775809; SELECT @@SESSION.example_signed_longlong_thdvar; SET SESSION example_signed_longlong_thdvar = 9223372036854775808; SELECT @@SESSION.example_signed_longlong_thdvar; UNINSTALL PLUGIN example;