2260 lines
		
	
	
		
			50 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			2260 lines
		
	
	
		
			50 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 1: NOTHING -> TABLE transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from t1";
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 2: NOTHING -> TEMPORARY TABLE transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 3: NOTHING -> VIEW transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 4: TABLE -> NOTHING transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								# Test 4-a: select ... from <table>
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								# Test 4-b: TABLE -> NOTHING by renaming the table
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								rename table t1 to t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 5: TABLE -> TABLE (DDL) transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "select a from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								alter table t1 add column (b int);
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 6: TABLE -> TABLE (TRIGGER) transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								# Test 6-a: adding a relevant trigger
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "insert into t1 (a) value (?)";
							 | 
						||
| 
								 | 
							
								set @val=1;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								2
							 | 
						||
| 
								 | 
							
								set @val=3;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								3
							 | 
						||
| 
								 | 
							
								prepare stmt from "insert into t1 (a) value (?)";
							 | 
						||
| 
								 | 
							
								set @val=4;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								4
							 | 
						||
| 
								 | 
							
								# Test 6-b: adding an irrelevant trigger
							 | 
						||
| 
								 | 
							
								create trigger t1_bd before delete on t1 for each row
							 | 
						||
| 
								 | 
							
								set @message= old.a;
							 | 
						||
| 
								 | 
							
								set @val=5;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								5
							 | 
						||
| 
								 | 
							
								set @val=6;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								prepare stmt from "insert into t1 (a) value (?)";
							 | 
						||
| 
								 | 
							
								set @val=7;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								7
							 | 
						||
| 
								 | 
							
								# Test 6-c: changing a relevant trigger
							 | 
						||
| 
								 | 
							
								drop trigger t1_bi;
							 | 
						||
| 
								 | 
							
								create trigger t1_bi before insert on t1 for each row
							 | 
						||
| 
								 | 
							
								set @message= concat("new trigger: ", new.a);
							 | 
						||
| 
								 | 
							
								set @val=8;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								new trigger: 8
							 | 
						||
| 
								 | 
							
								set @val=9;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								new trigger: 9
							 | 
						||
| 
								 | 
							
								prepare stmt from "insert into t1 (a) value (?)";
							 | 
						||
| 
								 | 
							
								set @val=10;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								new trigger: 10
							 | 
						||
| 
								 | 
							
								# Test 6-d: changing an irrelevant trigger
							 | 
						||
| 
								 | 
							
								drop trigger t1_bd;
							 | 
						||
| 
								 | 
							
								set @val=11;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								new trigger: 11
							 | 
						||
| 
								 | 
							
								Test 6-e: removing a relevant trigger
							 | 
						||
| 
								 | 
							
								drop trigger t1_bi;
							 | 
						||
| 
								 | 
							
								set @val=12;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								new trigger: 11
							 | 
						||
| 
								 | 
							
								set @val=13;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								new trigger: 11
							 | 
						||
| 
								 | 
							
								prepare stmt from "insert into t1 (a) value (?)";
							 | 
						||
| 
								 | 
							
								set @val=14;
							 | 
						||
| 
								 | 
							
								execute stmt using @val;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								new trigger: 11
							 | 
						||
| 
								 | 
							
								select * from t1 order by a;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								2
							 | 
						||
| 
								 | 
							
								3
							 | 
						||
| 
								 | 
							
								4
							 | 
						||
| 
								 | 
							
								5
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								7
							 | 
						||
| 
								 | 
							
								8
							 | 
						||
| 
								 | 
							
								9
							 | 
						||
| 
								 | 
							
								10
							 | 
						||
| 
								 | 
							
								11
							 | 
						||
| 
								 | 
							
								12
							 | 
						||
| 
								 | 
							
								13
							 | 
						||
| 
								 | 
							
								14
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 7: TABLE -> TABLE (TRIGGER dependencies) transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								# Test 7-a: dependent PROCEDURE has changed
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Note, this scenario is not supported, subject of Bug#12093
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								execute stmt using @var;
							 | 
						||
| 
								 | 
							
								ERROR 42000: PROCEDURE test.p1 does not exist
							 | 
						||
| 
								 | 
							
								# Cleanup
							 | 
						||
| 
								 | 
							
								drop procedure p1;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Test 7-b: dependent FUNCTION has changed
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Note, this scenario is supported, subject of Bug#12093
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								@var
							 | 
						||
| 
								 | 
							
								4
							 | 
						||
| 
								 | 
							
								drop function f1;
							 | 
						||
| 
								 | 
							
								create function f1 (a int) returns int return 0;
							 | 
						||
| 
								 | 
							
								execute stmt using @var;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop function f1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								# Test 7-c: dependent VIEW has changed
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Note, this scenario is not functioning correctly, see
							 | 
						||
| 
								 | 
							
								# Bug#33255 Trigger using views and view ddl : corrupted triggers
							 | 
						||
| 
								 | 
							
								# and Bug #33000 Triggers do not detect changes in meta-data.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								# Demonstrate that the same bug is present
							 | 
						||
| 
								 | 
							
								# without prepared statements
							 | 
						||
| 
								 | 
							
								insert into t1 (a) values (5);
							 | 
						||
| 
								 | 
							
								select * from t2;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								5
							 | 
						||
| 
								 | 
							
								select * from t3;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								drop view v1;
							 | 
						||
| 
								 | 
							
								create view v1 as select a from t3;
							 | 
						||
| 
								 | 
							
								insert into t1 (a) values (6);
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t2' doesn't exist
							 | 
						||
| 
								 | 
							
								flush table t1;
							 | 
						||
| 
								 | 
							
								insert into t1 (a) values (6);
							 | 
						||
| 
								 | 
							
								select * from t2;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								5
							 | 
						||
| 
								 | 
							
								select * from t3;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								prepare stmt from "insert into t1 (a) values (?)";
							 | 
						||
| 
								 | 
							
								set @var=7;
							 | 
						||
| 
								 | 
							
								execute stmt using @var;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t3;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								7
							 | 
						||
| 
								 | 
							
								select * from t2;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								5
							 | 
						||
| 
								 | 
							
								drop view v1;
							 | 
						||
| 
								 | 
							
								create view v1 as select a from t2;
							 | 
						||
| 
								 | 
							
								set @var=8;
							 | 
						||
| 
								 | 
							
								# XXX: bug, the SQL statement in the trigger is still
							 | 
						||
| 
								 | 
							
								# pointing at table 't3', since the view was expanded
							 | 
						||
| 
								 | 
							
								# at first statement execution.
							 | 
						||
| 
								 | 
							
								# Repreparation of the main statement doesn't cause repreparation
							 | 
						||
| 
								 | 
							
								# of trigger statements.
							 | 
						||
| 
								 | 
							
								execute stmt using @var;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t3' doesn't exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Sic: the insert went into t3, even though the view now
							 | 
						||
| 
								 | 
							
								# points at t2. This is because neither the merged view
							 | 
						||
| 
								 | 
							
								#  nor its prelocking list are affected by view DDL
							 | 
						||
| 
								 | 
							
								# The binary log is of course wrong, since it is not
							 | 
						||
| 
								 | 
							
								# using prepared statements
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								select * from t2;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								5
							 | 
						||
| 
								 | 
							
								select * from t3;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								7
							 | 
						||
| 
								 | 
							
								flush table t1;
							 | 
						||
| 
								 | 
							
								set @var=9;
							 | 
						||
| 
								 | 
							
								execute stmt using @var;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t2;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								5
							 | 
						||
| 
								 | 
							
								9
							 | 
						||
| 
								 | 
							
								select * from t3;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								7
							 | 
						||
| 
								 | 
							
								drop view v1;
							 | 
						||
| 
								 | 
							
								drop table t1,t2,t3;
							 | 
						||
| 
								 | 
							
								# 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;
							 | 
						||
| 
								 | 
							
								# Since the dependent table is tracked in the prelocked
							 | 
						||
| 
								 | 
							
								# list of the prepared statement, invalidation happens
							 | 
						||
| 
								 | 
							
								# and the statement is re-prepared. This is an unnecessary
							 | 
						||
| 
								 | 
							
								# side effect, since the statement that *is* dependent
							 | 
						||
| 
								 | 
							
								# on t2 definition is inside the trigger, and it is currently
							 | 
						||
| 
								 | 
							
								# not reprepared (see the previous test case).
							 | 
						||
| 
								 | 
							
								execute stmt using @var;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								2
							 | 
						||
| 
								 | 
							
								select * from t2;
							 | 
						||
| 
								 | 
							
								a	comment
							 | 
						||
| 
								 | 
							
								1	NULL
							 | 
						||
| 
								 | 
							
								2	NULL
							 | 
						||
| 
								 | 
							
								drop table t1,t2;
							 | 
						||
| 
								 | 
							
								# 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);
							 | 
						||
| 
								 | 
							
								a	a	a
							 | 
						||
| 
								 | 
							
								1	1	1
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								a	a	a
							 | 
						||
| 
								 | 
							
								2	2	2
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								a	a	a
							 | 
						||
| 
								 | 
							
								2	2	2
							 | 
						||
| 
								 | 
							
								3	3	3
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t1 join t2 on (t1.a=t2.a) join t3 on (t2.a=t3.a);
							 | 
						||
| 
								 | 
							
								a	a	a
							 | 
						||
| 
								 | 
							
								1	1	1
							 | 
						||
| 
								 | 
							
								4	4	4
							 | 
						||
| 
								 | 
							
								select * from t1 join t2 on (t1.a=t2.a) join t4 on (t2.a=t4.a);
							 | 
						||
| 
								 | 
							
								a	a	a
							 | 
						||
| 
								 | 
							
								2	2	2
							 | 
						||
| 
								 | 
							
								3	3	3
							 | 
						||
| 
								 | 
							
								drop table t1, t2, t3, t4;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 8: TABLE -> TEMPORARY TABLE transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								# Test 8-a: base table used recreated as temporary table
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create temporary table t1 (a int);
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								# 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;
							 | 
						||
| 
								 | 
							
								count(*)
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								count(*)
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create temporary table t1 AS SELECT 1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								count(*)
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								count(*)
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								drop temporary table t1;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 9: TABLE -> VIEW transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t2 (a int);
							 | 
						||
| 
								 | 
							
								create view t1 as select * from t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop view t1;
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 10: TEMPORARY TABLE -> NOTHING transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								create temporary table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop temporary table t1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 11: TEMPORARY TABLE -> TABLE transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								# 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 t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop temporary table t1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								# Test 11-b: temporary table has precedence over base table with same name
							 | 
						||
| 
								 | 
							
								#            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;
							 | 
						||
| 
								 | 
							
								count(*)
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								count(*)
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop temporary table t1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								count(*)
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								count(*)
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 12: TEMPORARY TABLE -> TEMPORARY TABLE (DDL) transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								create temporary table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "select a from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop temporary table t1;
							 | 
						||
