summaryrefslogtreecommitdiff
path: root/mysql-test/t/ps_ddl.test
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/t/ps_ddl.test')
-rw-r--r--mysql-test/t/ps_ddl.test2650
1 files changed, 1441 insertions, 1209 deletions
diff --git a/mysql-test/t/ps_ddl.test b/mysql-test/t/ps_ddl.test
index c824d17063b..e19e73df3ac 100644
--- a/mysql-test/t/ps_ddl.test
+++ b/mysql-test/t/ps_ddl.test
@@ -47,1793 +47,2025 @@
# - Part 20: Special tables (log tables)
# - Part 21: Special tables (system tables)
# - Part 22: Special tables (views temp tables)
-# - Part 23: Special tables (internal join tables)
-# - Part 24: Special statements
-# - Part 25: Testing the strength of TABLE_SHARE version
-
-let $base_count = SELECT VARIABLE_VALUE from
-INFORMATION_SCHEMA.SESSION_STATUS where variable_name='COM_STMT_REPREPARE'
-into @base_count ;
-
-let $check = SELECT CASE (VARIABLE_VALUE - @base_count - @expected)
- WHEN 0 THEN "PASSED"
- ELSE "FAILED"
- END
- AS `CHECK`,
- (VARIABLE_VALUE - @base_count - @expected) AS `OFFSET`
- from INFORMATION_SCHEMA.SESSION_STATUS
- where variable_name='COM_STMT_REPREPARE' ;
-
-eval $base_count;
-set @expected = 0;
-
-# Maintainer:
-# When not expecting a re-prepare, write the test like this:
-# execute stmt;
-# eval $check;
-#
-# When expecting a re-prepare, write the test like this:
-# set @expected = @expected + 1;
-# execute stmt;
-# eval $check;
-#
+# - Part 23: Special statements
+# - Part 24: Testing the strength of TABLE_SHARE version
+--disable_warnings
+drop temporary table if exists t1, t2, t3;
+drop table if exists t1, t2, t3;
+drop procedure if exists p_verify_reprepare_count;
+drop procedure if exists p1;
+drop function if exists f1;
+drop view if exists v1, v2;
+--enable_warnings
+
+delimiter |;
+create procedure p_verify_reprepare_count(expected int)
+begin
+ declare old_reprepare_count int default @reprepare_count;
+
+ select variable_value from
+ information_schema.session_status where
+ variable_name='com_stmt_reprepare'
+ into @reprepare_count;
+
+ if old_reprepare_count + expected <> @reprepare_count then
+ select concat("Expected: ", expected,
+ ", actual: ", @reprepare_count - old_reprepare_count)
+ as "ERROR";
+ else
+ select '' as "SUCCESS";
+ end if;
+end|
+delimiter ;|
+set @reprepare_count= 0;
+flush status;
--echo =====================================================================
---echo Testing 1: NOTHING -> TABLE transitions
+--echo Part 1: NOTHING -> TABLE transitions
--echo =====================================================================
---disable_warnings
-drop table if exists t1;
---enable_warnings
-
# can not be tested since prepare failed
--error ER_NO_SUCH_TABLE
-prepare stmt from 'select * from t1';
+prepare stmt from "select * from t1";
--echo =====================================================================
---echo Testing 2: NOTHING -> TEMPORARY TABLE transitions
+--echo Part 2: NOTHING -> TEMPORARY TABLE transitions
--echo =====================================================================
# can not be tested
--echo =====================================================================
---echo Testing 3: NOTHING -> VIEW transitions
+--echo Part 3: NOTHING -> VIEW transitions
--echo =====================================================================
# can not be tested
--echo =====================================================================
---echo Testing 4: TABLE -> NOTHING transitions
+--echo Part 4: TABLE -> NOTHING transitions
--echo =====================================================================
---disable_warnings
-drop table if exists t4;
---enable_warnings
+--echo # Test 4-a: select ... from <table>
+create table t1 (a int);
-create table t4(a int);
+prepare stmt from "select * from t1";
+execute stmt;
+call p_verify_reprepare_count(0);
+execute stmt;
+call p_verify_reprepare_count(0);
+
+drop table t1;
+--error ER_NO_SUCH_TABLE
+execute stmt;
+call p_verify_reprepare_count(0);
+--error ER_NO_SUCH_TABLE
+execute stmt;
+call p_verify_reprepare_count(0);
+deallocate prepare stmt;
-prepare stmt from 'select * from t4';
+--echo # Test 4-b: TABLE -> NOTHING by renaming the table
+create table t1 (a int);
+prepare stmt from "select * from t1";
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop table t4;
+rename table t1 to t2;
--error ER_NO_SUCH_TABLE
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
--error ER_NO_SUCH_TABLE
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
+
+deallocate prepare stmt;
+drop table t2;
--echo =====================================================================
---echo Testing 5: TABLE -> TABLE (DDL) transitions
+--echo Part 5: TABLE -> TABLE (DDL) transitions
--echo =====================================================================
---disable_warnings
-drop table if exists t5;
---enable_warnings
+create table t1 (a int);
-create table t5(a int);
-
-prepare stmt from 'select a from t5';
+prepare stmt from "select a from t1";
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-alter table t5 add column (b int);
+alter table t1 add column (b int);
-set @expected = @expected + 1;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
+
+drop table t1;
+deallocate prepare stmt;
-drop table t5;
--echo =====================================================================
---echo Testing 6: TABLE -> TABLE (TRIGGER) transitions
+--echo Part 6: TABLE -> TABLE (TRIGGER) transitions
--echo =====================================================================
-#
-# Test 6-a: adding a relevant trigger
-# Test 6-b: adding an irrelevant trigger
-# Test 6-c: changing a relevant trigger
-# Test 6-d: changing an irrelevant trigger
-# Test 6-e: removing a relevant trigger
-# Test 6-f: removing an irrelevant trigger
-#
-
---disable_warnings
-drop table if exists t6;
---enable_warnings
+--echo # Test 6-a: adding a relevant trigger
-create table t6(a int);
+create table t1 (a int);
-prepare stmt from 'insert into t6(a) value (?)';
+prepare stmt from "insert into t1 (a) value (?)";
set @val=1;
execute stmt using @val;
-eval $check;
-set @val=2;
-execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(0);
# Relevant trigger: execute should reprepare
-delimiter $$;
-create trigger t6_bi before insert on t6 for each row
- begin
- set @message= "t6_bi";
- end
-$$
-delimiter ;$$
-
-set @message="none";
+create trigger t1_bi before insert on t1 for each row
+ set @message= new.a;
+
+set @val=2;
+execute stmt using @val;
+call p_verify_reprepare_count(1);
+select @message;
set @val=3;
-set @expected = @expected + 1;
execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(0);
select @message;
+
+prepare stmt from "insert into t1 (a) value (?)";
set @val=4;
execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(0);
select @message;
-prepare stmt from 'insert into t6(a) value (?)';
-set @message="none";
+--echo # Test 6-b: adding an irrelevant trigger
+
+# Unrelated trigger: reprepare may or may not happen, implementation dependent
+create trigger t1_bd before delete on t1 for each row
+ set @message= old.a;
+
set @val=5;
execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(1);
select @message;
-set @message="none";
set @val=6;
execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(0);
select @message;
-# Unrelated trigger: execute can pass of fail, implementation dependent
-delimiter $$;
-create trigger t6_bd before delete on t6 for each row
- begin
- set @message= "t6_bd";
- end
-$$
-delimiter ;$$
-
-set @message="none";
+prepare stmt from "insert into t1 (a) value (?)";
set @val=7;
-set @expected = @expected + 1;
-execute stmt using @val;
-eval $check;
-select @message;
-set @message="none";
-set @val=8;
execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(0);
select @message;
-prepare stmt from 'insert into t6(a) value (?)';
-set @message="none";
-set @val=9;
-execute stmt using @val;
-eval $check;
-select @message;
-set @message="none";
-set @val=10;
-execute stmt using @val;
-eval $check;
-select @message;
+--echo # Test 6-c: changing a relevant trigger
# Relevant trigger: execute should reprepare
-drop trigger t6_bi;
-delimiter $$;
-create trigger t6_bi before insert on t6 for each row
- begin
- set @message= "t6_bi (2)";
- end
-$$
-delimiter ;$$
-
-set @message="none";
-set @val=11;
-set @expected = @expected + 1;
-execute stmt using @val;
-eval $check;
-select @message;
-set @val=12;
-execute stmt using @val;
-eval $check;
-select @message;
+drop trigger t1_bi;
+create trigger t1_bi before insert on t1 for each row
+ set @message= concat("new trigger: ", new.a);
-prepare stmt from 'insert into t6(a) value (?)';
-set @message="none";
-set @val=13;
+set @val=8;
execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(1);
select @message;
-set @message="none";
-set @val=14;
+set @val=9;
execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(0);
select @message;
-# Unrelated trigger: execute can pass of fail, implementation dependent
-drop trigger t6_bd;
-delimiter $$;
-create trigger t6_bd before delete on t6 for each row
- begin
- set @message= "t6_bd (2)";
- end
-$$
-delimiter ;$$
-
-set @message="none";
-set @val=15;
-set @expected = @expected + 1;
-execute stmt using @val;
-eval $check;
-select @message;
-set @message="none";
-set @val=16;
+prepare stmt from "insert into t1 (a) value (?)";
+set @val=10;
execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(0);
select @message;
-prepare stmt from 'insert into t6(a) value (?)';
-set @message="none";
-set @val=17;
-execute stmt using @val;
-eval $check;
-select @message;
-set @message="none";
-set @val=18;
-execute stmt using @val;
-eval $check;
-select @message;
+--echo # Test 6-d: changing an irrelevant trigger
-drop trigger t6_bi;
+# Unrelated trigger: reprepare may or may not happen, implementation dependent
+drop trigger t1_bd;
-set @message="none";
-set @val=19;
-set @expected = @expected + 1;
-execute stmt using @val;
-eval $check;
-select @message;
-set @val=20;
+set @val=11;
execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(1);
select @message;
-prepare stmt from 'insert into t6(a) value (?)';
-set @message="none";
-set @val=21;
+--echo Test 6-e: removing a relevant trigger
+
+drop trigger t1_bi;
+
+set @val=12;
execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(1);
select @message;
-set @val=22;
+set @val=13;
execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(0);
select @message;
-drop trigger t6_bd;
-
-set @val=23;
-set @expected = @expected + 1;
-execute stmt using @val;
-eval $check;
-select @message;
-set @val=24;
+prepare stmt from "insert into t1 (a) value (?)";
+set @val=14;
execute stmt using @val;
-eval $check;
+call p_verify_reprepare_count(0);
select @message;
-select * from t6 order by a;
-drop table t6;
+select * from t1 order by a;
+drop table t1;
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 7: TABLE -> TABLE (TRIGGER dependencies) transitions
+--echo Part 7: TABLE -> TABLE (TRIGGER dependencies) transitions
--echo =====================================================================
-#
-# Test 7-a: dependent PROCEDURE has changed
-# Test 7-b: dependent FUNCTION has changed
-# Test 7-c: dependent VIEW has changed
-# Test 7-d: dependent TABLE has changed
-# Test 7-e: dependent TABLE TRIGGER has changed
-#
-
---disable_warnings
-drop table if exists t7_proc;
-drop table if exists t7_func;
-drop table if exists t7_view;
-drop table if exists t7_table;
-drop table if exists t7_dependent_table;
-drop table if exists t7_table_trigger;
-drop table if exists t7_audit;
-drop procedure if exists audit_proc;
-drop function if exists audit_func;
-drop view if exists audit_view;
---enable_warnings
-
-create table t7_proc(a int);
-create table t7_func(a int);
-create table t7_view(a int);
-create table t7_table(a int);
-create table t7_table_trigger(a int);
-
-create table t7_audit(old_a int, new_a int, reason varchar(50));
-create table t7_dependent_table(old_a int, new_a int, reason varchar(50));
-
-create procedure audit_proc(a int)
- insert into t7_audit values (NULL, a, "proc v1");
+--echo # Test 7-a: dependent PROCEDURE has changed
+--echo #
+--echo # Note, this scenario is not supported, subject of Bug#12093
+--echo #
+
+create table t1 (a int);
+create trigger t1_ai after insert on t1 for each row
+ call p1(new.a);
+create procedure p1(a int) begin end;
+prepare stmt from "insert into t1 (a) values (?)";
+set @var= 1;
+execute stmt using @var;
+drop procedure p1;
+create procedure p1 (a int) begin end;
+set @var= 2;
+--error ER_SP_DOES_NOT_EXIST
+execute stmt using @var;
+--echo # Cleanup
+drop procedure p1;
+call p_verify_reprepare_count(0);
+
+--echo # Test 7-b: dependent FUNCTION has changed
+--echo #
+--echo # Note, this scenario is not supported, subject of Bug#12093
+--echo #
+drop trigger t1_ai;
+create trigger t1_ai after insert on t1 for each row
+ select f1(new.a+1) into @var;
+create function f1 (a int) returns int return a;
+prepare stmt from "insert into t1(a) values (?)";
+set @var=3;
+execute stmt using @var;
+select @var;
+drop function f1;
+create function f1 (a int) returns int return 0;
+--error ER_SP_DOES_NOT_EXIST
+execute stmt using @var;
+call p_verify_reprepare_count(0);
+drop function f1;
+deallocate prepare stmt;
-create function audit_func() returns varchar(50)
- return "func v1";
-
-create view audit_view as select "view v1" as reason from dual;
-
-create trigger t7_proc_bi before insert on t7_proc for each row
- call audit_proc(NEW.a);
-
-create trigger t7_func_bi before insert on t7_func for each row
- insert into t7_audit values (NULL, NEW.a, audit_func());
-
-create trigger t7_view_bi before insert on t7_view for each row
- insert into t7_audit values (NULL, NEW.a, (select reason from audit_view));
-
-create trigger t7_table_bi before insert on t7_table for each row
- insert into t7_dependent_table values (NULL, NEW.a, "dependent table");
-
-create trigger t7_table_trigger_bi before insert on t7_dependent_table
- for each row set NEW.reason="trigger v1";
-
-prepare stmt_proc from 'insert into t7_proc(a) value (?)';
-set @val=101;
-execute stmt_proc using @val;
-eval $check;
-set @val=102;
-execute stmt_proc using @val;
-eval $check;
-
-drop procedure audit_proc;
-
-create procedure audit_proc(a int)
- insert into t7_audit values (NULL, a, "proc v2");
-
-set @val=103;
-set @expected = @expected + 1;
-execute stmt_proc using @val;
-eval $check;
-set @val=104;
-execute stmt_proc using @val;
-eval $check;
-
-
-prepare stmt_func from 'insert into t7_func(a) value (?)';
-set @val=201;
-execute stmt_func using @val;
-eval $check;
-set @val=202;
-execute stmt_func using @val;
-eval $check;
-
-drop function audit_func;
-
-create function audit_func() returns varchar(50)
- return "func v2";
-
-set @val=203;
-set @expected = @expected + 1;
-execute stmt_func using @val;
-eval $check;
-set @val=204;
-execute stmt_func using @val;
-eval $check;
-
-prepare stmt_view from 'insert into t7_view(a) value (?)';
-set @val=301;
-execute stmt_view using @val;
-eval $check;
-set @val=302;
-execute stmt_view using @val;
-eval $check;
-
-drop view audit_view;
-
-create view audit_view as select "view v2" as reason from dual;
-
-# Because of Bug#33255, the wrong result is still produced for cases
-# 303 and 304, even after re-preparing the statement.
-# This is because the table trigger is cached and is not invalidated.
-
-set @val=303;
-set @expected = @expected + 1;
-execute stmt_view using @val;
-eval $check;
-set @val=304;
-execute stmt_view using @val;
-eval $check;
-
-
-prepare stmt_table from 'insert into t7_table(a) value (?)';
-set @val=401;
-execute stmt_table using @val;
-eval $check;
-set @val=402;
-execute stmt_table using @val;
-eval $check;
-
-alter table t7_dependent_table add column comments varchar(100) default NULL;
-
-set @val=403;
-set @expected = @expected + 1;
---error ER_WRONG_VALUE_COUNT_ON_ROW
-execute stmt_table using @val;
-eval $check;
-set @val=404;
-set @expected = @expected + 1;
---error ER_WRONG_VALUE_COUNT_ON_ROW
-execute stmt_table using @val;
-eval $check;
-
-alter table t7_dependent_table drop column comments;
-
-set @val=405;
-set @expected = @expected + 1;
-execute stmt_table using @val;
-eval $check;
-set @val=406;
-execute stmt_table using @val;
-eval $check;
-
-
-prepare stmt_table_trigger from 'insert into t7_table(a) value (?)';
-set @val=501;
-execute stmt_table_trigger using @val;
-eval $check;
-set @val=502;
-execute stmt_table_trigger using @val;
-eval $check;
-
-drop trigger t7_table_trigger_bi;
-
-create trigger t7_table_trigger_bi before insert on t7_dependent_table
- for each row set NEW.reason="trigger v2";
-
-set @val=503;
-set @expected = @expected + 1;
-execute stmt_table_trigger using @val;
-eval $check;
-set @val=504;
-execute stmt_table_trigger using @val;
-eval $check;
-
-select * from t7_audit order by new_a;
-
-select * from t7_dependent_table order by new_a;
-
-drop table t7_proc;
-drop table t7_func;
-drop table t7_view;
-drop table t7_table;
-drop table t7_dependent_table;
-drop table t7_table_trigger;
-drop table t7_audit;
-drop procedure audit_proc;
-drop function audit_func;
-drop view audit_view;
+--echo # Test 7-c: dependent VIEW has changed
+--echo #
+--echo # Note, this scenario is not functioning correctly, see
+--echo # Bug#33255 Trigger using views and view ddl : corrupted triggers
+--echo # and Bug #33000 Triggers do not detect changes in meta-data.
+--echo #
+drop trigger t1_ai;
+create table t2 (a int unique);
+create table t3 (a int unique);
+create view v1 as select a from t2;
+create trigger t1_ai after insert on t1 for each row
+ insert into v1 (a) values (new.a);
+
+--echo # Demonstrate that the same bug is present
+--echo # without prepared statements
+insert into t1 (a) values (5);
+select * from t2;
+select * from t3;
+drop view v1;
+create view v1 as select a from t3;
+--error ER_NO_SUCH_TABLE
+insert into t1 (a) values (6);
+flush table t1;
+insert into t1 (a) values (6);
+select * from t2;
+select * from t3;
+
+prepare stmt from "insert into t1 (a) values (?)";
+set @var=7;
+execute stmt using @var;
+call p_verify_reprepare_count(0);
+select * from t3;
+select * from t2;
+drop view v1;
+create view v1 as select a from t2;
+set @var=8;
+execute stmt using @var;
+call p_verify_reprepare_count(0);
+--echo #
+--echo # Sic: the insert went into t3, even though the view now
+--echo # points at t2. This is because neither the merged view
+--echo # nor its prelocking list are affected by view DDL
+--echo # The binary log is of course wrong, since it is not
+--echo # using prepared statements
+--echo #
+select * from t2;
+select * from t3;
+flush table t1;
+set @var=9;
+execute stmt using @var;
+call p_verify_reprepare_count(1);
+select * from t2;
+select * from t3;
+drop view v1;
+drop table t1,t2,t3;
+
+--echo # Test 7-d: dependent TABLE has changed
+create table t1 (a int);
+create trigger t1_ai after insert on t1 for each row
+ insert into t2 (a) values (new.a);
+create table t2 (a int);
+
+prepare stmt from "insert into t1 (a) values (?)";
+set @var=1;
+execute stmt using @var;
+alter table t2 add column comment varchar(255);
+set @var=2;
+--echo # Since the dependent table is tracked in the prelocked
+--echo # list of the prepared statement, invalidation happens
+--echo # and the statement is re-prepared. This is an unnecessary
+--echo # side effect, since the statement that *is* dependent
+--echo # on t2 definition is inside the trigger, and it is currently
+--echo # not reprepared (see the previous test case).
+execute stmt using @var;
+call p_verify_reprepare_count(1);
+select * from t1;
+select * from t2;
+drop table t1,t2;
+
+--echo # Test 7-e: dependent TABLE TRIGGER has changed
+create table t1 (a int);
+create trigger t1_ai after insert on t1 for each row
+ insert into t2 (a) values (new.a);
+create table t2 (a int unique);
+create trigger t2_ai after insert on t2 for each row
+ insert into t3 (a) values (new.a);
+create table t3 (a int unique);
+create table t4 (a int unique);
+
+insert into t1 (a) values (1);
+select * from t1 join t2 on (t1.a=t2.a) join t3 on (t2.a=t3.a);
+drop trigger t2_ai;
+create trigger t2_ai after insert on t2 for each row
+ insert into t4 (a) values (new.a);
+insert into t1 (a) values (2);
+select * from t1 join t2 on (t1.a=t2.a) join t4 on (t2.a=t4.a);
+
+prepare stmt from "insert into t1 (a) values (?)";
+set @var=3;
+execute stmt using @var;
+select * from t1 join t2 on (t1.a=t2.a) join t4 on (t2.a=t4.a);
+drop trigger t2_ai;
+create trigger t2_ai after insert on t2 for each row
+ insert into t3 (a) values (new.a);
+set @var=4;
+execute stmt using @var;
+call p_verify_reprepare_count(1);
+select * from t1 join t2 on (t1.a=t2.a) join t3 on (t2.a=t3.a);
+select * from t1 join t2 on (t1.a=t2.a) join t4 on (t2.a=t4.a);
+
+drop table t1, t2, t3, t4;
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 8: TABLE -> TEMPORARY TABLE transitions
+--echo Part 8: TABLE -> TEMPORARY TABLE transitions
--echo =====================================================================
---disable_warnings
-drop table if exists t8;
---enable_warnings
+--echo # Test 8-a: base table used recreated as temporary table
+create table t1 (a int);
-create table t8(a int);
+prepare stmt from "select * from t1";
+execute stmt;
+
+drop table t1;
+create temporary table t1 (a int);
-prepare stmt from 'select * from t8';
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
+
+drop table t1;
+deallocate prepare stmt;
-drop table t8;
-create temporary table t8(a int);
+--echo # Test 8-b: temporary table has precedence over base table with same name
+create table t1 (a int);
+prepare stmt from 'select count(*) from t1';
+execute stmt;
+call p_verify_reprepare_count(0);
+execute stmt;
+call p_verify_reprepare_count(0);
-set @expected = @expected + 1;
+create temporary table t1 AS SELECT 1;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
+
+deallocate prepare stmt;
+drop temporary table t1;
+drop table t1;
-drop table t8;
--echo =====================================================================
---echo Testing 9: TABLE -> VIEW transitions
+--echo Part 9: TABLE -> VIEW transitions
--echo =====================================================================
---disable_warnings
-drop table if exists t9;
-drop table if exists t9_b;
---enable_warnings
-
-create table t9(a int);
-create table t9_b(a int);
+create table t1 (a int);
-prepare stmt from 'select * from t9';
+prepare stmt from "select * from t1";
execute stmt;
-eval $check;
-execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop table t9;
-create view t9 as select * from t9_b;
+drop table t1;
+create table t2 (a int);
+create view t1 as select * from t2;
-set @expected = @expected + 1;
-execute stmt;
-eval $check;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
-drop view t9;
-drop table t9_b;
+drop view t1;
+drop table t2;
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 10: TEMPORARY TABLE -> NOTHING transitions
+--echo Part 10: TEMPORARY TABLE -> NOTHING transitions
--echo =====================================================================
---disable_warnings
-drop temporary table if exists t10;
---enable_warnings
+create temporary table t1 (a int);
-create temporary table t10(a int);
-
-prepare stmt from 'select * from t10';
-execute stmt;
-eval $check;
+prepare stmt from "select * from t1";
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop temporary table t10;
+drop temporary table t1;
--error ER_NO_SUCH_TABLE
execute stmt;
-eval $check;
---error ER_NO_SUCH_TABLE
-execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 11: TEMPORARY TABLE -> TABLE transitions
+--echo Part 11: TEMPORARY TABLE -> TABLE transitions
--echo =====================================================================
---disable_warnings
-drop table if exists t11;
-drop temporary table if exists t11;
---enable_warnings
-
-create table t11(a int);
-insert into t11(a) value (1);
-create temporary table t11(a int);
+--echo # Test 11-a: temporary table replaced by base table
+create table t1 (a int);
+insert into t1 (a) value (1);
+create temporary table t1 (a int);
-prepare stmt from 'select * from t11';
+prepare stmt from "select * from t1";
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
+
+drop temporary table t1;
+
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
+
+select * from t1;
+drop table t1;
+deallocate prepare stmt;
-drop temporary table t11;
-set @expected = @expected + 1;
+--echo # Test 11-b: temporary table has precedence over base table with same name
+--echo # temporary table disappears
+create table t1 (a int);
+create temporary table t1 as select 1 as a;
+prepare stmt from "select count(*) from t1";
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
+
+drop temporary table t1;
+execute stmt;
+call p_verify_reprepare_count(1);
+execute stmt;
+call p_verify_reprepare_count(0);
+
+deallocate prepare stmt;
+drop table t1;
-select * from t11;
-drop table t11;
--echo =====================================================================
---echo Testing 12: TEMPORARY TABLE -> TEMPORARY TABLE (DDL) transitions
+--echo Part 12: TEMPORARY TABLE -> TEMPORARY TABLE (DDL) transitions
--echo =====================================================================
---disable_warnings
-drop temporary table if exists t12;
---enable_warnings
-
-create temporary table t12(a int);
+create temporary table t1 (a int);
-prepare stmt from 'select a from t12';
-execute stmt;
-eval $check;
+prepare stmt from "select a from t1";
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop temporary table t12;
-create temporary table t12(a int, b int);
+drop temporary table t1;
+create temporary table t1 (a int, b int);
-set @expected = @expected + 1;
execute stmt;
-eval $check;
-execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
-select * from t12;
-drop table t12;
+select * from t1;
+drop temporary table t1;
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 13: TEMPORARY TABLE -> VIEW transitions
+--echo Part 13: TEMPORARY TABLE -> VIEW transitions
--echo =====================================================================
---disable_warnings
-drop temporary table if exists t13;
-drop table if exists t13_b;
---enable_warnings
-
-create temporary table t13(a int);
-create table t13_b(a int);
+create temporary table t1 (a int);
+create table t2 (a int);
-prepare stmt from 'select * from t13';
+prepare stmt from "select * from t1";
execute stmt;
-eval $check;
-execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop temporary table t13;
-create view t13 as select * from t13_b;
+drop temporary table t1;
+create view t1 as select * from t2;
-set @expected = @expected + 1;
-execute stmt;
-eval $check;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
-drop view t13;
-drop table t13_b;
+drop view t1;
+drop table t2;
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 14: VIEW -> NOTHING transitions
+--echo Part 14: VIEW -> NOTHING transitions
--echo =====================================================================
---disable_warnings
-drop view if exists t14;
-drop table if exists t14_b;
---enable_warnings
+create table t2 (a int);
+create view t1 as select * from t2;
-create table t14_b(a int);
-create view t14 as select * from t14_b;
-
-prepare stmt from 'select * from t14';
-execute stmt;
-eval $check;
+prepare stmt from "select * from t1";
execute stmt;
-eval $check;
+drop view t1;
-drop view t14;
-
-set @expected = @expected + 1;
--error ER_NO_SUCH_TABLE
execute stmt;
-eval $check;
-set @expected = @expected + 1;
+call p_verify_reprepare_count(0);
--error ER_NO_SUCH_TABLE
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop table t14_b;
+drop table t2;
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 15: VIEW -> TABLE transitions
+--echo Part 15: VIEW -> TABLE transitions
--echo =====================================================================
---disable_warnings
-drop view if exists t15;
-drop table if exists t15_b;
---enable_warnings
-
-create table t15_b(a int);
-create view t15 as select * from t15_b;
+create table t2 (a int);
+create view t1 as select * from t2;
-prepare stmt from 'select * from t15';
+prepare stmt from "select * from t1";
execute stmt;
-eval $check;
-execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop view t15;
-create table t15(a int);
+drop view t1;
+create table t1 (a int);
-set @expected = @expected + 1;
-execute stmt;
-eval $check;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
-drop table t15_b;
-drop table t15;
+drop table t2;
+drop table t1;
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 16: VIEW -> TEMPORARY TABLE transitions
+--echo Part 16: VIEW -> TEMPORARY TABLE transitions
--echo =====================================================================
---disable_warnings
-drop view if exists t16;
-drop table if exists t16_b;
---enable_warnings
-
-create table t16_b(a int);
-create view t16 as select * from t16_b;
+create table t2 (a int);
+insert into t2 (a) values (1);
+create view t1 as select * from t2;
-prepare stmt from 'select * from t16';
-execute stmt;
-eval $check;
+prepare stmt from "select * from t1";
execute stmt;
-eval $check;
-
-drop view t16;
-create temporary table t16(a int);
+call p_verify_reprepare_count(0);
-set @expected = @expected + 1;
+create temporary table t1 (a int);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
+drop view t1;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop table t16_b;
-drop temporary table t16;
+drop table t2;
+drop temporary table t1;
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 17: VIEW -> VIEW (DDL) transitions
+--echo Part 17: VIEW -> VIEW (DDL) transitions
--echo =====================================================================
---disable_warnings
-drop view if exists t17;
-drop table if exists t17_b;
---enable_warnings
-
-create table t17_b(a int);
-insert into t17_b values (10), (20), (30);
+create table t2 (a int);
+insert into t2 values (10), (20), (30);
-create view t17 as select a, 2*a as b, 3*a as c from t17_b;
-select * from t17;
+create view t1 as select a, 2*a as b, 3*a as c from t2;
+select * from t1;
-prepare stmt from 'select * from t17';
-execute stmt;
-eval $check;
+prepare stmt from "select * from t1";
execute stmt;
-eval $check;
-drop view t17;
-create view t17 as select a, 2*a as b, 5*a as c from t17_b;
-select * from t17;
+drop view t1;
+create view t1 as select a, 2*a as b, 5*a as c from t2;
+select * from t1;
-set @expected = @expected + 1;
+--echo # Currently a different result from conventional statements.
+--echo # A view is inlined once at prepare, later on view DDL
+--echo # does not affect prepared statement and it is not re-prepared.
+--echo # This is reported in Bug#36002 Prepared statements: if a view
+--echo # used in a statement is replaced, bad data
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
+flush table t2;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
-drop table t17_b;
-drop view t17;
+drop table t2;
+drop view t1;
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 18: VIEW -> VIEW (VIEW dependencies) transitions
+--echo Part 18: VIEW -> VIEW (VIEW dependencies) transitions
--echo =====================================================================
-#
-# Test 18-a: dependent PROCEDURE has changed (via a trigger)
-# Test 18-b: dependent FUNCTION has changed
-# Test 18-c: dependent VIEW has changed
-# Test 18-d: dependent TABLE has changed
-# Test 18-e: dependent TABLE TRIGGER has changed
-#
-
---disable_warnings
-drop table if exists t18;
-drop table if exists t18_dependent_table;
-drop view if exists t18_func;
-drop view if exists t18_view;
-drop view if exists t18_table;
-drop function if exists view_func;
-drop view if exists view_view;
---enable_warnings
-
-# TODO: insertable view -> trigger
-# TODO: insertable view -> trigger -> proc ?
-
-create table t18(a int);
-insert into t18 values (1), (2), (3);
-
-create function view_func(x int) returns int
- return x+1;
-
-create view view_view as select "view v1" as reason from dual;
-
-create table t18_dependent_table(a int);
-
-create view t18_func as select a, view_func(a) as b from t18;
-create view t18_view as select a, reason as b from t18, view_view;
-create view t18_table as select * from t18;
+--echo # Part 18a: dependent function has changed
+create table t1 (a int);
+insert into t1 (a) values (1), (2), (3);
+create function f1() returns int return (select max(a) from t1);
+create view v1 as select f1();
+prepare stmt from "select * from v1";
+execute stmt;
+execute stmt;
+call p_verify_reprepare_count(0);
+drop function f1;
+create function f1() returns int return 2;
+--echo # XXX: Bug#12093. We only get a different error
+--echo # message because the non-existing procedure error is masked
+--echo # by the view.
+--error ER_VIEW_INVALID
+execute stmt;
+--error ER_VIEW_INVALID
+execute stmt;
+call p_verify_reprepare_count(0);
-prepare stmt_func from 'select * from t18_func';
-execute stmt_func;
-eval $check;
-execute stmt_func;
-eval $check;
+--echo # Part 18b: dependent procedure has changed (referred to via a function)
-drop function view_func;
-create function view_func(x int) returns int
- return x*x;
+create table t2 (a int);
+insert into t2 (a) values (4), (5), (6);
-set @expected = @expected + 1;
-execute stmt_func;
-eval $check;
-execute stmt_func;
-eval $check;
+drop function f1;
+delimiter |;
+create function f1() returns int
+begin
+ declare x int;
+ call p1(x);
+ return x;
+end|
+delimiter ;|
+create procedure p1(out x int) select max(a) from t1 into x;
-prepare stmt_view from 'select * from t18_view';
-execute stmt_view;
-eval $check;
-execute stmt_view;
-eval $check;
+prepare stmt from "select * from v1";
+execute stmt;
+execute stmt;
+call p_verify_reprepare_count(0);
+drop procedure p1;
+create procedure p1(out x int) select max(a) from t2 into x;
+--echo # XXX: bug. The prelocked list is not invalidated
+--echo # and we keep opening table t1, whereas the procedure
+--echo # is now referring to table t2
+--error ER_VIEW_INVALID
+execute stmt;
+call p_verify_reprepare_count(0);
+flush table t1;
+execute stmt;
+call p_verify_reprepare_count(1);
+execute stmt;
-drop view view_view;
-create view view_view as select "view v2" as reason from dual;
+--echo # Test 18-c: dependent VIEW has changed
-set @expected = @expected + 1;
-execute stmt_view;
-eval $check;
-execute stmt_view;
-eval $check;
+drop view v1;
+create view v2 as select a from t1;
+create view v1 as select * from v2;
+prepare stmt from "select * from v1";
+execute stmt;
+execute stmt;
+call p_verify_reprepare_count(0);
+drop view v2;
+create view v2 as select a from t2;
+execute stmt;
+execute stmt;
+call p_verify_reprepare_count(0);
+flush table t1;
+execute stmt;
+call p_verify_reprepare_count(1);
+execute stmt;
+--echo # Test 18-d: dependent TABLE has changed
+drop view v2;
+create table v2 as select * from t1;
+execute stmt;
+call p_verify_reprepare_count(1);
+execute stmt;
+call p_verify_reprepare_count(0);
+drop table v2;
+create table v2 (a int unique) as select * from t2;
+execute stmt;
+call p_verify_reprepare_count(1);
+execute stmt;
+call p_verify_reprepare_count(0);
-prepare stmt_table from 'select * from t18_table';
-execute stmt_table;
-eval $check;
-execute stmt_table;
-eval $check;
+--echo # Test 18-e: dependent TABLE trigger has changed
-alter table t18 add column comments varchar(50) default NULL;
+prepare stmt from "insert into v1 (a) values (?)";
+set @var= 7;
+execute stmt using @var;
+call p_verify_reprepare_count(0);
+create trigger v2_bi before insert on v2 for each row set @message="v2_bi";
+set @var=8;
+execute stmt using @var;
+call p_verify_reprepare_count(1);
+select @message;
+drop trigger v2_bi;
+set @message=null;
+set @var=9;
+execute stmt using @var;
+call p_verify_reprepare_count(1);
+select @message;
+create trigger v2_bi after insert on v2 for each row set @message="v2_ai";
+set @var= 10;
+execute stmt using @var;
+call p_verify_reprepare_count(1);
+select @message;
+select * from v1;
-set @expected = @expected + 1;
-execute stmt_table;
-eval $check;
-execute stmt_table;
-eval $check;
+--echo # Cleanup
-drop table t18;
-drop table t18_dependent_table;
-drop view t18_func;
-drop view t18_view;
-drop view t18_table;
-drop function view_func;
-drop view view_view;
+--disable_warnings
+drop table if exists t1, t2, v1, v2;
+drop view if exists v1, v2;
+drop function f1;
+drop procedure p1;
+--enable_warnings
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 19: Special tables (INFORMATION_SCHEMA)
+--echo Part 19: Special tables (INFORMATION_SCHEMA)
--echo =====================================================================
---disable_warnings
-drop procedure if exists proc_19;
---enable_warnings
-
# Using a temporary table internally should not confuse the prepared
# statement code, and should not raise ER_PS_INVALIDATED errors
prepare stmt from
- 'select ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE
+ "select ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE
from INFORMATION_SCHEMA.ROUTINES where
- routine_name=\'proc_19\'';
+ routine_name='p1'";
-create procedure proc_19() select "hi there";
+create procedure p1() select "hi there";
execute stmt;
-eval $check;
execute stmt;
-eval $check;
-drop procedure proc_19;
-create procedure proc_19() select "hi there, again";
+drop procedure p1;
+create procedure p1() select "hi there, again";
execute stmt;
-eval $check;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop procedure proc_19;
+drop procedure p1;
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 20: Special tables (log tables)
+--echo Part 20: Special tables (log tables)
--echo =====================================================================
prepare stmt from
- 'select * from mysql.general_log where argument=\'IMPOSSIBLE QUERY STRING\'';
+ "select * from mysql.general_log where argument='IMPOSSIBLE QUERY STRING'";
+--disable_result_log
execute stmt;
-eval $check;
execute stmt;
-eval $check;
execute stmt;
-eval $check;
execute stmt;
-eval $check;
+--enable_result_log
+call p_verify_reprepare_count(0);
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 21: Special tables (system tables)
+--echo Part 21: Special tables (system tables)
--echo =====================================================================
---disable_warnings
-drop procedure if exists proc_21;
---enable_warnings
-
prepare stmt from
- 'select type, db, name from mysql.proc where name=\'proc_21\'';
+ "select type, db, name from mysql.proc where name='p1'";
-create procedure proc_21() select "hi there";
+create procedure p1() select "hi there";
execute stmt;
-eval $check;
execute stmt;
-eval $check;
-drop procedure proc_21;
-create procedure proc_21() select "hi there, again";
+drop procedure p1;
+create procedure p1() select "hi there, again";
execute stmt;
-eval $check;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop procedure proc_21;
+drop procedure p1;
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 22: Special tables (views temp tables)
+--echo Part 22: Special tables (views temp tables)
--echo =====================================================================
---disable_warnings
-drop table if exists t22_b;
-drop view if exists t22;
---enable_warnings
+create table t1 (a int);
-create table t22_b(a int);
+create algorithm=temptable view v1 as select a*a as a2 from t1;
-create algorithm=temptable view t22 as select a*a as a2 from t22_b;
+--echo # Using a temporary table internally should not confuse the prepared
+--echo # statement code, and should not raise ER_PS_INVALIDATED errors
+show create view v1;
-# Using a temporary table internally should not confuse the prepared
-# statement code, and should not raise ER_PS_INVALIDATED errors
-show create view t22;
-
-prepare stmt from 'select * from t22';
+prepare stmt from "select * from v1";
-insert into t22_b values (1), (2), (3);
+insert into t1 values (1), (2), (3);
execute stmt;
-eval $check;
execute stmt;
-eval $check;
-insert into t22_b values (4), (5), (6);
+insert into t1 values (4), (5), (6);
execute stmt;
-eval $check;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop table t22_b;
-drop view t22;
+drop table t1;
+drop view v1;
--echo =====================================================================
---echo Testing 23: Special tables (internal join tables)
+--echo Part 23: Special statements
--echo =====================================================================
---disable_warnings
-drop table if exists t23_a;
-drop table if exists t23_b;
---enable_warnings
+--echo # SQLCOM_ALTER_TABLE:
-create table t23_a(a int);
-create table t23_b(b int);
-# Using a temporary table internally should not confuse the prepared
-# statement code, and should not raise ER_PS_INVALIDATED errors
-prepare stmt from 'select * from t23_a join t23_b';
-
-insert into t23_a values (1), (2), (3);
-insert into t23_b values (10), (20), (30);
-execute stmt;
-eval $check;
-execute stmt;
-eval $check;
+create table t1 (a int);
-insert into t23_a values (4);
-insert into t23_b values (40);
+prepare stmt from "alter table t1 add column b int";
execute stmt;
-eval $check;
-execute stmt;
-eval $check;
-
-drop table t23_a;
-drop table t23_b;
-
---echo =====================================================================
---echo Testing 24: Special statements
---echo =====================================================================
-# SQLCOM_ALTER_TABLE:
+drop table t1;
+create table t1 (a1 int, a2 int);
---disable_warnings
-drop table if exists t24_alter;
---enable_warnings
-
-create table t24_alter(a int);
-
-prepare stmt from 'alter table t24_alter add column b int';
+--echo # t1 has changed, and it's does not lead to reprepare
execute stmt;
-eval $check;
-
-drop table t24_alter;
-create table t24_alter(a1 int, a2 int);
-# t24_alter has changed, and it's not a problem
+alter table t1 drop column b;
execute stmt;
-eval $check;
-alter table t24_alter drop column b;
+alter table t1 drop column b;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-alter table t24_alter drop column b;
-execute stmt;
-eval $check;
+drop table t1;
-drop table t24_alter;
+--echo # SQLCOM_REPAIR:
-# SQLCOM_REPAIR:
+create table t1 (a int);
---disable_warnings
-drop table if exists t24_repair;
---enable_warnings
+insert into t1 values (1), (2), (3);
-create table t24_repair(a int);
-insert into t24_repair values (1), (2), (3);
+prepare stmt from "repair table t1";
-prepare stmt from 'repair table t24_repair';
execute stmt;
-eval $check;
+execute stmt;
-drop table t24_repair;
-create table t24_repair(a1 int, a2 int);
-insert into t24_repair values (1, 10), (2, 20), (3, 30);
+drop table t1;
+create table t1 (a1 int, a2 int);
+insert into t1 values (1, 10), (2, 20), (3, 30);
-# t24_repair has changed, and it's not a problem
+--echo # t1 has changed, and it's does not lead to reprepare
execute stmt;
-eval $check;
-alter table t24_repair add column b varchar(50) default NULL;
+alter table t1 add column b varchar(50) default NULL;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-alter table t24_repair drop column b;
+alter table t1 drop column b;
execute stmt;
-eval $check;
-
-drop table t24_repair;
+call p_verify_reprepare_count(0);
-# SQLCOM_ANALYZE:
+--echo # SQLCOM_ANALYZE:
---disable_warnings
-drop table if exists t24_analyze;
---enable_warnings
-
-create table t24_analyze(a int);
-insert into t24_analyze values (1), (2), (3);
-
-prepare stmt from 'analyze table t24_analyze';
+prepare stmt from "analyze table t1";
execute stmt;
-eval $check;
-
-drop table t24_analyze;
-create table t24_analyze(a1 int, a2 int);
-insert into t24_analyze values (1, 10), (2, 20), (3, 30);
-# t24_analyze has changed, and it's not a problem
+drop table t1;
+create table t1 (a1 int, a2 int);
+insert into t1 values (1, 10), (2, 20), (3, 30);
+--echo # t1 has changed, and it's not a problem
execute stmt;
-eval $check;
-alter table t24_analyze add column b varchar(50) default NULL;
+alter table t1 add column b varchar(50) default NULL;
execute stmt;
-eval $check;
-alter table t24_analyze drop column b;
+alter table t1 drop column b;
execute stmt;
-eval $check;
-drop table t24_analyze;
+call p_verify_reprepare_count(0);
-# SQLCOM_OPTIMIZE:
+--echo # SQLCOM_OPTIMIZE:
---disable_warnings
-drop table if exists t24_optimize;
---enable_warnings
-
-create table t24_optimize(a int);
-insert into t24_optimize values (1), (2), (3);
-
-prepare stmt from 'optimize table t24_optimize';
+prepare stmt from "optimize table t1";
execute stmt;
-eval $check;
-drop table t24_optimize;
-create table t24_optimize(a1 int, a2 int);
-insert into t24_optimize values (1, 10), (2, 20), (3, 30);
+drop table t1;
+create table t1 (a1 int, a2 int);
+insert into t1 values (1, 10), (2, 20), (3, 30);
-# t24_optimize has changed, and it's not a problem
+--echo # t1 has changed, and it's not a problem
execute stmt;
-eval $check;
-alter table t24_optimize add column b varchar(50) default NULL;
+alter table t1 add column b varchar(50) default NULL;
execute stmt;
-eval $check;
-alter table t24_optimize drop column b;
+alter table t1 drop column b;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop table t24_optimize;
+drop table t1;
-# SQLCOM_SHOW_CREATE_PROC:
+--echo # SQLCOM_SHOW_CREATE_PROC:
---disable_warnings
-drop procedure if exists changing_proc;
---enable_warnings
-
-prepare stmt from 'show create procedure changing_proc';
+prepare stmt from "show create procedure p1";
--error ER_SP_DOES_NOT_EXIST
execute stmt;
-eval $check;
--error ER_SP_DOES_NOT_EXIST
execute stmt;
-eval $check;
-create procedure changing_proc() begin end;
+create procedure p1() begin end;
-# changing_proc has changed, and it's not a problem
+--disable_result_log
execute stmt;
-eval $check;
execute stmt;
-eval $check;
+--enable_result_log
-drop procedure changing_proc;
-create procedure changing_proc(x int, y int) begin end;
+drop procedure p1;
+create procedure p1(x int, y int) begin end;
+--disable_result_log
execute stmt;
-eval $check;
execute stmt;
-eval $check;
+--enable_result_log
-drop procedure changing_proc;
+drop procedure p1;
--error ER_SP_DOES_NOT_EXIST
execute stmt;
-eval $check;
--error ER_SP_DOES_NOT_EXIST
execute stmt;
-eval $check;
-
-# SQLCOM_SHOW_CREATE_FUNC:
+call p_verify_reprepare_count(0);
---disable_warnings
-drop function if exists changing_func;
---enable_warnings
+--echo # SQLCOM_SHOW_CREATE_FUNC:
-prepare stmt from 'show create function changing_func';
+prepare stmt from "show create function f1";
--error ER_SP_DOES_NOT_EXIST
execute stmt;
-eval $check;
--error ER_SP_DOES_NOT_EXIST
execute stmt;
-eval $check;
-create function changing_func() returns int return 0;
+create function f1() returns int return 0;
-# changing_proc has changed, and it's not a problem
+--disable_result_log
execute stmt;
-eval $check;
execute stmt;
-eval $check;
+--enable_result_log
-drop function changing_func;
-create function changing_func(x int, y int) returns int return x+y;
+drop function f1;
+create function f1(x int, y int) returns int return x+y;
+--disable_result_log
execute stmt;
-eval $check;
execute stmt;
-eval $check;
+--enable_result_log
-drop function changing_func;
+drop function f1;
--error ER_SP_DOES_NOT_EXIST
execute stmt;
-eval $check;
--error ER_SP_DOES_NOT_EXIST
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-# SQLCOM_SHOW_CREATE_TRIGGER:
+--echo # SQLCOM_SHOW_CREATE_TRIGGER:
---disable_warnings
-drop table if exists t24_trigger;
---enable_warnings
-
-create table t24_trigger(a int);
+create table t1 (a int);
-prepare stmt from 'show create trigger t24_bi;';
+prepare stmt from "show create trigger t1_bi";
--error ER_TRG_DOES_NOT_EXIST
execute stmt;
-eval $check;
--error ER_TRG_DOES_NOT_EXIST
execute stmt;
-eval $check;
-delimiter $$;
-create trigger t24_bi before insert on t24_trigger for each row
- begin
- set @message= "t24_bi";
- end
-$$
-delimiter ;$$
+create trigger t1_bi before insert on t1 for each row set @message= "t1_bi";
-# t24_bi has changed, and it's not a problem
+--disable_result_log
execute stmt;
-eval $check;
execute stmt;
-eval $check;
+--enable_result_log
+
+drop trigger t1_bi;
-drop trigger t24_bi;
-delimiter $$;
-create trigger t24_bi before insert on t24_trigger for each row
- begin
- set @message= "t24_bi (2)";
- end
-$$
-delimiter ;$$
+create trigger t1_bi before insert on t1 for each row set @message= "t1_bi (2)";
-# t24_bi has changed, and it's not a problem
-set @expected = @expected + 1;
+--disable_result_log
execute stmt;
-eval $check;
execute stmt;
-eval $check;
+--enable_result_log
-drop trigger t24_bi;
+drop trigger t1_bi;
--error ER_TRG_DOES_NOT_EXIST
execute stmt;
-eval $check;
--error ER_TRG_DOES_NOT_EXIST
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop table t24_trigger;
+drop table t1;
+deallocate prepare stmt;
--echo =====================================================================
---echo Testing 25: Testing the strength of TABLE_SHARE version
+--echo Part 24: Testing the strength of TABLE_SHARE version
--echo =====================================================================
-# Test 25-a: number of columns
+--echo # Test 24-a: number of columns
---disable_warnings
-drop table if exists t25_num_col;
---enable_warnings
-
-create table t25_num_col(a int);
+create table t1 (a int);
-prepare stmt from 'select a from t25_num_col';
-execute stmt;
-eval $check;
+prepare stmt from "select a from t1";
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-alter table t25_num_col add column b varchar(50) default NULL;
+alter table t1 add column b varchar(50) default NULL;
-set @expected = @expected + 1;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop table t25_num_col;
+--echo # Test 24-b: column name
-# Test 25-b: column name
+alter table t1 change b c int;
+execute stmt;
+call p_verify_reprepare_count(1);
+execute stmt;
+call p_verify_reprepare_count(0);
---disable_warnings
-drop table if exists t25_col_name;
---enable_warnings
+--echo # Test 24-c: column type
-create table t25_col_name(a int);
+alter table t1 change a a varchar(10);
-prepare stmt from 'select * from t25_col_name';
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
+
+--echo # Test 24-d: column type length
-alter table t25_col_name change a b int;
+alter table t1 change a a varchar(20);
-set @expected = @expected + 1;
---error ER_PS_REBIND
execute stmt;
-eval $check;
-set @expected = @expected + 1;
---error ER_PS_REBIND
+call p_verify_reprepare_count(1);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop table t25_col_name;
+--echo # Test 24-e: column NULL property
-# Test 25-c: column type
+alter table t1 change a a varchar(20) NOT NULL;
---disable_warnings
-drop table if exists t25_col_type;
---enable_warnings
-
-create table t25_col_type(a int);
-
-prepare stmt from 'select * from t25_col_type';
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
+
+--echo # Test 24-f: column DEFAULT
-alter table t25_col_type change a a varchar(10);
+alter table t1 change c c int DEFAULT 20;
-set @expected = @expected + 1;
---error ER_PS_REBIND
execute stmt;
-eval $check;
-set @expected = @expected + 1;
---error ER_PS_REBIND
+call p_verify_reprepare_count(1);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-drop table t25_col_type;
+--echo # Test 24-g: number of keys
+create unique index t1_a_idx on t1 (a);
-# Test 25-d: column type length
+execute stmt;
+call p_verify_reprepare_count(1);
+execute stmt;
+call p_verify_reprepare_count(0);
---disable_warnings
-drop table if exists t25_col_type_length;
---enable_warnings
+--echo # Test 24-h: changing index uniqueness
-create table t25_col_type_length(a varchar(10));
+drop index t1_a_idx on t1;
+create index t1_a_idx on t1 (a);
-prepare stmt from 'select * from t25_col_type_length';
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-alter table t25_col_type_length change a a varchar(20);
+--echo # Cleanup
+drop table t1;
-set @expected = @expected + 1;
---error ER_PS_REBIND
-execute stmt;
-eval $check;
-set @expected = @expected + 1;
---error ER_PS_REBIND
-execute stmt;
-eval $check;
+deallocate prepare stmt;
-drop table t25_col_type_length;
+--echo =====================================================================
+--echo Testing reported bugs
+--echo =====================================================================
-# Test 25-e: column NULL property
+--echo #
+--echo # Bug#27420 A combination of PS and view operations cause
+--echo # error + assertion on shutdown
+--echo #
--disable_warnings
-drop table if exists t25_col_null;
+drop table if exists t_27420_100;
+drop table if exists t_27420_101;
+drop view if exists v_27420;
--enable_warnings
-create table t25_col_null(a varchar(10));
+create table t_27420_100(a int);
+insert into t_27420_100 values (1), (2);
+
+create table t_27420_101(a int);
+insert into t_27420_101 values (1), (2);
+
+create view v_27420 as select t_27420_100.a X, t_27420_101.a Y
+ from t_27420_100, t_27420_101
+ where t_27420_100.a=t_27420_101.a;
+
+prepare stmt from "select * from v_27420";
-prepare stmt from 'select * from t25_col_null';
-execute stmt;
-eval $check;
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-alter table t25_col_null change a a varchar(10) NOT NULL;
+drop view v_27420;
+create table v_27420(X int, Y int);
-set @expected = @expected + 1;
---error ER_PS_REBIND
execute stmt;
-eval $check;
-set @expected = @expected + 1;
---error ER_PS_REBIND
+call p_verify_reprepare_count(1);
+
+drop table v_27420;
+# passes in 5.0, fails in 5.1, should pass
+create table v_27420 (a int, b int, filler char(200));
+
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
-drop table t25_col_null;
+drop table t_27420_100;
+drop table t_27420_101;
+drop table v_27420;
+deallocate prepare stmt;
-# Test 25-f: column DEFAULT
+--echo #
+--echo # Bug#27430 Crash in subquery code when in PS and table DDL changed
+--echo # after PREPARE
+--echo #
--disable_warnings
-drop table if exists t25_col_default;
+drop table if exists t_27430_1;
+drop table if exists t_27430_2;
--enable_warnings
-create table t25_col_default(a int, b int DEFAULT 10);
+create table t_27430_1 (a int not null, oref int not null, key(a));
+insert into t_27430_1 values
+ (1, 1),
+ (1, 1234),
+ (2, 3),
+ (2, 1234),
+ (3, 1234);
-prepare stmt from 'insert into t25_col_default(a) values (?)';
-set @val=1;
-execute stmt using @val;
-eval $check;
-set @val=2;
-execute stmt using @val;
-eval $check;
+create table t_27430_2 (a int not null, oref int not null);
+insert into t_27430_2 values
+ (1, 1),
+ (2, 2),
+ (1234, 3),
+ (1234, 4);
-alter table t25_col_default change b b int DEFAULT 20;
+prepare stmt from
+ "select oref, a, a in (select a from t_27430_1 where oref=t_27430_2.oref) Z from t_27430_2";
-set @val=3;
-# Must insert the correct default value for b
-set @expected = @expected + 1;
-execute stmt using @val;
-eval $check;
+execute stmt;
+call p_verify_reprepare_count(0);
-set @val=4;
-# Must insert the correct default value for b
-execute stmt using @val;
-eval $check;
+drop table t_27430_1, t_27430_2;
-select * from t25_col_default;
+create table t_27430_1 (a int, oref int, key(a));
+insert into t_27430_1 values
+ (1, 1),
+ (1, NULL),
+ (2, 3),
+ (2, NULL),
+ (3, NULL);
-drop table t25_col_default;
+create table t_27430_2 (a int, oref int);
+insert into t_27430_2 values
+ (1, 1),
+ (2,2),
+ (NULL, 3),
+ (NULL, 4);
-# Test 25-g: number of keys
+execute stmt;
+call p_verify_reprepare_count(1);
+
+drop table t_27430_1;
+drop table t_27430_2;
+deallocate prepare stmt;
+
+--echo #
+--echo # Bug#27690 Re-execution of prepared statement after table
+--echo # was replaced with a view crashes
+--echo #
--disable_warnings
-drop table if exists t25_index;
+drop table if exists t_27690_1;
+drop view if exists v_27690_1;
+drop table if exists v_27690_2;
--enable_warnings
-create table t25_index(a varchar(10));
+create table t_27690_1 (a int, b int);
+insert into t_27690_1 values (1,1),(2,2);
-prepare stmt from 'select * from t25_index';
-execute stmt;
-eval $check;
-execute stmt;
-eval $check;
+create table v_27690_1 as select * from t_27690_1;
+create table v_27690_2 as select * from t_27690_1;
-create index i1 on t25_index(a);
+prepare stmt from "select * from v_27690_1, v_27690_2";
-set @expected = @expected + 1;
execute stmt;
-eval $check;
execute stmt;
-eval $check;
-
-drop table t25_index;
-# Test 25-h: changing index uniqueness
+drop table v_27690_1;
---disable_warnings
-drop table if exists t25_index_unique;
---enable_warnings
+--error ER_NO_SUCH_TABLE
+execute stmt;
-create table t25_index_unique(a varchar(10), b varchar(10));
-create index i1 on t25_index_unique(a, b);
+--error ER_NO_SUCH_TABLE
+execute stmt;
+call p_verify_reprepare_count(0);
-show create table t25_index_unique;
+create view v_27690_1 as select A.a, A.b from t_27690_1 A, t_27690_1 B;
-prepare stmt from 'select * from t25_index_unique';
execute stmt;
-eval $check;
+call p_verify_reprepare_count(1);
execute stmt;
-eval $check;
+call p_verify_reprepare_count(0);
-alter table t25_index_unique drop index i1;
-create unique index i1 on t25_index_unique(a, b);
+drop table t_27690_1;
+drop view v_27690_1;
+drop table v_27690_2;
+deallocate prepare stmt;
+
+--echo #=====================================================================
+--echo # TODO: fix the below two bugs and modify their tests
+--echo #
+--echo # Bug#21294 Executing a prepared statement that executes
+--echo # a stored function which was recreat
+--echo #
-show create table t25_index_unique;
+create function f1() returns int return 10;
-set @expected = @expected + 1;
+prepare stmt from "select f1()";
execute stmt;
-eval $check;
+
+drop function f1;
+create function f1() returns int return 10;
+
+# might pass or fail, implementation dependent
+--error ER_SP_DOES_NOT_EXIST
execute stmt;
-eval $check;
-drop table t25_index_unique;
+drop function f1;
+create function f1() returns int return 20;
---echo =====================================================================
---echo Testing reported bugs
---echo =====================================================================
+--error ER_SP_DOES_NOT_EXIST
+execute stmt;
+call p_verify_reprepare_count(0);
-#
-# Bug#12093 (SP not found on second PS execution if another thread drops
-# other SP in between)
-#
+drop function f1;
+deallocate prepare stmt;
+--echo #
+--echo # Bug#12093 SP not found on second PS execution if another thread drops
+--echo # other SP in between
+--echo #
--disable_warnings
-drop table if exists table_12093;
-drop function if exists func_12093;
-drop function if exists func_12093_unrelated;
-drop procedure if exists proc_12093;
+drop table if exists t_12093;
+drop function if exists f_12093;
+drop function if exists f_12093_unrelated;
+drop procedure if exists p_12093;
--enable_warnings
-connect (con1,localhost,root,,);
+create table t_12093 (a int);
-connection default;
+create function f_12093() returns int return (select count(*) from t_12093);
-create table table_12093(a int);
+create procedure p_12093(a int) select * from t_12093;
-delimiter //;
+create function f_12093_unrelated() returns int return 2;
+create procedure p_12093_unrelated() begin end;
-create function func_12093()
-returns int
-begin
- return (select count(*) from table_12093);
-end//
-
-create procedure proc_12093(a int)
-begin
- select * from table_12093;
-end//
-
-delimiter ;//
-
-create function func_12093_unrelated() returns int return 2;
-create procedure proc_12093_unrelated() begin end;
-
-prepare stmt_sf from 'select func_12093();';
-prepare stmt_sp from 'call proc_12093(func_12093())';
+prepare stmt_sf from 'select f_12093();';
+prepare stmt_sp from 'call p_12093(f_12093())';
execute stmt_sf;
-eval $check;
execute stmt_sp;
-eval $check;
+connect (con1,localhost,root,,);
connection con1;
-drop function func_12093_unrelated;
-drop procedure proc_12093_unrelated;
+drop function f_12093_unrelated;
+drop procedure p_12093_unrelated;
connection default;
-# previously, failed with --error 1305
+--echo # XXX: bug
+--error ER_SP_DOES_NOT_EXIST
execute stmt_sf;
-eval $check;
-# previously, failed with --error 1305
+--echo # XXX: bug
+--error ER_SP_DOES_NOT_EXIST
execute stmt_sp;
-eval $check;
-# previously, failed with --error 1305
+--echo # XXX: bug
+--error ER_SP_DOES_NOT_EXIST
execute stmt_sf;
-eval $check;
-# previously, failed with --error 1305
+--echo # XXX: bug
+--error ER_SP_DOES_NOT_EXIST
execute stmt_sp;
-eval $check;
+call p_verify_reprepare_count(0);
+
+disconnect con1;
+drop table t_12093;
+drop function f_12093;
+drop procedure p_12093;
deallocate prepare stmt_sf;
deallocate prepare stmt_sp;
-disconnect con1;
-drop table table_12093;
-drop function func_12093;
-drop procedure proc_12093;
+--echo =====================================================================
+--echo Ensure that metadata validation is performed for every type of
+--echo SQL statement where it is needed.
+--echo =====================================================================
-#
-# Bug#21294 (executing a prepared statement that executes a stored function
-# which was recreat)
-#
+--echo #
+--echo # SQLCOM_SELECT
+--echo #
--disable_warnings
-drop function if exists func_21294;
+drop table if exists t1;
--enable_warnings
+create table t1 (a int);
+prepare stmt from "select 1 as res from dual where (1) in (select * from t1)";
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
+deallocate prepare stmt;
+call p_verify_reprepare_count(1);
-create function func_21294() returns int return 10;
+--echo #
+--echo # SQLCOM_CREATE_TABLE
+--echo #
-prepare stmt from "select func_21294()";
+--disable_warnings
+drop table if exists t1;
+drop table if exists t2;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from 'create table t2 as select * from t1';
+execute stmt;
+drop table t2;
+execute stmt;
+drop table t2;
+execute stmt;
+call p_verify_reprepare_count(0);
+# Base table with name of table to be created exists
+--error ER_TABLE_EXISTS_ERROR
+execute stmt;
+call p_verify_reprepare_count(1);
+--error ER_TABLE_EXISTS_ERROR
+execute stmt;
+call p_verify_reprepare_count(0);
+drop table t2;
+# Temporary table with name of table to be created exists
+create temporary table t2 (a int);
+--error ER_TABLE_EXISTS_ERROR
+execute stmt;
+call p_verify_reprepare_count(1);
+--error ER_TABLE_EXISTS_ERROR
+execute stmt;
+call p_verify_reprepare_count(0);
+drop temporary table t2;
+execute stmt;
+call p_verify_reprepare_count(1);
+drop table t2;
+execute stmt;
+call p_verify_reprepare_count(0);
+drop table t2;
+# View with name of table to be created exists
+# Attention:
+# We cannot print the error message because it contains a random filename.
+# Example: 1050: Table '<some_path>/var/tmp/#sql_6979_0' already exists
+# Therefore we mangle it via
+# "--error ER_TABLE_EXISTS_ERROR,9999" (9999 is currently not used)
+# to "Got one of the listed errors".
+create view t2 as select 1;
+--error ER_TABLE_EXISTS_ERROR,9999
+execute stmt;
+call p_verify_reprepare_count(1);
+--error ER_TABLE_EXISTS_ERROR,9999
+execute stmt;
+call p_verify_reprepare_count(0);
+drop view t2;
+drop table t1;
+# Table to be used recreated (drop,create) with different layout
+create table t1 (x varchar(20));
+execute stmt;
+call p_verify_reprepare_count(1);
+select * from t2;
+drop table t2;
+execute stmt;
+call p_verify_reprepare_count(0);
+drop table t2;
+# Table to be used has a modified (alter table) layout
+alter table t1 add column y decimal(10,3);
+execute stmt;
+call p_verify_reprepare_count(1);
+select * from t2;
+drop table t2;
+execute stmt;
+call p_verify_reprepare_count(0);
+drop table t1;
+deallocate prepare stmt;
+--echo # XXX: no validation of the first table in case of
+--echo # CREATE TEMPORARY TABLE. This is a shortcoming of the current code,
+--echo # but since validation is not strictly necessary, nothing is done
+--echo # about it.
+--echo # Will be fixed as part of work on Bug#21431 "Incomplete support of
+--echo # temporary tables"
+create table t1 (a int);
+insert into t1 (a) values (1);
+prepare stmt from "create temporary table if not exists t2 as select * from t1";
+execute stmt;
+drop table t2;
+execute stmt;
+execute stmt;
+select * from t2;
execute stmt;
-eval $check;
+select * from t2;
+drop table t2;
+create temporary table t2 (a varchar(10));
+execute stmt;
+select * from t2;
+call p_verify_reprepare_count(0);
+drop table t1;
+create table t1 (x int);
+execute stmt;
+call p_verify_reprepare_count(1);
+execute stmt;
+call p_verify_reprepare_count(0);
+drop table t1;
+drop temporary table t2;
+drop table t2;
+deallocate prepare stmt;
-drop function func_21294;
-create function func_21294() returns int return 10;
+create table t1 (a int);
+prepare stmt from "create table t2 like t1";
+execute stmt;
+call p_verify_reprepare_count(0);
+drop table t2;
+execute stmt;
+call p_verify_reprepare_count(0);
+drop table t2;
+# Table to be used does not exist
+drop table t1;
+--error ER_NO_SUCH_TABLE
+execute stmt;
+call p_verify_reprepare_count(0);
+--error ER_NO_SUCH_TABLE
+execute stmt;
+call p_verify_reprepare_count(0);
+# Table to be used recreated (drop,create) with different layout
+create table t1 (x char(17));
+execute stmt;
+call p_verify_reprepare_count(1);
+drop table t2;
+execute stmt;
+call p_verify_reprepare_count(0);
+drop table t2;
+# Table to be used has a modified (alter table) layout
+alter table t1 add column y time;
+execute stmt;
+call p_verify_reprepare_count(1);
+select * from t2;
+drop table t2;
+execute stmt;
+call p_verify_reprepare_count(0);
+drop table t1;
+drop table t2;
+deallocate prepare stmt;
-# might pass or fail, implementation dependent
+
+--echo #
+--echo # SQLCOM_UPDATE
+--echo #
+
+--disable_warnings
+drop table if exists t1, t2;
+--enable_warnings
+create table t1 (a int);
+create table t2 (a int);
+prepare stmt from "update t2 set a=a+1 where (1) in (select * from t1)";
execute stmt;
-eval $check;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1, t2;
+deallocate prepare stmt;
-drop function func_21294;
-create function func_21294() returns int return 20;
+--echo #
+--echo # SQLCOM_INSERT
+--echo #
-set @expected = @expected + 1;
+--disable_warnings
+drop table if exists t1, t2;
+--enable_warnings
+create table t1 (a int);
+create table t2 (a int);
+prepare stmt from "insert into t2 set a=((1) in (select * from t1))";
+execute stmt;
+drop table t1;
+create table t1 (x int);
execute stmt;
-eval $check;
+drop table t1, t2;
deallocate prepare stmt;
-drop function func_21294;
-#
-# Bug#27420 (A combination of PS and view operations cause error + assertion
-# on shutdown)
-#
+--echo #
+--echo # SQLCOM_INSERT_SELECT
+--echo #
--disable_warnings
-drop table if exists t_27420_100;
-drop table if exists t_27420_101;
-drop view if exists v_27420;
+drop table if exists t1, t2;
--enable_warnings
+create table t1 (a int);
+create table t2 (a int);
+prepare stmt from "insert into t2 select * from t1";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1, t2;
+deallocate prepare stmt;
-connect (con1,localhost,root,,);
+--echo #
+--echo # SQLCOM_REPLACE
+--echo #
-connection default;
+--disable_warnings
+drop table if exists t1, t2;
+--enable_warnings
+create table t1 (a int);
+create table t2 (a int);
+prepare stmt from "replace t2 set a=((1) in (select * from t1))";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1, t2;
+deallocate prepare stmt;
-create table t_27420_100(a int);
-insert into t_27420_100 values (1), (2);
+--echo #
+--echo # SQLCOM_REPLACE_SELECT
+--echo #
-create table t_27420_101(a int);
-insert into t_27420_101 values (1), (2);
+--disable_warnings
+drop table if exists t1, t2;
+--enable_warnings
+create table t1 (a int);
+create table t2 (a int);
+prepare stmt from "replace t2 select * from t1";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1, t2;
+deallocate prepare stmt;
-create view v_27420 as select t_27420_100.a X, t_27420_101.a Y
- from t_27420_100, t_27420_101
- where t_27420_100.a=t_27420_101.a;
+--echo #
+--echo # SQLCOM_DELETE
+--echo #
+
+--disable_warnings
+drop table if exists t1, t2;
+--enable_warnings
+create table t1 (a int);
+create table t2 (a int);
+prepare stmt from "delete from t2 where (1) in (select * from t1)";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1, t2;
+deallocate prepare stmt;
-prepare stmt from 'select * from v_27420';
+--echo #
+--echo # SQLCOM_DELETE_MULTI
+--echo #
+--disable_warnings
+drop table if exists t1, t2, t3;
+--enable_warnings
+create table t1 (a int);
+create table t2 (a int);
+create table t3 (a int);
+prepare stmt from "delete t2, t3 from t2, t3 where (1) in (select * from t1)";
execute stmt;
-eval $check;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1, t2, t3;
+deallocate prepare stmt;
-connection con1;
+--echo #
+--echo # SQLCOM_UPDATE_MULTI
+--echo #
-drop view v_27420;
-create table v_27420(X int, Y int);
+--disable_warnings
+drop table if exists t1, t2, t3;
+--enable_warnings
+create table t1 (a int);
+create table t2 (a int);
+create table t3 (a int);
+prepare stmt from "update t2, t3 set t3.a=t2.a, t2.a=null where (1) in (select * from t1)";
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1, t2, t3;
+deallocate prepare stmt;
+--echo # Intermediate results: 8 SQLCOMs tested, 8 automatic reprepares
+call p_verify_reprepare_count(8);
-connection default;
+--echo #
+--echo # SQLCOM_LOAD
+--echo #
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a varchar(20));
+--error ER_UNSUPPORTED_PS
+prepare stmt from "load data infile '../std_data_ln/words.dat' into table t1";
+drop table t1;
+
+--echo #
+--echo # SQLCOM_SHOW_DATABASES
+--echo #
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "show databases where (1) in (select * from t1)";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
+deallocate prepare stmt;
-set @expected = @expected + 1;
+--echo #
+--echo # SQLCOM_SHOW_TABLES
+--echo #
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "show tables where (1) in (select * from t1)";
+execute stmt;
+drop table t1;
+create table t1 (x int);
execute stmt;
-eval $check;
+drop table t1;
+deallocate prepare stmt;
-connection con1;
+--echo #
+--echo # SQLCOM_SHOW_FIELDS
+--echo #
-drop table v_27420;
-# passes in 5.0, fails in 5.1, should pass
-create table v_27420 (a int, b int, filler char(200));
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "show fields from t1 where (1) in (select * from t1)";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
+deallocate prepare stmt;
-connection default;
+--echo #
+--echo # SQLCOM_SHOW_KEYS
+--echo #
-set @expected = @expected + 1;
---error ER_PS_REBIND
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "show keys from t1 where (1) in (select * from t1)";
execute stmt;
-eval $check;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
+deallocate prepare stmt;
-disconnect con1;
+--echo #
+--echo # SQLCOM_SHOW_VARIABLES
+--echo #
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "show variables where (1) in (select * from t1)";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
deallocate prepare stmt;
-drop table t_27420_100;
-drop table t_27420_101;
-drop table v_27420;
-#
-# Bug#27430 (Crash in subquery code when in PS and table DDL changed after
-# PREPARE)
-#
+--echo #
+--echo # SQLCOM_SHOW_STATUS
+--echo #
--disable_warnings
-drop table if exists t_27430_1;
-drop table if exists t_27430_2;
+drop table if exists t1;
--enable_warnings
+create table t1 (a int);
+prepare stmt from "show status where (1) in (select * from t1)";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
+deallocate prepare stmt;
-create table t_27430_1 (a int not null, oref int not null, key(a));
-insert into t_27430_1 values
- (1, 1),
- (1, 1234),
- (2, 3),
- (2, 1234),
- (3, 1234);
+--echo #
+--echo # SQLCOM_SHOW_ENGINE_STATUS, SQLCOM_SHOW_ENGINE_LOGS,
+--echo # SQLCOM_SHOW_ENGINE_MUTEX, SQLCOM_SHOW_PROCESSLIST
+--echo #
-create table t_27430_2 (a int not null, oref int not null);
-insert into t_27430_2 values
- (1, 1),
- (2, 2),
- (1234, 3),
- (1234, 4);
+--echo # Currently can not have a where clause, need to be covered
+--echo # with tests
-prepare stmt from
- 'select oref, a, a in (select a from t_27430_1 where oref=t_27430_2.oref) Z from t_27430_2';
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+--error ER_PARSE_ERROR
+prepare stmt from "show engine all status where (1) in (select * from t1)";
+--error ER_PARSE_ERROR
+prepare stmt from "show engine all logs where (1) in (select * from t1)";
+--error ER_PARSE_ERROR
+prepare stmt from "show engine all mutex where (1) in (select * from t1)";
+--error ER_PARSE_ERROR
+prepare stmt from "show processlist where (1) in (select * from t1)";
+drop table t1;
+
+--echo #
+--echo # SQLCOM_SHOW_CHARSETS
+--echo #
-execute stmt;
-eval $check;
-execute stmt;
-eval $check;
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "show charset where (1) in (select * from t1)";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
+deallocate prepare stmt;
-drop table t_27430_1, t_27430_2;
+--echo #
+--echo # SQLCOM_SHOW_COLLATIONS
+--echo #
-create table t_27430_1 (a int, oref int, key(a));
-insert into t_27430_1 values
- (1, 1),
- (1, NULL),
- (2, 3),
- (2, NULL),
- (3, NULL);
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "show collation where (1) in (select * from t1)";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
+deallocate prepare stmt;
-create table t_27430_2 (a int, oref int);
-insert into t_27430_2 values
- (1, 1),
- (2,2),
- (NULL, 3),
- (NULL, 4);
+--echo #
+--echo # SQLCOM_SHOW_TABLE_STATUS
+--echo #
-set @expected = @expected + 1;
---error ER_PS_REBIND
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "show table status where (1) in (select * from t1)";
execute stmt;
-eval $check;
-set @expected = @expected + 1;
---error ER_PS_REBIND
+drop table t1;
+create table t1 (x int);
execute stmt;
-eval $check;
+drop table t1;
+deallocate prepare stmt;
+
+--echo #
+--echo # SQLCOM_SHOW_TRIGGERS
+--echo #
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "show triggers where (1) in (select * from t1)";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
deallocate prepare stmt;
-drop table t_27430_1;
-drop table t_27430_2;
-#
-# Bug#27690 (Re-execution of prepared statement after table was replaced
-# with a view crashes)
-#
+--echo #
+--echo # SQLCOM_SHOW_OPEN_TABLES
+--echo #
--disable_warnings
-drop table if exists t_27690_1;
-drop view if exists v_27690_1;
-drop table if exists v_27690_2;
+drop table if exists t1;
--enable_warnings
+create table t1 (a int);
+prepare stmt from "show open tables where (1) in (select * from t1)";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
+deallocate prepare stmt;
-create table t_27690_1 (a int, b int);
-insert into t_27690_1 values (1,1),(2,2);
+--echo #
+--echo # SQLCOM_SHOW_STATUS_PROC
+--echo #
-create table v_27690_1 as select * from t_27690_1;
-create table v_27690_2 as select * from t_27690_1;
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "show procedure status where (1) in (select * from t1)";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
+deallocate prepare stmt;
-prepare stmt from 'select * from v_27690_1, v_27690_2';
+--echo #
+--echo # SQLCOM_SHOW_STATUS_FUNC
+--echo #
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "show function status where (1) in (select * from t1)";
execute stmt;
-eval $check;
+drop table t1;
+create table t1 (x int);
execute stmt;
-eval $check;
+drop table t1;
+deallocate prepare stmt;
-drop table v_27690_1;
+--echo #
+--echo # SQLCOM_SHOW_EVENTS
+--echo #
---error ER_NO_SUCH_TABLE
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "show events where (1) in (select * from t1)";
execute stmt;
-eval $check;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
+deallocate prepare stmt;
---error ER_NO_SUCH_TABLE
+--echo #
+--echo # SQLCOM_SET_OPTION
+--echo #
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "set @a=((1) in (select * from t1))";
execute stmt;
-eval $check;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
+deallocate prepare stmt;
-create view v_27690_1 as select A.a, A.b from t_27690_1 A, t_27690_1 B;
+--echo #
+--echo # SQLCOM_DO
+--echo #
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "do ((1) in (select * from t1))";
+execute stmt;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop table t1;
+deallocate prepare stmt;
-set @expected = @expected + 1;
+--echo #
+--echo # SQLCOM_CALL
+--echo #
+
+--disable_warnings
+drop table if exists t1;
+drop procedure if exists p1;
+--enable_warnings
+create procedure p1(a int) begin end;
+create table t1 (a int);
+prepare stmt from "call p1((1) in (select * from t1))";
execute stmt;
-eval $check;
+drop table t1;
+create table t1 (x int);
execute stmt;
-eval $check;
+drop table t1;
+drop procedure p1;
+deallocate prepare stmt;
+--echo #
+--echo # SQLCOM_CREATE_VIEW
+--echo #
+
+--disable_warnings
+drop table if exists t1;
+drop view if exists v1;
+--enable_warnings
+create table t1 (a int);
+prepare stmt from "create view v1 as select * from t1";
+execute stmt;
+drop view v1;
+drop table t1;
+create table t1 (x int);
+execute stmt;
+drop view v1;
+drop table t1;
deallocate prepare stmt;
-drop table t_27690_1;
-drop view v_27690_1;
-drop table v_27690_2;
+--echo # Intermediate result: number of reprepares matches the number
+--echo # of tests
+call p_verify_reprepare_count(18);
+
+--echo #
+--echo # SQLCOM_ALTER_VIEW
+--echo #
+--disable_warnings
+drop view if exists v1;
+--enable_warnings
+create view v1 as select 1;
+--error ER_UNSUPPORTED_PS
+prepare stmt from "alter view v1 as select 2";
+drop view v1;
+
+--echo # Cleanup
+--echo #
+--disable_warnings
+drop temporary table if exists t1, t2, t3;
+drop table if exists t1, t2, t3, v1, v2;
+drop procedure if exists p_verify_reprepare_count;
+drop procedure if exists p1;
+drop function if exists f1;
+drop view if exists v1, v2;
+--enable_warnings