#
--source include/not_windows_embedded.inc
--source include/have_example_plugin.inc
--source include/have_debug_sync.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_KEY_PARTS
CREATE TABLE t1 (a int PRIMARY KEY) ENGINE=EXAMPLE;
--error ER_TOO_MANY_KEY_PARTS
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;

DROP TABLE t1;

# a couple of tests for variables
set global example_ulong_var=500;
set global example_enum_var= e1;
show status like 'example%';
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 INFORMATION_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.
--replace_column 1 #
--reap;
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;
--replace_column 1 #
--reap;
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;
--replace_column 1 #
--reap

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