| 
								 | 
							
								create temporary table t1 (a int, b int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								a	b
							 | 
						||
| 
								 | 
							
								drop temporary table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 13: TEMPORARY TABLE -> VIEW transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								create temporary table t1 (a int);
							 | 
						||
| 
								 | 
							
								create table t2 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop temporary table t1;
							 | 
						||
| 
								 | 
							
								create view t1 as select * from t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop view t1;
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 14: VIEW -> NOTHING transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								create table t2 (a int);
							 | 
						||
| 
								 | 
							
								create view t1 as select * from t2;
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								drop view t1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 15: VIEW -> TABLE transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								create table t2 (a int);
							 | 
						||
| 
								 | 
							
								create view t1 as select * from t2;
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop view t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 16: VIEW -> TEMPORARY TABLE transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								create table t2 (a int);
							 | 
						||
| 
								 | 
							
								insert into t2 (a) values (1);
							 | 
						||
| 
								 | 
							
								create view t1 as select * from t2;
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create temporary table t1 (a int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop view t1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								drop temporary table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 17: VIEW -> VIEW (DDL) transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								create table t2 (a int);
							 | 
						||
| 
								 | 
							
								insert into t2 values (10), (20), (30);
							 | 
						||
| 
								 | 
							
								create view t1 as select a, 2*a as b, 3*a as c from t2;
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								a	b	c
							 | 
						||
| 
								 | 
							
								10	20	30
							 | 
						||
| 
								 | 
							
								20	40	60
							 | 
						||
| 
								 | 
							
								30	60	90
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a	b	c
							 | 
						||
| 
								 | 
							
								10	20	30
							 | 
						||
| 
								 | 
							
								20	40	60
							 | 
						||
| 
								 | 
							
								30	60	90
							 | 
						||
| 
								 | 
							
								drop view t1;
							 | 
						||
| 
								 | 
							
								create view t1 as select a, 2*a as b, 5*a as c from t2;
							 | 
						||
| 
								 | 
							
								select * from t1;
							 | 
						||
| 
								 | 
							
								a	b	c
							 | 
						||
| 
								 | 
							
								10	20	50
							 | 
						||
| 
								 | 
							
								20	40	100
							 | 
						||
| 
								 | 
							
								30	60	150
							 | 
						||
| 
								 | 
							
								# Currently a different result from conventional statements.
							 | 
						||
| 
								 | 
							
								# A view is inlined once at prepare, later on view DDL
							 | 
						||
| 
								 | 
							
								# does not affect prepared statement and it is not re-prepared.
							 | 
						||
| 
								 | 
							
								# This is reported in Bug#36002 Prepared statements: if a view
							 | 
						||
| 
								 | 
							
								# used in a statement is replaced, bad data
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a	b	c
							 | 
						||
| 
								 | 
							
								10	20	30
							 | 
						||
| 
								 | 
							
								20	40	60
							 | 
						||
| 
								 | 
							
								30	60	90
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								flush table t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a	b	c
							 | 
						||
| 
								 | 
							
								10	20	50
							 | 
						||
| 
								 | 
							
								20	40	100
							 | 
						||
| 
								 | 
							
								30	60	150
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								drop view t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 18: VIEW -> VIEW (VIEW dependencies) transitions
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								# 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;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								3
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								3
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop function f1;
							 | 
						||
| 
								 | 
							
								create function f1() returns int return 2;
							 | 
						||
| 
								 | 
							
								# XXX: Used to be another manifestation of Bug#12093.
							 | 
						||
| 
								 | 
							
								# We only used to get a different error
							 | 
						||
| 
								 | 
							
								# message because the non-existing procedure error is masked
							 | 
						||
| 
								 | 
							
								# by the view.
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								2
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								2
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Part 18b: dependent procedure has changed (referred to via a function)
							 | 
						||
| 
								 | 
							
								create table t2 (a int);
							 | 
						||
| 
								 | 
							
								insert into t2 (a) values (4), (5), (6);
							 | 
						||
| 
								 | 
							
								drop function f1;
							 | 
						||
| 
								 | 
							
								create function f1() returns int
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								declare x int;
							 | 
						||
| 
								 | 
							
								call p1(x);
							 | 
						||
| 
								 | 
							
								return x;
							 | 
						||
| 
								 | 
							
								end|
							 | 
						||
| 
								 | 
							
								create procedure p1(out x int) select max(a) from t1 into x;
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from v1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								3
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								3
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop procedure p1;
							 | 
						||
| 
								 | 
							
								create procedure p1(out x int) select max(a) from t2 into x;
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug. The prelocked list was not invalidated
							 | 
						||
| 
								 | 
							
								# and we kept opening table t1, whereas the procedure
							 | 
						||
| 
								 | 
							
								# is now referring to table t2
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								flush table t1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								# Test 18-c: dependent VIEW has changed
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								2
							 | 
						||
| 
								 | 
							
								3
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								2
							 | 
						||
| 
								 | 
							
								3
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop view v2;
							 | 
						||
| 
								 | 
							
								create view v2 as select a from t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								2
							 | 
						||
| 
								 | 
							
								3
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								2
							 | 
						||
| 
								 | 
							
								3
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								flush table t1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								4
							 | 
						||
| 
								 | 
							
								5
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								4
							 | 
						||
| 
								 | 
							
								5
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								# Test 18-d: dependent TABLE has changed
							 | 
						||
| 
								 | 
							
								drop view v2;
							 | 
						||
| 
								 | 
							
								create table v2 as select * from t1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								2
							 | 
						||
| 
								 | 
							
								3
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								2
							 | 
						||
| 
								 | 
							
								3
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table v2;
							 | 
						||
| 
								 | 
							
								create table v2 (a int unique) as select * from t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								4
							 | 
						||
| 
								 | 
							
								5
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								4
							 | 
						||
| 
								 | 
							
								5
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Test 18-e: dependent TABLE trigger has changed
							 | 
						||
| 
								 | 
							
								prepare stmt from "insert into v1 (a) values (?)";
							 | 
						||
| 
								 | 
							
								set @var= 7;
							 | 
						||
| 
								 | 
							
								execute stmt using @var;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								v2_bi
							 | 
						||
| 
								 | 
							
								drop trigger v2_bi;
							 | 
						||
| 
								 | 
							
								set @message=null;
							 | 
						||
| 
								 | 
							
								set @var=9;
							 | 
						||
| 
								 | 
							
								execute stmt using @var;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								NULL
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select @message;
							 | 
						||
| 
								 | 
							
								@message
							 | 
						||
| 
								 | 
							
								v2_ai
							 | 
						||
| 
								 | 
							
								select * from v1;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								4
							 | 
						||
| 
								 | 
							
								5
							 | 
						||
| 
								 | 
							
								6
							 | 
						||
| 
								 | 
							
								7
							 | 
						||
| 
								 | 
							
								8
							 | 
						||
| 
								 | 
							
								9
							 | 
						||
| 
								 | 
							
								10
							 | 
						||
| 
								 | 
							
								# Cleanup
							 | 
						||
| 
								 | 
							
								drop table if exists t1, t2, v1, v2;
							 | 
						||
| 
								 | 
							
								drop view if exists v1, v2;
							 | 
						||
| 
								 | 
							
								drop function f1;
							 | 
						||
| 
								 | 
							
								drop procedure p1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 19: Special tables (INFORMATION_SCHEMA)
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								prepare stmt from
							 | 
						||
| 
								 | 
							
								"select ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE
							 | 
						||
| 
								 | 
							
								 from INFORMATION_SCHEMA.ROUTINES where
							 | 
						||
| 
								 | 
							
								 routine_name='p1'";
							 | 
						||
| 
								 | 
							
								create procedure p1() select "hi there";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ROUTINE_SCHEMA	ROUTINE_NAME	ROUTINE_TYPE
							 | 
						||
| 
								 | 
							
								test	p1	PROCEDURE
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ROUTINE_SCHEMA	ROUTINE_NAME	ROUTINE_TYPE
							 | 
						||
| 
								 | 
							
								test	p1	PROCEDURE
							 | 
						||
| 
								 | 
							
								drop procedure p1;
							 | 
						||
| 
								 | 
							
								create procedure p1() select "hi there, again";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ROUTINE_SCHEMA	ROUTINE_NAME	ROUTINE_TYPE
							 | 
						||
| 
								 | 
							
								test	p1	PROCEDURE
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ROUTINE_SCHEMA	ROUTINE_NAME	ROUTINE_TYPE
							 | 
						||
| 
								 | 
							
								test	p1	PROCEDURE
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop procedure p1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 20: Special tables (log tables)
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								prepare stmt from
							 | 
						||
| 
								 | 
							
								"select * from mysql.general_log where argument='IMPOSSIBLE QUERY STRING'";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 21: Special tables (system tables)
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								prepare stmt from
							 | 
						||
| 
								 | 
							
								"select type, db, name from mysql.proc where name='p1'";
							 | 
						||
| 
								 | 
							
								create procedure p1() select "hi there";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								type	db	name
							 | 
						||
| 
								 | 
							
								PROCEDURE	test	p1
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								type	db	name
							 | 
						||
| 
								 | 
							
								PROCEDURE	test	p1
							 | 
						||
| 
								 | 
							
								drop procedure p1;
							 | 
						||
| 
								 | 
							
								create procedure p1() select "hi there, again";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								type	db	name
							 | 
						||
| 
								 | 
							
								PROCEDURE	test	p1
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								type	db	name
							 | 
						||
| 
								 | 
							
								PROCEDURE	test	p1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop procedure p1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 22: Special tables (views temp tables)
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								create algorithm=temptable view v1 as select a*a as a2 from t1;
							 | 
						||
| 
								 | 
							
								# Using a temporary table internally should not confuse the prepared
							 | 
						||
| 
								 | 
							
								# statement code, and should not raise ER_PS_INVALIDATED errors
							 | 
						||
| 
								 | 
							
								show create view v1;
							 | 
						||
| 
								 | 
							
								View	Create View	character_set_client	collation_connection
							 | 
						||
| 
								 | 
							
								v1	CREATE ALGORITHM=TEMPTABLE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select (`t1`.`a` * `t1`.`a`) AS `a2` from `t1`	latin1	latin1_swedish_ci
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from v1";
							 | 
						||
| 
								 | 
							
								insert into t1 values (1), (2), (3);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a2
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								4
							 | 
						||
| 
								 | 
							
								9
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a2
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								4
							 | 
						||
| 
								 | 
							
								9
							 | 
						||
| 
								 | 
							
								insert into t1 values (4), (5), (6);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a2
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								4
							 | 
						||
| 
								 | 
							
								9
							 | 
						||
| 
								 | 
							
								16
							 | 
						||
| 
								 | 
							
								25
							 | 
						||
| 
								 | 
							
								36
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a2
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								4
							 | 
						||
| 
								 | 
							
								9
							 | 
						||
| 
								 | 
							
								16
							 | 
						||
| 
								 | 
							
								25
							 | 
						||
| 
								 | 
							
								36
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								drop view v1;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 23: Special statements
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								# SQLCOM_ALTER_TABLE:
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "alter table t1 add column b int";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a1 int, a2 int);
							 | 
						||
| 
								 | 
							
								# t1 has changed, and it's does not lead to reprepare
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								alter table t1 drop column b;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								alter table t1 drop column b;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								# SQLCOM_REPAIR:
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								insert into t1 values (1), (2), (3);
							 | 
						||
| 
								 | 
							
								prepare stmt from "repair table t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	repair	status	OK
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	repair	status	OK
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a1 int, a2 int);
							 | 
						||
| 
								 | 
							
								insert into t1 values (1, 10), (2, 20), (3, 30);
							 | 
						||
| 
								 | 
							
								# t1 has changed, and it's does not lead to reprepare
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	repair	status	OK
							 | 
						||
| 
								 | 
							
								alter table t1 add column b varchar(50) default NULL;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	repair	status	OK
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								alter table t1 drop column b;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	repair	status	OK
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# SQLCOM_ANALYZE:
							 | 
						||
| 
								 | 
							
								prepare stmt from "analyze table t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	analyze	status	OK
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a1 int, a2 int);
							 | 
						||
| 
								 | 
							
								insert into t1 values (1, 10), (2, 20), (3, 30);
							 | 
						||
| 
								 | 
							
								# t1 has changed, and it's not a problem
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	analyze	status	OK
							 | 
						||
| 
								 | 
							
								alter table t1 add column b varchar(50) default NULL;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	analyze	status	OK
							 | 
						||
| 
								 | 
							
								alter table t1 drop column b;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	analyze	status	OK
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# SQLCOM_OPTIMIZE:
							 | 
						||
| 
								 | 
							
								prepare stmt from "optimize table t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	optimize	status	Table is already up to date
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a1 int, a2 int);
							 | 
						||
| 
								 | 
							
								insert into t1 values (1, 10), (2, 20), (3, 30);
							 | 
						||
