932 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			932 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | ###################### ps_general.test ####################### | ||
|  | #                                                            # | ||
|  | #   basic and miscellaneous tests for prepared statements    # | ||
|  | #                                                            # | ||
|  | ############################################################## | ||
|  | 
 | ||
|  | #     | ||
|  | # NOTE: PLEASE SEE THE DETAILED DESCRIPTION AT THE BOTTOM OF THIS FILE | ||
|  | #       BEFORE ADDING NEW TEST CASES HERE !!! | ||
|  | 
 | ||
|  | --disable_warnings | ||
|  | drop table if exists t5, t6, t7, t8; | ||
|  | drop database if exists mysqltest ; | ||
|  | 
 | ||
|  | # Cleanup from other tests | ||
|  | drop database if exists client_test_db; | ||
|  | drop database if exists testtets; | ||
|  | drop table if exists t1Aa,t2Aa,v1Aa,v2Aa; | ||
|  | drop view if exists t1Aa,t2Aa,v1Aa,v2Aa; | ||
|  | --enable_warnings | ||
|  | 
 | ||
|  | --disable_query_log | ||
|  | select '------ basic tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | 
 | ||
|  | let $type= 'MYISAM' ; | ||
|  | # create the tables (t1 and t9) used in many tests | ||
|  | --source include/ps_create.inc | ||
|  | # insert data into these tables | ||
|  | --source include/ps_renew.inc | ||
|  | 
 | ||
|  | 
 | ||
|  | ################ The basic functions ################ | ||
|  | 
 | ||
|  | # 1. PREPARE stmt_name FROM <preparable statement>; | ||
|  | #    <preparable statement> ::= | ||
|  | #     'literal_stmt' | | ||
|  | #     @variable_ref_stmt. | ||
|  | #    The statement may contain question marks as placeholders for parameters. | ||
|  | # | ||
|  | #    Bind a statement name to a string containing a SQL statement and | ||
|  | #    send it to the server. The server will parse the statement and | ||
|  | #    reply with "Query Ok" or an error message. | ||
|  | # | ||
|  | PREPARE stmt FROM ' select * from t1 where a = ? ' ; | ||
|  | 
 | ||
|  | # 2. EXECUTE stmt_name [USING @var [, @var ]]; | ||
|  | #    Current values of supplied variables are used as parameters. | ||
|  | # | ||
|  | #    Send the server the order to execute the statement and supply values | ||
|  | #    for the input parameters needed. | ||
|  | #    If no error occurs the server reply will be identical to the reply for | ||
|  | #    the query used in PREPARE with question marks replaced with values of | ||
|  | #    the input variables. | ||
|  | # | ||
|  | SET @var= 2 ; | ||
|  | EXECUTE stmt USING @var ; | ||
|  | #    The non prepared statement with the same server reply would be: | ||
|  | select * from t1 where a = @var ; | ||
|  | 
 | ||
|  | # 3. DEALLOCATE PREPARE stmt_name; | ||
|  | # | ||
|  | #    Send the server the order to drop the parse informations. | ||
|  | #    The server will reply with "Query Ok" or an error message. | ||
|  | DEALLOCATE PREPARE stmt ; | ||
|  | 
 | ||
|  | ################ PREPARE ################ | ||
|  | # prepare without parameter | ||
|  | prepare stmt1 from ' select 1 as my_col ' ; | ||
|  | # prepare with parameter | ||
|  | prepare stmt1 from ' select ? as my_col ' ; | ||
|  | # prepare must fail (incomplete statements/wrong syntax) | ||
|  | --error ER_PARSE_ERROR | ||
|  | prepare ; | ||
|  | --error ER_PARSE_ERROR | ||
|  | prepare stmt1 ; | ||
|  | --error ER_PARSE_ERROR | ||
|  | prepare stmt1 from ; | ||
|  | --error ER_PARSE_ERROR | ||
|  | prepare_garbage stmt1 from ' select 1 ' ; | ||
|  | --error ER_PARSE_ERROR | ||
|  | prepare stmt1 from_garbage ' select 1 ' ; | ||
|  | --error ER_PARSE_ERROR | ||
|  | prepare stmt1 from ' select_garbage 1 ' ; | ||
|  | --error ER_PARSE_ERROR | ||
|  | prepare from ' select 1 ' ; | ||
|  | --error ER_PARSE_ERROR | ||
|  | prepare stmt1 ' select 1 ' ; | ||
|  | --error ER_PARSE_ERROR | ||
|  | prepare ? from ' select ? as my_col ' ; | ||
|  | # statement in variable | ||
|  | set @arg00='select 1 as my_col'; | ||
|  | prepare stmt1 from @arg00; | ||
|  | # prepare must fail (query variable is empty) | ||
|  | set @arg00=''; | ||
|  | --error ER_EMPTY_QUERY | ||
|  | prepare stmt1 from @arg00; | ||
|  | set @arg00=NULL; | ||
|  | # prepare must fail (query variable is NULL) | ||
|  | --error ER_PARSE_ERROR | ||
|  | prepare stmt1 from @arg01; | ||
|  | 
 | ||
