Commit 64cac0d6 authored by malff/marcsql@weblab.(none)'s avatar malff/marcsql@weblab.(none)

Merge weblab.(none):/home/marcsql/TREE/mysql-5.1-base

into  weblab.(none):/home/marcsql/TREE/mysql-5.1-rt-merge
parents 39e900e5 083bd79b
...@@ -33,7 +33,7 @@ drop table if exists t1; ...@@ -33,7 +33,7 @@ drop table if exists t1;
create table t1(c1 int); create table t1(c1 int);
insert into t1 values(1),(10),(100); insert into t1 values(1),(10),(100);
# Prepared statements has no parameters, query caching should happen # First, prepared statements with no parameters
prepare stmt1 from "select * from t1 where c1=10"; prepare stmt1 from "select * from t1 where c1=10";
show status like 'Qcache_hits'; show status like 'Qcache_hits';
execute stmt1; execute stmt1;
...@@ -113,7 +113,9 @@ show status like 'Qcache_hits'; ...@@ -113,7 +113,9 @@ show status like 'Qcache_hits';
--echo ---- switch to connection default ---- --echo ---- switch to connection default ----
connection default; connection default;
# Prepared statement has parameters, query caching should not happen # Query caching also works when statement has parameters
# (BUG#29318 Statements prepared with PREPARE and with one parameter don't use
# query cache)
prepare stmt1 from "select * from t1 where c1=?"; prepare stmt1 from "select * from t1 where c1=?";
show status like 'Qcache_hits'; show status like 'Qcache_hits';
set @a=1; set @a=1;
...@@ -127,6 +129,12 @@ set @a=1; ...@@ -127,6 +129,12 @@ set @a=1;
prepare stmt4 from "select * from t1 where c1=?"; prepare stmt4 from "select * from t1 where c1=?";
execute stmt4 using @a; execute stmt4 using @a;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
# verify that presence of user variables forbids caching
prepare stmt4 from "select @a from t1 where c1=?";
execute stmt4 using @a;
show status like 'Qcache_hits';
execute stmt4 using @a;
show status like 'Qcache_hits';
--echo ---- switch to connection default ---- --echo ---- switch to connection default ----
connection default; connection default;
......
...@@ -378,6 +378,8 @@ prepare stmt1 from ' execute stmt2 ' ; ...@@ -378,6 +378,8 @@ prepare stmt1 from ' execute stmt2 ' ;
ERROR HY000: This command is not supported in the prepared statement protocol yet ERROR HY000: This command is not supported in the prepared statement protocol yet
prepare stmt1 from ' deallocate prepare never_prepared ' ; prepare stmt1 from ' deallocate prepare never_prepared ' ;
ERROR HY000: This command is not supported in the prepared statement protocol yet ERROR HY000: This command is not supported in the prepared statement protocol yet
prepare stmt1 from 'alter view v1 as select 2';
ERROR HY000: This command is not supported in the prepared statement protocol yet
prepare stmt4 from ' use test ' ; prepare stmt4 from ' use test ' ;
ERROR HY000: This command is not supported in the prepared statement protocol yet ERROR HY000: This command is not supported in the prepared statement protocol yet
prepare stmt3 from ' create database mysqltest '; prepare stmt3 from ' create database mysqltest ';
......
...@@ -144,7 +144,7 @@ c1 ...@@ -144,7 +144,7 @@ c1
1 1
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 15
---- switch to connection con1 ---- ---- switch to connection con1 ----
set @a=1; set @a=1;
prepare stmt4 from "select * from t1 where c1=?"; prepare stmt4 from "select * from t1 where c1=?";
...@@ -153,50 +153,63 @@ c1 ...@@ -153,50 +153,63 @@ c1
1 1
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
prepare stmt4 from "select @a from t1 where c1=?";
execute stmt4 using @a;
@a
1
show status like 'Qcache_hits';
Variable_name Value
Qcache_hits 16
execute stmt4 using @a;
@a
1
show status like 'Qcache_hits';
Variable_name Value
Qcache_hits 16
---- switch to connection default ---- ---- switch to connection default ----
prepare stmt1 from "select * from t1 where c1=10"; prepare stmt1 from "select * from t1 where c1=10";
set global query_cache_size=0; set global query_cache_size=0;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
---- switch to connection con1 ---- ---- switch to connection con1 ----
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=100000; set global query_cache_size=100000;
execute stmt1; execute stmt1;
...@@ -204,80 +217,80 @@ c1 ...@@ -204,80 +217,80 @@ c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 15 Qcache_hits 17
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 16 Qcache_hits 18
---- switch to connection con1 ---- ---- switch to connection con1 ----
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 18 Qcache_hits 20
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=0; set global query_cache_size=0;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
---- switch to connection con1 ---- ---- switch to connection con1 ----
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=0; set global query_cache_size=0;
prepare stmt1 from "select * from t1 where c1=10"; prepare stmt1 from "select * from t1 where c1=10";
...@@ -287,75 +300,75 @@ prepare stmt3 from "select * from t1 where c1=10"; ...@@ -287,75 +300,75 @@ prepare stmt3 from "select * from t1 where c1=10";
set global query_cache_size=100000; set global query_cache_size=100000;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
---- switch to connection con1 ---- ---- switch to connection con1 ----
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=0; set global query_cache_size=0;
prepare stmt1 from "select * from t1 where c1=?"; prepare stmt1 from "select * from t1 where c1=?";
set global query_cache_size=100000; set global query_cache_size=100000;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
set @a=1; set @a=1;
execute stmt1 using @a; execute stmt1 using @a;
c1 c1
1 1
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
set @a=100; set @a=100;
execute stmt1 using @a; execute stmt1 using @a;
c1 c1
100 100
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
set @a=10; set @a=10;
execute stmt1 using @a; execute stmt1 using @a;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
drop table t1; drop table t1;
---- disconnect connection con1 ---- ---- disconnect connection con1 ----
set @@global.query_cache_size=@initial_query_cache_size; set @@global.query_cache_size=@initial_query_cache_size;
......
...@@ -144,7 +144,7 @@ c1 ...@@ -144,7 +144,7 @@ c1
1 1
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 13
---- switch to connection con1 ---- ---- switch to connection con1 ----
set @a=1; set @a=1;
prepare stmt4 from "select * from t1 where c1=?"; prepare stmt4 from "select * from t1 where c1=?";
...@@ -153,50 +153,63 @@ c1 ...@@ -153,50 +153,63 @@ c1
1 1
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
prepare stmt4 from "select @a from t1 where c1=?";
execute stmt4 using @a;
@a
1
show status like 'Qcache_hits';
Variable_name Value
Qcache_hits 14
execute stmt4 using @a;
@a
1
show status like 'Qcache_hits';
Variable_name Value
Qcache_hits 14
---- switch to connection default ---- ---- switch to connection default ----
prepare stmt1 from "select * from t1 where c1=10"; prepare stmt1 from "select * from t1 where c1=10";
set global query_cache_size=0; set global query_cache_size=0;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
---- switch to connection con1 ---- ---- switch to connection con1 ----
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=100000; set global query_cache_size=100000;
execute stmt1; execute stmt1;
...@@ -204,80 +217,80 @@ c1 ...@@ -204,80 +217,80 @@ c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 13 Qcache_hits 15
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
---- switch to connection con1 ---- ---- switch to connection con1 ----
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 15 Qcache_hits 17
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 16 Qcache_hits 18
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=0; set global query_cache_size=0;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
---- switch to connection con1 ---- ---- switch to connection con1 ----
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=0; set global query_cache_size=0;
prepare stmt1 from "select * from t1 where c1=10"; prepare stmt1 from "select * from t1 where c1=10";
...@@ -287,75 +300,75 @@ prepare stmt3 from "select * from t1 where c1=10"; ...@@ -287,75 +300,75 @@ prepare stmt3 from "select * from t1 where c1=10";
set global query_cache_size=100000; set global query_cache_size=100000;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
---- switch to connection con1 ---- ---- switch to connection con1 ----
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=0; set global query_cache_size=0;
prepare stmt1 from "select * from t1 where c1=?"; prepare stmt1 from "select * from t1 where c1=?";
set global query_cache_size=100000; set global query_cache_size=100000;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
set @a=1; set @a=1;
execute stmt1 using @a; execute stmt1 using @a;
c1 c1
1 1
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
set @a=100; set @a=100;
execute stmt1 using @a; execute stmt1 using @a;
c1 c1
100 100
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
set @a=10; set @a=10;
execute stmt1 using @a; execute stmt1 using @a;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
drop table t1; drop table t1;
---- disconnect connection con1 ---- ---- disconnect connection con1 ----
set @@global.query_cache_size=@initial_query_cache_size; set @@global.query_cache_size=@initial_query_cache_size;
......
...@@ -87,6 +87,10 @@ prepare stmt from "create table t1 (a int)"; ...@@ -87,6 +87,10 @@ prepare stmt from "create table t1 (a int)";
execute stmt; execute stmt;
insert into t1 (a) values (1); insert into t1 (a) values (1);
select * from t1; select * from t1;
prepare stmt_alter from "alter table t1 add (b int)";
execute stmt_alter;
insert into t1 (a,b) values (2,1);
deallocate prepare stmt_alter;
deallocate prepare stmt; deallocate prepare stmt;
deallocate prepare stmt_drop; deallocate prepare stmt_drop;
end| end|
...@@ -245,6 +249,9 @@ a ...@@ -245,6 +249,9 @@ a
1 1
drop procedure p1| drop procedure p1|
drop table if exists t1| drop table if exists t1|
drop table if exists t2|
Warnings:
Note 1051 Unknown table 't2'
create table t1 (id integer primary key auto_increment, create table t1 (id integer primary key auto_increment,
stmt_text char(35), status varchar(20))| stmt_text char(35), status varchar(20))|
insert into t1 (stmt_text) values insert into t1 (stmt_text) values
...@@ -255,7 +262,10 @@ insert into t1 (stmt_text) values ...@@ -255,7 +262,10 @@ insert into t1 (stmt_text) values
("help help"), ("show databases"), ("show tables"), ("help help"), ("show databases"), ("show tables"),
("show table status"), ("show open tables"), ("show storage engines"), ("show table status"), ("show open tables"), ("show storage engines"),
("insert into t1 (id) values (1)"), ("update t1 set status=''"), ("insert into t1 (id) values (1)"), ("update t1 set status=''"),
("delete from t1"), ("truncate t1"), ("call p1()"), ("foo bar")| ("delete from t1"), ("truncate t1"), ("call p1()"), ("foo bar"),
("create view v1 as select 1"), ("alter view v1 as select 2"),
("drop view v1"),("create table t2 (a int)"),("alter table t2 add (b int)"),
("drop table t2")|
create procedure p1() create procedure p1()
begin begin
declare v_stmt_text varchar(255); declare v_stmt_text varchar(255);
...@@ -305,6 +315,12 @@ id stmt_text status ...@@ -305,6 +315,12 @@ id stmt_text status
20 truncate t1 supported 20 truncate t1 supported
21 call p1() supported 21 call p1() supported
22 foo bar syntax error 22 foo bar syntax error
23 create view v1 as select 1 supported
24 alter view v1 as select 2 not supported
25 drop view v1 supported
26 create table t2 (a int) supported
27 alter table t2 add (b int) supported
28 drop table t2 supported
drop procedure p1| drop procedure p1|
drop table t1| drop table t1|
prepare stmt from 'select 1'| prepare stmt from 'select 1'|
......
...@@ -982,9 +982,9 @@ ERROR HY000: Explicit or implicit commit is not allowed in stored function or tr ...@@ -982,9 +982,9 @@ ERROR HY000: Explicit or implicit commit is not allowed in stored function or tr
CREATE FUNCTION bug_13627_f() returns int BEGIN create view v1 as select 1; return 1; END | CREATE FUNCTION bug_13627_f() returns int BEGIN create view v1 as select 1; return 1; END |
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger. ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN alter view v1 as select 1; END | CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN alter view v1 as select 1; END |
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger. ERROR 0A000: ALTER VIEW is not allowed in stored procedures
CREATE FUNCTION bug_13627_f() returns int BEGIN alter view v1 as select 1; return 1; END | CREATE FUNCTION bug_13627_f() returns int BEGIN alter view v1 as select 1; return 1; END |
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger. ERROR 0A000: ALTER VIEW is not allowed in stored procedures
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop view v1; END | CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN drop view v1; END |
ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger. ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger.
CREATE FUNCTION bug_13627_f() returns int BEGIN drop view v1; return 1; END | CREATE FUNCTION bug_13627_f() returns int BEGIN drop view v1; return 1; END |
......
...@@ -414,6 +414,10 @@ prepare stmt1 from ' execute stmt2 ' ; ...@@ -414,6 +414,10 @@ prepare stmt1 from ' execute stmt2 ' ;
--error ER_UNSUPPORTED_PS --error ER_UNSUPPORTED_PS
prepare stmt1 from ' deallocate prepare never_prepared ' ; prepare stmt1 from ' deallocate prepare never_prepared ' ;
## We don't support alter view as prepared statements
--error ER_UNSUPPORTED_PS
prepare stmt1 from 'alter view v1 as select 2';
## switch the database connection ## switch the database connection
--error ER_UNSUPPORTED_PS --error ER_UNSUPPORTED_PS
prepare stmt4 from ' use test ' ; prepare stmt4 from ' use test ' ;
......
...@@ -85,7 +85,7 @@ call p1()| ...@@ -85,7 +85,7 @@ call p1()|
call p1()| call p1()|
drop procedure p1| drop procedure p1|
# #
# D. Create/Drop a table (a DDL that issues a commit) in Dynamic SQL. # D. Create/Drop/Alter a table (a DDL that issues a commit) in Dynamic SQL.
# (should work ok). # (should work ok).
# #
create procedure p1() create procedure p1()
...@@ -96,6 +96,10 @@ begin ...@@ -96,6 +96,10 @@ begin
execute stmt; execute stmt;
insert into t1 (a) values (1); insert into t1 (a) values (1);
select * from t1; select * from t1;
prepare stmt_alter from "alter table t1 add (b int)";
execute stmt_alter;
insert into t1 (a,b) values (2,1);
deallocate prepare stmt_alter;
deallocate prepare stmt; deallocate prepare stmt;
deallocate prepare stmt_drop; deallocate prepare stmt_drop;
end| end|
...@@ -239,6 +243,7 @@ drop procedure p1| ...@@ -239,6 +243,7 @@ drop procedure p1|
# K. Use of continue handlers with Dynamic SQL. # K. Use of continue handlers with Dynamic SQL.
# #
drop table if exists t1| drop table if exists t1|
drop table if exists t2|
create table t1 (id integer primary key auto_increment, create table t1 (id integer primary key auto_increment,
stmt_text char(35), status varchar(20))| stmt_text char(35), status varchar(20))|
insert into t1 (stmt_text) values insert into t1 (stmt_text) values
...@@ -249,7 +254,10 @@ insert into t1 (stmt_text) values ...@@ -249,7 +254,10 @@ insert into t1 (stmt_text) values
("help help"), ("show databases"), ("show tables"), ("help help"), ("show databases"), ("show tables"),
("show table status"), ("show open tables"), ("show storage engines"), ("show table status"), ("show open tables"), ("show storage engines"),
("insert into t1 (id) values (1)"), ("update t1 set status=''"), ("insert into t1 (id) values (1)"), ("update t1 set status=''"),
("delete from t1"), ("truncate t1"), ("call p1()"), ("foo bar")| ("delete from t1"), ("truncate t1"), ("call p1()"), ("foo bar"),
("create view v1 as select 1"), ("alter view v1 as select 2"),
("drop view v1"),("create table t2 (a int)"),("alter table t2 add (b int)"),
("drop table t2")|
create procedure p1() create procedure p1()
begin begin
declare v_stmt_text varchar(255); declare v_stmt_text varchar(255);
......
...@@ -1087,12 +1087,12 @@ delimiter ;| ...@@ -1087,12 +1087,12 @@ delimiter ;|
# #
# BUG 12490 (Packets out of order if calling HELP CONTENTS from Stored Procedure) # BUG 12490 (Packets out of order if calling HELP CONTENTS from Stored Procedure)
# #
--error 1314 --error ER_SP_BADSTATEMENT
CREATE PROCEDURE BUG_12490() HELP CONTENTS; CREATE PROCEDURE BUG_12490() HELP CONTENTS;
--error 1314 --error ER_SP_BADSTATEMENT
CREATE FUNCTION BUG_12490() RETURNS INT HELP CONTENTS; CREATE FUNCTION BUG_12490() RETURNS INT HELP CONTENTS;
CREATE TABLE t_bug_12490(a int); CREATE TABLE t_bug_12490(a int);
--error 1314 --error ER_SP_BADSTATEMENT
CREATE TRIGGER BUG_12490 BEFORE UPDATE ON t_bug_12490 FOR EACH ROW HELP CONTENTS; CREATE TRIGGER BUG_12490 BEFORE UPDATE ON t_bug_12490 FOR EACH ROW HELP CONTENTS;
DROP TABLE t_bug_12490; DROP TABLE t_bug_12490;
...@@ -1401,9 +1401,9 @@ CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create view v1 as sele ...@@ -1401,9 +1401,9 @@ CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN create view v1 as sele
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG -- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
CREATE FUNCTION bug_13627_f() returns int BEGIN create view v1 as select 1; return 1; END | CREATE FUNCTION bug_13627_f() returns int BEGIN create view v1 as select 1; return 1; END |
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG -- error ER_SP_BADSTATEMENT
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN alter view v1 as select 1; END | CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN alter view v1 as select 1; END |
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG -- error ER_SP_BADSTATEMENT
CREATE FUNCTION bug_13627_f() returns int BEGIN alter view v1 as select 1; return 1; END | CREATE FUNCTION bug_13627_f() returns int BEGIN alter view v1 as select 1; return 1; END |
-- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG -- error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG
......
...@@ -27,6 +27,10 @@ SUBDIRS = share ...@@ -27,6 +27,10 @@ SUBDIRS = share
libexec_PROGRAMS = mysqld libexec_PROGRAMS = mysqld
EXTRA_PROGRAMS = gen_lex_hash EXTRA_PROGRAMS = gen_lex_hash
bin_PROGRAMS = mysql_tzinfo_to_sql bin_PROGRAMS = mysql_tzinfo_to_sql
noinst_LTLIBRARIES= libndb.la \
udf_example.la
SUPPORTING_LIBS = $(top_builddir)/vio/libvio.a \ SUPPORTING_LIBS = $(top_builddir)/vio/libvio.a \
$(top_builddir)/mysys/libmysys.a \ $(top_builddir)/mysys/libmysys.a \
$(top_builddir)/dbug/libdbug.a \ $(top_builddir)/dbug/libdbug.a \
...@@ -34,7 +38,8 @@ SUPPORTING_LIBS = $(top_builddir)/vio/libvio.a \ ...@@ -34,7 +38,8 @@ SUPPORTING_LIBS = $(top_builddir)/vio/libvio.a \
$(top_builddir)/strings/libmystrings.a $(top_builddir)/strings/libmystrings.a
mysqld_DEPENDENCIES= @mysql_plugin_libs@ $(SUPPORTING_LIBS) mysqld_DEPENDENCIES= @mysql_plugin_libs@ $(SUPPORTING_LIBS)
LDADD = $(SUPPORTING_LIBS) @ZLIB_LIBS@ @NDB_SCI_LIBS@ LDADD = $(SUPPORTING_LIBS) @ZLIB_LIBS@ @NDB_SCI_LIBS@
mysqld_LDADD = @MYSQLD_EXTRA_LDFLAGS@ \ mysqld_LDADD = libndb.la \
@MYSQLD_EXTRA_LDFLAGS@ \
@pstack_libs@ \ @pstack_libs@ \
@mysql_plugin_libs@ \ @mysql_plugin_libs@ \
$(LDADD) $(CXXLDFLAGS) $(WRAPLIBS) @LIBDL@ \ $(LDADD) $(CXXLDFLAGS) $(WRAPLIBS) @LIBDL@ \
...@@ -94,8 +99,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \ ...@@ -94,8 +99,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \
log_event_old.cc rpl_record_old.cc \ log_event_old.cc rpl_record_old.cc \
discover.cc time.cc opt_range.cc opt_sum.cc \ discover.cc time.cc opt_range.cc opt_sum.cc \
records.cc filesort.cc handler.cc \ records.cc filesort.cc handler.cc \
ha_ndbcluster.cc ha_ndbcluster_cond.cc \ ha_partition.cc \
ha_ndbcluster_binlog.cc ha_partition.cc \
sql_db.cc sql_table.cc sql_rename.cc sql_crypt.cc \ sql_db.cc sql_table.cc sql_rename.cc sql_crypt.cc \
sql_load.cc mf_iocache.cc field_conv.cc sql_show.cc \ sql_load.cc mf_iocache.cc field_conv.cc sql_show.cc \
sql_udf.cc sql_analyse.cc sql_analyse.h sql_cache.cc \ sql_udf.cc sql_analyse.cc sql_analyse.h sql_cache.cc \
...@@ -116,6 +120,11 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \ ...@@ -116,6 +120,11 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \
sql_builtin.cc sql_tablespace.cc partition_info.cc \ sql_builtin.cc sql_tablespace.cc partition_info.cc \
sql_servers.cc sql_servers.cc
libndb_la_CPPFLAGS= @ndbcluster_includes@
libndb_la_SOURCES= ha_ndbcluster.cc \
ha_ndbcluster_binlog.cc \
ha_ndbcluster_cond.cc
gen_lex_hash_SOURCES = gen_lex_hash.cc gen_lex_hash_SOURCES = gen_lex_hash.cc
gen_lex_hash_LDFLAGS = @NOINST_LDFLAGS@ gen_lex_hash_LDFLAGS = @NOINST_LDFLAGS@
...@@ -159,22 +168,7 @@ lex_hash.h: gen_lex_hash.cc lex.h ...@@ -159,22 +168,7 @@ lex_hash.h: gen_lex_hash.cc lex.h
./gen_lex_hash$(EXEEXT) > $@-t ./gen_lex_hash$(EXEEXT) > $@-t
$(MV) $@-t $@ $(MV) $@-t $@
# the following four should eventually be moved out of this directory
ha_ndbcluster.o:ha_ndbcluster.cc ha_ndbcluster.h
$(CXXCOMPILE) @ndbcluster_includes@ $(LM_CFLAGS) -c $<
ha_ndbcluster_cond.o:ha_ndbcluster_cond.cc ha_ndbcluster_cond.h
$(CXXCOMPILE) @ndbcluster_includes@ $(LM_CFLAGS) -c $<
ha_ndbcluster_binlog.o:ha_ndbcluster_binlog.cc ha_ndbcluster_binlog.h
$(CXXCOMPILE) @ndbcluster_includes@ $(LM_CFLAGS) -c $<
#Until we can get rid of dependencies on ha_ndbcluster.h
handler.o: handler.cc ha_ndbcluster.h
$(CXXCOMPILE) @ndbcluster_includes@ $(CXXFLAGS) -c $<
# For testing of udf_example.so # For testing of udf_example.so
noinst_LTLIBRARIES= udf_example.la
udf_example_la_SOURCES= udf_example.c udf_example_la_SOURCES= udf_example.c
udf_example_la_LDFLAGS= -module -rpath $(pkglibdir) udf_example_la_LDFLAGS= -module -rpath $(pkglibdir)
......
...@@ -436,6 +436,13 @@ public: ...@@ -436,6 +436,13 @@ public:
#ifndef DBUG_OFF #ifndef DBUG_OFF
bool is_backup_arena; /* True if this arena is used for backup. */ bool is_backup_arena; /* True if this arena is used for backup. */
#endif #endif
/*
The states relfects three diffrent life cycles for three
different types of statements:
Prepared statement: INITIALIZED -> PREPARED -> EXECUTED.
Stored procedure: INITIALIZED_FOR_SP -> EXECUTED.
Other statements: CONVENTIONAL_EXECUTION never changes.
*/
enum enum_state enum enum_state
{ {
INITIALIZED= 0, INITIALIZED_FOR_SP= 1, PREPARED= 2, INITIALIZED= 0, INITIALIZED_FOR_SP= 1, PREPARED= 2,
......
...@@ -4076,6 +4076,10 @@ create_sp_error: ...@@ -4076,6 +4076,10 @@ create_sp_error:
#endif // ifndef DBUG_OFF #endif // ifndef DBUG_OFF
case SQLCOM_CREATE_VIEW: case SQLCOM_CREATE_VIEW:
{ {
/*
Note: SQLCOM_CREATE_VIEW also handles 'ALTER VIEW' commands
as specified through the thd->lex->create_view_mode flag.
*/
if (end_active_trans(thd)) if (end_active_trans(thd))
goto error; goto error;
......
...@@ -1726,6 +1726,13 @@ static bool check_prepared_statement(Prepared_statement *stmt, ...@@ -1726,6 +1726,13 @@ static bool check_prepared_statement(Prepared_statement *stmt,
res= mysql_test_create_table(stmt); res= mysql_test_create_table(stmt);
break; break;
case SQLCOM_CREATE_VIEW:
if (lex->create_view_mode == VIEW_ALTER)
{
my_message(ER_UNSUPPORTED_PS, ER(ER_UNSUPPORTED_PS), MYF(0));
goto error;
}
break;
case SQLCOM_DO: case SQLCOM_DO:
res= mysql_test_do_fields(stmt, tables, lex->insert_list); res= mysql_test_do_fields(stmt, tables, lex->insert_list);
break; break;
...@@ -1779,7 +1786,6 @@ static bool check_prepared_statement(Prepared_statement *stmt, ...@@ -1779,7 +1786,6 @@ static bool check_prepared_statement(Prepared_statement *stmt,
case SQLCOM_ROLLBACK: case SQLCOM_ROLLBACK:
case SQLCOM_TRUNCATE: case SQLCOM_TRUNCATE:
case SQLCOM_CALL: case SQLCOM_CALL:
case SQLCOM_CREATE_VIEW:
case SQLCOM_DROP_VIEW: case SQLCOM_DROP_VIEW:
case SQLCOM_REPAIR: case SQLCOM_REPAIR:
case SQLCOM_ANALYZE: case SQLCOM_ANALYZE:
...@@ -2916,18 +2922,6 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len) ...@@ -2916,18 +2922,6 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len)
thd->restore_backup_statement(this, &stmt_backup); thd->restore_backup_statement(this, &stmt_backup);
thd->stmt_arena= old_stmt_arena; thd->stmt_arena= old_stmt_arena;
if ((protocol->type() == Protocol::PROTOCOL_TEXT) && (param_count > 0))
{
/*
This is a mysql_sql_stmt_prepare(); query expansion will insert user
variable references, and user variables are uncacheable, thus we have to
mark this statement as uncacheable.
This has to be done before setup_set_params(), as it may make expansion
unneeded.
*/
lex->safe_to_cache_query= FALSE;
}
if (error == 0) if (error == 0)
{ {
setup_set_params(); setup_set_params();
......
...@@ -205,18 +205,17 @@ fill_defined_view_parts (THD *thd, TABLE_LIST *view) ...@@ -205,18 +205,17 @@ fill_defined_view_parts (THD *thd, TABLE_LIST *view)
} }
/* /**
Creating/altering VIEW procedure @brief Creating/altering VIEW procedure
SYNOPSIS @param thd thread handler
mysql_create_view() @param views views to create
thd - thread handler @param mode VIEW_CREATE_NEW, VIEW_ALTER, VIEW_CREATE_OR_REPLACE
views - views to create
mode - VIEW_CREATE_NEW, VIEW_ALTER, VIEW_CREATE_OR_REPLACE
RETURN VALUE @note This function handles both create and alter view commands.
FALSE OK
TRUE Error @retval FALSE Operation was a success.
@retval TRUE An error occured.
*/ */
bool mysql_create_view(THD *thd, TABLE_LIST *views, bool mysql_create_view(THD *thd, TABLE_LIST *views,
......
...@@ -5169,7 +5169,14 @@ alter: ...@@ -5169,7 +5169,14 @@ alter:
} }
| ALTER view_algorithm definer | ALTER view_algorithm definer
{ {
Lex->create_view_mode= VIEW_ALTER; LEX *lex= Lex;
if (lex->sphead)
{
my_error(ER_SP_BADSTATEMENT, MYF(0), "ALTER VIEW");
MYSQL_YYABORT;
}
lex->create_view_mode= VIEW_ALTER;
} }
view_tail view_tail
{} {}
...@@ -5181,6 +5188,12 @@ alter: ...@@ -5181,6 +5188,12 @@ alter:
*/ */
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (lex->sphead)
{
my_error(ER_SP_BADSTATEMENT, MYF(0), "ALTER VIEW");
MYSQL_YYABORT;
}
lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED; lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED;
lex->create_view_mode= VIEW_ALTER; lex->create_view_mode= VIEW_ALTER;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment