diff options
author | monty@mysql.com <> | 2004-07-07 11:29:39 +0300 |
---|---|---|
committer | monty@mysql.com <> | 2004-07-07 11:29:39 +0300 |
commit | 1e311999950833cd81ca0788cd3656585c46d9ae (patch) | |
tree | ca8974710746bb69b04a49bc64f938d0b1a8420a /mysql-test/include | |
parent | 24a8dc2337a717ff340bac228383ef04437a4666 (diff) | |
parent | 8462b8aeb83355fa6c5cb4f45ea0ed63ba9e0712 (diff) | |
download | mariadb-git-1e311999950833cd81ca0788cd3656585c46d9ae.tar.gz |
Merge with 4.1.3-beta
Diffstat (limited to 'mysql-test/include')
-rw-r--r-- | mysql-test/include/have_archive.inc | 4 | ||||
-rw-r--r-- | mysql-test/include/have_debug.inc | 4 | ||||
-rw-r--r-- | mysql-test/include/have_geometry.inc | 4 | ||||
-rw-r--r-- | mysql-test/include/ps_create.inc | 29 | ||||
-rw-r--r-- | mysql-test/include/ps_modify.inc | 207 | ||||
-rw-r--r-- | mysql-test/include/ps_modify1.inc | 60 | ||||
-rw-r--r-- | mysql-test/include/ps_query.inc | 587 | ||||
-rw-r--r-- | mysql-test/include/ps_renew.inc | 34 |
8 files changed, 929 insertions, 0 deletions
diff --git a/mysql-test/include/have_archive.inc b/mysql-test/include/have_archive.inc new file mode 100644 index 00000000000..f7fb942e83e --- /dev/null +++ b/mysql-test/include/have_archive.inc @@ -0,0 +1,4 @@ +-- require r/have_archive.require +disable_query_log; +show variables like "have_archive"; +enable_query_log; diff --git a/mysql-test/include/have_debug.inc b/mysql-test/include/have_debug.inc new file mode 100644 index 00000000000..ff59037b6eb --- /dev/null +++ b/mysql-test/include/have_debug.inc @@ -0,0 +1,4 @@ +-- require r/have_debug.require +disable_query_log; +select (version() like "%debug%") as debug; +enable_query_log; diff --git a/mysql-test/include/have_geometry.inc b/mysql-test/include/have_geometry.inc new file mode 100644 index 00000000000..169c3a41ee7 --- /dev/null +++ b/mysql-test/include/have_geometry.inc @@ -0,0 +1,4 @@ +-- require r/have_geometry.require +disable_query_log; +show variables like "have_geometry"; +enable_query_log; diff --git a/mysql-test/include/ps_create.inc b/mysql-test/include/ps_create.inc new file mode 100644 index 00000000000..7c457572d61 --- /dev/null +++ b/mysql-test/include/ps_create.inc @@ -0,0 +1,29 @@ +############### include/ps_create.inc ################## +# # +# drop + create the tables used in most PS test cases # +# # +######################################################## + +--disable_warnings +drop table if exists t1, t_many_col_types ; +--enable_warnings + +eval create table t1 +( + a int, b varchar(30), + primary key(a) +) engine = $type ; + +eval create table t_many_col_types +( + c1 tinyint, c2 smallint, c3 mediumint, c4 int, + c5 integer, c6 bigint, c7 float, c8 double, + c9 double precision, c10 real, c11 decimal(7, 4), c12 numeric(8, 4), + c13 date, c14 datetime, c15 timestamp(14), c16 time, + c17 year, c18 bit, c19 bool, c20 char, + c21 char(10), c22 varchar(30), c23 tinyblob, c24 tinytext, + c25 blob, c26 text, c27 mediumblob, c28 mediumtext, + c29 longblob, c30 longtext, c31 enum('one', 'two', 'three'), + c32 set('monday', 'tuesday', 'wednesday'), + primary key(c1) +) engine = $type ; diff --git a/mysql-test/include/ps_modify.inc b/mysql-test/include/ps_modify.inc new file mode 100644 index 00000000000..85e9690cf04 --- /dev/null +++ b/mysql-test/include/ps_modify.inc @@ -0,0 +1,207 @@ +###################### ps_modify.inc ######################### +# # +# Tests for prepared statements: INSERT/DELETE/UPDATE... # +# # +############################################################## + +--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 +--error 1295 +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; +set @arg00=0; +execute stmt1 using @arg01, @arg00; +select a,b from t1; + +## 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 +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 = ?)'; +execute stmt1 using @arg00, @arg01, @arg02, @arg03, @arg04 ; +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 = ?)'; +execute stmt1 using @arg04, @arg01, @arg02, @arg03, @arg00 ; +select a,b from t1 ; +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' ; +# currently (May 2004, Version 4.1) it is impossible +-- error 1064 +prepare stmt1 from 'update t1 set b=''bla'' +where a=2 +limit ?'; + +--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 1062 +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; + +## 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; +set @arg00=81 ; +set @arg01=1 ; +--error 1062 +execute stmt1 using @arg00, @arg01; + +## 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 ; +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 ; +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 ; +delete from t1 where a >= 1000 ; + +## replace +--error 1295 +prepare stmt1 from ' replace into t1 (a,b) select 100, ''hundred'' '; diff --git a/mysql-test/include/ps_modify1.inc b/mysql-test/include/ps_modify1.inc new file mode 100644 index 00000000000..3608e726648 --- /dev/null +++ b/mysql-test/include/ps_modify1.inc @@ -0,0 +1,60 @@ +###################### ps_modify1.inc ######################## +# # +# Tests for prepared statements: big INSERT .. SELECTs # +# # +############################################################## + +## big insert select statements +set @duplicate='duplicate ' ; +set @1000=1000 ; +set @5=5 ; +select a,b from t1 where a < 5 ; +--enable_info +insert into t1 select a + @1000, concat(@duplicate,b) from t1 +where a < @5 ; +--disable_info +select a,b from t1 where a >= 1000 ; +delete from t1 where a >= 1000 ; +prepare stmt1 from ' insert into t1 select a + ?, concat(?,b) from t1 +where a < ? ' ; +--enable_info +execute stmt1 using @1000, @duplicate, @5; +--disable_info +select a,b from t1 where a >= 1000 ; +delete from t1 where a >= 1000 ; + +set @float=1.00; +set @five='five' ; +--disable_warnings +drop table if exists t2; +--enable_warnings +create table t2 like t1 ; +--enable_info +insert into t2 (b,a) +select @duplicate, sum(first.a) from t1 first, t1 second + where first.a <> @5 and second.b = first.b + and second.b <> @five + group by second.b + having sum(second.a) > @2 +union +select b, a + @100 from t1 + where (a,b) in ( select sqrt(a+@1)+CAST(@float AS signed),b + from t1); +--disable_info +select a,b from t2; +delete from t2 ; +prepare stmt1 from ' insert into t2 (b,a) +select ?, sum(first.a) + from t1 first, t1 second + where first.a <> ? and second.b = first.b and second.b <> ? + group by second.b + having sum(second.a) > ? +union +select b, a + ? from t1 + where (a,b) in ( select sqrt(a+?)+CAST(? AS signed),b + from t1 ) ' ; +--enable_info +execute stmt1 using @duplicate, @5, @five, @2, @100, @1, @float ; +--disable_info +select a,b from t2; +drop table t2; diff --git a/mysql-test/include/ps_query.inc b/mysql-test/include/ps_query.inc new file mode 100644 index 00000000000..819ec4add06 --- /dev/null +++ b/mysql-test/include/ps_query.inc @@ -0,0 +1,587 @@ +####################### ps_query.inc ######################### +# # +# Tests for prepared statements: SELECTs # +# # +############################################################## + + +# Please do not modify (INSERT/UPDATE/DELETE) the content of the tables +# t1 and t_many_col_types. +# Such tests should be done in include/ps_modify.inc + +--disable_query_log +select '------ simple select tests ------' as test_sequence ; +--enable_query_log + +##### parameter used for keyword like SELECT (must fail) +set @arg00='SELECT' ; +# mysqltest gives no output for the next statement, Why ?? +--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 ; +## 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 ; +# BUG#3796 +prepare stmt1 from ' select a , concat(?,b) from t1 ' ; +execute stmt1 using @arg00; +# +select a , concat(b,@arg00) from t1 ; +prepare stmt1 from ' select a , concat(b,?) from t1 ' ; +execute stmt1 using @arg00; + +# variations on 'group_concat' +set @arg00='MySQL' ; +select group_concat(@arg00,b) from t1 +group by 'a' ; +prepare stmt1 from ' select group_concat(?,b) from t1 +group by ''a'' ' ; +execute stmt1 using @arg00; +# +select group_concat(b,@arg00) from t1 +group by 'a' ; +prepare stmt1 from ' select group_concat(b,?) 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 new_tab ; +--enable_warnings +create table new_tab (id1 int(11) not null default '0', + value2 varchar(100), value1 varchar(100)) ; +insert into new_tab values (1,'hh','hh'),(2,'hh','hh'), + (1,'ii','ii'),(2,'ii','ii') ; +prepare stmt1 from ' select id1,value1 from new_tab where id1=? or value1=? ' ; +set @arg00=1 ; +set @arg01='hh' ; +execute stmt1 using @arg00, @arg01 ; +drop table new_tab ; +# case derived from client_test.c: test_bug1180() +# for BUG#1180 optimized away part of WHERE clause +--disable_warnings +drop table if exists new_tab ; +--enable_warnings +create table new_tab(session_id char(9) not null) ; +insert into new_tab values ('abc') ; +prepare stmt1 from ' select * from new_tab +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 new_tab ; + + +##### 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); +prepare stmt1 from ' select a FROM t1 where a in (?,?) '; +execute stmt1 using @arg00, @arg01; +# 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 ; + +##### 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 ; +prepare stmt1 from ' select a,b FROM t1 where a is not NULL +AND b is not NULL having b <> ? ' ; +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; + +##### parameter used in limit clause +set @arg00=1; +prepare stmt1 from ' select a,b from t1 +limit 1 '; +execute stmt1 ; +# currently (May 2004, Version 4.1) it is impossible +-- error 1064 +prepare stmt1 from ' select a,b from t1 +limit ? '; + +##### 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; + + +--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 ; +prepare stmt1 from ' select first.a as a1, second.a as a2 + from t1 first, t1 second + where first.a = second.a '; +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; +prepare stmt1 from ' select first.a, ?, second.a FROM t1 first, t1 second + where ? = first.b or first.a = second.a or second.b = ? '; +execute stmt1 using @arg00, @arg01, @arg02; + + + +--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 ; + +######## 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 ) '; +# also Bug#4000 (only BDB tables) ?? +execute stmt1 ; + +###### 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 ; + +###### heavy modified case derived from client_test.c: test_distinct() +## no parameters +--disable_warnings +drop table if exists t2 ; +--enable_warnings +create table t2 as select * from t_many_col_types; +#insert into t2 select * from t_many_col_types; +set @stmt= ' SELECT + (SELECT SUM(c1 + c12 + 0.0) FROM t2 + where (t_many_col_types.c2 - 0e-3) = t2.c2 + GROUP BY t_many_col_types.c15 LIMIT 1) as scalar_s, + exists (select 1.0e+0 from t2 + where t2.c3 * 9.0000000000 = t_many_col_types.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 t_many_col_types, +(select c25 x, c32 y from t2) tt WHERE x = c25 ' ; +--enable_metadata +prepare stmt1 from @stmt ; +execute stmt1 ; +--disable_metadata +execute stmt1 ; +set @stmt= concat('explain ',@stmt); +--enable_metadata +prepare stmt1 from @stmt ; +execute stmt1 ; +--disable_metadata +execute stmt1 ; +## many parameters +set @stmt= ' SELECT + (SELECT SUM(c1+c12+?) FROM t2 where (t_many_col_types.c2-?)=t2.c2 + GROUP BY t_many_col_types.c15 LIMIT 1) as scalar_s, + exists (select ? from t2 + where t2.c3*?=t_many_col_types.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 t_many_col_types, +(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 ; +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 ; +drop table t2 ; + + +--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 ; + +##### 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; + + +--disable_query_log +select '------ explain select tests ------' as test_sequence ; +--enable_query_log +prepare stmt1 from ' select * from t_many_col_types ' ; +--enable_metadata +execute stmt1; +--disable_metadata + + diff --git a/mysql-test/include/ps_renew.inc b/mysql-test/include/ps_renew.inc new file mode 100644 index 00000000000..1441638f257 --- /dev/null +++ b/mysql-test/include/ps_renew.inc @@ -0,0 +1,34 @@ +################ include/ps_renew.inc ################# +# # +# renew the content of t1 and t_many_col_types # +# # +####################################################### + +# truncate could not be used, because it is not supported +# in tables of type MERGE +delete from t1 ; +insert into t1 values (1,'one'); +insert into t1 values (2,'two'); +insert into t1 values (3,'three'); +insert into t1 values (4,'four'); +commit ; + +delete from t_many_col_types ; +insert into t_many_col_types +set c1= 1, c2= 1, c3= 1, c4= 1, c5= 1, c6= 1, c7= 1, c8= 1, c9= 1, + c10= 1, c11= 1, c12 = 1, + c13= '2004-02-29', c14= '2004-02-29 11:11:11', c15= '2004-02-29 11:11:11', + c16= '11:11:11', c17= '2004', + c18= 1, c19=true, c20= 'a', c21= '123456789a', + c22= '123456789a123456789b123456789c', c23= 'tinyblob', c24= 'tinytext', + c25= 'blob', c26= 'text', c27= 'mediumblob', c28= 'mediumtext', + c29= 'longblob', c30= 'longtext', c31='one', c32= 'monday'; +insert into t_many_col_types +set c1= 9, c2= 9, c3= 9, c4= 9, c5= 9, c6= 9, c7= 9, c8= 9, c9= 9, + c10= 9, c11= 9, c12 = 9, + c13= '2004-02-29', c14= '2004-02-29 11:11:11', c15= '2004-02-29 11:11:11', + c16= '11:11:11', c17= '2004', + c18= 1, c19=false, c20= 'a', c21= '123456789a', + c22= '123456789a123456789b123456789c', c23= 'tinyblob', c24= 'tinytext', + c25= 'blob', c26= 'text', c27= 'mediumblob', c28= 'mediumtext', + c29= 'longblob', c30= 'longtext', c31='two', c32= 'tuesday'; |