|  | prepare stmt1 from ' select * from t1 where a <= 2 ' ; | ||
|  | # prepare must fail (column x does not exist) | ||
|  | --error ER_BAD_FIELD_ERROR | ||
|  | prepare stmt1 from ' select * from t1 where x <= 2 ' ; | ||
|  | # cases derived from client_test.c: test_null() | ||
|  | # prepare must fail (column x does not exist) | ||
|  | --error ER_BAD_FIELD_ERROR | ||
|  | prepare stmt1 from ' insert into t1(a,x) values(?,?) ' ; | ||
|  | --error ER_BAD_FIELD_ERROR | ||
|  | prepare stmt1 from ' insert into t1(x,a) values(?,?) ' ; | ||
|  | --disable_warnings | ||
|  | drop table if exists not_exist ; | ||
|  | --enable_warnings | ||
|  | # prepare must fail (table does not exist) | ||
|  | --error ER_NO_SUCH_TABLE | ||
|  | prepare stmt1 from ' select * from not_exist where a <= 2 ' ; | ||
|  | 
 | ||
|  | # case derived from client_test.c: test_prepare_syntax() | ||
|  | # prepare must fail (incomplete statement) | ||
|  | --error ER_PARSE_ERROR | ||
|  | prepare stmt1 from ' insert into t1 values(? ' ; | ||
|  | --error ER_PARSE_ERROR | ||
|  | prepare stmt1 from ' select a, b from t1 | ||
|  |                      where a=? and where ' ; | ||
|  | 
 | ||
|  | ################ EXECUTE ################ | ||
|  | # execute must fail (statement never_prepared never prepared) | ||
|  | --error ER_UNKNOWN_STMT_HANDLER | ||
|  | execute never_prepared ; | ||
|  | # execute must fail (prepare stmt1 just failed, | ||
|  | #         but there was a successful prepare of stmt1 before) | ||
|  | prepare stmt1 from ' select * from t1 where a <= 2 ' ; | ||
|  | --error ER_NO_SUCH_TABLE | ||
|  | prepare stmt1 from ' select * from not_exist where a <= 2 ' ; | ||
|  | --error ER_UNKNOWN_STMT_HANDLER | ||
|  | execute stmt1 ; | ||
|  | 
 | ||
|  | # drop the table between prepare and execute | ||
|  | create table t5 | ||
|  | ( | ||
|  |   a int primary key, | ||
|  |   b char(30), | ||
|  |   c int | ||
|  | ); | ||
|  | insert into t5( a, b, c) values( 1, 'original table', 1); | ||
|  | prepare stmt2 from ' select * from t5 ' ; | ||
|  | execute stmt2 ; | ||
|  | drop table t5 ; | ||
|  | # execute must fail (table was dropped after prepare) | ||
|  | --error ER_NO_SUCH_TABLE | ||
|  | execute stmt2 ; | ||
|  | # cases derived from client_test.c: test_select_prepare() | ||
|  | # 1. drop + create table (same column names/types/order)  | ||
|  | # between prepare and execute | ||
|  | create table t5 | ||
|  | ( | ||
|  |   a int primary key, | ||
|  |   b char(30), | ||
|  |   c int | ||
|  | ); | ||
|  | insert into t5( a, b, c) values( 9, 'recreated table', 9); | ||
|  | execute stmt2 ; | ||
|  | drop table t5 ; | ||
|  | # 2. drop + create table (same column names/types but different order) | ||
|  | # between prepare and execute | ||
|  | create table t5 | ||
|  | ( | ||
|  |   a int primary key, | ||
|  |   c int, | ||
|  |   b char(30) | ||
|  | ); | ||
|  | insert into t5( a, b, c) values( 9, 'recreated table', 9); | ||
|  | execute stmt2 ; | ||
|  | drop table t5 ; | ||
|  | # 3. drop + create table (same column names/types/order+extra column)  | ||
|  | # between prepare and execute | ||
|  | create table t5 | ||
|  | ( | ||
|  |   a int primary key, | ||
|  |   b char(30), | ||
|  |   c int, | ||
|  |   d timestamp default '2008-02-23 09:23:45' | ||
|  | ); | ||
|  | insert into t5( a, b, c) values( 9, 'recreated table', 9); | ||
|  | execute stmt2 ; | ||
|  | drop table t5 ; | ||
|  | # 4. drop + create table (same column names/types, different order + | ||
|  | # additional column) between prepare and execute | ||
|  | create table t5 | ||
|  | ( | ||
|  |   a int primary key, | ||
|  |   d timestamp default '2008-02-23 09:23:45', | ||
|  |   b char(30), | ||
|  |   c int | ||
|  | ); | ||
|  | insert into t5( a, b, c) values( 9, 'recreated table', 9); | ||
|  | execute stmt2 ; | ||
|  | drop table t5 ; | ||
|  | # 5. drop + create table (same column names/order, different types) | ||
|  | # between prepare and execute | ||
|  | create table t5 | ||
|  | ( | ||
|  |   a timestamp default '2004-02-29 18:01:59', | ||
|  |   b char(30), | ||
|  |   c int | ||
|  | ); | ||
|  | insert into t5( b, c) values( 'recreated table', 9); | ||
|  | execute stmt2 ; | ||
|  | drop table t5 ; | ||
|  | # 6. drop + create table (same column types/order, different names)  | ||
|  | # between prepare and execute | ||
|  | create table t5 | ||
|  | ( | ||
|  |   f1 int primary key, | ||
|  |   f2 char(30), | ||
|  |   f3 int | ||
|  | ); | ||
|  | insert into t5( f1, f2, f3) values( 9, 'recreated table', 9); | ||
|  | execute stmt2 ; | ||
|  | drop table t5 ; | ||
|  | 
 | ||
