📄 ps_query.inc
字号:
####################### 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_logselect '------ 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_metadataexecute stmt1;--disable_metadata##### parameter used for keyword like SELECT (must fail)set @arg00='SELECT' ;--error 1064@arg00 a from t1 where a=1;--error 1064prepare stmt1 from ' ? a from t1 where a=1 ';##### parameter in select column list## parameter is not NULLset @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 NULLset @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 expressionset @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 resultprepare 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 t1group 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 t1group by ''a'' ' ;execute stmt1 using @arg00;## two parametersset @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_warningsdrop table if exists t5 ;--enable_warningscreate 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_warningsdrop table if exists t5 ;--enable_warningscreate table t5(session_id char(9) not null) ;insert into t5 values ('abc') ;prepare stmt1 from ' select * from t5where ?=''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 1064select a @arg00 t1 where a=1 ;--error 1064prepare stmt1 from ' select a ? t1 where a=1 ' ;##### parameter used for tablename (must fail)set @arg00='t1' ;--error 1064select a from @arg00 where a=1 ;--error 1064prepare stmt1 from ' select a from ? where a=1 ' ;##### parameter used for keyword WHERE tablename (must fail)set @arg00='WHERE' ;--error 1064select a from t1 @arg00 a=1 ;--error 1064prepare stmt1 from ' select a from t1 ? a=1 ' ;##### parameter used in where clause# parameter is not NULLset @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 foundexecute stmt1 using @arg00 ;# parameter is NULLset @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 functionset @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 functionset @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 INset @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 LIKEprepare 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# modeset @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 1064select a FROM t1 where a @arg00 1 ;--error 1064prepare stmt1 from ' select a FROM t1 where a ? 1 ' ;##### parameter used in group by clauseset @arg00=1 ;select a,b FROM t1 where a is not NULLAND b is not NULL group by a - @arg00 ;prepare stmt1 from ' select a,b FROM t1 where a is not NULLAND b is not NULL group by a - ? ' ;execute stmt1 using @arg00 ;##### parameter used in having clauseset @arg00='two' ;select a,b FROM t1 where a is not NULLAND b is not NULL having b <> @arg00 order by a ;prepare stmt1 from ' select a,b FROM t1 where a is not NULLAND b is not NULL having b <> ? order by a ' ;execute stmt1 using @arg00 ;##### parameter used in order clauseset @arg00=1 ;select a,b FROM t1 where a is not NULLAND b is not NULL order by a - @arg00 ;prepare stmt1 from ' select a,b FROM t1 where a is not NULLAND 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 constantset @arg00=2 ;select a,b from t1 order by 2 ;prepare stmt1 from ' select a,b from t1order by ? ';execute stmt1 using @arg00;set @arg00=1 ;execute stmt1 using @arg00;set @arg00=0 ;--error 1054execute stmt1 using @arg00;##### parameter used in limit clauseset @arg00=1;prepare stmt1 from ' select a,b from t1 order by alimit 1 ';execute stmt1 ;prepare stmt1 from ' select a,b from t1 order by a limit ? ';execute stmt1 using @arg00;##### parameter used in many placesset @arg00='b' ;set @arg01=0 ;set @arg02=2 ;set @arg03=2 ;select sum(a), @arg00 from t1 where a > @arg01and 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_logselect '------ join tests ------' as test_sequence ;--enable_query_log# no parameterselect first.a as a1, second.a as a2 from t1 first, t1 secondwhere 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 parametersset @arg00='ABC';set @arg01='two';set @arg02='one';select first.a, @arg00, second.a FROM t1 first, t1 secondwhere @arg01 = first.b or first.a = second.a or second.b = @arg02order 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_warningsdrop table if exists t2 ;--enable_warningscreate 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_logselect '------ subquery tests ------' as test_sequence ;--enable_query_log# no parameterprepare stmt1 from ' select a, b FROM t1 outer_table where a = (select a from t1 where b = ''two'') ';execute stmt1 ;###### parameter in the outer partset @arg00='two' ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -