483 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			483 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								drop temporary table if exists t1;
							 | 
						||
| 
								 | 
							
								drop table if exists t1, t2;
							 | 
						||
| 
								 | 
							
								drop procedure if exists p_verify_reprepare_count;
							 | 
						||
| 
								 | 
							
								drop procedure if exists p1;
							 | 
						||
| 
								 | 
							
								drop function if exists f1;
							 | 
						||
| 
								 | 
							
								drop view if exists t1;
							 | 
						||
| 
								 | 
							
								drop schema if exists mysqltest;
							 | 
						||
| 
								 | 
							
								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|
							 | 
						||
| 
								 | 
							
								set @reprepare_count= 0;
							 | 
						||
| 
								 | 
							
								flush status;
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								# Column added or dropped is not within the list of selected columns
							 | 
						||
| 
								 | 
							
								# or table comment has changed.
							 | 
						||
| 
								 | 
							
								# A reprepare is probably not needed.
							 | 
						||
| 
								 | 
							
								create table t1 (a int, b int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "select a from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								alter table t1 add column c int;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								alter table t1 drop column b;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								alter table t1 comment "My best table";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								# Selects using the table at various positions, inser,update ...
							 | 
						||
| 
								 | 
							
								# + the table disappears
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt1 from "truncate t1";
							 | 
						||
| 
								 | 
							
								prepare stmt2 from "select 1 as my_column from t1";
							 | 
						||
| 
								 | 
							
								prepare stmt3 from "select 1 as my_column from (select * from t1) as t2";
							 | 
						||
| 
								 | 
							
								prepare stmt4 from
							 | 
						||
| 
								 | 
							
								"select 1 as my_column from (select 1) as t2 where exists (select 1 from t1)";
							 | 
						||
| 
								 | 
							
								prepare stmt5 from "select * from (select 1 as b) as t2, t1";
							 | 
						||
| 
								 | 
							
								prepare stmt6 from "select * from t1 union all select 1.5";
							 | 
						||
| 
								 | 
							
								prepare stmt7 from "select 1 as my_column union all select 1 from t1";
							 | 
						||
| 
								 | 
							
								prepare stmt8 from "insert into t1 values(1),(2)";
							 | 
						||
| 
								 | 
							
								prepare stmt9 from "update t1 set a = 3 where a = 2";
							 | 
						||
| 
								 | 
							
								prepare stmt10 from "delete from t1 where a = 1";
							 | 
						||
| 
								 | 
							
								# Attention: Result logging is disabled.
							 | 
						||
| 
								 | 
							
								execute stmt10;
							 | 
						||
| 
								 | 
							
								execute stmt9;
							 | 
						||
| 
								 | 
							
								execute stmt8;
							 | 
						||
| 
								 | 
							
								execute stmt7;
							 | 
						||
| 
								 | 
							
								execute stmt6;
							 | 
						||
| 
								 | 
							
								execute stmt5;
							 | 
						||
| 
								 | 
							
								execute stmt4;
							 | 
						||
| 
								 | 
							
								execute stmt3;
							 | 
						||
| 
								 | 
							
								execute stmt2;
							 | 
						||
| 
								 | 
							
								execute stmt1;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								execute stmt10;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								execute stmt9;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								execute stmt8;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								execute stmt7;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								execute stmt6;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								execute stmt5;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								execute stmt4;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								execute stmt3;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								execute stmt2;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								execute stmt1;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt10;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt9;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt8;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt7;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt6;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt5;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt4;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt3;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt2;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt1;
							 | 
						||
| 
								 | 
							
								# Selects using the table at various positions, inser,update ...
							 | 
						||
| 
								 | 
							
								# + layout change (drop column) which must cause a reprepare
							 | 
						||
| 
								 | 
							
								create table t1 (a int, b int);
							 | 
						||
| 
								 | 
							
								insert into t1 values(1,1),(2,2),(3,3);
							 | 
						||
| 
								 | 
							
								create table t2 like t1;
							 | 
						||
| 
								 | 
							
								insert into t1 values(2,2);
							 | 
						||
| 
								 | 
							
								prepare stmt1 from "select a,b from t1";
							 | 
						||
| 
								 | 
							
								prepare stmt2 from "select a,b from (select * from t1) as t1";
							 | 
						||
| 
								 | 
							
								prepare stmt3 from "select * from t1 where a = 2 and b = 2";
							 | 
						||
| 
								 | 
							
								prepare stmt4 from "select * from t2 where (a,b) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								prepare stmt5 from "select * from t1 union select * from t2";
							 | 
						||
| 
								 | 
							
								prepare stmt6 from "select * from t1 union all select * from t2";
							 | 
						||
| 
								 | 
							
								prepare stmt7 from "insert into t1 set a = 4, b = 4";
							 | 
						||
| 
								 | 
							
								prepare stmt8 from "insert into t1 select * from t2";
							 | 
						||
| 
								 | 
							
								# Attention: Result logging is disabled.
							 | 
						||
| 
								 | 
							
								execute stmt8;
							 | 
						||
| 
								 | 
							
								execute stmt7;
							 | 
						||
| 
								 | 
							
								execute stmt6;
							 | 
						||
| 
								 | 
							
								execute stmt5;
							 | 
						||
| 
								 | 
							
								execute stmt4;
							 | 
						||
| 
								 | 
							
								execute stmt3;
							 | 
						||
| 
								 | 
							
								execute stmt2;
							 | 
						||
| 
								 | 
							
								execute stmt1;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								alter table t1 drop column b;
							 | 
						||
| 
								 | 
							
								execute stmt8;
							 | 
						||
| 
								 | 
							
								ERROR 21S01: Column count doesn't match value count at row 1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt7;
							 | 
						||
| 
								 | 
							
								ERROR 42S22: Unknown column 'b' in 'field list'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt6;
							 | 
						||
| 
								 | 
							
								ERROR 21000: The used SELECT statements have a different number of columns
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt5;
							 | 
						||
| 
								 | 
							
								ERROR 21000: The used SELECT statements have a different number of columns
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt4;
							 | 
						||
| 
								 | 
							
								ERROR 21000: Operand should contain 2 column(s)
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt3;
							 | 
						||
| 
								 | 
							
								ERROR 42S22: Unknown column 'b' in 'where clause'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt2;
							 | 
						||
| 
								 | 
							
								ERROR 42S22: Unknown column 'b' in 'field list'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt1;
							 | 
						||
| 
								 | 
							
								ERROR 42S22: Unknown column 'b' in 'field list'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt8;
							 | 
						||
| 
								 | 
							
								ERROR 21S01: Column count doesn't match value count at row 1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								ERROR
							 | 
						||
| 
								 | 
							
								Expected: 1, actual: 0
							 | 
						||
| 
								 | 
							
								execute stmt7;
							 | 
						||
| 
								 | 
							
								ERROR 42S22: Unknown column 'b' in 'field list'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt6;
							 | 
						||
| 
								 | 
							
								ERROR 21000: The used SELECT statements have a different number of columns
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt5;
							 | 
						||
| 
								 | 
							
								ERROR 21000: The used SELECT statements have a different number of columns
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt4;
							 | 
						||
| 
								 | 
							
								ERROR 21000: Operand should contain 2 column(s)
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt3;
							 | 
						||
| 
								 | 
							
								ERROR 42S22: Unknown column 'b' in 'where clause'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt2;
							 | 
						||
| 
								 | 
							
								ERROR 42S22: Unknown column 'b' in 'field list'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt1;
							 | 
						||
| 
								 | 
							
								ERROR 42S22: Unknown column 'b' in 'field list'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Why does the INSERT ... SELECT does not get a reprepare or is
							 | 
						||
| 
								 | 
							
								# only the counter not incremented?
							 | 
						||
| 
								 | 
							
								execute stmt8;
							 | 
						||
| 
								 | 
							
								ERROR 21S01: Column count doesn't match value count at row 1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								ERROR
							 | 
						||
| 
								 | 
							
								Expected: 1, actual: 0
							 | 
						||
| 
								 | 
							
								alter table t2 add column c int;
							 | 
						||
| 
								 | 
							
								execute stmt8;
							 | 
						||
| 
								 | 
							
								ERROR 21S01: Column count doesn't match value count at row 1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt8;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt7;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt6;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt5;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt4;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt3;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt2;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt1;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								# select AVG(<col>) + optimizer uses index meets loss of the index
							 | 
						||
| 
								 | 
							
								create table t1 (a int, b int, primary key(b),unique index t1_unq_idx(a));
							 | 
						||
| 
								 | 
							
								insert into t1 set a = 0, b = 0;
							 | 
						||
| 
								 | 
							
								insert into t1 select a + 1, b + 1 from t1;
							 | 
						||
| 
								 | 
							
								insert into t1 select a + 2, b + 2 from t1;
							 | 
						||
| 
								 | 
							
								insert into t1 select a + 4, b + 4 from t1;
							 | 
						||
| 
								 | 
							
								insert into t1 select a + 8, b + 8 from t1;
							 | 
						||
| 
								 | 
							
								# Optimizer strategy: Possible keys = NULL , Extra = Using index
							 | 
						||
| 
								 | 
							
								prepare stmt from "select avg(a) from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								avg(a)
							 | 
						||
| 
								 | 
							
								7.5000
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								avg(a)
							 | 
						||
| 
								 | 
							
								7.5000
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								alter table t1 drop index t1_unq_idx;
							 | 
						||
| 
								 | 
							
								# Optimizer strategy: Possible keys = NULL , Extra = 
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								avg(a)
							 | 
						||
| 
								 | 
							
								7.5000
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								avg(a)
							 | 
						||
| 
								 | 
							
								7.5000
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# select AVG(<col>) + optimizer uses table scan meets a new index
							 | 
						||
| 
								 | 
							
								alter table t1 add unique index t1_unq_idx(a);
							 | 
						||
| 
								 | 
							
								# Optimizer strategy: Possible keys = NULL , Extra = Using index
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								avg(a)
							 | 
						||
| 
								 | 
							
								7.5000
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								avg(a)
							 | 
						||
| 
								 | 
							
								7.5000
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								# table replaced by not updatable view - Insert
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "insert into t1 values(1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create view t1 as select 1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR HY000: The target table t1 of the INSERT is not insertable-into
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop view t1;
							 | 
						||
| 
								 | 
							
								create table t2 (a int);
							 | 
						||
| 
								 | 
							
								create view t1 as select * from t2 with check option;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								drop view t1;
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Some freestyle tests
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								create temporary table t1 as select 1 as a;
							 | 
						||
| 
								 | 
							
								create procedure p1()
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								drop temporary table t1;
							 | 
						||
| 
								 | 
							
								end|
							 | 
						||
| 
								 | 
							
								create function f1() returns int
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								call p1();
							 | 
						||
| 
								 | 
							
								return 1;
							 | 
						||
| 
								 | 
							
								end|
							 | 
						||
| 
								 | 
							
								prepare stmt from "select f1() as my_column, a from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR HY000: Can't reopen table: 't1'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								prepare stmt from "select a, f1() as my_column from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR HY000: Can't reopen table: 't1'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								prepare stmt from "select f1() as my_column, count(*) from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR HY000: Can't reopen table: 't1'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								prepare stmt from "select count(*), f1() as my_column from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR HY000: Can't reopen table: 't1'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								# Execute fails, no drop of temporary table
							 | 
						||
| 
								 | 
							
								prepare stmt from "select 1 as my_column from (select 1) as t2
							 | 
						||
| 
								 | 
							
								                   where exists (select f1() from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								my_column
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								my_column
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								# Execute drops temporary table
							 | 
						||
| 
								 | 
							
								prepare stmt from "select f1()";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Unknown table 't1'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop function f1;
							 | 
						||
| 
								 | 
							
								drop procedure p1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								# Execute fails, temporary table is not replaced by another
							 | 
						||
| 
								 | 
							
								create temporary table t1 as select 1 as a;
							 | 
						||
| 
								 | 
							
								create procedure p1()
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								drop temporary table t1;
							 | 
						||
| 
								 | 
							
								create temporary table t1 as select 'abc' as a;
							 | 
						||
| 
								 | 
							
								end|
							 | 
						||
| 
								 | 
							
								create function f1() returns int
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								call p1();
							 | 
						||
| 
								 | 
							
								return 1;
							 | 
						||
| 
								 | 
							
								end|
							 | 
						||
| 
								 | 
							
								prepare stmt from "select count(*), f1() as my_column from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR HY000: Can't reopen table: 't1'
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								prepare stmt from "call p1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop procedure p1;
							 | 
						||
| 
								 | 
							
								create schema mysqltest;
							 | 
						||
| 
								 | 
							
								create procedure mysqltest.p1()
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								drop schema mysqltest;
							 | 
						||
| 
								 | 
							
								create schema mysqltest;
							 | 
						||
| 
								 | 
							
								end|
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42000: PROCEDURE test.p1 does not exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42000: PROCEDURE test.p1 does not exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								drop schema mysqltest;
							 | 
						||
| 
								 | 
							
								drop temporary table t1;
							 | 
						||
| 
								 | 
							
								# Cleanup
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop temporary table if exists t1;
							 | 
						||
| 
								 | 
							
								drop table if exists t1, t2;
							 | 
						||
| 
								 | 
							
								drop procedure if exists p_verify_reprepare_count;
							 | 
						||
| 
								 | 
							
								drop procedure if exists p1;
							 | 
						||
| 
								 | 
							
								drop function if exists f1;
							 | 
						||
| 
								 | 
							
								drop view if exists t1;
							 | 
						||
| 
								 | 
							
								drop schema if exists mysqltest;
							 |