Merge bodhi.local:/opt/local/work/tmp_merge
into bodhi.local:/opt/local/work/mysql-5.1-runtime-merge-5.0 include/my_sys.h: Auto merged mysql-test/r/auto_increment.result: Auto merged mysql-test/r/func_math.result: Auto merged mysql-test/r/func_system.result: Auto merged mysql-test/r/func_time.result: Auto merged mysql-test/r/information_schema.result: Auto merged mysql-test/r/query_cache.result: Auto merged mysql-test/r/subselect.result: Auto merged mysql-test/r/trigger.result: Auto merged mysql-test/r/type_blob.result: Auto merged mysql-test/r/variables.result: Auto merged mysql-test/r/view.result: Auto merged mysql-test/t/trigger.test: Auto merged sql/ha_ndbcluster.cc: Auto merged sql/log.cc: Auto merged sql/slave.cc: Auto merged sql/sql_lex.cc: Auto merged sql/sql_lex.h: Auto merged sql/sql_select.cc: Auto merged sql/sql_trigger.cc: Auto merged sql/sql_yacc.yy: Auto merged storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp: Auto merged storage/ndb/src/mgmsrv/ConfigInfo.cpp: Auto merged sql/slave.h: SCCS merged mysql-test/r/show_check.result: Manual merge. mysql-test/t/show_check.test: Manual merge. sql/log_event.cc: Manual merge. sql/share/errmsg.txt: Manual merge. sql/sql_class.h: Manual merge. sql/sql_db.cc: Manual merge.
This commit is contained in:
commit
d013f9e53a
@ -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));
|
|||||||
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
|
|||||||
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();
|
|||||||
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();
|
|||||||
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
|
|||||||
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;
|
|||||||
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:
|
|||||||
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;
|
|||||||
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");
|
|||||||
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);
|
|||||||
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
|
|||||||
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
|
|||||||
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;
|
|||||||
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
|
|||||||
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'));
|
|||||||
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;
|
|||||||
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);
|
|||||||
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;
|
|||||||
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;
|
|||||||
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;
|
|||||||
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());
|
|||||||
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;
|
|||||||
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;
|
|||||||
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
|
|||||||
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;
|
|||||||
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;
|
|||||||
--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
|
|||||||
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;
|
|||||||
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;
|
|||||||
# 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;
|
|||||||
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;
|
|||||||
# 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;
|
|||||||
# 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;
|
|||||||
# 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);
|
|||||||
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.
|
|||||||
# 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);
|
|||||||
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);
|
|||||||
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;
|
|||||||
|
|
||||||
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)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#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
|
|||||||
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:
|
|||||||
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,
|
|||||||
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:
|
|||||||
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
|
|||||||
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:
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
153
sql/sql_db.cc
153
sql/sql_db.cc
@ -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<EFBFBD>©'"
|
|
||||||
- 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:
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
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
|
||||||
|
a stored routine, the stored routine will use this function,
|
||||||
|
even if it's run on the slave.
|
||||||
|
|
||||||
This function does not send anything, including error messages to the
|
This function allocates the name of the database on the system
|
||||||
client, if that should be sent to the client, call net_send_error after
|
heap: this is necessary to be able to uniformly change the
|
||||||
this function.
|
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)
|
|||||||
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));
|
||||||
{
|
|
||||||
/* Called from SP when orignal database was not set */
|
|
||||||
system_db= 1;
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
if (!(thd->slave_thread))
|
|
||||||
x_free(dbname); /* purecov: inspected */
|
|
||||||
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR),
|
|
||||||
MYF(0)); /* purecov: inspected */
|
|
||||||
DBUG_RETURN(1); /* purecov: inspected */
|
DBUG_RETURN(1); /* purecov: inspected */
|
||||||
}
|
}
|
||||||
if (check_db_name(dbname))
|
else if (name[0] == '\0')
|
||||||
{
|
{
|
||||||
my_error(ER_WRONG_DB_NAME, MYF(0), dbname);
|
/* Called from SP to restore the original database, which was NULL */
|
||||||
if (!(thd->slave_thread))
|
DBUG_ASSERT(no_access_check);
|
||||||
my_free(dbname, MYF(0));
|
system_db= 1;
|
||||||
|
db_name= NULL;
|
||||||
|
db_length= 0;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Now we need to make a copy because check_db_name requires a
|
||||||
|
non-constant argument. TODO: fix check_db_name.
|
||||||
|
*/
|
||||||
|
if ((db_name= my_strdup(name, MYF(MY_WME))) == NULL)
|
||||||
|
DBUG_RETURN(1); /* the error is set */
|
||||||
|
db_length= strlen(db_name);
|
||||||
|
if (check_db_name(db_name))
|
||||||
|
{
|
||||||
|
my_error(ER_WRONG_DB_NAME, MYF(0), db_name);
|
||||||
|
my_free(db_name, 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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()
|
|||||||
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:
|
|||||||
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)
|
|||||||
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)
|
|||||||
!(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,
|
|||||||
/* 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:
|
|||||||
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:
|
|||||||
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:
|
|||||||
*
|
*
|
||||||
* 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:
|
|||||||
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user