357 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
		
		
			
		
	
	
			357 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
|  | ###################### ps_modify.inc #########################
 | ||
|  | #                                                            #
 | ||
|  | #  Tests for prepared statements: INSERT/DELETE/UPDATE...    #
 | ||
|  | #                                                            #
 | ||
|  | ##############################################################
 | ||
|  | 
 | ||
|  | #    
 | ||
|  | # NOTE: PLEASE SEE ps_1general.test (bottom) 
 | ||
|  | #       BEFORE ADDING NEW TEST CASES HERE !!!
 | ||
|  | 
 | ||
|  | #
 | ||
|  | # Please be aware, that this file will be sourced by several test case files
 | ||
|  | # stored within the subdirectory 't'. So every change here will affect 
 | ||
|  | # several test cases.
 | ||
|  | #
 | ||
|  | # Please do not modify the structure (DROP/ALTER..) of the tables
 | ||
|  | #     't1' and 't9'. 
 | ||
|  | #
 | ||
|  | # But you are encouraged to use these two tables within your statements
 | ||
|  | # (DELETE/UPDATE/...) whenever possible. 
 | ||
|  | #     t1  - very simple table
 | ||
|  | #     t9  - table with nearly all available column types
 | ||
|  | #
 | ||
|  | # The structure and the content of these tables can be found in
 | ||
|  | #     include/ps_create.inc  CREATE TABLE ...
 | ||
|  | #     include/ps_renew.inc   DELETE all rows and INSERT some rows
 | ||
|  | #
 | ||
|  | # Both tables are managed by the same storage engine.
 | ||
|  | # The type of the storage engine is stored in the variable '$type' . 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #------------------- Please insert your test cases here -------------------#
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #-------- Please be very carefull when editing behind this line  ----------#
 | ||
|  | 
 | ||
|  | --disable_query_log | ||
|  | select '------ delete tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | --source include/ps_renew.inc | ||
|  | 
 | ||
|  | ## delete without parameter
 | ||
|  | prepare stmt1 from 'delete from t1 where a=2' ; | ||
|  | execute stmt1; | ||
|  | select a,b from t1 where a=2; | ||
|  | # delete with row not found
 | ||
|  | execute stmt1; | ||
|  | 
 | ||
|  | ## delete with one parameter in the where clause
 | ||
|  | insert into t1 values(0,NULL); | ||
|  | set @arg00=NULL; | ||
|  | prepare stmt1 from 'delete from t1 where b=?' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | select a,b from t1 where b is NULL ; | ||
|  | set @arg00='one'; | ||
|  | execute stmt1 using @arg00; | ||
|  | select a,b from t1 where b=@arg00; | ||
|  | 
 | ||
|  | ## truncate a table
 | ||
|  | prepare stmt1 from 'truncate table t1' ; | ||
|  | 
 | ||
|  | 
 | ||
|  | --disable_query_log | ||
|  | select '------ update tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | --source include/ps_renew.inc | ||
|  | 
 | ||
|  | ## update without parameter
 | ||
|  | prepare stmt1 from 'update t1 set b=''a=two'' where a=2' ; | ||
|  | execute stmt1; | ||
|  | select a,b from t1 where a=2; | ||
|  | # dummy update
 | ||
|  | execute stmt1; | ||
|  | select a,b from t1 where a=2; | ||
|  | 
 | ||
|  | ## update with one parameter in the set clause
 | ||
|  | set @arg00=NULL; | ||
|  | prepare stmt1 from 'update t1 set b=? where a=2' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | select a,b from t1 where a=2; | ||
|  | set @arg00='two'; | ||
|  | execute stmt1 using @arg00; | ||
|  | select a,b from t1 where a=2; | ||
|  | 
 | ||
|  | ## update with one parameter in the where cause
 | ||
|  | set @arg00=2; | ||
|  | prepare stmt1 from 'update t1 set b=NULL where a=?' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | select a,b from t1 where a=@arg00; | ||
|  | update t1 set b='two' where a=@arg00; | ||
|  | # row not found in update
 | ||
|  | set @arg00=2000; | ||
|  | execute stmt1 using @arg00; | ||
|  | select a,b from t1 where a=@arg00; | ||
|  | 
 | ||
|  | ## update on primary key column (two parameters)
 | ||
|  | set @arg00=2; | ||
|  | set @arg01=22; | ||
|  | prepare stmt1 from 'update t1 set a=? where a=?' ; | ||
|  | # dummy update
 | ||
|  | execute stmt1 using @arg00, @arg00; | ||
|  | select a,b from t1 where a=@arg00; | ||
|  | execute stmt1 using @arg01, @arg00; | ||
|  | select a,b from t1 where a=@arg01; | ||
|  | execute stmt1 using @arg00, @arg01; | ||
|  | select a,b from t1 where a=@arg00; | ||
|  | set @arg00=NULL; | ||
|  | set @arg01=2; | ||
|  | execute stmt1 using @arg00, @arg01; | ||
|  | select a,b from t1 order by a; | ||
|  | set @arg00=0; | ||
|  | execute stmt1 using @arg01, @arg00; | ||
|  | select a,b from t1 order by a; | ||
|  | 
 | ||
|  | ## update with subquery and several parameters
 | ||
|  | set @arg00=23; | ||
|  | set @arg01='two'; | ||
|  | set @arg02=2; | ||
|  | set @arg03='two'; | ||
|  | set @arg04=2; | ||
|  | --disable_warnings | ||
|  | drop table if exists t2; | ||
|  | --enable_warnings | ||
|  | # t2 will be of table type 'MYISAM'
 | ||
|  | create table t2 as select a,b from t1 ; | ||
|  | prepare stmt1 from 'update t1 set a=? where b=? | ||
|  |                     and a in (select ? from t2 | ||
|  |                               where b = ? or a = ?)'; | ||
|  | --enable_info | ||
|  | execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04 ; | ||
|  | --disable_info | ||
|  | select a,b from t1 where a = @arg00 ; | ||
|  | prepare stmt1 from 'update t1 set a=? where b=? | ||
|  |                     and a not in (select ? from t2 | ||
|  |                               where b = ? or a = ?)'; | ||
|  | --enable_info | ||
|  | execute stmt1 using @arg04, @arg01, @arg02, @arg03, @arg00 ; | ||
|  | --disable_info | ||
|  | select a,b from t1 order by a ; | ||
|  | drop table t2 ; | ||
|  | # t2 is now of table type '$type'
 | ||
|  | # The test battery for table type 'MERGE' gets here only a 'MYISAM' table
 | ||
|  | #
 | ||
|  | # Test UPDATE with SUBQUERY in prepared mode
 | ||
|  | #
 | ||
|  | eval create table t2 | ||
|  | ( | ||
|  |   a int, b varchar(30), | ||
|  |   primary key(a) | ||
|  | ) engine = $type ; | ||
|  | insert into t2(a,b) select a, b from t1 ; | ||
|  | prepare stmt1 from 'update t1 set a=? where b=? | ||
|  |                     and a in (select ? from t2 | ||
|  |                               where b = ? or a = ?)'; | ||
|  | --enable_info | ||
|  | execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04 ; | ||
|  | --disable_info | ||
|  | select a,b from t1 where a = @arg00 ; | ||
|  | prepare stmt1 from 'update t1 set a=? where b=? | ||
|  |                     and a not in (select ? from t2 | ||
|  |                               where b = ? or a = ?)'; | ||
|  | --enable_info | ||
|  | execute stmt1 using @arg04, @arg01, @arg02, @arg03, @arg00 ; | ||
|  | --disable_info | ||
|  | select a,b from t1 order by a ; | ||
|  | drop table t2 ; | ||
|  | 
 | ||
|  | ## update with parameters in limit
 | ||
|  | set @arg00=1; | ||
|  | prepare stmt1 from 'update t1 set b=''bla'' | ||
|  | where a=2 | ||
|  | limit 1'; | ||
|  | execute stmt1 ; | ||
|  | select a,b from t1 where b = 'bla' ; | ||
|  | prepare stmt1 from 'update t1 set b=''bla'' where a=2 limit ?'; | ||
|  | execute stmt1 using @arg00; | ||
|  | 
 | ||
|  | --disable_query_log | ||
|  | select '------ insert tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | --source include/ps_renew.inc | ||
|  | 
 | ||
|  | ## insert without parameter
 | ||
|  | prepare stmt1 from 'insert into t1 values(5, ''five'' )'; | ||
|  | execute stmt1; | ||
|  | select a,b from t1 where a = 5; | ||
|  | 
 | ||
|  | ## insert with one parameter in values part
 | ||
|  | set @arg00='six' ; | ||
|  | prepare stmt1 from 'insert into t1 values(6, ? )'; | ||
|  | execute stmt1 using @arg00; | ||
|  | select a,b from t1 where b = @arg00; | ||
|  | # the second insert fails, because the first column is primary key
 | ||
|  | --error ER_DUP_ENTRY | ||
|  | execute stmt1 using @arg00; | ||
|  | set @arg00=NULL ; | ||
|  | prepare stmt1 from 'insert into t1 values(0, ? )'; | ||
|  | execute stmt1 using @arg00; | ||
|  | select a,b from t1 where b is NULL; | ||
|  | 
 | ||
|  | ## insert with two parameter in values part
 | ||
|  | set @arg00=8 ; | ||
|  | set @arg01='eight' ; | ||
|  | prepare stmt1 from 'insert into t1 values(?, ? )'; | ||
|  | execute stmt1 using @arg00, @arg01 ; | ||
|  | select a,b from t1 where b = @arg01; | ||
|  | # cases derived from client_test.c: test_null()
 | ||
|  | set @NULL= null ; | ||
|  | set @arg00= 'abc' ; | ||
|  | # execute must fail, because first column is primary key (-> not null)
 | ||
|  | --error 1048 | ||
|  | execute stmt1 using @NULL, @NULL ; | ||
|  | --error 1048 | ||
|  | execute stmt1 using @NULL, @NULL ; | ||
|  | --error 1048 | ||
|  | execute stmt1 using @NULL, @arg00 ; | ||
|  | --error 1048 | ||
|  | execute stmt1 using @NULL, @arg00 ; | ||
|  | let $1 = 2; | ||
|  | while ($1) | ||
|  | { | ||
|  |   eval set @arg01= 10000 + $1 ; | ||
|  |   execute stmt1 using @arg01, @arg00 ; | ||
|  |   dec $1; | ||
|  | } | ||
|  | select * from t1 where a > 10000 order by a ; | ||
|  | delete from t1 where a > 10000 ; | ||
|  | let $1 = 2; | ||
|  | while ($1) | ||
|  | { | ||
|  |   eval set @arg01= 10000 + $1 ; | ||
|  |   execute stmt1 using @arg01, @NULL ; | ||
|  |   dec $1; | ||
|  | } | ||
|  | select * from t1 where a > 10000 order by a ; | ||
|  | delete from t1 where a > 10000 ; | ||
|  | let $1 = 10; | ||
|  | while ($1) | ||
|  | { | ||
|  |   eval set @arg01= 10000 + $1 ; | ||
|  |   execute stmt1 using @arg01, @arg01 ; | ||
|  |   dec $1; | ||
|  | } | ||
|  | select * from t1 where a > 10000 order by a ; | ||
|  | delete from t1 where a > 10000 ; | ||
|  | 
 | ||
|  | 
 | ||
|  | ## insert with two rows in values part
 | ||
|  | set @arg00=81 ; | ||
|  | set @arg01='8-1' ; | ||
|  | set @arg02=82 ; | ||
|  | set @arg03='8-2' ; | ||
|  | prepare stmt1 from 'insert into t1 values(?,?),(?,?)'; | ||
|  | execute stmt1 using @arg00, @arg01, @arg02, @arg03 ; | ||
|  | select a,b from t1 where a in (@arg00,@arg02) ; | ||
|  | 
 | ||
|  | ## insert with two parameter in the set part
 | ||
|  | set @arg00=9 ; | ||
|  | set @arg01='nine' ; | ||
|  | prepare stmt1 from 'insert into t1 set a=?, b=? '; | ||
|  | execute stmt1 using @arg00, @arg01 ; | ||
|  | select a,b from t1 where a = @arg00 ; | ||
|  | 
 | ||
|  | ## insert with parameters in the ON DUPLICATE KEY part 
 | ||
|  | set @arg00=6 ; | ||
|  | set @arg01=1 ; | ||
|  | prepare stmt1 from 'insert into t1 set a=?, b=''sechs'' | ||
|  |                     on duplicate key update a=a + ?, b=concat(b,''modified'') '; | ||
|  | execute stmt1 using @arg00, @arg01; | ||
|  | select * from t1 order by a; | ||
|  | set @arg00=81 ; | ||
|  | set @arg01=1 ; | ||
|  | --error ER_DUP_ENTRY | ||
|  | execute stmt1 using @arg00, @arg01; | ||
|  | 
 | ||
|  | ## insert, autoincrement column and ' SELECT LAST_INSERT_ID() '
 | ||
|  | # cases derived from client_test.c: test_bug3117()
 | ||
|  | --disable_warnings | ||
|  | drop table if exists t2 ; | ||
|  | --enable_warnings | ||
|  | # The test battery for table type 'MERGE' gets here only a 'MYISAM' table
 | ||
|  | eval create table t2 (id int auto_increment primary key)  | ||
|  | ENGINE= $type ; | ||
|  | prepare stmt1 from ' select last_insert_id() ' ; | ||
|  | insert into t2 values (NULL) ; | ||
|  | execute stmt1 ; | ||
|  | insert into t2 values (NULL) ; | ||
|  | # bug#3117
 | ||
|  | execute stmt1 ; | ||
|  | drop table t2 ; | ||
|  | 
 | ||
|  | ## many parameters
 | ||
|  | set @1000=1000 ; | ||
|  | set @x1000_2="x1000_2" ; | ||
|  | set @x1000_3="x1000_3" ; | ||
|  | 
 | ||
|  | set @x1000="x1000" ; | ||
|  | set @1100=1100 ; | ||
|  | set @x1100="x1100" ; | ||
|  | set @100=100 ; | ||
|  | set @updated="updated" ; | ||
|  | insert into t1 values(1000,'x1000_1') ; | ||
|  | insert into t1 values(@1000,@x1000_2),(@1000,@x1000_3) | ||
|  |                on duplicate key update a = a + @100, b = concat(b,@updated) ; | ||
|  | select a,b from t1 where a >= 1000 order by a ; | ||
|  | delete from t1 where a >= 1000 ; | ||
|  | insert into t1 values(1000,'x1000_1') ; | ||
|  | prepare stmt1 from ' insert into t1 values(?,?),(?,?) | ||
|  |                on duplicate key update a = a + ?, b = concat(b,?) '; | ||
|  | execute stmt1 using @1000, @x1000_2, @1000, @x1000_3, @100, @updated ; | ||
|  | select a,b from t1 where a >= 1000 order by a ; | ||
|  | delete from t1 where a >= 1000 ; | ||
|  | insert into t1 values(1000,'x1000_1') ; | ||
|  | execute stmt1 using @1000, @x1000_2, @1100, @x1000_3, @100, @updated ; | ||
|  | select a,b from t1 where a >= 1000 order by a ; | ||
|  | delete from t1 where a >= 1000 ; | ||
|  | 
 | ||
|  | ## replace
 | ||
|  | prepare stmt1 from ' replace into t1 (a,b) select 100, ''hundred'' '; | ||
|  | execute stmt1; | ||
|  | execute stmt1; | ||
|  | execute stmt1; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | ## multi table statements
 | ||
|  | --disable_query_log | ||
|  | select '------ multi table tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | # cases derived from client_test.c: test_multi
 | ||
|  | delete from t1 ; | ||
|  | delete from t9 ; | ||
|  | insert into t1(a,b) values (1, 'one'), (2, 'two'), (3, 'three') ; | ||
|  | insert into t9 (c1,c21) | ||
|  |   values (1, 'one'), (2, 'two'), (3, 'three') ; | ||
|  | prepare stmt_delete from " delete t1, t9 
 | ||
|  |   from t1, t9 where t1.a=t9.c1 and t1.b='updated' ";
 | ||
|  | prepare stmt_update from " update t1, t9 
 | ||
|  |   set t1.b='updated', t9.c21='updated' | ||
|  |   where t1.a=t9.c1 and t1.a=? ";
 | ||
|  | prepare stmt_select1 from " select a, b from t1 order by a" ; | ||
|  | prepare stmt_select2 from " select c1, c21 from t9 order by c1" ; | ||
|  | set @arg00= 1 ; | ||
|  | let $1= 3 ; | ||
|  | while ($1) | ||
|  | { | ||
|  |   execute stmt_update using @arg00 ; | ||
|  |   execute stmt_delete ; | ||
|  |   execute stmt_select1 ; | ||
|  |   execute stmt_select2 ; | ||
|  |   set @arg00= @arg00 + 1 ; | ||
|  |   dec $1 ; | ||
|  | } | ||
|  | 
 |