|  | # execute without parameter | ||
|  | prepare stmt1 from ' select * from t1 where a <= 2 ' ; | ||
|  | execute stmt1 ; | ||
|  | # execute with parameter | ||
|  | set @arg00=1 ; | ||
|  | set @arg01='two' ; | ||
|  | prepare stmt1 from ' select * from t1 where a <= ? ' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | # execute must fail (too small number of parameters) | ||
|  | --error ER_WRONG_ARGUMENTS | ||
|  | execute stmt1 ; | ||
|  | # execute must fail (too big number of parameters) | ||
|  | --error ER_WRONG_ARGUMENTS | ||
|  | execute stmt1 using @arg00, @arg01; | ||
|  | # execute must fail (parameter is not set) | ||
|  | execute stmt1 using @not_set; | ||
|  | 
 | ||
|  | ################ DEALLOCATE ################ | ||
|  | # deallocate must fail (the statement 'never_prepared' was never prepared) | ||
|  | --error ER_UNKNOWN_STMT_HANDLER | ||
|  | deallocate prepare never_prepared ; | ||
|  | # deallocate must fail (prepare stmt1 just failed, | ||
|  | #         but there was a successful prepare before) | ||
|  | prepare stmt1 from ' select * from t1 where a <= 2 ' ; | ||
|  | --error ER_NO_SUCH_TABLE | ||
|  | prepare stmt1 from ' select * from not_exist where a <= 2 ' ; | ||
|  | --error ER_UNKNOWN_STMT_HANDLER | ||
|  | deallocate prepare stmt1; | ||
|  | create table t5 | ||
|  | ( | ||
|  |   a int primary key, | ||
|  |   b char(10) | ||
|  | ); | ||
|  | prepare stmt2 from ' select a,b from t5 where a <= 2 ' ; | ||
|  | drop table t5 ; | ||
|  | # deallocate prepared statement where the table was dropped after prepare | ||
|  | deallocate prepare stmt2; | ||
|  | 
 | ||
|  | ## parallel use of more than one prepared statement handlers | ||
|  | # switch between different queries | ||
|  | prepare stmt1 from ' select a from t1 where a <= 2 ' ; | ||
|  | prepare stmt2 from ' select b from t1 where a <= 2 ' ; | ||
|  | execute stmt2 ; | ||
|  | execute stmt1 ; | ||
|  | # switch between statement handlers of the same query | ||
|  | prepare stmt1 from ' select a from t1 where a <= 2 ' ; | ||
|  | prepare stmt2 from ' select a from t1 where a <= 2 ' ; | ||
|  | execute stmt2 ; | ||
|  | execute stmt1 ; | ||
|  | deallocate prepare stmt1 ; | ||
|  | # Will the deallocate of stmt1 with the same query affect stmt2 ? | ||
|  | execute stmt2 ; | ||
|  | 
 | ||
|  | --disable_query_log | ||
|  | select '------ show and misc tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | 
 | ||
|  | --disable_warnings | ||
|  | drop table if exists t2; | ||
|  | --enable_warnings | ||
|  | create table t2  | ||
|  | ( | ||
|  |   a int primary key, b char(10) | ||
|  | ); | ||
|  | 
 | ||
|  | ################ SHOW COMMANDS ################ | ||
|  | prepare stmt4 from ' show databases '; | ||
|  | execute stmt4; | ||
|  | prepare stmt4 from ' show tables from test like ''t2%'' '; | ||
|  | execute stmt4; | ||
|  | prepare stmt4 from ' show columns from t2 where field in (select ?) '; | ||
|  | SET @arg00="a"; | ||
|  | execute stmt4 using @arg00; | ||
|  | SET @arg00="b"; | ||
|  | execute stmt4 using @arg00; | ||
|  | SET @arg00=1; | ||
|  | execute stmt4 using @arg00; | ||
|  | 
 | ||
|  | prepare stmt4 from ' show columns from t2 from test like ''a%'' '; | ||
|  | execute stmt4; | ||
|  | create index t2_idx on t2(b); | ||
|  | prepare stmt4 from ' show index from t2 from test '; | ||
|  | execute stmt4; | ||
|  | prepare stmt4 from ' show table status from test like ''t2%'' '; | ||
|  | # egalize date and time values | ||
|  | --replace_column 8 # 12 # 13 # 14 # | ||
|  | # Bug#4288 : prepared statement 'show table status ..', wrong output on execute | ||
|  | execute stmt4; | ||
|  | # try the same with the big table | ||
|  | prepare stmt4 from ' show table status from test like ''t9%'' '; | ||
|  | # egalize date and time values | ||
|  | --replace_column 8 # 12 # 13 # 14 # | ||
|  | # Bug#4288 | ||
|  | execute stmt4; | ||
|  | prepare stmt4 from ' show status like ''Threads_running'' '; | ||
|  | --replace_column 2 # | ||
|  | execute stmt4; | ||
|  | prepare stmt4 from ' show variables like ''sql_mode'' '; | ||
|  | execute stmt4; | ||
|  | prepare stmt4 from ' show engine myisam logs '; | ||
|  | execute stmt4; | ||
|  | prepare stmt4 from ' show grants for user '; | ||
|  | prepare stmt4 from ' show create table t2 '; | ||
|  | prepare stmt4 from ' show master status '; | ||
|  | prepare stmt4 from ' show master logs '; | ||
|  | prepare stmt4 from ' show slave status '; | ||
|  | prepare stmt4 from ' show warnings limit 20 '; | ||
|  | prepare stmt4 from ' show errors limit 20 '; | ||
|  | prepare stmt4 from ' show storage engines '; | ||
|  | # The output depends upon the precise order in which | ||
|  | # storage engines are registered, so we switch off the output. | ||
|  | --disable_result_log | ||
|  | execute stmt4; | ||
|  | --enable_result_log | ||
|  | 
 | ||
