2004-07-01 16:30:29 +02:00
|
|
|
####################### ps_query.inc #########################
|
|
|
|
# #
|
|
|
|
# Tests for prepared statements: SELECTs #
|
|
|
|
# #
|
|
|
|
##############################################################
|
|
|
|
|
2004-07-02 20:01:34 +02:00
|
|
|
#
|
|
|
|
# NOTE: PLEASE SEE ps_1general.test (bottom)
|
|
|
|
# BEFORE ADDING NEW TEST CASES HERE !!!
|
2004-07-01 16:30:29 +02:00
|
|
|
|
2004-07-02 20:01:34 +02:00
|
|
|
#
|
|
|
|
# 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 't_many_col_types'.
|
|
|
|
# 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
|
|
|
|
# t_many_col_types - 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 ----------#
|
2004-07-01 16:30:29 +02:00
|
|
|
|
|
|
|
--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;
|
2004-07-21 19:17:07 +02:00
|
|
|
set @arg00=1 ;
|
|
|
|
execute stmt1 using @arg00;
|
|
|
|
set @arg00=0 ;
|
|
|
|
--error 1054
|
|
|
|
execute stmt1 using @arg00;
|
2004-07-01 16:30:29 +02:00
|
|
|
|
|
|
|
##### 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
|
2004-09-15 12:25:58 +02:00
|
|
|
where @arg01 = first.b or first.a = second.a or second.b = @arg02
|
|
|
|
order by second.a, first.a;
|
2004-07-01 16:30:29 +02:00
|
|
|
prepare stmt1 from ' select first.a, ?, second.a FROM t1 first, t1 second
|
2004-09-15 12:25:58 +02:00
|
|
|
where ? = first.b or first.a = second.a or second.b = ?
|
|
|
|
order by second.a, first.a';
|
2004-07-01 16:30:29 +02:00
|
|
|
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
|
|
|
|
|
|
|
|
|