summaryrefslogtreecommitdiff
path: root/mysql-test/include
diff options
context:
space:
mode:
authormonty@mysql.com <>2004-07-07 11:29:39 +0300
committermonty@mysql.com <>2004-07-07 11:29:39 +0300
commit1e311999950833cd81ca0788cd3656585c46d9ae (patch)
treeca8974710746bb69b04a49bc64f938d0b1a8420a /mysql-test/include
parent24a8dc2337a717ff340bac228383ef04437a4666 (diff)
parent8462b8aeb83355fa6c5cb4f45ea0ed63ba9e0712 (diff)
downloadmariadb-git-1e311999950833cd81ca0788cd3656585c46d9ae.tar.gz
Merge with 4.1.3-beta
Diffstat (limited to 'mysql-test/include')
-rw-r--r--mysql-test/include/have_archive.inc4
-rw-r--r--mysql-test/include/have_debug.inc4
-rw-r--r--mysql-test/include/have_geometry.inc4
-rw-r--r--mysql-test/include/ps_create.inc29
-rw-r--r--mysql-test/include/ps_modify.inc207
-rw-r--r--mysql-test/include/ps_modify1.inc60
-rw-r--r--mysql-test/include/ps_query.inc587
-rw-r--r--mysql-test/include/ps_renew.inc34
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';