776 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			PHP
		
	
	
	
		
		
			
		
	
	
			776 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			PHP
		
	
	
	
|  | ####################### ps_query.inc #########################
 | ||
|  | #                                                            #
 | ||
|  | #       Tests for prepared statements: SELECTs               #
 | ||
|  | #                                                            #
 | ||
|  | ##############################################################
 | ||
|  | 
 | ||
|  | #    
 | ||
|  | # 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 (INSERT/UPDATE/DELETE) the content or the 
 | ||
|  | # structure (DROP/ALTER..) of the tables
 | ||
|  | #     't1' and 't9'. 
 | ||
|  | # Such tests should be done in include/ps_modify.inc .
 | ||
|  | #
 | ||
|  | # But you are encouraged to use these two tables within your SELECT statements
 | ||
|  | # 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  ----------#
 | ||
|  | 
 | ||
|  | ################ simple select tests ################
 | ||
|  | --disable_query_log | ||
|  | select '------ simple select tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | 
 | ||
|  | ##### many column types, but no parameter
 | ||
|  | # heavy modified case derived from client_test.c: test_func_fields()
 | ||
|  | prepare stmt1 from ' select * from t9 order by c1 ' ; | ||
|  | --enable_metadata | ||
|  | execute stmt1; | ||
|  | --disable_metadata | ||
|  | 
 | ||
|  | ##### parameter used for keyword like SELECT (must fail)
 | ||
|  | set @arg00='SELECT' ; | ||
|  | --error 1064 | ||
|  | @arg00 a from t1 where a=1; | ||
|  | --error 1064 | ||
|  | prepare stmt1 from ' ? a from t1 where a=1 '; | ||
|  | 
 | ||
|  | ##### parameter in select column list
 | ||
|  | ## parameter is not NULL
 | ||
|  | set @arg00=1 ; | ||
|  | select @arg00, b from t1 where a=1 ; | ||
|  | prepare stmt1 from ' select ?, b from t1 where a=1 ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | set @arg00='lion' ; | ||
|  | select @arg00, b from t1 where a=1 ; | ||
|  | prepare stmt1 from ' select ?, b from t1 where a=1 ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | ## parameter is NULL
 | ||
|  | set @arg00=NULL ; | ||
|  | select @arg00, b from t1 where a=1 ; | ||
|  | prepare stmt1 from ' select ?, b from t1 where a=1 ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | ## parameter within an expression
 | ||
|  | set @arg00=1 ; | ||
|  | select b, a - @arg00 from t1 where a=1 ; | ||
|  | prepare stmt1 from ' select b, a - ? from t1 where a=1 ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | # case derived from client_test.c: test_ps_null_param()
 | ||
|  | set @arg00=null ; | ||
|  | select @arg00 as my_col ; | ||
|  | prepare stmt1 from ' select ? as my_col'; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | select @arg00 + 1 as my_col ; | ||
|  | prepare stmt1 from ' select ? + 1 as my_col'; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | select 1 + @arg00 as my_col ; | ||
|  | prepare stmt1 from ' select 1 + ? as my_col'; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | ## parameter is within a function
 | ||
|  | # variations on 'substr'
 | ||
|  | set @arg00='MySQL' ; | ||
|  | select substr(@arg00,1,2) from t1 where a=1 ; | ||
|  | prepare stmt1 from ' select substr(?,1,2) from t1 where a=1 ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | set @arg00=3 ; | ||
|  | select substr('MySQL',@arg00,5) from t1 where a=1 ; | ||
|  | prepare stmt1 from ' select substr(''MySQL'',?,5) from t1 where a=1 ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | select substr('MySQL',1,@arg00) from t1 where a=1 ; | ||
|  | prepare stmt1 from ' select substr(''MySQL'',1,?) from t1 where a=1 ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | # variations on 'concat'
 | ||
|  | set @arg00='MySQL' ; | ||
|  | select a , concat(@arg00,b) from t1 order by a; | ||
|  | # BUG#3796 Prepared statement, select concat(<parameter>,<column>),wrong result
 | ||
|  | prepare stmt1 from ' select a , concat(?,b) from t1 order by a ' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | #
 | ||
|  | select a , concat(b,@arg00) from t1 order by a ; | ||
|  | prepare stmt1 from ' select a , concat(b,?) from t1 order by a ' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | 
 | ||
|  | # variations on 'group_concat'
 | ||
|  | set @arg00='MySQL' ; | ||
|  | select group_concat(@arg00,b order by a) from t1  | ||
|  | group by 'a' ; | ||
|  | prepare stmt1 from ' select group_concat(?,b order by a) from t1 | ||
|  | group by ''a'' ' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | #
 | ||
|  | select group_concat(b,@arg00 order by a) from t1  | ||
|  | group by 'a' ; | ||
|  | prepare stmt1 from ' select group_concat(b,? order by a) from t1 | ||
|  | group by ''a'' ' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | 
 | ||
|  | ## two parameters
 | ||
|  | set @arg00='first' ; | ||
|  | set @arg01='second' ; | ||
|  | set @arg02=NULL; | ||
|  | select @arg00, @arg01 from t1 where a=1 ; | ||
|  | prepare stmt1 from ' select ?, ? from t1 where a=1 ' ; | ||
|  | execute stmt1 using @arg00, @arg01 ; | ||
|  | # NULL as first and/or last parameter 
 | ||
|  | execute stmt1 using @arg02, @arg01 ; | ||
|  | execute stmt1 using @arg00, @arg02 ; | ||
|  | execute stmt1 using @arg02, @arg02 ; | ||
|  | # case derived from client_test.c: test_ps_conj_select()
 | ||
|  | #      for BUG#3420: select returned all rows of the table
 | ||
|  | --disable_warnings | ||
|  | drop table if exists t5 ; | ||
|  | --enable_warnings | ||
|  | create table t5 (id1 int(11) not null default '0', | ||
|  |        value2 varchar(100), value1 varchar(100)) ; | ||
|  | insert into t5 values (1,'hh','hh'),(2,'hh','hh'), | ||
|  |                   (1,'ii','ii'),(2,'ii','ii') ; | ||
|  | prepare stmt1 from ' select id1,value1 from t5 where id1=? or value1=? order by id1,value1 ' ; | ||
|  | set @arg00=1 ; | ||
|  | set @arg01='hh' ; | ||
|  | execute stmt1 using @arg00, @arg01 ; | ||
|  | drop table t5 ; | ||
|  | # case derived from client_test.c: test_bug1180()
 | ||
|  | #      for BUG#1180 optimized away part of WHERE clause
 | ||
|  | --disable_warnings | ||
|  | drop table if exists t5 ; | ||
|  | --enable_warnings | ||
|  | create table t5(session_id  char(9) not null) ; | ||
|  | insert into t5 values ('abc') ; | ||
|  | prepare stmt1 from ' select * from t5 | ||
|  | where ?=''1111'' and session_id = ''abc'' ' ; | ||
|  | set @arg00='abc' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | set @arg00='1111' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | set @arg00='abc' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | drop table t5 ; | ||
|  | 
 | ||
|  | 
 | ||
|  | ##### parameter used for keyword FROM (must fail)
 | ||
|  | set @arg00='FROM' ; | ||
|  | --error 1064 | ||
|  | select a @arg00 t1 where a=1 ; | ||
|  | --error 1064 | ||
|  | prepare stmt1 from ' select a ? t1 where a=1 ' ; | ||
|  | ##### parameter used for tablename (must fail)
 | ||
|  | set @arg00='t1' ; | ||
|  | --error 1064 | ||
|  | select a from @arg00 where a=1 ; | ||
|  | --error 1064 | ||
|  | prepare stmt1 from ' select a from ? where a=1 ' ; | ||
|  | ##### parameter used for keyword WHERE tablename (must fail)
 | ||
|  | set @arg00='WHERE' ; | ||
|  | --error 1064 | ||
|  | select a from t1 @arg00 a=1 ; | ||
|  | --error 1064 | ||
|  | prepare stmt1 from ' select a from t1 ? a=1 ' ; | ||
|  | 
 | ||
|  | ##### parameter used in where clause
 | ||
|  | # parameter is not NULL
 | ||
|  | set @arg00=1 ; | ||
|  | select a FROM t1 where a=@arg00 ; | ||
|  | prepare stmt1 from ' select a FROM t1 where a=? ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | set @arg00=1000 ; | ||
|  | # row not found
 | ||
|  | execute stmt1 using @arg00 ; | ||
|  | # parameter is NULL
 | ||
|  | set @arg00=NULL ; | ||
|  | select a FROM t1 where a=@arg00 ; | ||
|  | prepare stmt1 from ' select a FROM t1 where a=? ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | # parameter is not NULL within a function
 | ||
|  | set @arg00=4 ; | ||
|  | select a FROM t1 where a=sqrt(@arg00) ; | ||
|  | prepare stmt1 from ' select a FROM t1 where a=sqrt(?) ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | # parameter is NULL within a function
 | ||
|  | set @arg00=NULL ; | ||
|  | select a FROM t1 where a=sqrt(@arg00) ; | ||
|  | prepare stmt1 from ' select a FROM t1 where a=sqrt(?) ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | # parameter in IN
 | ||
|  | set @arg00=2 ; | ||
|  | set @arg01=3 ; | ||
|  | select a FROM t1 where a in (@arg00,@arg01) order by a; | ||
|  | prepare stmt1 from ' select a FROM t1 where a in (?,?) order by a '; | ||
|  | execute stmt1 using @arg00, @arg01; | ||
|  | # case derived from client_test.c: test_bug1500()
 | ||
|  | set @arg00= 'one' ; | ||
|  | set @arg01= 'two' ; | ||
|  | set @arg02= 'five' ; | ||
|  | prepare stmt1 from ' select b FROM t1 where b in (?,?,?) order by b ' ; | ||
|  | execute stmt1 using @arg00, @arg01, @arg02 ; | ||
|  | # parameter in LIKE
 | ||
|  | prepare stmt1 from ' select b FROM t1 where b like ? '; | ||
|  | set @arg00='two' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | set @arg00='tw%' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | set @arg00='%wo' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | # case derived from client_test.c: test_ps_null_param():
 | ||
|  | # second part, comparisions with NULL placeholders in prepared
 | ||
|  | # mode
 | ||
|  | set @arg00=null ; | ||
|  | insert into t9 set c1= 0, c5 = NULL ; | ||
|  | select c5 from t9 where c5 > NULL ; | ||
|  | prepare stmt1 from ' select c5 from t9 where c5 > ? '; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | select c5 from t9 where c5 < NULL ; | ||
|  | prepare stmt1 from ' select c5 from t9 where c5 < ? '; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | select c5 from t9 where c5 = NULL ; | ||
|  | prepare stmt1 from ' select c5 from t9 where c5 = ? '; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | select c5 from t9 where c5 <=> NULL ; | ||
|  | prepare stmt1 from ' select c5 from t9 where c5 <=> ? '; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | delete from t9 where c1= 0 ; | ||
|  | 
 | ||
|  | ##### parameter used for operator in WHERE clause (must fail)
 | ||
|  | set @arg00='>' ; | ||
|  | --error 1064 | ||
|  | select a FROM t1 where a @arg00 1 ; | ||
|  | --error 1064 | ||
|  | prepare stmt1 from ' select a FROM t1 where a ? 1 ' ; | ||
|  | 
 | ||
|  | ##### parameter used in group by clause
 | ||
|  | set @arg00=1 ; | ||
|  | select a,b FROM t1 where a is not NULL | ||
|  | AND b is not NULL group by a - @arg00 ; | ||
|  | prepare stmt1 from ' select a,b FROM t1 where a is not NULL | ||
|  | AND b is not NULL group by a - ? ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | 
 | ||
|  | ##### parameter used in having clause
 | ||
|  | set @arg00='two' ; | ||
|  | select a,b FROM t1 where a is not NULL | ||
|  | AND b is not NULL having b <> @arg00 order by a ; | ||
|  | prepare stmt1 from ' select a,b FROM t1 where a is not NULL | ||
|  | AND b is not NULL having b <> ? order by a ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | 
 | ||
|  | ##### parameter used in order clause
 | ||
|  | set @arg00=1 ; | ||
|  | select a,b FROM t1 where a is not NULL | ||
|  | AND b is not NULL order by a - @arg00 ; | ||
|  | prepare stmt1 from ' select a,b FROM t1 where a is not NULL | ||
|  | AND b is not NULL order by a - ? ' ; | ||
|  | execute stmt1 using @arg00 ; | ||
|  | ## What is the semantic of a single parameter (integer >0)
 | ||
|  | #  after order by? column number or constant
 | ||
|  | set @arg00=2 ; | ||
|  | select a,b from t1 order by 2 ; | ||
|  | prepare stmt1 from ' select a,b from t1 | ||
|  | order by ? '; | ||
|  | execute stmt1 using @arg00; | ||
|  | set @arg00=1 ; | ||
|  | execute stmt1 using @arg00; | ||
|  | set @arg00=0 ; | ||
|  | --error 1054 | ||
|  | execute stmt1 using @arg00; | ||
|  | 
 | ||
|  | ##### parameter used in limit clause
 | ||
|  | set @arg00=1; | ||
|  | prepare stmt1 from ' select a,b from t1 order by a | ||
|  | limit 1 '; | ||
|  | execute stmt1 ; | ||
|  | prepare stmt1 from ' select a,b from t1 order by a limit ? '; | ||
|  | execute stmt1 using @arg00; | ||
|  | 
 | ||
|  | ##### parameter used in many places
 | ||
|  | set @arg00='b' ; | ||
|  | set @arg01=0 ; | ||
|  | set @arg02=2 ; | ||
|  | set @arg03=2 ; | ||
|  | select sum(a), @arg00 from t1 where a > @arg01 | ||
|  | and b is not null group by substr(b,@arg02) | ||
|  | having sum(a) <> @arg03 ; | ||
|  | prepare stmt1 from ' select sum(a), ? from t1 where a > ? | ||
|  | and b is not null group by substr(b,?) | ||
|  | having sum(a) <> ? '; | ||
|  | execute stmt1 using @arg00, @arg01, @arg02, @arg03; | ||
|  | 
 | ||
