Commit 99fefab1 authored by kostja@bodhi.local's avatar kostja@bodhi.local

Merge bodhi.local:/opt/local/work/tmp_merge

into  bodhi.local:/opt/local/work/mysql-5.1-runtime-merge-5.0
parents 56353959 3010430d
...@@ -143,7 +143,7 @@ explain extended select last_insert_id(); ...@@ -143,7 +143,7 @@ explain extended select last_insert_id();
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings: Warnings:
Note 1003 select sql_no_cache last_insert_id() AS `last_insert_id()` Note 1003 select last_insert_id() AS `last_insert_id()`
insert into t1 set i = 254; insert into t1 set i = 254;
ERROR 23000: Duplicate entry '254' for key 'PRIMARY' ERROR 23000: Duplicate entry '254' for key 'PRIMARY'
select last_insert_id(); select last_insert_id();
......
...@@ -11,7 +11,7 @@ explain extended select uncompress(compress(@test_compress_string)); ...@@ -11,7 +11,7 @@ explain extended select uncompress(compress(@test_compress_string));
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings: Warnings:
Note 1003 select sql_no_cache uncompress(compress((@test_compress_string))) AS `uncompress(compress(@test_compress_string))` Note 1003 select uncompress(compress((@test_compress_string))) AS `uncompress(compress(@test_compress_string))`
select uncompressed_length(compress(@test_compress_string))=length(@test_compress_string); select uncompressed_length(compress(@test_compress_string))=length(@test_compress_string);
uncompressed_length(compress(@test_compress_string))=length(@test_compress_string) uncompressed_length(compress(@test_compress_string))=length(@test_compress_string)
1 1
...@@ -19,7 +19,7 @@ explain extended select uncompressed_length(compress(@test_compress_string))=len ...@@ -19,7 +19,7 @@ explain extended select uncompressed_length(compress(@test_compress_string))=len
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings: Warnings:
Note 1003 select sql_no_cache (uncompressed_length(compress((@test_compress_string))) = length((@test_compress_string))) AS `uncompressed_length(compress(@test_compress_string))=length(@test_compress_string)` Note 1003 select (uncompressed_length(compress((@test_compress_string))) = length((@test_compress_string))) AS `uncompressed_length(compress(@test_compress_string))=length(@test_compress_string)`
select uncompressed_length(compress(@test_compress_string)); select uncompressed_length(compress(@test_compress_string));
uncompressed_length(compress(@test_compress_string)) uncompressed_length(compress(@test_compress_string))
117 117
......
...@@ -90,7 +90,7 @@ explain extended select rand(999999),rand(); ...@@ -90,7 +90,7 @@ explain extended select rand(999999),rand();
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings: Warnings:
Note 1003 select sql_no_cache rand(999999) AS `rand(999999)`,rand() AS `rand()` Note 1003 select rand(999999) AS `rand(999999)`,rand() AS `rand()`
select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6),format(cot(1),6),format(asin(1),6),format(acos(0),6),format(atan(1),6); select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6),format(cot(1),6),format(asin(1),6),format(acos(0),6),format(atan(1),6);
pi() format(sin(pi()/2),6) format(cos(pi()/2),6) format(abs(tan(pi())),6) format(cot(1),6) format(asin(1),6) format(acos(0),6) format(atan(1),6) pi() format(sin(pi()/2),6) format(cos(pi()/2),6) format(abs(tan(pi())),6) format(cot(1),6) format(asin(1),6) format(acos(0),6) format(atan(1),6)
3.141593 1.000000 0.000000 0.000000 0.642093 1.570796 1.570796 0.785398 3.141593 1.000000 0.000000 0.000000 0.642093 1.570796 1.570796 0.785398
......
...@@ -41,7 +41,7 @@ explain extended select database(), user(); ...@@ -41,7 +41,7 @@ explain extended select database(), user();
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings: Warnings:
Note 1003 select sql_no_cache database() AS `database()`,user() AS `user()` Note 1003 select database() AS `database()`,user() AS `user()`
create table t1 (version char(60)) select database(), user(), version() as 'version'; create table t1 (version char(60)) select database(), user(), version() as 'version';
show create table t1; show create table t1;
Table Create Table Table Create Table
......
...@@ -729,7 +729,7 @@ explain extended select period_add("9602",-12),period_diff(199505,"9404"),from_d ...@@ -729,7 +729,7 @@ explain extended select period_add("9602",-12),period_diff(199505,"9404"),from_d
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings: Warnings:
Note 1003 select sql_no_cache period_add(_latin1'9602',-(12)) AS `period_add("9602",-12)`,period_diff(199505,_latin1'9404') AS `period_diff(199505,"9404")`,from_days(to_days(_latin1'960101')) AS `from_days(to_days("960101"))`,dayofmonth(_latin1'1997-01-02') AS `dayofmonth("1997-01-02")`,month(_latin1'1997-01-02') AS `month("1997-01-02")`,monthname(_latin1'1972-03-04') AS `monthname("1972-03-04")`,dayofyear(_latin1'0000-00-00') AS `dayofyear("0000-00-00")`,hour(_latin1'1997-03-03 23:03:22') AS `HOUR("1997-03-03 23:03:22")`,minute(_latin1'23:03:22') AS `MINUTE("23:03:22")`,second(230322) AS `SECOND(230322)`,quarter(980303) AS `QUARTER(980303)`,week(_latin1'1998-03-03',0) AS `WEEK("1998-03-03")`,yearweek(_latin1'2000-01-01',1) AS `yearweek("2000-01-01",1)`,week(19950101,1) AS `week(19950101,1)`,year(_latin1'98-02-03') AS `year("98-02-03")`,(weekday(curdate()) - weekday(now())) AS `weekday(curdate())-weekday(now())`,dayname(_latin1'1962-03-03') AS `dayname("1962-03-03")`,unix_timestamp() AS `unix_timestamp()`,sec_to_time((time_to_sec(_latin1'0:30:47') / 6.21)) AS `sec_to_time(time_to_sec("0:30:47")/6.21)`,curtime() AS `curtime()`,utc_time() AS `utc_time()`,curdate() AS `curdate()`,utc_date() AS `utc_date()`,utc_timestamp() AS `utc_timestamp()`,date_format(_latin1'1997-01-02 03:04:05',_latin1'%M %W %D %Y %y %m %d %h %i %s %w') AS `date_format("1997-01-02 03:04:05", "%M %W %D %Y %y %m %d %h %i %s %w")`,from_unixtime(unix_timestamp(_latin1'1994-03-02 10:11:12')) AS `from_unixtime(unix_timestamp("1994-03-02 10:11:12"))`,(_latin1'1997-12-31 23:59:59' + interval 1 second) AS `"1997-12-31 23:59:59" + INTERVAL 1 SECOND`,(_latin1'1998-01-01 00:00:00' - interval 1 second) AS `"1998-01-01 00:00:00" - INTERVAL 1 SECOND`,(_latin1'1997-12-31' + interval 1 day) AS `INTERVAL 1 DAY + "1997-12-31"`,extract(year from _latin1'1999-01-02 10:11:12') AS `extract(YEAR FROM "1999-01-02 10:11:12")`,(_latin1'1997-12-31 23:59:59' + interval 1 second) AS `date_add("1997-12-31 23:59:59",INTERVAL 1 SECOND)` Note 1003 select period_add(_latin1'9602',-(12)) AS `period_add("9602",-12)`,period_diff(199505,_latin1'9404') AS `period_diff(199505,"9404")`,from_days(to_days(_latin1'960101')) AS `from_days(to_days("960101"))`,dayofmonth(_latin1'1997-01-02') AS `dayofmonth("1997-01-02")`,month(_latin1'1997-01-02') AS `month("1997-01-02")`,monthname(_latin1'1972-03-04') AS `monthname("1972-03-04")`,dayofyear(_latin1'0000-00-00') AS `dayofyear("0000-00-00")`,hour(_latin1'1997-03-03 23:03:22') AS `HOUR("1997-03-03 23:03:22")`,minute(_latin1'23:03:22') AS `MINUTE("23:03:22")`,second(230322) AS `SECOND(230322)`,quarter(980303) AS `QUARTER(980303)`,week(_latin1'1998-03-03',0) AS `WEEK("1998-03-03")`,yearweek(_latin1'2000-01-01',1) AS `yearweek("2000-01-01",1)`,week(19950101,1) AS `week(19950101,1)`,year(_latin1'98-02-03') AS `year("98-02-03")`,(weekday(curdate()) - weekday(now())) AS `weekday(curdate())-weekday(now())`,dayname(_latin1'1962-03-03') AS `dayname("1962-03-03")`,unix_timestamp() AS `unix_timestamp()`,sec_to_time((time_to_sec(_latin1'0:30:47') / 6.21)) AS `sec_to_time(time_to_sec("0:30:47")/6.21)`,curtime() AS `curtime()`,utc_time() AS `utc_time()`,curdate() AS `curdate()`,utc_date() AS `utc_date()`,utc_timestamp() AS `utc_timestamp()`,date_format(_latin1'1997-01-02 03:04:05',_latin1'%M %W %D %Y %y %m %d %h %i %s %w') AS `date_format("1997-01-02 03:04:05", "%M %W %D %Y %y %m %d %h %i %s %w")`,from_unixtime(unix_timestamp(_latin1'1994-03-02 10:11:12')) AS `from_unixtime(unix_timestamp("1994-03-02 10:11:12"))`,(_latin1'1997-12-31 23:59:59' + interval 1 second) AS `"1997-12-31 23:59:59" + INTERVAL 1 SECOND`,(_latin1'1998-01-01 00:00:00' - interval 1 second) AS `"1998-01-01 00:00:00" - INTERVAL 1 SECOND`,(_latin1'1997-12-31' + interval 1 day) AS `INTERVAL 1 DAY + "1997-12-31"`,extract(year from _latin1'1999-01-02 10:11:12') AS `extract(YEAR FROM "1999-01-02 10:11:12")`,(_latin1'1997-12-31 23:59:59' + interval 1 second) AS `date_add("1997-12-31 23:59:59",INTERVAL 1 SECOND)`
SET @TMP=NOW(); SET @TMP=NOW();
CREATE TABLE t1 (d DATETIME); CREATE TABLE t1 (d DATETIME);
INSERT INTO t1 VALUES (NOW()); INSERT INTO t1 VALUES (NOW());
......
...@@ -386,11 +386,11 @@ show keys from v4; ...@@ -386,11 +386,11 @@ show keys from v4;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
select * from information_schema.views where TABLE_NAME like "v%"; select * from information_schema.views where TABLE_NAME like "v%";
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE
NULL test v0 /* ALGORITHM=UNDEFINED */ select sql_no_cache `schemata`.`SCHEMA_NAME` AS `c` from `information_schema`.`schemata` NONE NO root@localhost DEFINER NULL test v0 /* ALGORITHM=UNDEFINED */ select `schemata`.`SCHEMA_NAME` AS `c` from `information_schema`.`schemata` NONE NO root@localhost DEFINER
NULL test v1 /* ALGORITHM=UNDEFINED */ select sql_no_cache `tables`.`TABLE_NAME` AS `c` from `information_schema`.`tables` where (`tables`.`TABLE_NAME` = _utf8'v1') NONE NO root@localhost DEFINER NULL test v1 /* ALGORITHM=UNDEFINED */ select `tables`.`TABLE_NAME` AS `c` from `information_schema`.`tables` where (`tables`.`TABLE_NAME` = _utf8'v1') NONE NO root@localhost DEFINER
NULL test v2 /* ALGORITHM=UNDEFINED */ select sql_no_cache `columns`.`COLUMN_NAME` AS `c` from `information_schema`.`columns` where (`columns`.`TABLE_NAME` = _utf8'v2') NONE NO root@localhost DEFINER NULL test v2 /* ALGORITHM=UNDEFINED */ select `columns`.`COLUMN_NAME` AS `c` from `information_schema`.`columns` where (`columns`.`TABLE_NAME` = _utf8'v2') NONE NO root@localhost DEFINER
NULL test v3 /* ALGORITHM=UNDEFINED */ select sql_no_cache `character_sets`.`CHARACTER_SET_NAME` AS `c` from `information_schema`.`character_sets` where (`character_sets`.`CHARACTER_SET_NAME` like _utf8'latin1%') NONE NO root@localhost DEFINER NULL test v3 /* ALGORITHM=UNDEFINED */ select `character_sets`.`CHARACTER_SET_NAME` AS `c` from `information_schema`.`character_sets` where (`character_sets`.`CHARACTER_SET_NAME` like _utf8'latin1%') NONE NO root@localhost DEFINER
NULL test v4 /* ALGORITHM=UNDEFINED */ select sql_no_cache `collations`.`COLLATION_NAME` AS `c` from `information_schema`.`collations` where (`collations`.`COLLATION_NAME` like _utf8'latin1%') NONE NO root@localhost DEFINER NULL test v4 /* ALGORITHM=UNDEFINED */ select `collations`.`COLLATION_NAME` AS `c` from `information_schema`.`collations` where (`collations`.`COLLATION_NAME` like _utf8'latin1%') NONE NO root@localhost DEFINER
drop view v0, v1, v2, v3, v4; drop view v0, v1, v2, v3, v4;
create table t1 (a int); create table t1 (a int);
grant select,update,insert on t1 to mysqltest_1@localhost; grant select,update,insert on t1 to mysqltest_1@localhost;
...@@ -705,7 +705,7 @@ Warnings: ...@@ -705,7 +705,7 @@ Warnings:
Warning 1356 View 'test.v2' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them Warning 1356 View 'test.v2' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
show create table v3; show create table v3;
View Create View View Create View
v3 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS select sql_no_cache `test`.`sub1`(1) AS `c` v3 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS select `test`.`sub1`(1) AS `c`
Warnings: Warnings:
Warning 1356 View 'test.v3' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them Warning 1356 View 'test.v3' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
drop view v2; drop view v2;
......
...@@ -233,7 +233,7 @@ explain extended select benchmark(1,1) from t1; ...@@ -233,7 +233,7 @@ explain extended select benchmark(1,1) from t1;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 system NULL NULL NULL NULL 0 const row not found 1 SIMPLE t1 system NULL NULL NULL NULL 0 const row not found
Warnings: Warnings:
Note 1003 select sql_no_cache benchmark(1,1) AS `benchmark(1,1)` from `test`.`t1` Note 1003 select benchmark(1,1) AS `benchmark(1,1)` from `test`.`t1`
show status like "Qcache_queries_in_cache"; show status like "Qcache_queries_in_cache";
Variable_name Value Variable_name Value
Qcache_queries_in_cache 0 Qcache_queries_in_cache 0
......
...@@ -25,7 +25,7 @@ explain extended select is_free_lock("lock"), is_used_lock("lock"); ...@@ -25,7 +25,7 @@ explain extended select is_free_lock("lock"), is_used_lock("lock");
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings: Warnings:
Note 1003 select sql_no_cache is_free_lock(_latin1'lock') AS `is_free_lock("lock")`,is_used_lock(_latin1'lock') AS `is_used_lock("lock")` Note 1003 select is_free_lock(_latin1'lock') AS `is_free_lock("lock")`,is_used_lock(_latin1'lock') AS `is_used_lock("lock")`
select is_free_lock("lock2"); select is_free_lock("lock2");
is_free_lock("lock2") is_free_lock("lock2")
1 1
......
...@@ -11,7 +11,7 @@ explain extended select master_pos_wait('master-bin.999999',0,2); ...@@ -11,7 +11,7 @@ explain extended select master_pos_wait('master-bin.999999',0,2);
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings: Warnings:
Note 1003 select sql_no_cache master_pos_wait(_latin1'master-bin.999999',0,2) AS `master_pos_wait('master-bin.999999',0,2)` Note 1003 select master_pos_wait(_latin1'master-bin.999999',0,2) AS `master_pos_wait('master-bin.999999',0,2)`
select master_pos_wait('master-bin.999999',0); select master_pos_wait('master-bin.999999',0);
stop slave sql_thread; stop slave sql_thread;
master_pos_wait('master-bin.999999',0) master_pos_wait('master-bin.999999',0)
......
...@@ -1019,19 +1019,19 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -1019,19 +1019,19 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found 1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found
2 UNCACHEABLE SUBQUERY t1 system NULL NULL NULL NULL 0 const row not found 2 UNCACHEABLE SUBQUERY t1 system NULL NULL NULL NULL 0 const row not found
Warnings: Warnings:
Note 1003 select sql_no_cache (select sql_no_cache rand() AS `RAND()` from `test`.`t1`) AS `(SELECT RAND() FROM t1)` from `test`.`t1` Note 1003 select (select rand() AS `RAND()` from `test`.`t1`) AS `(SELECT RAND() FROM t1)` from `test`.`t1`
EXPLAIN EXTENDED SELECT (SELECT ENCRYPT('test') FROM t1) FROM t1; EXPLAIN EXTENDED SELECT (SELECT ENCRYPT('test') FROM t1) FROM t1;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found 1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found
2 UNCACHEABLE SUBQUERY t1 system NULL NULL NULL NULL 0 const row not found 2 UNCACHEABLE SUBQUERY t1 system NULL NULL NULL NULL 0 const row not found
Warnings: Warnings:
Note 1003 select sql_no_cache (select sql_no_cache encrypt(_latin1'test') AS `ENCRYPT('test')` from `test`.`t1`) AS `(SELECT ENCRYPT('test') FROM t1)` from `test`.`t1` Note 1003 select (select encrypt(_latin1'test') AS `ENCRYPT('test')` from `test`.`t1`) AS `(SELECT ENCRYPT('test') FROM t1)` from `test`.`t1`
EXPLAIN EXTENDED SELECT (SELECT BENCHMARK(1,1) FROM t1) FROM t1; EXPLAIN EXTENDED SELECT (SELECT BENCHMARK(1,1) FROM t1) FROM t1;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found 1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found
2 UNCACHEABLE SUBQUERY t1 system NULL NULL NULL NULL 0 const row not found 2 UNCACHEABLE SUBQUERY t1 system NULL NULL NULL NULL 0 const row not found
Warnings: Warnings:
Note 1003 select sql_no_cache (select sql_no_cache benchmark(1,1) AS `BENCHMARK(1,1)` from `test`.`t1`) AS `(SELECT BENCHMARK(1,1) FROM t1)` from `test`.`t1` Note 1003 select (select benchmark(1,1) AS `BENCHMARK(1,1)` from `test`.`t1`) AS `(SELECT BENCHMARK(1,1) FROM t1)` from `test`.`t1`
drop table t1; drop table t1;
CREATE TABLE `t1` ( CREATE TABLE `t1` (
`mot` varchar(30) character set latin1 NOT NULL default '', `mot` varchar(30) character set latin1 NOT NULL default '',
...@@ -1126,7 +1126,7 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -1126,7 +1126,7 @@ id select_type table type possible_keys key key_len ref rows Extra
2 UNCACHEABLE SUBQUERY t1 ALL NULL NULL NULL NULL 3 2 UNCACHEABLE SUBQUERY t1 ALL NULL NULL NULL NULL 3
3 UNCACHEABLE SUBQUERY t1 ALL NULL NULL NULL NULL 3 3 UNCACHEABLE SUBQUERY t1 ALL NULL NULL NULL NULL 3
Warnings: Warnings:
Note 1003 select sql_no_cache `test`.`t1`.`a` AS `a`,(select sql_no_cache (select sql_no_cache rand() AS `rand()` from `test`.`t1` limit 1) AS `(select rand() from t1 limit 1)` from `test`.`t1` limit 1) AS `(select (select rand() from t1 limit 1) from t1 limit 1)` from `test`.`t1` Note 1003 select `test`.`t1`.`a` AS `a`,(select (select rand() AS `rand()` from `test`.`t1` limit 1) AS `(select rand() from t1 limit 1)` from `test`.`t1` limit 1) AS `(select (select rand() from t1 limit 1) from t1 limit 1)` from `test`.`t1`
drop table t1; drop table t1;
select t1.Continent, t2.Name, t2.Population from t1 LEFT JOIN t2 ON t1.Code = t2.Country where t2.Population IN (select max(t2.Population) AS Population from t2, t1 where t2.Country = t1.Code group by Continent); select t1.Continent, t2.Name, t2.Population from t1 LEFT JOIN t2 ON t1.Code = t2.Country where t2.Population IN (select max(t2.Population) AS Population from t2, t1 where t2.Country = t1.Code group by Continent);
ERROR 42S02: Table 'test.t1' doesn't exist ERROR 42S02: Table 'test.t1' doesn't exist
......
...@@ -295,7 +295,7 @@ create trigger trg before insert on t1 for each row set @a:=1; ...@@ -295,7 +295,7 @@ create trigger trg before insert on t1 for each row set @a:=1;
create trigger trg after insert on t1 for each row set @a:=1; create trigger trg after insert on t1 for each row set @a:=1;
ERROR HY000: Trigger already exists ERROR HY000: Trigger already exists
create trigger trg2 before insert on t1 for each row set @a:=1; create trigger trg2 before insert on t1 for each row set @a:=1;
ERROR HY000: Trigger already exists ERROR 42000: This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'
create trigger trg before insert on t3 for each row set @a:=1; create trigger trg before insert on t3 for each row set @a:=1;
ERROR HY000: Trigger already exists ERROR HY000: Trigger already exists
create trigger trg2 before insert on t3 for each row set @a:=1; create trigger trg2 before insert on t3 for each row set @a:=1;
...@@ -1078,3 +1078,15 @@ i1 ...@@ -1078,3 +1078,15 @@ i1
43 43
51 51
DROP TABLE t1; DROP TABLE t1;
create trigger wont_work after update on mysql.user for each row
begin
set @a:= 1;
end|
ERROR HY000: Triggers can not be created on system tables
use mysql|
create trigger wont_work after update on event for each row
begin
set @a:= 1;
end|
ERROR HY000: Triggers can not be created on system tables
End of 5.0 tests
...@@ -517,7 +517,7 @@ coercibility(load_file('../../std_data/words.dat')); ...@@ -517,7 +517,7 @@ coercibility(load_file('../../std_data/words.dat'));
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings: Warnings:
Note 1003 select sql_no_cache charset(load_file(_latin1'../../std_data/words.dat')) AS `charset(load_file('../../std_data/words.dat'))`,collation(load_file(_latin1'../../std_data/words.dat')) AS `collation(load_file('../../std_data/words.dat'))`,coercibility(load_file(_latin1'../../std_data/words.dat')) AS `coercibility(load_file('../../std_data/words.dat'))` Note 1003 select charset(load_file(_latin1'../../std_data/words.dat')) AS `charset(load_file('../../std_data/words.dat'))`,collation(load_file(_latin1'../../std_data/words.dat')) AS `collation(load_file('../../std_data/words.dat'))`,coercibility(load_file(_latin1'../../std_data/words.dat')) AS `coercibility(load_file('../../std_data/words.dat'))`
update t1 set imagem=load_file('../../std_data/words.dat') where id=1; update t1 set imagem=load_file('../../std_data/words.dat') where id=1;
select if(imagem is null, "ERROR", "OK"),length(imagem) from t1 where id = 1; select if(imagem is null, "ERROR", "OK"),length(imagem) from t1 where id = 1;
if(imagem is null, "ERROR", "OK") length(imagem) if(imagem is null, "ERROR", "OK") length(imagem)
......
...@@ -75,7 +75,7 @@ explain extended select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; ...@@ -75,7 +75,7 @@ explain extended select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings: Warnings:
Note 1003 select sql_no_cache (@t1:=((@t2:=1) + (@t3:=4))) AS `@t1:=(@t2:=1)+@t3:=4`,(@t1) AS `@t1`,(@t2) AS `@t2`,(@t3) AS `@t3` Note 1003 select (@t1:=((@t2:=1) + (@t3:=4))) AS `@t1:=(@t2:=1)+@t3:=4`,(@t1) AS `@t1`,(@t2) AS `@t2`,(@t3) AS `@t3`
select @t5; select @t5;
@t5 @t5
1.23456 1.23456
...@@ -135,7 +135,7 @@ explain extended select last_insert_id(345); ...@@ -135,7 +135,7 @@ explain extended select last_insert_id(345);
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings: Warnings:
Note 1003 select sql_no_cache last_insert_id(345) AS `last_insert_id(345)` Note 1003 select last_insert_id(345) AS `last_insert_id(345)`
select @@IDENTITY,last_insert_id(), @@identity; select @@IDENTITY,last_insert_id(), @@identity;
@@IDENTITY last_insert_id() @@identity @@IDENTITY last_insert_id() @@identity
345 345 345 345 345 345
...@@ -143,7 +143,7 @@ explain extended select @@IDENTITY,last_insert_id(), @@identity; ...@@ -143,7 +143,7 @@ explain extended select @@IDENTITY,last_insert_id(), @@identity;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings: Warnings:
Note 1003 select sql_no_cache 345 AS `@@IDENTITY`,last_insert_id() AS `last_insert_id()`,345 AS `@@identity` Note 1003 select 345 AS `@@IDENTITY`,last_insert_id() AS `last_insert_id()`,345 AS `@@identity`
set big_tables=OFF, big_tables=ON, big_tables=0, big_tables=1, big_tables="OFF", big_tables="ON"; set big_tables=OFF, big_tables=ON, big_tables=0, big_tables=1, big_tables="OFF", big_tables="ON";
set global concurrent_insert=2; set global concurrent_insert=2;
show variables like 'concurrent_insert'; show variables like 'concurrent_insert';
......
...@@ -672,7 +672,7 @@ drop table t1; ...@@ -672,7 +672,7 @@ drop table t1;
CREATE VIEW v1 (f1,f2,f3,f4) AS SELECT connection_id(), pi(), current_user(), version(); CREATE VIEW v1 (f1,f2,f3,f4) AS SELECT connection_id(), pi(), current_user(), version();
SHOW CREATE VIEW v1; SHOW CREATE VIEW v1;
View Create View View Create View
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select sql_no_cache connection_id() AS `f1`,pi() AS `f2`,current_user() AS `f3`,version() AS `f4` v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select connection_id() AS `f1`,pi() AS `f2`,current_user() AS `f3`,version() AS `f4`
drop view v1; drop view v1;
create table t1 (s1 int); create table t1 (s1 int);
create table t2 (s2 int); create table t2 (s2 int);
...@@ -787,7 +787,7 @@ create function `f``1` () returns int return 5; ...@@ -787,7 +787,7 @@ create function `f``1` () returns int return 5;
create view v1 as select test.`f``1` (); create view v1 as select test.`f``1` ();
show create view v1; show create view v1;
View Create View View Create View
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select sql_no_cache `test`.`f``1`() AS `test.``f````1`` ()` v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `test`.`f``1`() AS `test.``f````1`` ()`
select * from v1; select * from v1;
test.`f``1` () test.`f``1` ()
5 5
...@@ -1868,14 +1868,14 @@ create table t2 (b timestamp default now()); ...@@ -1868,14 +1868,14 @@ create table t2 (b timestamp default now());
create view v1 as select a,b,t1.a < now() from t1,t2 where t1.a < now(); create view v1 as select a,b,t1.a < now() from t1,t2 where t1.a < now();
SHOW CREATE VIEW v1; SHOW CREATE VIEW v1;
View Create View View Create View
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select sql_no_cache `t1`.`a` AS `a`,`t2`.`b` AS `b`,(`t1`.`a` < now()) AS `t1.a < now()` from (`t1` join `t2`) where (`t1`.`a` < now()) v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a`,`t2`.`b` AS `b`,(`t1`.`a` < now()) AS `t1.a < now()` from (`t1` join `t2`) where (`t1`.`a` < now())
drop view v1; drop view v1;
drop table t1, t2; drop table t1, t2;
CREATE TABLE t1 ( a varchar(50) ); CREATE TABLE t1 ( a varchar(50) );
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a = CURRENT_USER(); CREATE VIEW v1 AS SELECT * FROM t1 WHERE a = CURRENT_USER();
SHOW CREATE VIEW v1; SHOW CREATE VIEW v1;
View Create View View Create View
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select sql_no_cache `t1`.`a` AS `a` from `t1` where (`t1`.`a` = current_user()) v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` where (`t1`.`a` = current_user())
DROP VIEW v1; DROP VIEW v1;
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a = VERSION(); CREATE VIEW v1 AS SELECT * FROM t1 WHERE a = VERSION();
SHOW CREATE VIEW v1; SHOW CREATE VIEW v1;
...@@ -1885,7 +1885,7 @@ DROP VIEW v1; ...@@ -1885,7 +1885,7 @@ DROP VIEW v1;
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a = DATABASE(); CREATE VIEW v1 AS SELECT * FROM t1 WHERE a = DATABASE();
SHOW CREATE VIEW v1; SHOW CREATE VIEW v1;
View Create View View Create View
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select sql_no_cache `t1`.`a` AS `a` from `t1` where (`t1`.`a` = database()) v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` where (`t1`.`a` = database())
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (col1 time); CREATE TABLE t1 (col1 time);
...@@ -2538,7 +2538,7 @@ show create view v1; ...@@ -2538,7 +2538,7 @@ show create view v1;
drop view v1; drop view v1;
// //
View Create View View Create View
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select sql_no_cache `test`.`t1`.`id` AS `id` from `t1` v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `test`.`t1`.`id` AS `id` from `t1`
create table t1(f1 int, f2 int); create table t1(f1 int, f2 int);
create view v1 as select ta.f1 as a, tb.f1 as b from t1 ta, t1 tb where ta.f1=tb create view v1 as select ta.f1 as a, tb.f1 as b from t1 ta, t1 tb where ta.f1=tb
.f1 and ta.f2=tb.f2; .f1 and ta.f2=tb.f2;
...@@ -2683,7 +2683,7 @@ SELECT (year(now())-year(DOB)) AS Age ...@@ -2683,7 +2683,7 @@ SELECT (year(now())-year(DOB)) AS Age
FROM t1 HAVING Age < 75; FROM t1 HAVING Age < 75;
SHOW CREATE VIEW v1; SHOW CREATE VIEW v1;
View Create View View Create View
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select sql_no_cache (year(now()) - year(`t1`.`DOB`)) AS `Age` from `t1` having (`Age` < 75) v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select (year(now()) - year(`t1`.`DOB`)) AS `Age` from `t1` having (`Age` < 75)
SELECT (year(now())-year(DOB)) AS Age FROM t1 HAVING Age < 75; SELECT (year(now())-year(DOB)) AS Age FROM t1 HAVING Age < 75;
Age Age
42 42
......
...@@ -395,11 +395,10 @@ show create table t1; ...@@ -395,11 +395,10 @@ show create table t1;
drop table if exists t1; drop table if exists t1;
system rm -f $MYSQLTEST_VARDIR/master-data/test/t1.frm ; system rm -f $MYSQLTEST_VARDIR/master-data/test/t1.frm ;
# End of 4.1 tests
# #
# BUG 12183 - SHOW OPEN TABLES behavior doesn't match grammar # BUG 12183 - SHOW OPEN TABLES behavior doesn't match grammar
# First we close all open tables with FLUSH tables and then we open some. # First we close all open tables with FLUSH tables and then we open some.
#
CREATE TABLE txt1(a int); CREATE TABLE txt1(a int);
CREATE TABLE tyt2(a int); CREATE TABLE tyt2(a int);
CREATE TABLE urkunde(a int); CREATE TABLE urkunde(a int);
...@@ -421,7 +420,78 @@ DROP TABLE urkunde; ...@@ -421,7 +420,78 @@ DROP TABLE urkunde;
--error 1049 --error 1049
SHOW TABLES FROM non_existing_database; SHOW TABLES FROM non_existing_database;
# End of 4.1 tests --echo End of 4.1 tests
#
# Bug#17203: "sql_no_cache sql_cache" in views created from prepared
# statement
#
# The problem was that initial user setting was forgotten, and current
# runtime-determined values of the flags were shown instead.
#
--disable_warnings
DROP VIEW IF EXISTS v1;
DROP PROCEDURE IF EXISTS p1;
--enable_warnings
# Check that SHOW CREATE VIEW shows SQL_CACHE flag exaclty as
# specified by the user.
CREATE VIEW v1 AS SELECT 1;
SHOW CREATE VIEW v1;
DROP VIEW v1;
CREATE VIEW v1 AS SELECT SQL_CACHE 1;
SHOW CREATE VIEW v1;
DROP VIEW v1;
CREATE VIEW v1 AS SELECT SQL_NO_CACHE 1;
SHOW CREATE VIEW v1;
DROP VIEW v1;
# Usage of NOW() disables caching, but we still have show what the
# user have specified.
CREATE VIEW v1 AS SELECT NOW();
SHOW CREATE VIEW v1;
DROP VIEW v1;
CREATE VIEW v1 AS SELECT SQL_CACHE NOW();
SHOW CREATE VIEW v1;
DROP VIEW v1;
CREATE VIEW v1 AS SELECT SQL_NO_CACHE NOW();
SHOW CREATE VIEW v1;
DROP VIEW v1;
# Check that SQL_NO_CACHE always wins.
CREATE VIEW v1 AS SELECT SQL_CACHE SQL_NO_CACHE NOW();
SHOW CREATE VIEW v1;
DROP VIEW v1;
CREATE VIEW v1 AS SELECT SQL_NO_CACHE SQL_CACHE NOW();
SHOW CREATE VIEW v1;
DROP VIEW v1;
CREATE VIEW v1 AS SELECT SQL_CACHE SQL_NO_CACHE SQL_CACHE NOW();
SHOW CREATE VIEW v1;
DROP VIEW v1;
# Check CREATE VIEW in a prepared statement in a procedure.
delimiter |;
CREATE PROCEDURE p1()
BEGIN
SET @s= 'CREATE VIEW v1 AS SELECT SQL_CACHE 1';
PREPARE stmt FROM @s;
EXECUTE stmt;
DROP PREPARE stmt;
END |
delimiter ;|
CALL p1();
SHOW CREATE VIEW v1;
DROP PROCEDURE p1;
DROP VIEW v1;
--echo End of 5.0 tests.
--disable_result_log --disable_result_log
SHOW AUTHORS; SHOW AUTHORS;
......
...@@ -237,7 +237,7 @@ begin ...@@ -237,7 +237,7 @@ begin
end| end|
delimiter ;| delimiter ;|
insert into t3 values (1); insert into t3 values (1);
--error 1048 --error ER_BAD_NULL_ERROR
insert into t1 values (4, "four", 1), (5, "five", 2); insert into t1 values (4, "four", 1), (5, "five", 2);
select * from t1; select * from t1;
select * from t2; select * from t2;
...@@ -295,19 +295,19 @@ drop table t1, t2; ...@@ -295,19 +295,19 @@ drop table t1, t2;
create table t1 (i int); create table t1 (i int);
create table t3 (i int); create table t3 (i int);
--error 1363 --error ER_TRG_NO_SUCH_ROW_IN_TRG
create trigger trg before insert on t1 for each row set @a:= old.i; create trigger trg before insert on t1 for each row set @a:= old.i;
--error 1363 --error ER_TRG_NO_SUCH_ROW_IN_TRG
create trigger trg before delete on t1 for each row set @a:= new.i; create trigger trg before delete on t1 for each row set @a:= new.i;
--error 1362 --error ER_TRG_CANT_CHANGE_ROW
create trigger trg before update on t1 for each row set old.i:=1; create trigger trg before update on t1 for each row set old.i:=1;
--error 1363 --error ER_TRG_NO_SUCH_ROW_IN_TRG
create trigger trg before delete on t1 for each row set new.i:=1; create trigger trg before delete on t1 for each row set new.i:=1;
--error 1362 --error ER_TRG_CANT_CHANGE_ROW
create trigger trg after update on t1 for each row set new.i:=1; create trigger trg after update on t1 for each row set new.i:=1;
--error 1054 --error ER_BAD_FIELD_ERROR
create trigger trg before update on t1 for each row set new.j:=1; create trigger trg before update on t1 for each row set new.j:=1;
--error 1054 --error ER_BAD_FIELD_ERROR
create trigger trg before update on t1 for each row set @a:=old.j; create trigger trg before update on t1 for each row set @a:=old.j;
...@@ -315,25 +315,25 @@ create trigger trg before update on t1 for each row set @a:=old.j; ...@@ -315,25 +315,25 @@ create trigger trg before update on t1 for each row set @a:=old.j;
# Let us test various trigger creation errors # Let us test various trigger creation errors
# Also quickly test table namespace (bug#5892/6182) # Also quickly test table namespace (bug#5892/6182)
# #
--error 1146 --error ER_NO_SUCH_TABLE
create trigger trg before insert on t2 for each row set @a:=1; create trigger trg before insert on t2 for each row set @a:=1;
create trigger trg before insert on t1 for each row set @a:=1; create trigger trg before insert on t1 for each row set @a:=1;
--error 1359 --error ER_TRG_ALREADY_EXISTS
create trigger trg after insert on t1 for each row set @a:=1; create trigger trg after insert on t1 for each row set @a:=1;
--error 1359 --error ER_NOT_SUPPORTED_YET
create trigger trg2 before insert on t1 for each row set @a:=1; create trigger trg2 before insert on t1 for each row set @a:=1;
--error 1359 --error ER_TRG_ALREADY_EXISTS
create trigger trg before insert on t3 for each row set @a:=1; create trigger trg before insert on t3 for each row set @a:=1;
create trigger trg2 before insert on t3 for each row set @a:=1; create trigger trg2 before insert on t3 for each row set @a:=1;
drop trigger trg2; drop trigger trg2;
drop trigger trg; drop trigger trg;
--error 1360 --error ER_TRG_DOES_NOT_EXIST
drop trigger trg; drop trigger trg;
create view v1 as select * from t1; create view v1 as select * from t1;
--error 1347 --error ER_WRONG_OBJECT
create trigger trg before insert on v1 for each row set @a:=1; create trigger trg before insert on v1 for each row set @a:=1;
drop view v1; drop view v1;
...@@ -341,7 +341,7 @@ drop table t1; ...@@ -341,7 +341,7 @@ drop table t1;
drop table t3; drop table t3;
create temporary table t1 (i int); create temporary table t1 (i int);
--error 1361 --error ER_TRG_ON_VIEW_OR_TEMP_TABLE
create trigger trg before insert on t1 for each row set @a:=1; create trigger trg before insert on t1 for each row set @a:=1;
drop table t1; drop table t1;
...@@ -495,47 +495,47 @@ select * from t1; ...@@ -495,47 +495,47 @@ select * from t1;
# their main effect. This is because operation on the table row is # their main effect. This is because operation on the table row is
# executed before "after" trigger and its effect cannot be rolled back # executed before "after" trigger and its effect cannot be rolled back
# when whole statement fails, because t1 is MyISAM table. # when whole statement fails, because t1 is MyISAM table.
--error 1054 --error ER_BAD_FIELD_ERROR
insert into t1 values (2, 1); insert into t1 values (2, 1);
select * from t1; select * from t1;
--error 1054 --error ER_BAD_FIELD_ERROR
update t1 set k = 2 where i = 2; update t1 set k = 2 where i = 2;
select * from t1; select * from t1;
--error 1054 --error ER_BAD_FIELD_ERROR
delete from t1 where i = 2; delete from t1 where i = 2;
select * from t1; select * from t1;
# Should fail and insert only 1 row # Should fail and insert only 1 row
--error 1054 --error ER_BAD_FIELD_ERROR
load data infile '../std_data_ln/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (i, k); load data infile '../std_data_ln/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (i, k);
select * from t1; select * from t1;
--error 1054 --error ER_BAD_FIELD_ERROR
insert into t1 select 3, 3; insert into t1 select 3, 3;
select * from t1; select * from t1;
# Multi-update working on the fly, again it will update only # Multi-update working on the fly, again it will update only
# one row even if more matches # one row even if more matches
--error 1054 --error ER_BAD_FIELD_ERROR
update t1, t2 set k = k + 10 where t1.i = t2.i; update t1, t2 set k = k + 10 where t1.i = t2.i;
select * from t1; select * from t1;
# The same for multi-update via temp table # The same for multi-update via temp table
--error 1054 --error ER_BAD_FIELD_ERROR
update t1, t2 set k = k + 10 where t1.i = t2.i and k < 3; update t1, t2 set k = k + 10 where t1.i = t2.i and k < 3;
select * from t1; select * from t1;
# Multi-delete on the fly # Multi-delete on the fly
--error 1054 --error ER_BAD_FIELD_ERROR
delete t1, t2 from t1 straight_join t2 where t1.i = t2.i; delete t1, t2 from t1 straight_join t2 where t1.i = t2.i;
select * from t1; select * from t1;
# And via temporary storage # And via temporary storage
--error 1054 --error ER_BAD_FIELD_ERROR
delete t2, t1 from t2 straight_join t1 where t1.i = t2.i; delete t2, t1 from t2 straight_join t1 where t1.i = t2.i;
select * from t1; select * from t1;
# Prepare table for testing of REPLACE and INSERT ... ON DUPLICATE KEY UPDATE # Prepare table for testing of REPLACE and INSERT ... ON DUPLICATE KEY UPDATE
alter table t1 add primary key (i); alter table t1 add primary key (i);
--error 1054 --error ER_BAD_FIELD_ERROR
insert into t1 values (3, 4) on duplicate key update k= k + 10; insert into t1 values (3, 4) on duplicate key update k= k + 10;
select * from t1; select * from t1;
# The following statement will delete old row and won't # The following statement will delete old row and won't
# insert new one since after delete trigger will fail. # insert new one since after delete trigger will fail.
--error 1054 --error ER_BAD_FIELD_ERROR
replace into t1 values (3, 3); replace into t1 values (3, 3);
select * from t1; select * from t1;
# Also drops all triggers # Also drops all triggers
...@@ -553,33 +553,33 @@ alter table t1 drop column bt; ...@@ -553,33 +553,33 @@ alter table t1 drop column bt;
# The following statements changing t1 should fail and should not # The following statements changing t1 should fail and should not
# cause any effect on table, since "before" trigger is executed # cause any effect on table, since "before" trigger is executed
# before operation on the table row. # before operation on the table row.
--error 1054 --error ER_BAD_FIELD_ERROR
insert into t1 values (3, 3); insert into t1 values (3, 3);
select * from t1; select * from t1;
--error 1054 --error ER_BAD_FIELD_ERROR
update t1 set i = 2; update t1 set i = 2;
select * from t1; select * from t1;
--error 1054 --error ER_BAD_FIELD_ERROR
delete from t1; delete from t1;
select * from t1; select * from t1;
--error 1054 --error ER_BAD_FIELD_ERROR
load data infile '../std_data_ln/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (i, k); load data infile '../std_data_ln/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (i, k);
select * from t1; select * from t1;
--error 1054 --error ER_BAD_FIELD_ERROR
insert into t1 select 3, 3; insert into t1 select 3, 3;
select * from t1; select * from t1;
# Both types of multi-update (on the fly and via temp table) # Both types of multi-update (on the fly and via temp table)
--error 1054 --error ER_BAD_FIELD_ERROR
update t1, t2 set k = k + 10 where t1.i = t2.i; update t1, t2 set k = k + 10 where t1.i = t2.i;
select * from t1; select * from t1;
--error 1054 --error ER_BAD_FIELD_ERROR
update t1, t2 set k = k + 10 where t1.i = t2.i and k < 2; update t1, t2 set k = k + 10 where t1.i = t2.i and k < 2;
select * from t1; select * from t1;
# Both types of multi-delete # Both types of multi-delete
--error 1054 --error ER_BAD_FIELD_ERROR
delete t1, t2 from t1 straight_join t2 where t1.i = t2.i; delete t1, t2 from t1 straight_join t2 where t1.i = t2.i;
select * from t1; select * from t1;
--error 1054 --error ER_BAD_FIELD_ERROR
delete t2, t1 from t2 straight_join t1 where t1.i = t2.i; delete t2, t1 from t2 straight_join t1 where t1.i = t2.i;
select * from t1; select * from t1;
# Let us test REPLACE/INSERT ... ON DUPLICATE KEY UPDATE. # Let us test REPLACE/INSERT ... ON DUPLICATE KEY UPDATE.
...@@ -587,10 +587,10 @@ select * from t1; ...@@ -587,10 +587,10 @@ select * from t1;
# in ordinary INSERT we need to drop "before insert" trigger. # in ordinary INSERT we need to drop "before insert" trigger.
alter table t1 add primary key (i); alter table t1 add primary key (i);
drop trigger bi; drop trigger bi;
--error 1054 --error ER_BAD_FIELD_ERROR
insert into t1 values (2, 4) on duplicate key update k= k + 10; insert into t1 values (2, 4) on duplicate key update k= k + 10;
select * from t1; select * from t1;
--error 1054 --error ER_BAD_FIELD_ERROR
replace into t1 values (2, 4); replace into t1 values (2, 4);
select * from t1; select * from t1;
# Also drops all triggers # Also drops all triggers
...@@ -608,7 +608,7 @@ insert into t1 values (1, 2); ...@@ -608,7 +608,7 @@ insert into t1 values (1, 2);
create function bug5893 () returns int return 5; create function bug5893 () returns int return 5;
create trigger t1_bu before update on t1 for each row set new.col1= bug5893(); create trigger t1_bu before update on t1 for each row set new.col1= bug5893();
drop function bug5893; drop function bug5893;
--error 1305 --error ER_SP_DOES_NOT_EXIST
update t1 set col2 = 4; update t1 set col2 = 4;
# This should not crash server too. # This should not crash server too.
drop trigger t1_bu; drop trigger t1_bu;
...@@ -908,9 +908,9 @@ create trigger t1_bi after insert on t1 for each row insert into t3 values (new. ...@@ -908,9 +908,9 @@ create trigger t1_bi after insert on t1 for each row insert into t3 values (new.
# Until we implement proper mechanism for invalidation of PS/SP when table # Until we implement proper mechanism for invalidation of PS/SP when table
# or SP's are changed these two statements will fail with 'Table ... was # or SP's are changed these two statements will fail with 'Table ... was
# not locked' error (this mechanism should be based on the new TDC). # not locked' error (this mechanism should be based on the new TDC).
--error 1100 --error 1100 #ER_TABLE_NOT_LOCKED
execute stmt1; execute stmt1;
--error 1100 --error 1100 #ER_TABLE_NOT_LOCKED
call p1(); call p1();
deallocate prepare stmt1; deallocate prepare stmt1;
drop procedure p1; drop procedure p1;
...@@ -1186,7 +1186,7 @@ INSERT INTO t1 VALUES (@x); ...@@ -1186,7 +1186,7 @@ INSERT INTO t1 VALUES (@x);
SELECT @x; SELECT @x;
SET @x=2; SET @x=2;
--error 1365 --error ER_DIVISION_BY_ZERO
UPDATE t1 SET i1 = @x; UPDATE t1 SET i1 = @x;
SELECT @x; SELECT @x;
...@@ -1197,7 +1197,7 @@ INSERT INTO t1 VALUES (@x); ...@@ -1197,7 +1197,7 @@ INSERT INTO t1 VALUES (@x);
SELECT @x; SELECT @x;
SET @x=4; SET @x=4;
--error 1365 --error ER_DIVISION_BY_ZERO
UPDATE t1 SET i1 = @x; UPDATE t1 SET i1 = @x;
SELECT @x; SELECT @x;
...@@ -1281,4 +1281,26 @@ SELECT * FROM t1; ...@@ -1281,4 +1281,26 @@ SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
# End of 5.0 tests #
# Bug #18005: Creating a trigger on mysql.event leads to server crash on
# scheduler startup
#
# Bug #18361: Triggers on mysql.user table cause server crash
#
# We don't allow triggers on the mysql schema
delimiter |;
--error ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA
create trigger wont_work after update on mysql.user for each row
begin
set @a:= 1;
end|
# Try when we're already using the mysql schema
use mysql|
--error ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA
create trigger wont_work after update on event for each row
begin
set @a:= 1;
end|
delimiter ;|
--echo End of 5.0 tests
...@@ -1693,14 +1693,33 @@ void Query_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info) ...@@ -1693,14 +1693,33 @@ void Query_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info)
*/ */
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) #if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
static const char *rewrite_db(const char *db)
{
if (replicate_rewrite_db.is_empty() || db == NULL)
return db;
I_List_iterator<i_string_pair> it(replicate_rewrite_db);
i_string_pair* tmp;
while ((tmp=it++))
{
if (strcmp(tmp->key, db) == 0)
return tmp->val;
}
return db;
}
int Query_log_event::exec_event(struct st_relay_log_info* rli) int Query_log_event::exec_event(struct st_relay_log_info* rli)
{ {
return exec_event(rli, query, q_len); return exec_event(rli, query, q_len);
} }
int Query_log_event::exec_event(struct st_relay_log_info* rli, const char *query_arg, uint32 q_len_arg) int Query_log_event::exec_event(struct st_relay_log_info* rli,
const char *query_arg, uint32 q_len_arg)
{ {
LEX_STRING new_db;
int expected_error,actual_error= 0; int expected_error,actual_error= 0;
/* /*
Colleagues: please never free(thd->catalog) in MySQL. This would lead to Colleagues: please never free(thd->catalog) in MySQL. This would lead to
...@@ -1709,8 +1728,9 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli, const char *query ...@@ -1709,8 +1728,9 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli, const char *query
Thank you. Thank you.
*/ */
thd->catalog= catalog_len ? (char *) catalog : (char *)""; thd->catalog= catalog_len ? (char *) catalog : (char *)"";
thd->db_length= db_len; new_db.length= db_len;
thd->db= (char *) rpl_filter->get_rewrite_db(db, &thd->db_length); new_db.str= (char *) rpl_filter->get_rewrite_db(db, &new_db.length);
thd->set_db(new_db.str, new_db.length); /* allocates a copy of 'db' */
thd->variables.auto_increment_increment= auto_increment_increment; thd->variables.auto_increment_increment= auto_increment_increment;
thd->variables.auto_increment_offset= auto_increment_offset; thd->variables.auto_increment_offset= auto_increment_offset;
...@@ -1929,7 +1949,7 @@ end: ...@@ -1929,7 +1949,7 @@ end:
TABLE uses the db.table syntax. TABLE uses the db.table syntax.
*/ */
thd->catalog= 0; thd->catalog= 0;
thd->reset_db(NULL, 0); // prevent db from being freed thd->set_db(NULL, 0); /* will free the current database */
thd->query= 0; // just to be sure thd->query= 0; // just to be sure
thd->query_length= 0; thd->query_length= 0;
VOID(pthread_mutex_unlock(&LOCK_thread_count)); VOID(pthread_mutex_unlock(&LOCK_thread_count));
...@@ -2906,8 +2926,10 @@ void Load_log_event::set_fields(const char* affected_db, ...@@ -2906,8 +2926,10 @@ void Load_log_event::set_fields(const char* affected_db,
int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
bool use_rli_only_for_errors) bool use_rli_only_for_errors)
{ {
thd->db_length= db_len; LEX_STRING new_db;
thd->db= (char *) rpl_filter->get_rewrite_db(db, &thd->db_length); new_db.length= db_len;
new_db.str= (char *) rpl_filter->get_rewrite_db(db, &new_db.length);
thd->set_db(new_db.str, new_db.length);
DBUG_ASSERT(thd->query == 0); DBUG_ASSERT(thd->query == 0);
thd->query_length= 0; // Should not be needed thd->query_length= 0; // Should not be needed
thd->query_error= 0; thd->query_error= 0;
...@@ -3110,7 +3132,7 @@ error: ...@@ -3110,7 +3132,7 @@ error:
const char *remember_db= thd->db; const char *remember_db= thd->db;
VOID(pthread_mutex_lock(&LOCK_thread_count)); VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->catalog= 0; thd->catalog= 0;
thd->reset_db(NULL, 0); thd->set_db(NULL, 0); /* will free the current database */
thd->query= 0; thd->query= 0;
thd->query_length= 0; thd->query_length= 0;
VOID(pthread_mutex_unlock(&LOCK_thread_count)); VOID(pthread_mutex_unlock(&LOCK_thread_count));
......
...@@ -5594,6 +5594,8 @@ ER_NON_GROUPING_FIELD_USED 42000 ...@@ -5594,6 +5594,8 @@ ER_NON_GROUPING_FIELD_USED 42000
eng "non-grouping field '%-.64s' is used in %-.64s clause" eng "non-grouping field '%-.64s' is used in %-.64s clause"
ER_TABLE_CANT_HANDLE_SPKEYS ER_TABLE_CANT_HANDLE_SPKEYS
eng "The used table type doesn't support SPATIAL indexes" eng "The used table type doesn't support SPATIAL indexes"
ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA
eng "Triggers can not be created on system tables"
ER_ILLEGAL_HA_CREATE_OPTION ER_ILLEGAL_HA_CREATE_OPTION
eng "Table storage engine '%-.64s' does not support the create option '%.64s'" eng "Table storage engine '%-.64s' does not support the create option '%.64s'"
ER_PARTITION_REQUIRES_VALUES_ERROR ER_PARTITION_REQUIRES_VALUES_ERROR
......
...@@ -1576,21 +1576,29 @@ public: ...@@ -1576,21 +1576,29 @@ public:
/* /*
Initialize the current database from a NULL-terminated string with length Initialize the current database from a NULL-terminated string with length
If we run out of memory, we free the current database and return TRUE.
This way the user will notice the error as there will be no current
database selected (in addition to the error message set by malloc).
*/ */
void set_db(const char *new_db, uint new_db_len) bool set_db(const char *new_db, uint new_db_len)
{ {
if (new_db) /* Do not reallocate memory if current chunk is big enough. */
if (db && new_db && db_length >= new_db_len)
memcpy(db, new_db, new_db_len+1);
else
{ {
/* Do not reallocate memory if current chunk is big enough. */ /* Do not reallocate memory if current chunk is big enough. */
if (db && db_length >= new_db_len) if (db && db_length >= new_db_len)
memcpy(db, new_db, new_db_len+1); memcpy(db, new_db, new_db_len+1);
else else
{ {
safeFree(db); x_free(db);
db= my_strndup(new_db, new_db_len, MYF(MY_WME)); db= new_db ? my_strndup(new_db, new_db_len, MYF(MY_WME)) : NULL;
} }
db_length= db ? new_db_len: 0; db_length= db ? new_db_len: 0;
} }
db_length= db ? new_db_len : 0;
return new_db && !db;
} }
void reset_db(char *new_db, uint new_db_len) void reset_db(char *new_db, uint new_db_len)
{ {
......
...@@ -906,32 +906,13 @@ exit: ...@@ -906,32 +906,13 @@ exit:
(void)sp_drop_db_routines(thd, db); /* QQ Ignore errors for now */ (void)sp_drop_db_routines(thd, db); /* QQ Ignore errors for now */
error= Events::drop_schema_events(thd, db); error= Events::drop_schema_events(thd, db);
/* /*
If this database was the client's selected database, we silently change the If this database was the client's selected database, we silently
client's selected database to nothing (to have an empty SELECT DATABASE() change the client's selected database to nothing (to have an empty
in the future). For this we free() thd->db and set it to 0. But we don't do SELECT DATABASE() in the future). For this we free() thd->db and set
free() for the slave thread. Indeed, doing a x_free() on it leads to nasty it to 0.
problems (i.e. long painful debugging) because in this thread, thd->db is
the same as data_buf and db of the Query_log_event which is dropping the
database. So if you free() thd->db, you're freeing data_buf. You set
thd->db to 0 but not data_buf (thd->db and data_buf are two distinct
pointers which point to the same place). Then in ~Query_log_event(), we
have 'if (data_buf) free(data_buf)' data_buf is !=0 so this makes a
DOUBLE free().
Side effects of this double free() are, randomly (depends on the machine),
when the slave is replicating a DROP DATABASE:
- garbage characters in the error message:
"Error 'Can't drop database 'test2'; database doesn't exist' on query
'h4zI'"
- segfault
- hang in "free(vio)" (yes!) in the I/O or SQL slave threads (so slave
server hangs at shutdown etc).
*/ */
if (thd->db && !strcmp(thd->db, db)) if (thd->db && !strcmp(thd->db, db))
{ thd->set_db(NULL, 0);
if (!(thd->slave_thread)) /* a slave thread will free it itself */
x_free(thd->db);
thd->reset_db(NULL, 0);
}
VOID(pthread_mutex_unlock(&LOCK_mysql_create_db)); VOID(pthread_mutex_unlock(&LOCK_mysql_create_db));
start_waiting_global_read_lock(thd); start_waiting_global_read_lock(thd);
exit2: exit2:
...@@ -1227,38 +1208,52 @@ err: ...@@ -1227,38 +1208,52 @@ err:
/* /*
Change default database. Change the current database.
SYNOPSIS SYNOPSIS
mysql_change_db() mysql_change_db()
thd Thread handler thd thread handle
name Databasename name database name
no_access_check True don't do access check. In this case name may be "" no_access_check if TRUE, don't do access check. In this
case name may be ""
DESCRIPTION DESCRIPTION
Becasue the database name may have been given directly from the Check that the database name corresponds to a valid and
communication packet (in case of 'connect' or 'COM_INIT_DB') existent database, check access rights (unless called with
we have to do end space removal in this function. no_access_check), and set the current database. This function
is called to change the current database upon user request
(COM_CHANGE_DB command) or temporarily, to execute a stored
routine.
NOTES NOTES
Do as little as possible in this function, as it is not called for the This function is not the only way to switch the database that
replication slave SQL thread (for that thread, setting of thd->db is done is currently employed. When the replication slave thread
in ::exec_event() methods of log_event.cc). switches the database before executing a query, it calls
thd->set_db directly. However, if the query, in turn, uses
This function does not send anything, including error messages to the a stored routine, the stored routine will use this function,
client, if that should be sent to the client, call net_send_error after even if it's run on the slave.
this function.
This function allocates the name of the database on the system
heap: this is necessary to be able to uniformly change the
database from any module of the server. Up to 5.0 different
modules were using different memory to store the name of the
database, and this led to memory corruption: a stack pointer
set by Stored Procedures was used by replication after the
stack address was long gone.
This function does not send anything, including error
messages, to the client. If that should be sent to the client,
call net_send_error after this function.
RETURN VALUES RETURN VALUES
0 ok 0 OK
1 error 1 error
*/ */
bool mysql_change_db(THD *thd, const char *name, bool no_access_check) bool mysql_change_db(THD *thd, const char *name, bool no_access_check)
{ {
int length, db_length; int path_length, db_length;
char *dbname= thd->slave_thread ? (char *) name : char *db_name;
my_strdup((char *) name, MYF(MY_WME));
char path[FN_REFLEN]; char path[FN_REFLEN];
HA_CREATE_INFO create; HA_CREATE_INFO create;
bool system_db= 0; bool system_db= 0;
...@@ -1270,32 +1265,35 @@ bool mysql_change_db(THD *thd, const char *name, bool no_access_check) ...@@ -1270,32 +1265,35 @@ bool mysql_change_db(THD *thd, const char *name, bool no_access_check)
DBUG_ENTER("mysql_change_db"); DBUG_ENTER("mysql_change_db");
DBUG_PRINT("enter",("name: '%s'",name)); DBUG_PRINT("enter",("name: '%s'",name));
LINT_INIT(db_length); if (name == NULL || name[0] == '\0' && no_access_check == FALSE)
/* dbname can only be NULL if malloc failed */
if (!dbname || !(db_length= strlen(dbname)))
{ {
if (no_access_check && dbname) my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
DBUG_RETURN(1); /* purecov: inspected */
}
else if (name[0] == '\0')
{ {
/* Called from SP when orignal database was not set */ /* Called from SP to restore the original database, which was NULL */
DBUG_ASSERT(no_access_check);
system_db= 1; system_db= 1;
db_name= NULL;
db_length= 0;
goto end; goto end;
} }
if (!(thd->slave_thread)) /*
x_free(dbname); /* purecov: inspected */ Now we need to make a copy because check_db_name requires a
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), non-constant argument. TODO: fix check_db_name.
MYF(0)); /* purecov: inspected */ */
DBUG_RETURN(1); /* purecov: inspected */ if ((db_name= my_strdup(name, MYF(MY_WME))) == NULL)
} DBUG_RETURN(1); /* the error is set */
if (check_db_name(dbname)) db_length= strlen(db_name);
if (check_db_name(db_name))
{ {
my_error(ER_WRONG_DB_NAME, MYF(0), dbname); my_error(ER_WRONG_DB_NAME, MYF(0), db_name);
if (!(thd->slave_thread)) my_free(db_name, MYF(0));
my_free(dbname, MYF(0));
DBUG_RETURN(1); DBUG_RETURN(1);
} }
DBUG_PRINT("info",("Use database: %s", dbname)); DBUG_PRINT("info",("Use database: %s", db_name));
if (!my_strcasecmp(system_charset_info, dbname, information_schema_name.str)) if (!my_strcasecmp(system_charset_info, db_name, information_schema_name.str))
{ {
system_db= 1; system_db= 1;
#ifndef NO_EMBEDDED_ACCESS_CHECKS #ifndef NO_EMBEDDED_ACCESS_CHECKS
...@@ -1310,44 +1308,35 @@ bool mysql_change_db(THD *thd, const char *name, bool no_access_check) ...@@ -1310,44 +1308,35 @@ bool mysql_change_db(THD *thd, const char *name, bool no_access_check)
if (test_all_bits(sctx->master_access, DB_ACLS)) if (test_all_bits(sctx->master_access, DB_ACLS))
db_access=DB_ACLS; db_access=DB_ACLS;
else else
db_access= (acl_get(sctx->host, sctx->ip, sctx->priv_user, dbname, 0) | db_access= (acl_get(sctx->host, sctx->ip, sctx->priv_user, db_name, 0) |
sctx->master_access); sctx->master_access);
if (!(db_access & DB_ACLS) && (!grant_option || if (!(db_access & DB_ACLS) && (!grant_option ||
check_grant_db(thd,dbname))) check_grant_db(thd,db_name)))
{ {
my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), my_error(ER_DBACCESS_DENIED_ERROR, MYF(0),
sctx->priv_user, sctx->priv_user,
sctx->priv_host, sctx->priv_host,
dbname); db_name);
general_log_print(thd, COM_INIT_DB, ER(ER_DBACCESS_DENIED_ERROR), general_log_print(thd, COM_INIT_DB, ER(ER_DBACCESS_DENIED_ERROR),
sctx->priv_user, sctx->priv_host, dbname); sctx->priv_user, sctx->priv_host, db_name);
if (!(thd->slave_thread)) my_free(db_name,MYF(0));
my_free(dbname,MYF(0));
DBUG_RETURN(1); DBUG_RETURN(1);
} }
} }
#endif #endif
length= build_table_filename(path, sizeof(path), dbname, "", ""); path_length= build_table_filename(path, sizeof(path), db_name, "", "");
if (length && path[length-1] == FN_LIBCHAR) if (path_length && path[path_length-1] == FN_LIBCHAR)
path[length-1]=0; // remove ending '\' path[path_length-1]= '\0'; // remove ending '\'
if (my_access(path,F_OK)) if (my_access(path,F_OK))
{ {
my_error(ER_BAD_DB_ERROR, MYF(0), dbname); my_error(ER_BAD_DB_ERROR, MYF(0), db_name);
if (!(thd->slave_thread)) my_free(db_name, MYF(0));
my_free(dbname,MYF(0));
DBUG_RETURN(1); DBUG_RETURN(1);
} }
end: end:
if (!(thd->slave_thread))
x_free(thd->db); x_free(thd->db);
if (dbname && dbname[0] == 0) DBUG_ASSERT(db_name == NULL || db_name[0] != '\0');
{ thd->reset_db(db_name, db_length); // THD::~THD will free this
if (!(thd->slave_thread))
my_free(dbname, MYF(0));
thd->reset_db(NULL, 0);
}
else
thd->reset_db(dbname, db_length); // THD::~THD will free this
#ifndef NO_EMBEDDED_ACCESS_CHECKS #ifndef NO_EMBEDDED_ACCESS_CHECKS
if (!no_access_check) if (!no_access_check)
sctx->db_access= db_access; sctx->db_access= db_access;
......
...@@ -141,6 +141,7 @@ void lex_start(THD *thd, const uchar *buf, uint length) ...@@ -141,6 +141,7 @@ void lex_start(THD *thd, const uchar *buf, uint length)
lex->select_lex.link_next= lex->select_lex.slave= lex->select_lex.next= 0; lex->select_lex.link_next= lex->select_lex.slave= lex->select_lex.next= 0;
lex->select_lex.link_prev= (st_select_lex_node**)&(lex->all_selects_list); lex->select_lex.link_prev= (st_select_lex_node**)&(lex->all_selects_list);
lex->select_lex.options= 0; lex->select_lex.options= 0;
lex->select_lex.sql_cache= SELECT_LEX::SQL_CACHE_UNSPECIFIED;
lex->select_lex.init_order(); lex->select_lex.init_order();
lex->select_lex.group_list.empty(); lex->select_lex.group_list.empty();
lex->describe= 0; lex->describe= 0;
...@@ -1070,6 +1071,7 @@ int MYSQLlex(void *arg, void *yythd) ...@@ -1070,6 +1071,7 @@ int MYSQLlex(void *arg, void *yythd)
void st_select_lex_node::init_query() void st_select_lex_node::init_query()
{ {
options= 0; options= 0;
sql_cache= SQL_CACHE_UNSPECIFIED;
linkage= UNSPECIFIED_TYPE; linkage= UNSPECIFIED_TYPE;
no_error= no_table_names_allowed= 0; no_error= no_table_names_allowed= 0;
uncacheable= 0; uncacheable= 0;
...@@ -1146,6 +1148,7 @@ void st_select_lex::init_select() ...@@ -1146,6 +1148,7 @@ void st_select_lex::init_select()
table_join_options= 0; table_join_options= 0;
in_sum_expr= with_wild= 0; in_sum_expr= with_wild= 0;
options= 0; options= 0;
sql_cache= SQL_CACHE_UNSPECIFIED;
braces= 0; braces= 0;
when_list.empty(); when_list.empty();
expr_list.empty(); expr_list.empty();
......
...@@ -338,6 +338,14 @@ protected: ...@@ -338,6 +338,14 @@ protected:
public: public:
ulonglong options; ulonglong options;
/*
In sql_cache we store SQL_CACHE flag as specified by user to be
able to restore SELECT statement from internal structures.
*/
enum e_sql_cache { SQL_CACHE_UNSPECIFIED, SQL_NO_CACHE, SQL_CACHE };
e_sql_cache sql_cache;
/* /*
result of this query can't be cached, bit field, can be : result of this query can't be cached, bit field, can be :
UNCACHEABLE_DEPENDENT UNCACHEABLE_DEPENDENT
......
...@@ -14584,10 +14584,19 @@ void st_select_lex::print(THD *thd, String *str) ...@@ -14584,10 +14584,19 @@ void st_select_lex::print(THD *thd, String *str)
str->append(STRING_WITH_LEN("sql_buffer_result ")); str->append(STRING_WITH_LEN("sql_buffer_result "));
if (options & OPTION_FOUND_ROWS) if (options & OPTION_FOUND_ROWS)
str->append(STRING_WITH_LEN("sql_calc_found_rows ")); str->append(STRING_WITH_LEN("sql_calc_found_rows "));
if (!thd->lex->safe_to_cache_query) switch (sql_cache)
{
case SQL_NO_CACHE:
str->append(STRING_WITH_LEN("sql_no_cache ")); str->append(STRING_WITH_LEN("sql_no_cache "));
if (options & OPTION_TO_QUERY_CACHE) break;
case SQL_CACHE:
str->append(STRING_WITH_LEN("sql_cache ")); str->append(STRING_WITH_LEN("sql_cache "));
break;
case SQL_CACHE_UNSPECIFIED:
break;
default:
DBUG_ASSERT(0);
}
//Item List //Item List
bool first= 1; bool first= 1;
......
...@@ -183,6 +183,15 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) ...@@ -183,6 +183,15 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
!(tables= add_table_for_trigger(thd, thd->lex->spname))) !(tables= add_table_for_trigger(thd, thd->lex->spname)))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
/*
We don't allow creating triggers on tables in the 'mysql' schema
*/
if (create && !my_strcasecmp(system_charset_info, "mysql", tables->db))
{
my_error(ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA, MYF(0));
DBUG_RETURN(TRUE);
}
/* We should have only one table in table list. */ /* We should have only one table in table list. */
DBUG_ASSERT(tables->next_global == 0); DBUG_ASSERT(tables->next_global == 0);
...@@ -372,7 +381,9 @@ bool Table_triggers_list::create_trigger(THD *thd, TABLE_LIST *tables, ...@@ -372,7 +381,9 @@ bool Table_triggers_list::create_trigger(THD *thd, TABLE_LIST *tables,
/* We don't allow creation of several triggers of the same type yet */ /* We don't allow creation of several triggers of the same type yet */
if (bodies[lex->trg_chistics.event][lex->trg_chistics.action_time]) if (bodies[lex->trg_chistics.event][lex->trg_chistics.action_time])
{ {
my_message(ER_TRG_ALREADY_EXISTS, ER(ER_TRG_ALREADY_EXISTS), MYF(0)); my_error(ER_NOT_SUPPORTED_YET, MYF(0),
"multiple triggers with the same action time"
" and event for one table");
return 1; return 1;
} }
......
...@@ -5707,10 +5707,21 @@ select_option: ...@@ -5707,10 +5707,21 @@ select_option:
YYABORT; YYABORT;
Select->options|= OPTION_FOUND_ROWS; Select->options|= OPTION_FOUND_ROWS;
} }
| SQL_NO_CACHE_SYM { Lex->safe_to_cache_query=0; } | SQL_NO_CACHE_SYM
{
Lex->safe_to_cache_query=0;
Lex->select_lex.options&= ~OPTION_TO_QUERY_CACHE;
Lex->select_lex.sql_cache= SELECT_LEX::SQL_NO_CACHE;
}
| SQL_CACHE_SYM | SQL_CACHE_SYM
{ {
/* Honor this flag only if SQL_NO_CACHE wasn't specified. */
if (Lex->select_lex.sql_cache != SELECT_LEX::SQL_NO_CACHE)
{
Lex->safe_to_cache_query=1;
Lex->select_lex.options|= OPTION_TO_QUERY_CACHE; Lex->select_lex.options|= OPTION_TO_QUERY_CACHE;
Lex->select_lex.sql_cache= SELECT_LEX::SQL_CACHE;
}
} }
| ALL { Select->options|= SELECT_ALL; } | ALL { Select->options|= SELECT_ALL; }
; ;
...@@ -8073,6 +8084,7 @@ truncate: ...@@ -8073,6 +8084,7 @@ truncate:
LEX* lex= Lex; LEX* lex= Lex;
lex->sql_command= SQLCOM_TRUNCATE; lex->sql_command= SQLCOM_TRUNCATE;
lex->select_lex.options= 0; lex->select_lex.options= 0;
lex->select_lex.sql_cache= SELECT_LEX::SQL_CACHE_UNSPECIFIED;
lex->select_lex.init_order(); lex->select_lex.init_order();
} }
; ;
......
...@@ -2075,6 +2075,8 @@ private: ...@@ -2075,6 +2075,8 @@ private:
* *
* XXX only table ops check BlockState * XXX only table ops check BlockState
*/ */
struct DictLockType;
friend struct DictLockType;
struct DictLockType { struct DictLockType {
DictLockReq::LockType lockType; DictLockReq::LockType lockType;
...@@ -2082,6 +2084,9 @@ private: ...@@ -2082,6 +2084,9 @@ private:
const char* text; const char* text;
}; };
struct DictLockRecord;
friend struct DictLockRecord;
struct DictLockRecord { struct DictLockRecord {
DictLockReq req; DictLockReq req;
const DictLockType* lt; const DictLockType* lt;
......
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