|  | ################ MISC STUFF ################ | ||
|  | ## get a warning and an error | ||
|  | # cases derived from client_test.c: test_warnings(), test_errors() | ||
|  | --disable_warnings | ||
|  | drop table if exists t5; | ||
|  | --enable_warnings | ||
|  | prepare stmt1 from ' drop table if exists t5 ' ; | ||
|  | execute stmt1 ; | ||
|  | prepare stmt1 from ' drop table t5 ' ; | ||
|  | --error ER_BAD_TABLE_ERROR | ||
|  | execute stmt1 ; | ||
|  | 
 | ||
|  | ## SELECT @@version | ||
|  | # cases derived from client_test.c: test_select_version() | ||
|  | # | ||
|  | # TODO: Metadata check is temporary disabled here, because metadata of  | ||
|  | # this statement also depends on @@version contents and you can't apply | ||
|  | # replace_column and replace_result to it. It will be enabled again when  | ||
|  | # support of replace_column and replace_result on metadata will be | ||
|  | # implemented. | ||
|  | # | ||
|  | #--enable_metadata | ||
|  | prepare stmt1 from ' SELECT @@version ' ; | ||
|  | # egalize the version | ||
|  | --replace_column 1 <version> | ||
|  | execute stmt1 ; | ||
|  | #--disable_metadata | ||
|  | 
 | ||
|  | ## do @var:= and set @var= | ||
|  | # cases derived from client_test.c: test_do_set() | ||
|  | prepare stmt_do from ' do @var:=  (1 in (select a from t1)) ' ; | ||
|  | prepare stmt_set from ' set @var= (1 in (select a from t1)) ' ; | ||
|  | let $1= 3 ; | ||
|  | while ($1) | ||
|  | { | ||
|  |   execute stmt_do ; | ||
|  |   --disable_query_log | ||
|  |   select @var as 'content of @var is:' ; | ||
|  |   --enable_query_log | ||
|  |   execute stmt_set ; | ||
|  |   --disable_query_log | ||
|  |   select @var as 'content of @var is:' ; | ||
|  |   --enable_query_log | ||
|  |   dec $1 ; | ||
|  | } | ||
|  | # the same test with a table containing one column and 'select *' | ||
|  | --disable_warnings | ||
|  | drop table if exists t5 ; | ||
|  | --enable_warnings | ||
|  | create table t5 (a int) ; | ||
|  | prepare stmt_do from ' do @var:=  (1 in (select a from t5)) ' ; | ||
|  | prepare stmt_set from ' set @var= (1 in (select a from t5)) ' ; | ||
|  | let $1= 3 ; | ||
|  | while ($1) | ||
|  | { | ||
|  |   execute stmt_do ; | ||
|  |   --disable_query_log | ||
|  |   select @var as 'content of @var is:' ; | ||
|  |   --enable_query_log | ||
|  |   execute stmt_set ; | ||
|  |   --disable_query_log | ||
|  |   select @var as 'content of @var is:' ; | ||
|  |   --enable_query_log | ||
|  |   dec $1 ; | ||
|  | } | ||
|  | drop table t5 ; | ||
|  | deallocate prepare stmt_do ; | ||
|  | deallocate prepare stmt_set ; | ||
|  | 
 | ||
|  | ## nonsense like prepare of prepare,execute or deallocate | ||
|  | --error ER_UNSUPPORTED_PS  | ||
|  | prepare stmt1 from ' prepare stmt2 from '' select 1 ''  ' ; | ||
|  | --error ER_UNSUPPORTED_PS  | ||
|  | prepare stmt1 from ' execute stmt2 ' ; | ||
|  | --error ER_UNSUPPORTED_PS  | ||
|  | prepare stmt1 from ' deallocate prepare never_prepared ' ; | ||
|  | 
 | ||
|  | ## We don't support alter view as prepared statements | ||
|  | --error ER_UNSUPPORTED_PS | ||
|  | prepare stmt1 from 'alter view v1 as select 2'; | ||
|  | 
 | ||
|  | ## switch the database connection | ||
|  | --error ER_UNSUPPORTED_PS | ||
|  | prepare stmt4 from ' use test ' ; | ||
|  | 
 | ||
|  | ## create/drop database | ||
|  | prepare stmt3 from ' create database mysqltest '; | ||
|  | create database mysqltest ; | ||
|  | prepare stmt3 from ' drop database mysqltest '; | ||
|  | drop database mysqltest ; | ||
|  | 
 | ||
|  | #### table related commands | ||
|  | ## describe | ||
|  | prepare stmt3 from ' describe t2 '; | ||
|  | execute stmt3; | ||
|  | drop table t2 ; | ||
|  | --error ER_NO_SUCH_TABLE | ||
|  | execute stmt3; | ||
|  | ## lock/unlock | ||
|  | --error ER_UNSUPPORTED_PS | ||
|  | prepare stmt3 from ' lock tables t1 read ' ; | ||
|  | --error ER_UNSUPPORTED_PS | ||
|  | prepare stmt3 from ' unlock tables ' ; | ||
|  | ## Load/Unload table contents | ||
|  | 
 | ||
|  | --let $datafile = $MYSQLTEST_VARDIR/tmp/data.txt | ||
|  | --error 0,1 | ||
|  | --remove_file $datafile | ||
|  | 
 | ||
|  | --replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR> | ||
|  | --error ER_UNSUPPORTED_PS | ||
|  | eval prepare stmt1 from ' load data infile ''$datafile'' | ||
|  |      into table t1 fields terminated by ''\t'' '; | ||
|  | --replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR> | ||
|  | eval prepare stmt1 from ' select * into outfile ''$datafile'' from t1 '; | ||
|  |      execute stmt1 ; | ||
|  | ##  | ||
|  | prepare stmt1 from ' optimize table t1 ' ; | ||
|  | prepare stmt1 from ' analyze table t1 ' ; | ||
|  | prepare stmt1 from ' checksum table t1 ' ; | ||
|  | prepare stmt1 from ' repair table t1 ' ; | ||
|  | 
 | ||
|  | --replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR> | ||
|  | --error ER_UNSUPPORTED_PS | ||
|  | eval prepare stmt1 from ' restore table t1 from ''$datafile'' ' ; | ||
|  | --remove_file $datafile | ||
|  | 
 | ||
|  | ## handler | ||
|  | --error ER_UNSUPPORTED_PS | ||
|  | prepare stmt1 from ' handler t1 open '; | ||
|  | 
 | ||
|  | 
 | ||
|  | ## commit/rollback | ||
|  | prepare stmt3 from ' commit ' ; | ||
|  | prepare stmt3 from ' rollback ' ; | ||
|  | 
 | ||
|  | 
 | ||
|  | ## switch the sql_mode | ||
|  | prepare stmt4 from ' SET sql_mode=ansi '; | ||
|  | execute stmt4; | ||
|  | # check if the sql_mode is now ansi | ||
|  | select 'a' || 'b' ; | ||
|  | prepare stmt4 from ' SET sql_mode="" '; | ||
|  | execute stmt4; | ||
|  | # check if the sql_mode is not ansi | ||
|  | select '2' || '3' ; | ||
|  | # Will a switch of the sqlmode affect the execution of already prepared  | ||
|  | # statements ? | ||
|  | prepare stmt5 from ' select ''2'' || ''3'' ' ; | ||
|  | execute stmt5; | ||
|  | SET sql_mode=ansi; | ||
|  | execute stmt5; | ||
|  | SET sql_mode=""; | ||
|  | 
 | ||
|  | prepare stmt1 from ' flush local privileges ' ; | ||
|  | prepare stmt1 from ' reset query cache ' ; | ||
|  | prepare stmt1 from ' KILL 0 '; | ||
|  | 
 | ||
|  | ## simple explain | ||
|  | # cases derived from client_test.c: test_explain_bug() | ||
|  | prepare stmt1 from ' explain select a from t1 order by b '; | ||
|  | # PS protocol gives slightly different metadata | ||
|  | --disable_ps_protocol | ||
|  | --enable_metadata | ||
|  | execute stmt1; | ||
|  | --disable_metadata | ||
|  | SET @arg00=1 ; | ||
|  | prepare stmt1 from ' explain select a from t1 where a > ? order by b '; | ||
|  | --enable_metadata | ||
|  | execute stmt1 using @arg00; | ||
|  | --disable_metadata | ||
|  | --enable_ps_protocol | ||
|  | 
 | ||
|  | ## parameters with probably problematic characters (quote, double  quote) | ||
|  | # cases derived from client_test.c: test_logs() | ||
|  | # try if  | ||
|  | --disable_warnings | ||
|  | drop table if exists t2; | ||
|  | --enable_warnings | ||
|  | create table t2 (id smallint, name varchar(20)) ; | ||
|  | prepare stmt1 from ' insert into t2 values(?, ?) ' ; | ||
|  | set @id= 9876 ; | ||
|  | set @arg00= 'MySQL - Open Source Database' ; | ||
|  | set @arg01= "'" ; | ||
|  | set @arg02= '"' ; | ||
|  | set @arg03= "my'sql'" ; | ||
|  | set @arg04= 'my"sql"' ; | ||
|  | insert into t2 values ( @id , @arg00 ); | ||
|  | insert into t2 values ( @id , @arg01 ); | ||
|  | insert into t2 values ( @id , @arg02 ); | ||
|  | insert into t2 values ( @id , @arg03 ); | ||
|  | insert into t2 values ( @id , @arg04 ); | ||
|  | prepare stmt1 from ' select * from t2 where id= ? and name= ? '; | ||
|  | execute stmt1 using @id, @arg00 ; | ||
|  | execute stmt1 using @id, @arg01 ; | ||
|  | execute stmt1 using @id, @arg02 ; | ||
|  | execute stmt1 using @id, @arg03 ; | ||
|  | execute stmt1 using @id, @arg04 ; | ||
|  | drop table t2; | ||
|  | 
 | ||
|  | ################ CREATE/DROP/ALTER/RENAME TESTS ################ | ||
|  | --disable_query_log | ||
|  | select '------ create/drop/alter/rename tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | 
 | ||
|  | --disable_warnings | ||
|  | drop table if exists t2, t3; | ||
|  | --enable_warnings | ||
|  | 
 | ||
|  | ## DROP TABLE | ||
|  | prepare stmt_drop from ' drop table if exists t2 ' ; | ||
|  | --disable_warnings | ||
|  | execute stmt_drop; | ||
|  | --enable_warnings | ||
|  | 
 | ||
|  | ## CREATE TABLE | ||
|  | prepare stmt_create from ' create table t2 ( | ||
|  |                              a int primary key, b char(10)) '; | ||
|  | execute stmt_create; | ||
|  | prepare stmt3 from ' create table t3 like t2 '; | ||
|  | execute stmt3; | ||
|  | drop table t3; | ||
|  | 
 | ||