|  | 
 | ||
|  | ################ join tests ################
 | ||
|  | --disable_query_log | ||
|  | select '------ join tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | 
 | ||
|  | # no parameter
 | ||
|  | select first.a as a1, second.a as a2  | ||
|  | from t1 first, t1 second | ||
|  | where first.a = second.a order by a1 ; | ||
|  | prepare stmt1 from ' select first.a as a1, second.a as a2  | ||
|  |         from t1 first, t1 second | ||
|  |         where first.a = second.a order by a1 '; | ||
|  | execute stmt1 ; | ||
|  | 
 | ||
|  | # some parameters
 | ||
|  | set @arg00='ABC'; | ||
|  | set @arg01='two'; | ||
|  | set @arg02='one'; | ||
|  | select first.a, @arg00, second.a FROM t1 first, t1 second | ||
|  | where @arg01 = first.b or first.a = second.a or second.b = @arg02 | ||
|  | order by second.a, first.a; | ||
|  | prepare stmt1 from ' select first.a, ?, second.a FROM t1 first, t1 second | ||
|  |                     where ? = first.b or first.a = second.a or second.b = ? | ||
|  |                     order by second.a, first.a'; | ||
|  | execute stmt1 using @arg00, @arg01, @arg02; | ||
|  | 
 | ||
|  | # test case derived from client_test.c: test_join()
 | ||
|  | --disable_warnings | ||
|  | drop table if exists t2 ; | ||
|  | --enable_warnings | ||
|  | create table t2 as select * from t1 ; | ||
|  | set @query1= 'SELECT * FROM t2 join t1 on (t1.a=t2.a) order by t2.a ' ; | ||
|  | set @query2= 'SELECT * FROM t2 natural join t1 order by t2.a ' ; | ||
|  | set @query3= 'SELECT * FROM t2 join t1 using(a) order by t2.a ' ; | ||
|  | set @query4= 'SELECT * FROM t2 left join t1 on(t1.a=t2.a) order by t2.a ' ; | ||
|  | set @query5= 'SELECT * FROM t2 natural left join t1 order by t2.a ' ; | ||
|  | set @query6= 'SELECT * FROM t2 left join t1 using(a) order by t2.a ' ; | ||
|  | set @query7= 'SELECT * FROM t2 right join t1 on(t1.a=t2.a) order by t2.a ' ; | ||
|  | set @query8= 'SELECT * FROM t2 natural right join t1 order by t2.a ' ; | ||
|  | set @query9= 'SELECT * FROM t2 right join t1 using(a) order by t2.a ' ; | ||
|  | let $1= 9 ; | ||
|  | while ($1) | ||
|  | { | ||
|  |   --disable_query_log | ||
|  |   eval select @query$1 as 'the join statement is:' ; | ||
|  |   --enable_query_log | ||
|  |   eval prepare stmt1 from @query$1 ; | ||
|  |   let $2= 3 ; | ||
|  |   while ($2) | ||
|  |   { | ||
|  |     execute stmt1 ; | ||
|  |     dec $2 ; | ||
|  |   } | ||
|  |   dec $1 ; | ||
|  | } | ||
|  | drop table t2 ; | ||
|  | 
 | ||
|  | 
 | ||
|  | ################ subquery tests ################
 | ||
|  | --disable_query_log | ||
|  | select '------ subquery tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | 
 | ||
|  | # no parameter
 | ||
|  | prepare stmt1 from ' select a, b FROM t1 outer_table where | ||
|  |    a = (select a from t1 where b = ''two'') '; | ||
|  | execute stmt1 ; | ||
|  | 
 | ||
|  | ###### parameter in the outer part
 | ||
|  | set @arg00='two' ; | ||
|  | select a, b FROM t1 outer_table where | ||
|  |    a = (select a from t1 where b = 'two' ) and b=@arg00 ; | ||
|  | prepare stmt1 from ' select a, b FROM t1 outer_table where | ||
|  |    a = (select a from t1 where b = ''two'') and b=? '; | ||
|  | execute stmt1 using @arg00; | ||
|  | ###### parameter in the inner part
 | ||
|  | set @arg00='two' ; | ||
|  | # Bug#4000 (only BDB tables)
 | ||
|  | select a, b FROM t1 outer_table where | ||
|  |    a = (select a from t1 where b = @arg00 ) and b='two' ; | ||
|  | prepare stmt1 from ' select a, b FROM t1 outer_table where | ||
|  |    a = (select a from t1 where b = ? ) and b=''two'' ' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | set @arg00=3 ; | ||
|  | set @arg01='three' ; | ||
|  | select a,b FROM t1 where (a,b) in (select 3, 'three'); | ||
|  | select a FROM t1 where (a,b) in (select @arg00,@arg01); | ||
|  | prepare stmt1 from ' select a FROM t1 where (a,b) in (select ?, ?) '; | ||
|  | execute stmt1 using @arg00, @arg01; | ||
|  | 
 | ||
|  | ###### parameters in the both parts
 | ||
|  | set @arg00=1 ; | ||
|  | set @arg01='two' ; | ||
|  | set @arg02=2 ; | ||
|  | set @arg03='two' ; | ||
|  | # Bug#4000 (only BDB tables)
 | ||
|  | select a, @arg00, b FROM t1 outer_table where | ||
|  |    b=@arg01 and a = (select @arg02 from t1 where b = @arg03 ) ; | ||
|  | prepare stmt1 from ' select a, ?, b FROM t1 outer_table where | ||
|  |    b=? and a = (select ? from t1 where b = ? ) ' ; | ||
|  | execute stmt1 using @arg00, @arg01, @arg02, @arg03 ; | ||
|  | 
 | ||
|  | # Bug#8807
 | ||
|  | prepare stmt1 from 'select c4 FROM t9 where | ||
|  |     c13 = (select MAX(b) from t1 where a = ?) and c22 = ? ' ; | ||
|  | execute stmt1 using @arg01, @arg02; | ||
|  | 
 | ||
|  | ######## correlated subquery
 | ||
|  | # no parameter
 | ||
|  | prepare stmt1 from ' select a, b FROM t1 outer_table where | ||
|  |    a = (select a from t1 where b = outer_table.b ) order by a '; | ||
|  | # also Bug#4000 (only BDB tables)
 | ||
|  | # Bug#4106 : ndb table, query with correlated subquery, wrong result
 | ||
|  | execute stmt1 ; | ||
|  | # test case derived from client_test.c: test_subqueries_ref
 | ||
|  | let $1= 3 ; | ||
|  | while ($1) | ||
|  | { | ||
|  |   prepare stmt1 from ' SELECT a as ccc from t1 outr where a+1= | ||
|  |                            (SELECT 1+outr.a from t1 where outr.a+1=a+1 and a=1) '; | ||
|  |   execute stmt1 ; | ||
|  |   deallocate prepare stmt1 ; | ||
|  |   dec $1 ; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | ###### parameter in the outer part
 | ||
|  | set @arg00='two' ; | ||
|  | # Bug#4000 (only BDB tables)
 | ||
|  | select a, b FROM t1 outer_table where | ||
|  |    a = (select a from t1 where b = outer_table.b ) and b=@arg00 ; | ||
|  | prepare stmt1 from ' select a, b FROM t1 outer_table where | ||
|  |    a = (select a from t1 where b = outer_table.b) and b=? '; | ||
|  | # also Bug#4000 (only BDB tables)
 | ||
|  | execute stmt1 using @arg00; | ||
|  | 
 | ||
|  | ###### parameter in the inner part
 | ||
|  | set @arg00=2 ; | ||
|  | select a, b FROM t1 outer_table where | ||
|  |    a = (select a from t1 where a = @arg00 and b = outer_table.b) and b='two' ; | ||
|  | prepare stmt1 from ' select a, b FROM t1 outer_table where | ||
|  |    a = (select a from t1 where a = ? and b = outer_table.b) and b=''two'' ' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | 
 | ||
|  | set @arg00=2 ; | ||
|  | select a, b FROM t1 outer_table where | ||
|  |    a = (select a from t1 where outer_table.a = @arg00 and a=2) and b='two' ; | ||
|  | prepare stmt1 from ' select a, b FROM t1 outer_table where | ||
|  |    a = (select a from t1 where outer_table.a = ? and a=2) and b=''two'' ' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | 
 | ||
|  | ###### parameters in the both parts
 | ||
|  | set @arg00=1 ; | ||
|  | set @arg01='two' ; | ||
|  | set @arg02=2 ; | ||
|  | set @arg03='two' ; | ||
|  | # Bug#4000 (only BDB tables)
 | ||
|  | select a, @arg00, b FROM t1 outer_table where | ||
|  |    b=@arg01 and a = (select @arg02 from t1 where outer_table.b = @arg03 | ||
|  |                         and outer_table.a=a ) ; | ||
|  | prepare stmt1 from ' select a, ?, b FROM t1 outer_table where | ||
|  |    b=? and a = (select ? from t1 where outer_table.b = ?  | ||
|  |                    and outer_table.a=a ) ' ; | ||
|  | # also Bug#4000 (only BDB tables)
 | ||
|  | execute stmt1 using @arg00, @arg01, @arg02, @arg03 ; | ||
|  | 
 | ||
|  | ###### subquery after from
 | ||
|  | set @arg00=1 ; | ||
|  | set @arg01=0 ; | ||
|  | select a, @arg00  | ||
|  | from ( select a - @arg00 as a from t1 where a=@arg00 ) as t2 | ||
|  | where a=@arg01; | ||
|  | prepare stmt1 from ' select a, ?  | ||
|  |                     from ( select a - ? as a from t1 where a=? ) as t2 | ||
|  |                     where a=? '; | ||
|  | execute stmt1 using @arg00, @arg00, @arg00, @arg01 ; | ||
|  | 
 | ||
|  | ###### subquery  in select list
 | ||
|  | # test case derived from client_test.c: test_create_drop
 | ||
|  | --disable_warnings | ||
|  | drop table if exists t2 ; | ||
|  | --enable_warnings | ||
|  | create table t2 as select * from t1; | ||
|  | prepare stmt1 from ' select a in (select a from t2) from t1 ' ; | ||
|  | execute stmt1 ; | ||
|  | # test case derived from client_test.c: test_selecttmp()
 | ||
|  | --disable_warnings | ||
|  | drop table if exists t5, t6, t7 ; | ||
|  | --enable_warnings | ||
|  | create table t5 (a int , b int) ; | ||
|  | create table t6 like t5 ; | ||
|  | create table t7 like t5 ; | ||
|  | insert into t5 values (0, 100), (1, 2), (1, 3), (2, 2), (2, 7), | ||
|  |                       (2, -1), (3, 10) ; | ||
|  | insert into t6 values (0, 0), (1, 1), (2, 1), (3, 1), (4, 1) ; | ||
|  | insert into t7 values (3, 3), (2, 2), (1, 1) ; | ||
|  | prepare stmt1 from ' select a, (select count(distinct t5.b) as sum from t5, t6 | ||
|  |                      where t5.a=t6.a and t6.b > 0 and t5.a <= t7.b | ||
|  |                      group by t5.a order by sum limit 1) from t7 ' ; | ||
|  | let $1= 3 ; | ||
|  | while ($1) | ||
|  | { | ||
|  |   execute stmt1 ; | ||
|  |   dec $1 ; | ||
|  | } | ||
|  | drop table t5, t6, t7 ; | ||
|  | 
 | ||
|  | 
 | ||
|  | ###### heavy modified case derived from client_test.c: test_distinct()
 | ||
|  | --disable_warnings | ||
|  | drop table if exists t2 ; | ||
|  | --enable_warnings | ||
|  | create table t2 as select * from t9; | ||
|  | ## unusual and complex SELECT without parameters
 | ||
|  | set @stmt= ' SELECT | ||
|  |    (SELECT SUM(c1 + c12 + 0.0) FROM t2  | ||
|  |     where (t9.c2 - 0e-3) = t2.c2 | ||
|  |     GROUP BY t9.c15 LIMIT 1) as scalar_s, | ||
|  |    exists (select 1.0e+0 from t2  | ||
|  |            where t2.c3 * 9.0000000000 = t9.c4) as exists_s, | ||
|  |    c5 * 4 in (select c6 + 0.3e+1 from t2) as in_s, | ||
|  |    (c7 - 4, c8 - 4) in (select c9 + 4.0, c10 + 40e-1 from t2) as in_row_s | ||
|  | FROM t9, | ||
|  | (select c25 x, c32 y from t2) tt WHERE x = c25 ' ; | ||
|  | --enable_metadata | ||
|  | prepare stmt1 from @stmt ; | ||
|  | #
 | ||
|  | # Result log was disabled upon test case failure in the optimized build.
 | ||
|  | #
 | ||
|  | --disable_result_log | ||
|  | execute stmt1 ; | ||
|  | --disable_metadata | ||
|  | execute stmt1 ; | ||
|  | ## now expand the terrible SELECT to EXPLAIN SELECT
 | ||
|  | set @stmt= concat('explain ',@stmt); | ||
|  | --enable_metadata | ||
|  | prepare stmt1 from @stmt ; | ||
|  | execute stmt1 ; | ||
|  | --disable_metadata | ||
|  | # Bug#4271 prepared explain complex select, second executes crashes the server
 | ||
|  | execute stmt1 ; | ||
|  | ## many parameters
 | ||
|  | ## replace the constants of the complex SELECT with parameters
 | ||
|  | set @stmt= ' SELECT | ||
|  |    (SELECT SUM(c1+c12+?) FROM t2 where (t9.c2-?)=t2.c2 | ||
|  |     GROUP BY t9.c15 LIMIT 1) as scalar_s, | ||
|  |    exists (select ? from t2  | ||
|  |            where t2.c3*?=t9.c4) as exists_s, | ||
|  |    c5*? in (select c6+? from t2) as in_s, | ||
|  |    (c7-?, c8-?) in (select c9+?, c10+? from t2) as in_row_s | ||
|  | FROM t9, | ||
|  | (select c25 x, c32 y from t2) tt WHERE x =c25 ' ; | ||
|  | set @arg00= 0.0 ; | ||
|  | set @arg01= 0e-3 ; | ||
|  | set @arg02= 1.0e+0 ; | ||
|  | set @arg03= 9.0000000000 ; | ||
|  | set @arg04= 4 ; | ||
|  | set @arg05= 0.3e+1 ; | ||
|  | set @arg06= 4 ; | ||
|  | set @arg07= 4 ; | ||
|  | set @arg08= 4.0 ; | ||
|  | set @arg09= 40e-1 ; | ||
|  | --enable_metadata | ||
|  | prepare stmt1 from @stmt ; | ||
|  | execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, | ||
|  |                     @arg07, @arg08, @arg09 ; | ||
|  | --disable_metadata | ||
|  | execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, | ||
|  |                     @arg07, @arg08, @arg09 ; | ||
|  | ## now expand the terrible SELECT to EXPLAIN SELECT
 | ||
|  | set @stmt= concat('explain ',@stmt); | ||
|  | --enable_metadata | ||
|  | prepare stmt1 from @stmt ; | ||
|  | execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, | ||
|  |                     @arg07, @arg08, @arg09 ; | ||
|  | --disable_metadata | ||
|  | execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04, @arg05, @arg06, | ||
|  |                     @arg07, @arg08, @arg09 ; | ||
|  | --enable_result_log | ||
|  | drop table t2 ; | ||
|  | 
 | ||
|  | 
 | ||
|  | ##### test case derived from client_test.c: test_bug4079()
 | ||
|  | --error 1242 | ||
|  | select 1 < (select a from t1) ; | ||
|  | prepare stmt1 from ' select 1 < (select a from t1) ' ; | ||
|  | --error 1242 | ||
|  | execute stmt1 ; | ||
|  | # Bug#5066 embedded server, select after failed subquery provides wrong result
 | ||
|  | #          (two additional records, all column values NULL)
 | ||
|  | select 1 as my_col ; | ||
|  | 
 | ||
|  | ################ union tests ################
 | ||
|  | --disable_query_log | ||
|  | select '------ union tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | 
 | ||
|  | # no parameter
 | ||
|  | prepare stmt1 from ' select a FROM t1 where a=1 | ||
|  |                      union distinct | ||
|  |                      select a FROM t1 where a=1 '; | ||
|  | execute stmt1 ; | ||
|  | # Bug#3577: the second execute crashes mysqld
 | ||
|  | execute stmt1 ; | ||
|  | prepare stmt1 from ' select a FROM t1 where a=1 | ||
|  |                      union all | ||
|  |                      select a FROM t1 where a=1 '; | ||
|  | execute stmt1 ; | ||
|  | # test case derived from client_test.c: test_bad_union()
 | ||
|  | --error 1222 | ||
|  | prepare stmt1 from ' SELECT 1, 2 union SELECT 1 ' ; | ||
|  | --error 1222 | ||
|  | prepare stmt1 from ' SELECT 1 union SELECT 1, 2 ' ; | ||
|  | --error 1222 | ||
|  | prepare stmt1 from ' SELECT * from t1 union SELECT 1 ' ; | ||
|  | --error 1222 | ||
|  | prepare stmt1 from ' SELECT 1 union SELECT * from t1 ' ; | ||
|  | 
 | ||
|  | 
 | ||
|  | ##### everything in the first table
 | ||
|  | # one parameter as constant in the first table
 | ||
|  | set @arg00=1 ; | ||
|  | select @arg00 FROM t1 where a=1 | ||
|  | union distinct | ||
|  | select 1 FROM t1 where a=1; | ||
|  | prepare stmt1 from ' select ? FROM t1 where a=1 | ||
|  |                      union distinct | ||
|  |                      select 1 FROM t1 where a=1 ' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | 
 | ||
|  | ##### everything in the second table
 | ||
|  | # one parameter as constant
 | ||
|  | set @arg00=1 ; | ||
|  | select 1 FROM t1 where a=1 | ||
|  | union distinct | ||
|  | select @arg00 FROM t1 where a=1; | ||
|  | prepare stmt1 from ' select 1 FROM t1 where a=1 | ||
|  |                      union distinct | ||
|  |                      select ? FROM t1 where a=1 ' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | 
 | ||
|  | # one parameter in every table
 | ||
|  | set @arg00='a' ; | ||
|  | select @arg00 FROM t1 where a=1 | ||
|  | union distinct | ||
|  | select @arg00 FROM t1 where a=1; | ||
|  | prepare stmt1 from ' select ? FROM t1 where a=1 | ||
|  |                      union distinct | ||
|  |                      select ? FROM t1 where a=1 '; | ||
|  | # BUG#3811 wrong result, prepared statement, union, 
 | ||
|  | # parameter in result column list
 | ||