| 
								 | 
							
								# t1 has changed, and it's not a problem
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	optimize	status	OK
							 | 
						||
| 
								 | 
							
								alter table t1 add column b varchar(50) default NULL;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	optimize	status	OK
							 | 
						||
| 
								 | 
							
								alter table t1 drop column b;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Op	Msg_type	Msg_text
							 | 
						||
| 
								 | 
							
								test.t1	optimize	status	OK
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_CREATE_PROC:
							 | 
						||
| 
								 | 
							
								prepare stmt from "show create procedure p1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42000: PROCEDURE p1 does not exist
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42000: PROCEDURE p1 does not exist
							 | 
						||
| 
								 | 
							
								create procedure p1() begin end;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop procedure p1;
							 | 
						||
| 
								 | 
							
								create procedure p1(x int, y int) begin end;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop procedure p1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42000: PROCEDURE p1 does not exist
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42000: PROCEDURE p1 does not exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_CREATE_FUNC:
							 | 
						||
| 
								 | 
							
								prepare stmt from "show create function f1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42000: FUNCTION f1 does not exist
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42000: FUNCTION f1 does not exist
							 | 
						||
| 
								 | 
							
								create function f1() returns int return 0;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop function f1;
							 | 
						||
| 
								 | 
							
								create function f1(x int, y int) returns int return x+y;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop function f1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42000: FUNCTION f1 does not exist
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42000: FUNCTION f1 does not exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_CREATE_TRIGGER:
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show create trigger t1_bi";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR HY000: Trigger does not exist
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR HY000: Trigger does not exist
							 | 
						||
| 
								 | 
							
								create trigger t1_bi before insert on t1 for each row set @message= "t1_bi";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop trigger t1_bi;
							 | 
						||
| 
								 | 
							
								create trigger t1_bi before insert on t1 for each row set @message= "t1_bi (2)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop trigger t1_bi;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR HY000: Trigger does not exist
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR HY000: Trigger does not exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Part 24: Testing the strength of TABLE_SHARE version
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								# Test 24-a: number of columns
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "select a from t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								alter table t1 add column b varchar(50) default NULL;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Test 24-b: column name
							 | 
						||
| 
								 | 
							
								alter table t1 change b c int;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Test 24-c: column type
							 | 
						||
| 
								 | 
							
								alter table t1 change a a varchar(10);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Test 24-d: column type length
							 | 
						||
| 
								 | 
							
								alter table t1 change a a varchar(20);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Test 24-e: column NULL property
							 | 
						||
| 
								 | 
							
								alter table t1 change a a varchar(20) NOT NULL;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Test 24-f: column DEFAULT
							 | 
						||
| 
								 | 
							
								alter table t1 change c c int DEFAULT 20;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Test 24-g: number of keys
							 | 
						||
| 
								 | 
							
								create unique index t1_a_idx on t1 (a);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Test 24-h: changing index uniqueness
							 | 
						||
| 
								 | 
							
								drop index t1_a_idx on t1;
							 | 
						||
| 
								 | 
							
								create index t1_a_idx on t1 (a);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Cleanup
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Testing reported bugs
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Bug#27420 A combination of PS and view operations cause
							 | 
						||
| 
								 | 
							
								# error + assertion on shutdown
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t_27420_100;
							 | 
						||
| 
								 | 
							
								drop table if exists t_27420_101;
							 | 
						||
| 
								 | 
							
								drop view if exists v_27420;
							 | 
						||