|  | ## CREATE TABLE .. SELECT | ||
|  | set @arg00=1; | ||
|  | prepare stmt3 from ' create table t3 (m int) select ? as m ' ; | ||
|  | # Bug#4280 server hangs, prepared "create table .. as select ? .." | ||
|  | execute stmt3 using @arg00; | ||
|  | select m from t3; | ||
|  | drop table t3; | ||
|  | 
 | ||
|  | prepare stmt3 from ' create index t2_idx on t2(b) '; | ||
|  | prepare stmt3 from ' drop index t2_idx on t2 ' ;  | ||
|  | prepare stmt3 from ' alter table t2 drop primary key '; | ||
|  | 
 | ||
|  | ## RENAME TABLE | ||
|  | --disable_warnings | ||
|  | drop table if exists new_t2; | ||
|  | --enable_warnings | ||
|  | prepare stmt3 from ' rename table t2 to new_t2 '; | ||
|  | execute stmt3; | ||
|  | --error ER_TABLE_EXISTS_ERROR | ||
|  | execute stmt3; | ||
|  | rename table new_t2 to t2; | ||
|  | drop table t2; | ||
|  | ## RENAME more than on TABLE within one statement | ||
|  | # cases derived from client_test.c: test_rename() | ||
|  | prepare stmt1 from ' rename table t5 to t6, t7 to t8 ' ; | ||
|  | create table t5 (a int) ; | ||
|  | # rename must fail, t7 does not exist | ||
|  | # Clean up the filename here because embedded server reports whole path | ||
|  | --replace_result $MYSQLTEST_VARDIR . mysqld.1/data/ '' t7.frm t7 | ||
|  | --error ER_FILE_NOT_FOUND | ||
|  | execute stmt1 ; | ||
|  | create table t7 (a int) ; | ||
|  | # rename, t5 -> t6 and t7 -> t8 | ||
|  | execute stmt1 ; | ||
|  | # rename must fail, t5 and t7 does not exist t6 and t8 already exist | ||
|  | --error ER_TABLE_EXISTS_ERROR | ||
|  | execute stmt1 ; | ||
|  | rename table t6 to t5, t8 to t7 ; | ||
|  | # rename, t5 -> t6 and t7 -> t8 | ||
|  | execute stmt1 ; | ||
|  | drop table t6, t8 ; | ||
|  | 
 | ||
|  | 
 | ||
|  | ################ BIG STATEMENT TESTS ################ | ||
|  | --disable_query_log | ||
|  | select '------ big statement tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | # The following tests use huge numbers of lines, characters or parameters | ||
|  | # per prepared statement. | ||
|  | # I assume the server and also the client (mysqltest) are stressed. | ||
|  | # | ||
|  | # Attention: The limits used are NOT derived from the manual | ||
|  | #            or other sources. | ||
|  | 
 | ||
|  | ## many lines ( 50 ) | ||
|  | let $my_stmt= select 'ABC' as my_const_col from t1 where | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 AND | ||
|  | 1 = 1 ; | ||
|  | eval ($my_stmt) ; | ||
|  | eval prepare stmt1 from "$my_stmt" ; | ||
|  | execute stmt1 ; | ||
|  | execute stmt1 ; | ||
|  | 
 | ||
|  | ## many characters ( about 1400 ) | ||
|  | 
 | ||
|  | let $my_stmt= select 'ABC' as my_const_col FROM t1 WHERE | ||
|  | '1234567890123456789012345678901234567890123456789012345678901234567890' | ||
|  | = '1234567890123456789012345678901234567890123456789012345678901234567890' AND | ||
|  | '1234567890123456789012345678901234567890123456789012345678901234567890' | ||
|  | = '1234567890123456789012345678901234567890123456789012345678901234567890' AND | ||
|  | '1234567890123456789012345678901234567890123456789012345678901234567890' | ||
|  | = '1234567890123456789012345678901234567890123456789012345678901234567890' AND | ||
|  | '1234567890123456789012345678901234567890123456789012345678901234567890' | ||
|  | = '1234567890123456789012345678901234567890123456789012345678901234567890' AND | ||
|  | '1234567890123456789012345678901234567890123456789012345678901234567890' | ||
|  | = '1234567890123456789012345678901234567890123456789012345678901234567890' AND | ||
|  | '1234567890123456789012345678901234567890123456789012345678901234567890' | ||
|  | = '1234567890123456789012345678901234567890123456789012345678901234567890' AND | ||
|  | '1234567890123456789012345678901234567890123456789012345678901234567890' | ||
|  | = '1234567890123456789012345678901234567890123456789012345678901234567890' AND | ||
|  | '1234567890123456789012345678901234567890123456789012345678901234567890' | ||
|  | = '1234567890123456789012345678901234567890123456789012345678901234567890' AND | ||
|  | '1234567890123456789012345678901234567890123456789012345678901234567890' | ||
|  | = '1234567890123456789012345678901234567890123456789012345678901234567890' ; | ||
|  | eval ($my_stmt) ; | ||
|  | eval prepare stmt1 from "$my_stmt" ; | ||
|  | execute stmt1 ; | ||
|  | execute stmt1 ; | ||
|  | 
 | ||
|  | 
 | ||
|  | ## many parameters ( 50 ) | ||
|  | --disable_query_log | ||
|  | set @arg00= 1; | ||
|  | set @arg01= 1;  | ||
|  | set @arg02= 1; | ||
|  | set @arg03= 1;  | ||
|  | set @arg04= 1; | ||
|  | set @arg05= 1;  | ||
|  | set @arg06= 1; | ||
|  | set @arg07= 1; | ||
|  | set @arg10= 1; | ||
|  | set @arg11= 1;  | ||
|  | set @arg12= 1; | ||
|  | set @arg13= 1;  | ||
|  | set @arg14= 1; | ||
|  | set @arg15= 1;  | ||
|  | set @arg16= 1; | ||
|  | set @arg17= 1;  | ||
|  | set @arg20= 1; | ||
|  | set @arg21= 1;  | ||
|  | set @arg22= 1; | ||
|  | set @arg23= 1;  | ||
|  | set @arg24= 1; | ||
|  | set @arg25= 1;  | ||
|  | set @arg26= 1; | ||
|  | set @arg27= 1;  | ||
|  | set @arg30= 1; | ||
|  | set @arg31= 1;  | ||
|  | set @arg32= 1; | ||
|  | set @arg33= 1;  | ||
|  | set @arg34= 1; | ||
|  | set @arg35= 1;  | ||
|  | set @arg36= 1; | ||
|  | set @arg37= 1;  | ||
|  | set @arg40= 1; | ||
|  | set @arg41= 1;  | ||
|  | set @arg42= 1; | ||
|  | set @arg43= 1;  | ||
|  | set @arg44= 1; | ||
|  | set @arg45= 1;  | ||
|  | set @arg46= 1; | ||
|  | set @arg47= 1;  | ||
|  | set @arg50= 1; | ||
|  | set @arg51= 1;  | ||
|  | set @arg52= 1; | ||
|  | set @arg53= 1;  | ||
|  | set @arg54= 1; | ||
|  | set @arg55= 1;  | ||
|  | set @arg56= 1; | ||
|  | set @arg57= 1;  | ||
|  | set @arg60= 1; | ||
|  | set @arg61= 1; | ||
|  | --enable_query_log | ||
|  | 
 | ||
|  | select 'ABC' as my_const_col FROM t1 WHERE | ||
|  | @arg00=@arg00 and @arg00=@arg00 and @arg00=@arg00 and @arg00=@arg00 and | ||
|  | @arg00=@arg00 and @arg00=@arg00 and @arg00=@arg00 and @arg00=@arg00 and | ||
|  | @arg00=@arg00 and @arg00=@arg00 and @arg00=@arg00 and @arg00=@arg00 and | ||
|  | @arg00=@arg00 and @arg00=@arg00 and @arg00=@arg00 and @arg00=@arg00 and | ||
|  | @arg00=@arg00 and @arg00=@arg00 and @arg00=@arg00 and @arg00=@arg00 and | ||
|  | @arg00=@arg00 and @arg00=@arg00 and @arg00=@arg00 and @arg00=@arg00 and | ||
|  | @arg00=@arg00 ; | ||
|  | prepare stmt1 from ' select ''ABC'' as my_const_col FROM t1 WHERE | ||
|  |  ? = ?  and  ? = ?  and  ? = ?  and  ? = ?  and | ||
|  |  ? = ?  and  ? = ?  and  ? = ?  and  ? = ?  and | ||
|  |  ? = ?  and  ? = ?  and  ? = ?  and  ? = ?  and | ||
|  |  ? = ?  and  ? = ?  and  ? = ?  and  ? = ?  and | ||
|  |  ? = ?  and  ? = ?  and  ? = ?  and  ? = ?  and | ||
|  |  ? = ?  and  ? = ?  and  ? = ?  and  ? = ?  and | ||
|  |  ? = ?  ' ; | ||
|  | execute stmt1 using  | ||
|  | @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,  | ||
|  | @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, | ||
|  | @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,  | ||
|  | @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,  | ||
|  | @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,  | ||
|  | @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,  | ||
|  | @arg00, @arg00; | ||
|  | execute stmt1 using  | ||
|  | @arg00, @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, @arg07,  | ||
|  | @arg10, @arg11, @arg12, @arg13, @arg14, @arg15, @arg16, @arg17, | ||
|  | @arg20, @arg21, @arg22, @arg23, @arg24, @arg25, @arg26, @arg27,  | ||
|  | @arg30, @arg31, @arg32, @arg33, @arg34, @arg35, @arg36, @arg37,  | ||
|  | @arg40, @arg41, @arg42, @arg43, @arg44, @arg45, @arg46, @arg47,  | ||
|  | @arg50, @arg51, @arg52, @arg53, @arg54, @arg55, @arg56, @arg57,  | ||
|  | @arg60, @arg61 ; | ||
|  | 
 | ||
|  | # cases derived from client_test.c: test_mem_overun() | ||
|  | --disable_warnings | ||
|  | drop table if exists t5 ; | ||
|  | --enable_warnings | ||
|  | 
 | ||
|  | set @col_num= 1000 ; | ||
|  | 
 | ||
|  | --disable_query_log | ||
|  | set @string= 'create table t5( ' ; | ||
|  | let $1=`select @col_num - 1` ; | ||
|  | while ($1) | ||
|  | { | ||
|  |   eval set @string= concat(@string, 'c$1 int,') ; | ||
|  |   dec $1 ; | ||
|  | } | ||
|  | set @string= concat(@string, 'c0 int)' ); | ||
|  | --enable_query_log | ||
|  | select @string as "" ; | ||
|  | prepare stmt1 from @string ; | ||
|  | execute stmt1 ; | ||
|  | 
 | ||
|  | --disable_query_log | ||
|  | set @string= 'insert into t5 values(' ; | ||
|  | let $1=`select @col_num - 1` ; | ||
|  | while ($1) | ||
|  | { | ||
|  |   eval set @string= concat(@string, '1 ,') ; | ||
|  |   dec $1 ; | ||
|  | } | ||
|  | eval set @string= concat(@string, '1 )') ; | ||
|  | --enable_query_log | ||
|  | select @string as "" ; | ||
|  | prepare stmt1 from @string ; | ||
|  | execute stmt1 ; | ||
|  | 
 | ||
|  | prepare stmt1 from ' select * from t5 ' ; | ||
|  | --enable_metadata | ||
|  | # prevent too long lines | ||
|  | --vertical_results | ||
|  | --disable_result_log | ||
|  | execute stmt1 ; | ||
|  | --enable_result_log | ||
|  | --disable_metadata | ||
|  | --horizontal_results | ||
|  | 
 | ||
|  | drop table t1, t5, t9; | ||
|  | 
 | ||
|  | ##### RULES OF THUMB TO PRESERVE THE SYSTEMATICS OF THE PS TEST CASES ##### | ||
|  | # | ||
|  | # 0. You  don't have the time to  | ||
|  | #    - read and pay attention to these rules of thumb | ||
|  | #    - accept that QA may move your test case to a different place | ||
|  | #      (I will not change your code!!) . | ||
|  | #    Please append your test case to | ||
|  | #        t/ps.test | ||
|  | # | ||
|  | # 1. You have more time and want to get as much value from you test case as | ||
|  | #    possible. Please try to make the following decisions: | ||
|  | # | ||
|  | #    Will the execution or result of the sub test case depend on the | ||
|  | #    properties of a storage engine ? | ||
|  | # | ||
|  | #      NO   --> alter t/ps_1general.test (Example: Command with syntax error) | ||
|  | #               If you need a table, please try to use | ||
|  | #               t1               - very simple table | ||
|  | #               t9 - table with nearly all available column types | ||
|  | #               whenever possible. | ||
|  | # | ||
|  | #               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' .  In ps_1general.test $type is set to 'MYISAM'. | ||
|  | #     | ||
|  | #               Please feel free to source ps_create.inc or ps_renew.inc | ||
|  | #               whenever you think it helps. But please restore the original | ||
|  | #               state of these tables after your tests, because the following | ||
|  | #               statements may depend on it. | ||
|  | # | ||
|  | #      YES | ||
|  | #       | | ||
|  | #       | | ||
|  | #    Is it possible to apply the sub test case to all table types ? | ||
|  | #      YES  --> alter include/ps_query.inc   (for SELECTs) | ||
|  | #                     include/ps_modify.inc  (for INSERT/UPDATE/DELETE) | ||
|  | #                     include/ps_modify1.inc (also for INSERT/UPDATE/DELETE, | ||
|  | #                                but t/ps_5merge.test will not source that file) | ||
|  | #               Please try to find an appropriate place within the file. | ||
|  | #               It would be nice if we have some systematics in the | ||
|  | #               order of the sub test cases (if possible). | ||
|  | # | ||
|  | #               Please be aware, that | ||
|  | #                  include: ps_query.inc, ps_modify.inc, ps_modify1.inc | ||
|  | #               will be sourced by several test case files stored within the  | ||
|  | #               subdirectory 't'. So every change here will affect several test | ||
|  | #               cases. | ||
|  | # | ||
|  | #      NO | ||
|  | #       | | ||
|  | #       | | ||
|  | #    Append the sub test case to the appropriate  | ||
|  | #                  ps_<number><table type>.test  . | ||
|  | # | ||
|  | # 2. The current structure of the PS tests | ||
|  | # | ||
|  | #    t/ps_1general.test     Check of basic PS features, SHOW commands and DDL | ||
|  | #                           The tests should not depend on the table type. | ||
|  | # | ||
|  | #    t/ps_2myisam           Check of PS on tables of type MYISAM . | ||
|  | #    t/ps_3innodb           Check of PS on tables of type InnoDB . | ||
|  | #    ... | ||
|  | #    t/ps_6bdb              Check of PS on tables of type BDB . | ||
|  | #         All storage engine related tests use the variable $type to hold the | ||
|  | #         name of the storage engine.         | ||
|  | # | ||
|  | #    include/ps_query.inc   test cases with SELECT/...  | ||
|  | #                           These test cases should not modify the content or | ||
|  | #                           the structure (DROP/ALTER..) of the tables | ||
|  | #                           't1' and 't9'. | ||
|  | #    include/ps_modify.inc  test cases with INSERT/UPDATE/...  | ||
|  | #                           These test cases should not modify the structure  | ||
|  | #                           (DROP/ALTER..) of the tables | ||
|  | #                           't1' and 't9'. | ||
|  | #         These two test sequences will be applied to all table types . | ||
|  | # | ||
|  | #    include/ps_modify1.inc test cases with INSERT/UPDATE/... | ||
|  | #         This test sequences will be applied to all table types  | ||
|  | #         except MERGE tables. | ||
|  | # | ||
|  | #    include/ps_create.inc  DROP and CREATE of the tables  | ||
|  | #                             't1' and 't9' . | ||
|  | #    include/ps_renew.inc   DELETE all rows and INSERT some rows, that means | ||
|  | #                           recreate the original content of these tables. | ||
|  | #         Please do not alter the commands concerning these two tables. | ||
|  | # | ||
|  | #  Please feel free and encouraged to exploit the current code sharing | ||
|  | #  mechanism of the 'ps_<number><table type>' test cases. It is an convenient | ||
|  | #  way to check all storage engines. | ||
|  | # | ||
|  | #  Thank you for reading these rules of thumb. | ||
|  | # | ||
|  | #     Matthias | ||
|  | 
 | ||
|  | # End of 4.1 tests |