|  | execute stmt1 using @arg00, @arg00; | ||
|  | prepare stmt1 from ' select ?  | ||
|  |                      union distinct | ||
|  |                      select ? '; | ||
|  | execute stmt1 using @arg00, @arg00; | ||
|  | 
 | ||
|  | # many parameters
 | ||
|  | set @arg00='a' ; | ||
|  | set @arg01=1 ; | ||
|  | set @arg02='a' ; | ||
|  | set @arg03=2 ; | ||
|  | select @arg00 FROM t1 where a=@arg01 | ||
|  | union distinct | ||
|  | select @arg02 FROM t1 where a=@arg03; | ||
|  | prepare stmt1 from ' select ? FROM t1 where a=? | ||
|  |                      union distinct | ||
|  |                      select ? FROM t1 where a=? ' ; | ||
|  | execute stmt1 using @arg00, @arg01, @arg02, @arg03; | ||
|  | 
 | ||
|  | ## increased complexity
 | ||
|  | 
 | ||
|  | set @arg00=1 ; | ||
|  | # Bug#3686 the wrong server response was 1140 Mixing of GROUP columns ..
 | ||
|  | prepare stmt1 from ' select sum(a) + 200, ? from t1 | ||
|  | union distinct | ||
|  | select sum(a) + 200, 1 from t1 | ||
|  | group by b ' ; | ||
|  | execute stmt1 using @arg00; | ||
|  | 
 | ||
|  | set @Oporto='Oporto' ; | ||
|  | set @Lisboa='Lisboa' ; | ||
|  | set @0=0 ; | ||
|  | set @1=1 ; | ||
|  | set @2=2 ; | ||
|  | set @3=3 ; | ||
|  | set @4=4 ; | ||
|  | select @Oporto,@Lisboa,@0,@1,@2,@3,@4 ; | ||
|  | 
 | ||
|  | ## union + group by
 | ||
|  | select sum(a) + 200 as the_sum, @Oporto as the_town from t1 | ||
|  | group by b | ||
|  | union distinct | ||
|  | select sum(a) + 200, @Lisboa from t1 | ||
|  | group by b ; | ||
|  | 
 | ||
|  | prepare stmt1 from ' select sum(a) + 200 as the_sum, ? as the_town from t1 | ||
|  |                      group by b | ||
|  |                      union distinct | ||
|  |                      select sum(a) + 200, ? from t1 | ||
|  |                      group by b ' ; | ||
|  | execute stmt1 using @Oporto, @Lisboa; | ||
|  | 
 | ||
|  | 
 | ||
|  | ## union + where + group by
 | ||
|  | select sum(a) + 200 as the_sum, @Oporto as the_town from t1 | ||
|  | where a > @1 | ||
|  | group by b | ||
|  | union distinct | ||
|  | select sum(a) + 200, @Lisboa from t1 | ||
|  | where a > @2 | ||
|  | group by b ; | ||
|  | 
 | ||
|  | prepare stmt1 from ' select sum(a) + 200 as the_sum, ? as the_town from t1 | ||
|  |                      where a > ? | ||
|  |                      group by b | ||
|  |                      union distinct | ||
|  |                      select sum(a) + 200, ? from t1 | ||
|  |                      where a > ? | ||
|  |                      group by b ' ; | ||
|  | execute stmt1 using @Oporto, @1, @Lisboa, @2; | ||
|  | 
 | ||
|  | ## union + where + group by + having
 | ||
|  | select sum(a) + 200 as the_sum, @Oporto as the_town from t1 | ||
|  | where a > @1 | ||
|  | group by b | ||
|  | having avg(a) > @2 | ||
|  | union distinct | ||
|  | select sum(a) + 200, @Lisboa from t1 | ||
|  | where a > @2 | ||
|  | group by b  | ||
|  | having avg(a) > @3; | ||
|  | 
 | ||
|  | prepare stmt1 from ' select sum(a) + 200 as the_sum, ? as the_town from t1 | ||
|  |                      where a > ? | ||
|  |                      group by b | ||
|  |                      having avg(a) > ? | ||
|  |                      union distinct | ||
|  |                      select sum(a) + 200, ? from t1 | ||
|  |                      where a > ? | ||
|  |                      group by b | ||
|  |                      having avg(a) > ? '; | ||
|  | execute stmt1 using @Oporto, @1, @2, @Lisboa, @2, @3; | ||
|  | 
 | ||
|  | 
 | ||
|  | ################ explain select tests ################
 | ||
|  | --disable_query_log | ||
|  | select '------ explain select tests ------' as test_sequence ; | ||
|  | --enable_query_log | ||
|  | --disable_metadata | ||
|  | # table with many column types
 | ||
|  | prepare stmt1 from ' explain select * from t9 ' ; | ||
|  | --enable_metadata | ||
|  | execute stmt1; | ||
|  | --disable_metadata | ||
|  | 
 | ||
|  | 
 |