| 
								 | 
							
								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";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								X	Y
							 | 
						||
| 
								 | 
							
								1	1
							 | 
						||
| 
								 | 
							
								2	2
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop view v_27420;
							 | 
						||
| 
								 | 
							
								create table v_27420(X int, Y int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								X	Y
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table v_27420;
							 | 
						||
| 
								 | 
							
								create table v_27420 (a int, b int, filler char(200));
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a	b	filler
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t_27420_100;
							 | 
						||
| 
								 | 
							
								drop table t_27420_101;
							 | 
						||
| 
								 | 
							
								drop table v_27420;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Bug#27430 Crash in subquery code when in PS and table DDL changed
							 | 
						||
| 
								 | 
							
								# after PREPARE
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t_27430_1;
							 | 
						||
| 
								 | 
							
								drop table if exists t_27430_2;
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								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";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								oref	a	Z
							 | 
						||
| 
								 | 
							
								1	1	1
							 | 
						||
| 
								 | 
							
								2	2	0
							 | 
						||
| 
								 | 
							
								3	1234	0
							 | 
						||
| 
								 | 
							
								4	1234	0
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t_27430_1, t_27430_2;
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								create table t_27430_2 (a int, oref int);
							 | 
						||
| 
								 | 
							
								insert into t_27430_2 values
							 | 
						||
| 
								 | 
							
								(1, 1),
							 | 
						||
| 
								 | 
							
								(2,2),
							 | 
						||
| 
								 | 
							
								(NULL, 3),
							 | 
						||
| 
								 | 
							
								(NULL, 4);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								oref	a	Z
							 | 
						||
| 
								 | 
							
								1	1	1
							 | 
						||
| 
								 | 
							
								2	2	0
							 | 
						||
| 
								 | 
							
								3	NULL	NULL
							 | 
						||
| 
								 | 
							
								4	NULL	0
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t_27430_1;
							 | 
						||
| 
								 | 
							
								drop table t_27430_2;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Bug#27690 Re-execution of prepared statement after table
							 | 
						||
| 
								 | 
							
								# was replaced with a view crashes
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t_27690_1;
							 | 
						||
| 
								 | 
							
								drop view if exists v_27690_1;
							 | 
						||
| 
								 | 
							
								drop table if exists v_27690_2;
							 | 
						||
| 
								 | 
							
								create table t_27690_1 (a int, b int);
							 | 
						||
| 
								 | 
							
								insert into t_27690_1 values (1,1),(2,2);
							 | 
						||
| 
								 | 
							
								create table v_27690_1 as select * from t_27690_1;
							 | 
						||
| 
								 | 
							
								create table v_27690_2 as select * from t_27690_1;
							 | 
						||
| 
								 | 
							
								prepare stmt from "select * from v_27690_1, v_27690_2";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a	b	a	b
							 | 
						||
| 
								 | 
							
								1	1	1	1
							 | 
						||
| 
								 | 
							
								2	2	1	1
							 | 
						||
| 
								 | 
							
								1	1	2	2
							 | 
						||
| 
								 | 
							
								2	2	2	2
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a	b	a	b
							 | 
						||
| 
								 | 
							
								1	1	1	1
							 | 
						||
| 
								 | 
							
								2	2	1	1
							 | 
						||
| 
								 | 
							
								1	1	2	2
							 | 
						||
| 
								 | 
							
								2	2	2	2
							 | 
						||
| 
								 | 
							
								drop table v_27690_1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.v_27690_1' doesn't exist
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.v_27690_1' doesn't exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create view v_27690_1 as select A.a, A.b from t_27690_1 A, t_27690_1 B;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a	b	a	b
							 | 
						||
| 
								 | 
							
								1	1	1	1
							 | 
						||
| 
								 | 
							
								2	2	1	1
							 | 
						||
| 
								 | 
							
								1	1	1	1
							 | 
						||
| 
								 | 
							
								2	2	1	1
							 | 
						||
| 
								 | 
							
								1	1	2	2
							 | 
						||
| 
								 | 
							
								2	2	2	2
							 | 
						||
| 
								 | 
							
								1	1	2	2
							 | 
						||
| 
								 | 
							
								2	2	2	2
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								a	b	a	b
							 | 
						||
| 
								 | 
							
								1	1	1	1
							 | 
						||
| 
								 | 
							
								2	2	1	1
							 | 
						||
| 
								 | 
							
								1	1	1	1
							 | 
						||
| 
								 | 
							
								2	2	1	1
							 | 
						||
| 
								 | 
							
								1	1	2	2
							 | 
						||
| 
								 | 
							
								2	2	2	2
							 | 
						||
| 
								 | 
							
								1	1	2	2
							 | 
						||
| 
								 | 
							
								2	2	2	2
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t_27690_1;
							 | 
						||
| 
								 | 
							
								drop view v_27690_1;
							 | 
						||
| 
								 | 
							
								drop table v_27690_2;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#=====================================================================
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Bug#21294 Executing a prepared statement that executes
							 | 
						||
| 
								 | 
							
								# a stored function which was recreat
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								create function f1() returns int return 10;
							 | 
						||
| 
								 | 
							
								prepare stmt from "select f1()";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								10
							 | 
						||
| 
								 | 
							
								drop function f1;
							 | 
						||
| 
								 | 
							
								create function f1() returns int return 10;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								10
							 | 
						||
| 
								 | 
							
								drop function f1;
							 | 
						||
| 
								 | 
							
								create function f1() returns int return 20;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								f1()
							 | 
						||
| 
								 | 
							
								20
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(2);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop function f1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Bug#12093 SP not found on second PS execution if another thread drops
							 | 
						||
| 
								 | 
							
								# other SP in between
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								drop view if exists v_12093_unrelated;
							 | 
						||
| 
								 | 
							
								create table t_12093 (a int);
							 | 
						||
| 
								 | 
							
								create function f_12093() returns int return (select count(*) from t_12093);
							 | 
						||
| 
								 | 
							
								create procedure p_12093(a int) select * from t_12093;
							 | 
						||
| 
								 | 
							
								create function f_12093_unrelated() returns int return 2;
							 | 
						||
| 
								 | 
							
								create procedure p_12093_unrelated() begin end;
							 | 
						||
| 
								 | 
							
								create view v_12093_unrelated as select * from t_12093;
							 | 
						||
| 
								 | 
							
								prepare stmt_sf from 'select f_12093();';
							 | 
						||
| 
								 | 
							
								prepare stmt_sp from 'call p_12093(f_12093())';
							 | 
						||
| 
								 | 
							
								execute stmt_sf;
							 | 
						||
| 
								 | 
							
								f_12093()
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								execute stmt_sp;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								drop function f_12093_unrelated;
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug
							 | 
						||
| 
								 | 
							
								execute stmt_sf;
							 | 
						||
| 
								 | 
							
								f_12093()
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug
							 | 
						||
| 
								 | 
							
								execute stmt_sp;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug
							 | 
						||
| 
								 | 
							
								execute stmt_sf;
							 | 
						||
| 
								 | 
							
								f_12093()
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug
							 | 
						||
| 
								 | 
							
								execute stmt_sp;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								prepare stmt_sf from 'select f_12093();';
							 | 
						||
| 
								 | 
							
								prepare stmt_sp from 'call p_12093(f_12093())';
							 | 
						||
| 
								 | 
							
								execute stmt_sf;
							 | 
						||
| 
								 | 
							
								f_12093()
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								execute stmt_sp;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								drop procedure p_12093_unrelated;
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug
							 | 
						||
| 
								 | 
							
								execute stmt_sf;
							 | 
						||
| 
								 | 
							
								f_12093()
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug
							 | 
						||
| 
								 | 
							
								execute stmt_sp;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug
							 | 
						||
| 
								 | 
							
								execute stmt_sf;
							 | 
						||
| 
								 | 
							
								f_12093()
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug
							 | 
						||
| 
								 | 
							
								execute stmt_sp;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								prepare stmt_sf from 'select f_12093();';
							 | 
						||
| 
								 | 
							
								prepare stmt_sp from 'call p_12093(f_12093())';
							 | 
						||
| 
								 | 
							
								execute stmt_sf;
							 | 
						||
| 
								 | 
							
								f_12093()
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								execute stmt_sp;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								drop view v_12093_unrelated;
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug
							 | 
						||
| 
								 | 
							
								execute stmt_sf;
							 | 
						||
| 
								 | 
							
								f_12093()
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug
							 | 
						||
| 
								 | 
							
								execute stmt_sp;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug
							 | 
						||
| 
								 | 
							
								execute stmt_sf;
							 | 
						||
| 
								 | 
							
								f_12093()
							 | 
						||
| 
								 | 
							
								0
							 | 
						||
| 
								 | 
							
								# XXX: used to be a bug
							 | 
						||
| 
								 | 
							
								execute stmt_sp;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(6);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t_12093;
							 | 
						||
| 
								 | 
							
								drop function f_12093;
							 | 
						||
| 
								 | 
							
								drop procedure p_12093;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt_sf;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt_sp;
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								Ensure that metadata validation is performed for every type of
							 | 
						||
| 
								 | 
							
								SQL statement where it is needed.
							 | 
						||
| 
								 | 
							
								=====================================================================
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SELECT
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								res
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_CREATE_TABLE
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								drop table if exists t2;
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S01: Table 't2' already exists
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S01: Table 't2' already exists
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								create temporary table t2 (a int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S01: Table 't2' already exists
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop temporary table t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S01: Table 't2' already exists
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								create view t2 as select 1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Got one of the listed errors
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Got one of the listed errors
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop view t2;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x varchar(20));
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t2;
							 | 
						||
| 
								 | 
							
								x
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								alter table t1 add column y decimal(10,3);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t2;
							 | 
						||
| 
								 | 
							
								x	y
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								# XXX: no validation of the first table in case of
							 | 
						||
| 
								 | 
							
								# CREATE TEMPORARY TABLE. This is a shortcoming of the current code,
							 | 
						||
| 
								 | 
							
								# but since validation is not strictly necessary, nothing is done
							 | 
						||
| 
								 | 
							
								# about it.
							 | 
						||
| 
								 | 
							
								# Will be fixed as part of work on Bug#21431 "Incomplete support of
							 | 
						||
| 
								 | 
							
								# 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;
							 | 
						||
| 
								 | 
							
								Warnings:
							 | 
						||
| 
								 | 
							
								Note	1050	Table 't2' already exists
							 | 
						||
| 
								 | 
							
								select * from t2;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Warnings:
							 | 
						||
| 
								 | 
							
								Note	1050	Table 't2' already exists
							 | 
						||
| 
								 | 
							
								select * from t2;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								create temporary table t2 (a varchar(10));
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Warnings:
							 | 
						||
| 
								 | 
							
								Note	1050	Table 't2' already exists
							 | 
						||
| 
								 | 
							
								select * from t2;
							 | 
						||
| 
								 | 
							
								a
							 | 
						||
| 
								 | 
							
								1
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Warnings:
							 | 
						||
| 
								 | 
							
								Note	1050	Table 't2' already exists
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Warnings:
							 | 
						||
| 
								 | 
							
								Note	1050	Table 't2' already exists
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								drop temporary table t2;
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "create table t2 like t1";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								ERROR 42S02: Table 'test.t1' doesn't exist
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create table t1 (x char(17));
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								alter table t1 add column y time;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(1);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								select * from t2;
							 | 
						||
| 
								 | 
							
								x	y
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(0);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								drop table t2;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_UPDATE
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1, t2;
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop table t1, t2;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_INSERT
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1, t2;
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								drop table t1, t2;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_INSERT_SELECT
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1, t2;
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_REPLACE
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1, t2;
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_REPLACE_SELECT
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1, t2;
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_DELETE
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1, t2;
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_DELETE_MULTI
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1, t2, t3;
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop table t1, t2, t3;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_UPDATE_MULTI
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1, t2, t3;
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								# Intermediate results: 8 SQLCOMs tested, 8 automatic reprepares
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(8);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_LOAD
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a varchar(20));
							 | 
						||
| 
								 | 
							
								prepare stmt from "load data infile '../std_data_ln/words.dat' into table t1";
							 | 
						||
| 
								 | 
							
								ERROR HY000: This command is not supported in the prepared statement protocol yet
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_DATABASES
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show databases where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Database
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Database
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_TABLES
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show tables where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Tables_in_test
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Tables_in_test
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_FIELDS
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show fields from t1 where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Field	Type	Null	Key	Default	Extra
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Field	Type	Null	Key	Default	Extra
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_KEYS
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show keys from t1 where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_VARIABLES
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show variables where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Variable_name	Value
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Variable_name	Value
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_STATUS
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show status where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Variable_name	Value
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Variable_name	Value
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_ENGINE_STATUS, SQLCOM_SHOW_ENGINE_LOGS,
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_ENGINE_MUTEX, SQLCOM_SHOW_PROCESSLIST
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Currently can not have a where clause, need to be covered
							 | 
						||
| 
								 | 
							
								# with tests
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show engine all status where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where (1) in (select * from t1)' at line 1
							 | 
						||
| 
								 | 
							
								prepare stmt from "show engine all logs where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where (1) in (select * from t1)' at line 1
							 | 
						||
| 
								 | 
							
								prepare stmt from "show engine all mutex where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where (1) in (select * from t1)' at line 1
							 | 
						||
| 
								 | 
							
								prepare stmt from "show processlist where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where (1) in (select * from t1)' at line 1
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_CHARSETS
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show charset where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Charset	Description	Default collation	Maxlen
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Charset	Description	Default collation	Maxlen
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_COLLATIONS
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show collation where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Collation	Charset	Id	Default	Compiled	Sortlen
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Collation	Charset	Id	Default	Compiled	Sortlen
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_TABLE_STATUS
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show table status where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_TRIGGERS
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show triggers where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Trigger	Event	Table	Statement	Timing	Created	sql_mode	Definer	character_set_client	collation_connection	Database Collation
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Trigger	Event	Table	Statement	Timing	Created	sql_mode	Definer	character_set_client	collation_connection	Database Collation
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_OPEN_TABLES
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show open tables where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Database	Table	In_use	Name_locked
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Database	Table	In_use	Name_locked
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_STATUS_PROC
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show procedure status where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Db	Name	Type	Definer	Modified	Created	Security_type	Comment	character_set_client	collation_connection	Database Collation
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Db	Name	Type	Definer	Modified	Created	Security_type	Comment	character_set_client	collation_connection	Database Collation
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_STATUS_FUNC
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "show function status where (1) in (select * from t1)";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Db	Name	Type	Definer	Modified	Created	Security_type	Comment	character_set_client	collation_connection	Database Collation
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								Db	Name	Type	Definer	Modified	Created	Security_type	Comment	character_set_client	collation_connection	Database Collation
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SHOW_EVENTS
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Please see this test in ps.test, it requires not_embedded.inc
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_SET_OPTION
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "set @a=((1) in (select * from t1))";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_DO
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_CALL
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								drop procedure if exists p1;
							 | 
						||
| 
								 | 
							
								create procedure p1(a int) begin end;
							 | 
						||
| 
								 | 
							
								create table t1 (a int);
							 | 
						||
| 
								 | 
							
								prepare stmt from "call p1((1) in (select * from t1))";
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								create table t1 (x int);
							 | 
						||
| 
								 | 
							
								execute stmt;
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								drop procedure p1;
							 | 
						||
| 
								 | 
							
								deallocate prepare stmt;
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_CREATE_VIEW
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								drop view if exists v1;
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								# Intermediate result: number of reprepares matches the number
							 | 
						||
| 
								 | 
							
								# of tests
							 | 
						||
| 
								 | 
							
								call p_verify_reprepare_count(17);
							 | 
						||
| 
								 | 
							
								SUCCESS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# SQLCOM_ALTER_VIEW
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								drop view if exists v1;
							 | 
						||
| 
								 | 
							
								create view v1 as select 1;
							 | 
						||
| 
								 | 
							
								prepare stmt from "alter view v1 as select 2";
							 | 
						||
| 
								 | 
							
								ERROR HY000: This command is not supported in the prepared statement protocol yet
							 | 
						||
| 
								 | 
							
								drop view v1;
							 | 
						||
| 
								 | 
							
								# Cleanup
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								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;
							 |