Loading include/my_pthread.h +9 −0 Original line number Diff line number Diff line Loading @@ -701,6 +701,15 @@ extern uint my_thread_end_wait_time; Keep track of shutdown,signal, and main threads so that my_end() will not report errors with them */ /* Which kind of thread library is in use */ #define THD_LIB_OTHER 1 #define THD_LIB_NPTL 2 #define THD_LIB_LT 4 extern uint thd_lib_detected; /* statistics_xxx functions are for not essential statistic */ #ifndef thread_safe_increment Loading include/thr_alarm.h +3 −5 Original line number Diff line number Diff line Loading @@ -24,11 +24,6 @@ extern "C" { #ifndef USE_ALARM_THREAD #define USE_ONE_SIGNAL_HAND /* One must call process_alarm */ #endif #ifdef HAVE_LINUXTHREADS #define THR_CLIENT_ALARM SIGALRM #else #define THR_CLIENT_ALARM SIGUSR1 #endif #ifdef HAVE_rts_threads #undef USE_ONE_SIGNAL_HAND #define USE_ALARM_THREAD Loading Loading @@ -90,6 +85,9 @@ typedef struct st_alarm { my_bool malloced; } ALARM; extern uint thr_client_alarm; extern pthread_t alarm_thread; #define thr_alarm_init(A) (*(A))=0 #define thr_alarm_in_use(A) (*(A)!= 0) void init_thr_alarm(uint max_alarm); Loading mysql-test/r/federated_server.result +185 −10 Original line number Diff line number Diff line Loading @@ -20,6 +20,14 @@ CREATE TABLE first_db.t1 ( `name` varchar(64) NOT NULL default '' ) DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS first_db.t2; Warnings: Note 1051 Unknown table 't2' CREATE TABLE first_db.t2 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) DEFAULT CHARSET=latin1; use second_db; DROP TABLE IF EXISTS second_db.t1; Warnings: Loading @@ -29,6 +37,14 @@ CREATE TABLE second_db.t1 ( `name` varchar(64) NOT NULL default '' ) DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS second_db.t2; Warnings: Note 1051 Unknown table 't2' CREATE TABLE second_db.t2 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) DEFAULT CHARSET=latin1; drop server if exists 'server_one'; create server 'server_one' foreign data wrapper 'mysql' options (HOST '127.0.0.1', Loading Loading @@ -60,10 +76,10 @@ CREATE TABLE federated.old ( ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/first_db/t1'; INSERT INTO federated.old (id, name) values (1, 'federated.old url'); INSERT INTO federated.old (id, name) values (1, 'federated.old-> first_db.t1, url format'); SELECT * FROM federated.old; id name 1 federated.old url 1 federated.old-> first_db.t1, url format DROP TABLE IF EXISTS federated.old2; Warnings: Note 1051 Unknown table 'old2' Loading @@ -72,8 +88,37 @@ CREATE TABLE federated.old2 ( `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/first_db/t2'; INSERT INTO federated.old2 (id, name) values (1, 'federated.old2-> first_db.t2, url format'); SELECT * FROM federated.old2; id name 1 federated.old2-> first_db.t2, url format DROP TABLE IF EXISTS federated.urldb2t1; Warnings: Note 1051 Unknown table 'urldb2t1' CREATE TABLE federated.urldb2t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/second_db/t1'; INSERT INTO federated.old2 (id, name) values (1, 'federated.old2 url'); INSERT INTO federated.urldb2t1 (id, name) values (1, 'federated.urldb2t1 -> second_db.t1, url format'); SELECT * FROM federated.urldb2t1; id name 1 federated.urldb2t1 -> second_db.t1, url format DROP TABLE IF EXISTS federated.urldb2t2; Warnings: Note 1051 Unknown table 'urldb2t2' CREATE TABLE federated.urldb2t2 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/second_db/t2'; INSERT INTO federated.urldb2t2 (id, name) values (1, 'federated.urldb2t2 -> second_db.t2, url format'); SELECT * FROM federated.urldb2t2; id name 1 federated.urldb2t2 -> second_db.t2, url format DROP TABLE IF EXISTS federated.t1; Warnings: Note 1051 Unknown table 't1' Loading @@ -83,18 +128,38 @@ CREATE TABLE federated.t1 ( ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='server_one'; INSERT INTO federated.t1 (id, name) values (1, 'server_one, new scheme'); INSERT INTO federated.t1 (id, name) values (1, 'server_one, new scheme, first_db.t1'); SELECT * FROM federated.t1; id name 1 federated.old url 1 server_one, new scheme 1 federated.old-> first_db.t1, url format 1 server_one, new scheme, first_db.t1 DROP TABLE IF EXISTS federated.whatever; Warnings: Note 1051 Unknown table 'whatever' CREATE TABLE federated.whatever ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='server_one/t1'; INSERT INTO federated.whatever (id, name) values (1, 'server_one, new scheme, whatever, first_db.t1'); SELECT * FROM federated.whatever; id name 1 federated.old-> first_db.t1, url format 1 server_one, new scheme, first_db.t1 1 server_one, new scheme, whatever, first_db.t1 ALTER SERVER 'server_one' options(DATABASE 'second_db'); flush tables; INSERT INTO federated.t1 (id, name) values (1, 'server_two, new scheme'); INSERT INTO federated.t1 (id, name) values (1, 'server_two, new scheme, second_db.t1'); SELECT * FROM federated.t1; id name 1 federated.old2 url 1 server_two, new scheme 1 federated.urldb2t1 -> second_db.t1, url format 1 server_two, new scheme, second_db.t1 INSERT INTO federated.whatever (id, name) values (1, 'server_two, new scheme, whatever, second_db.t1'); SELECT * FROM federated.whatever; id name 1 federated.urldb2t1 -> second_db.t1, url format 1 server_two, new scheme, second_db.t1 1 server_two, new scheme, whatever, second_db.t1 drop table federated.t1; drop server 'server_one'; drop server 'server_two'; Loading @@ -104,6 +169,116 @@ drop table first_db.t1; drop table second_db.t1; drop database first_db; drop database second_db; create database db_legitimate; create database db_bogus; use db_legitimate; CREATE TABLE db_legitimate.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ); INSERT INTO db_legitimate.t1 VALUES ('1','this is legitimate'); use db_bogus; CREATE TABLE db_bogus.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ; INSERT INTO db_bogus.t1 VALUES ('2','this is bogus'); create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', USER 'root', PASSWORD '', PORT SLAVE_PORT, SOCKET '', OWNER 'root'); create user guest_select@localhost; grant select on federated.* to guest_select@localhost; create user guest_super@localhost; grant select,SUPER,RELOAD on *.* to guest_super@localhost; create user guest_usage@localhost; grant usage on *.* to guest_usage@localhost; CREATE TABLE federated.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE = FEDERATED CONNECTION = 's1'; select * from federated.t1; id name 1 this is legitimate alter server s1 options (database 'db_bogus'); ERROR 42000: Access denied; you need the SUPER privilege for this operation flush tables; select * from federated.t1; id name 1 this is legitimate alter server s1 options (database 'db_bogus'); ERROR 42000: Access denied; you need the SUPER privilege for this operation flush tables; select * from federated.t1; id name 1 this is legitimate alter server s1 options (database 'db_bogus'); flush tables; select * from federated.t1; id name 2 this is bogus drop server if exists 's1'; ERROR 42000: Access denied; you need the SUPER privilege for this operation create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', USER 'root', PASSWORD '', PORT SLAVE_PORT, SOCKET '', OWNER 'root'); ERROR 42000: Access denied; you need the SUPER privilege for this operation drop server 's1'; create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', USER 'root', PASSWORD '', PORT SLAVE_PORT, SOCKET '', OWNER 'root'); flush tables; select * from federated.t1; id name 1 this is legitimate drop database db_legitimate; drop database db_bogus; drop user guest_super@localhost; drop user guest_usage@localhost; drop user guest_select@localhost; drop table federated.t1; drop server 's1'; # End of 5.1 tests use test; create procedure p1 () begin DECLARE v INT DEFAULT 0; DECLARE e INT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET e = e + 1; WHILE v < 10000 do CREATE SERVER s FOREIGN DATA WRAPPER mysql OPTIONS (USER 'Remote', HOST '192.168.1.106', DATABASE 'test'); ALTER SERVER s OPTIONS (USER 'Remote'); DROP SERVER s; SET v = v + 1; END WHILE; SELECT e > 0; END// use test; call p1(); call p1(); e > 0 1 e > 0 1 drop procedure p1; drop server if exists s; DROP TABLE IF EXISTS federated.t1; DROP DATABASE IF EXISTS federated; DROP TABLE IF EXISTS federated.t1; Loading mysql-test/r/heap_btree.result +27 −0 Original line number Diff line number Diff line Loading @@ -280,6 +280,33 @@ a 1 1 drop table t1; CREATE TABLE t1 ( c1 CHAR(3), c2 INTEGER, KEY USING BTREE(c1), KEY USING BTREE(c2) ) ENGINE= MEMORY; INSERT INTO t1 VALUES ('ABC',0), ('A',0), ('B',0), ('C',0); UPDATE t1 SET c2= c2 + 1 WHERE c1 = 'A'; SELECT * FROM t1; c1 c2 ABC 0 A 1 B 0 C 0 DROP TABLE t1; CREATE TABLE t1 ( c1 ENUM('1', '2'), UNIQUE USING BTREE(c1) ) ENGINE= MEMORY DEFAULT CHARSET= utf8; INSERT INTO t1 VALUES('1'), ('2'); DROP TABLE t1; CREATE TABLE t1 ( c1 SET('1', '2'), UNIQUE USING BTREE(c1) ) ENGINE= MEMORY DEFAULT CHARSET= utf8; INSERT INTO t1 VALUES('1'), ('2'); DROP TABLE t1; End of 4.1 tests CREATE TABLE t1(val INT, KEY USING BTREE(val)) ENGINE=memory; INSERT INTO t1 VALUES(0); Loading mysql-test/t/federated_server.test +217 −5 Original line number Diff line number Diff line Loading @@ -17,6 +17,13 @@ CREATE TABLE first_db.t1 ( ) DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS first_db.t2; CREATE TABLE first_db.t2 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) DEFAULT CHARSET=latin1; use second_db; DROP TABLE IF EXISTS second_db.t1; CREATE TABLE second_db.t1 ( Loading @@ -25,6 +32,13 @@ CREATE TABLE second_db.t1 ( ) DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS second_db.t2; CREATE TABLE second_db.t2 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) DEFAULT CHARSET=latin1; connection master; drop server if exists 'server_one'; Loading Loading @@ -61,7 +75,7 @@ eval CREATE TABLE federated.old ( ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/first_db/t1'; INSERT INTO federated.old (id, name) values (1, 'federated.old url'); INSERT INTO federated.old (id, name) values (1, 'federated.old-> first_db.t1, url format'); SELECT * FROM federated.old; Loading @@ -72,9 +86,32 @@ eval CREATE TABLE federated.old2 ( `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/first_db/t2'; INSERT INTO federated.old2 (id, name) values (1, 'federated.old2-> first_db.t2, url format'); SELECT * FROM federated.old2; DROP TABLE IF EXISTS federated.urldb2t1; --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE federated.urldb2t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/second_db/t1'; INSERT INTO federated.urldb2t1 (id, name) values (1, 'federated.urldb2t1 -> second_db.t1, url format'); SELECT * FROM federated.urldb2t1; INSERT INTO federated.old2 (id, name) values (1, 'federated.old2 url'); DROP TABLE IF EXISTS federated.urldb2t2; --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE federated.urldb2t2 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/second_db/t2'; INSERT INTO federated.urldb2t2 (id, name) values (1, 'federated.urldb2t2 -> second_db.t2, url format'); SELECT * FROM federated.urldb2t2; DROP TABLE IF EXISTS federated.t1; CREATE TABLE federated.t1 ( Loading @@ -84,17 +121,30 @@ CREATE TABLE federated.t1 ( ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='server_one'; INSERT INTO federated.t1 (id, name) values (1, 'server_one, new scheme'); INSERT INTO federated.t1 (id, name) values (1, 'server_one, new scheme, first_db.t1'); SELECT * FROM federated.t1; DROP TABLE IF EXISTS federated.whatever; CREATE TABLE federated.whatever ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='server_one/t1'; INSERT INTO federated.whatever (id, name) values (1, 'server_one, new scheme, whatever, first_db.t1'); SELECT * FROM federated.whatever; ALTER SERVER 'server_one' options(DATABASE 'second_db'); flush tables; # FLUSH TABLES is now unneccessary INSERT INTO federated.t1 (id, name) values (1, 'server_two, new scheme'); INSERT INTO federated.t1 (id, name) values (1, 'server_two, new scheme, second_db.t1'); SELECT * FROM federated.t1; INSERT INTO federated.whatever (id, name) values (1, 'server_two, new scheme, whatever, second_db.t1'); SELECT * FROM federated.whatever; drop table federated.t1; drop server 'server_one'; Loading @@ -107,4 +157,166 @@ drop table second_db.t1; drop database first_db; drop database second_db; # # Bug#25671 - CREATE/DROP/ALTER SERVER should require privileges # # Changes to SERVER declarations should require SUPER privilege. # Based upon test case by Giuseppe Maxia create database db_legitimate; create database db_bogus; use db_legitimate; CREATE TABLE db_legitimate.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ); INSERT INTO db_legitimate.t1 VALUES ('1','this is legitimate'); use db_bogus; CREATE TABLE db_bogus.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ; INSERT INTO db_bogus.t1 VALUES ('2','this is bogus'); connection master; --replace_result $SLAVE_MYPORT SLAVE_PORT eval create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', USER 'root', PASSWORD '', PORT $SLAVE_MYPORT, SOCKET '', OWNER 'root'); create user guest_select@localhost; grant select on federated.* to guest_select@localhost; create user guest_super@localhost; grant select,SUPER,RELOAD on *.* to guest_super@localhost; create user guest_usage@localhost; grant usage on *.* to guest_usage@localhost; CREATE TABLE federated.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE = FEDERATED CONNECTION = 's1'; select * from federated.t1; connect (conn_select,127.0.0.1,guest_select,,federated,$MASTER_MYPORT); connect (conn_usage,127.0.0.1,guest_usage,,,$MASTER_MYPORT); connect (conn_super,127.0.0.1,guest_super,,,$MASTER_MYPORT); connection conn_select; --error ER_SPECIFIC_ACCESS_DENIED_ERROR alter server s1 options (database 'db_bogus'); connection master; flush tables; select * from federated.t1; connection conn_usage; --error ER_SPECIFIC_ACCESS_DENIED_ERROR alter server s1 options (database 'db_bogus'); connection master; flush tables; select * from federated.t1; connection conn_super; alter server s1 options (database 'db_bogus'); connection master; flush tables; select * from federated.t1; connection conn_select; --error ER_SPECIFIC_ACCESS_DENIED_ERROR drop server if exists 's1'; --replace_result $SLAVE_MYPORT SLAVE_PORT --error ER_SPECIFIC_ACCESS_DENIED_ERROR eval create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', USER 'root', PASSWORD '', PORT $SLAVE_MYPORT, SOCKET '', OWNER 'root'); connection conn_super; drop server 's1'; --replace_result $SLAVE_MYPORT SLAVE_PORT eval create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', USER 'root', PASSWORD '', PORT $SLAVE_MYPORT, SOCKET '', OWNER 'root'); connection master; flush tables; select * from federated.t1; # clean up test connection slave; drop database db_legitimate; drop database db_bogus; disconnect conn_select; disconnect conn_usage; disconnect conn_super; connection master; drop user guest_super@localhost; drop user guest_usage@localhost; drop user guest_select@localhost; drop table federated.t1; drop server 's1'; --echo # End of 5.1 tests # # Bug#25721 - deadlock with ALTER/CREATE SERVER # connect (other,localhost,root,,); connection master; use test; delimiter //; create procedure p1 () begin DECLARE v INT DEFAULT 0; DECLARE e INT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET e = e + 1; WHILE v < 10000 do CREATE SERVER s FOREIGN DATA WRAPPER mysql OPTIONS (USER 'Remote', HOST '192.168.1.106', DATABASE 'test'); ALTER SERVER s OPTIONS (USER 'Remote'); DROP SERVER s; SET v = v + 1; END WHILE; SELECT e > 0; END// delimiter ;// connection other; use test; send call p1(); connection master; call p1(); connection other; reap; drop procedure p1; drop server if exists s; source include/federated_cleanup.inc; Loading
include/my_pthread.h +9 −0 Original line number Diff line number Diff line Loading @@ -701,6 +701,15 @@ extern uint my_thread_end_wait_time; Keep track of shutdown,signal, and main threads so that my_end() will not report errors with them */ /* Which kind of thread library is in use */ #define THD_LIB_OTHER 1 #define THD_LIB_NPTL 2 #define THD_LIB_LT 4 extern uint thd_lib_detected; /* statistics_xxx functions are for not essential statistic */ #ifndef thread_safe_increment Loading
include/thr_alarm.h +3 −5 Original line number Diff line number Diff line Loading @@ -24,11 +24,6 @@ extern "C" { #ifndef USE_ALARM_THREAD #define USE_ONE_SIGNAL_HAND /* One must call process_alarm */ #endif #ifdef HAVE_LINUXTHREADS #define THR_CLIENT_ALARM SIGALRM #else #define THR_CLIENT_ALARM SIGUSR1 #endif #ifdef HAVE_rts_threads #undef USE_ONE_SIGNAL_HAND #define USE_ALARM_THREAD Loading Loading @@ -90,6 +85,9 @@ typedef struct st_alarm { my_bool malloced; } ALARM; extern uint thr_client_alarm; extern pthread_t alarm_thread; #define thr_alarm_init(A) (*(A))=0 #define thr_alarm_in_use(A) (*(A)!= 0) void init_thr_alarm(uint max_alarm); Loading
mysql-test/r/federated_server.result +185 −10 Original line number Diff line number Diff line Loading @@ -20,6 +20,14 @@ CREATE TABLE first_db.t1 ( `name` varchar(64) NOT NULL default '' ) DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS first_db.t2; Warnings: Note 1051 Unknown table 't2' CREATE TABLE first_db.t2 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) DEFAULT CHARSET=latin1; use second_db; DROP TABLE IF EXISTS second_db.t1; Warnings: Loading @@ -29,6 +37,14 @@ CREATE TABLE second_db.t1 ( `name` varchar(64) NOT NULL default '' ) DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS second_db.t2; Warnings: Note 1051 Unknown table 't2' CREATE TABLE second_db.t2 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) DEFAULT CHARSET=latin1; drop server if exists 'server_one'; create server 'server_one' foreign data wrapper 'mysql' options (HOST '127.0.0.1', Loading Loading @@ -60,10 +76,10 @@ CREATE TABLE federated.old ( ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/first_db/t1'; INSERT INTO federated.old (id, name) values (1, 'federated.old url'); INSERT INTO federated.old (id, name) values (1, 'federated.old-> first_db.t1, url format'); SELECT * FROM federated.old; id name 1 federated.old url 1 federated.old-> first_db.t1, url format DROP TABLE IF EXISTS federated.old2; Warnings: Note 1051 Unknown table 'old2' Loading @@ -72,8 +88,37 @@ CREATE TABLE federated.old2 ( `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/first_db/t2'; INSERT INTO federated.old2 (id, name) values (1, 'federated.old2-> first_db.t2, url format'); SELECT * FROM federated.old2; id name 1 federated.old2-> first_db.t2, url format DROP TABLE IF EXISTS federated.urldb2t1; Warnings: Note 1051 Unknown table 'urldb2t1' CREATE TABLE federated.urldb2t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/second_db/t1'; INSERT INTO federated.old2 (id, name) values (1, 'federated.old2 url'); INSERT INTO federated.urldb2t1 (id, name) values (1, 'federated.urldb2t1 -> second_db.t1, url format'); SELECT * FROM federated.urldb2t1; id name 1 federated.urldb2t1 -> second_db.t1, url format DROP TABLE IF EXISTS federated.urldb2t2; Warnings: Note 1051 Unknown table 'urldb2t2' CREATE TABLE federated.urldb2t2 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/second_db/t2'; INSERT INTO federated.urldb2t2 (id, name) values (1, 'federated.urldb2t2 -> second_db.t2, url format'); SELECT * FROM federated.urldb2t2; id name 1 federated.urldb2t2 -> second_db.t2, url format DROP TABLE IF EXISTS federated.t1; Warnings: Note 1051 Unknown table 't1' Loading @@ -83,18 +128,38 @@ CREATE TABLE federated.t1 ( ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='server_one'; INSERT INTO federated.t1 (id, name) values (1, 'server_one, new scheme'); INSERT INTO federated.t1 (id, name) values (1, 'server_one, new scheme, first_db.t1'); SELECT * FROM federated.t1; id name 1 federated.old url 1 server_one, new scheme 1 federated.old-> first_db.t1, url format 1 server_one, new scheme, first_db.t1 DROP TABLE IF EXISTS federated.whatever; Warnings: Note 1051 Unknown table 'whatever' CREATE TABLE federated.whatever ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='server_one/t1'; INSERT INTO federated.whatever (id, name) values (1, 'server_one, new scheme, whatever, first_db.t1'); SELECT * FROM federated.whatever; id name 1 federated.old-> first_db.t1, url format 1 server_one, new scheme, first_db.t1 1 server_one, new scheme, whatever, first_db.t1 ALTER SERVER 'server_one' options(DATABASE 'second_db'); flush tables; INSERT INTO federated.t1 (id, name) values (1, 'server_two, new scheme'); INSERT INTO federated.t1 (id, name) values (1, 'server_two, new scheme, second_db.t1'); SELECT * FROM federated.t1; id name 1 federated.old2 url 1 server_two, new scheme 1 federated.urldb2t1 -> second_db.t1, url format 1 server_two, new scheme, second_db.t1 INSERT INTO federated.whatever (id, name) values (1, 'server_two, new scheme, whatever, second_db.t1'); SELECT * FROM federated.whatever; id name 1 federated.urldb2t1 -> second_db.t1, url format 1 server_two, new scheme, second_db.t1 1 server_two, new scheme, whatever, second_db.t1 drop table federated.t1; drop server 'server_one'; drop server 'server_two'; Loading @@ -104,6 +169,116 @@ drop table first_db.t1; drop table second_db.t1; drop database first_db; drop database second_db; create database db_legitimate; create database db_bogus; use db_legitimate; CREATE TABLE db_legitimate.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ); INSERT INTO db_legitimate.t1 VALUES ('1','this is legitimate'); use db_bogus; CREATE TABLE db_bogus.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ; INSERT INTO db_bogus.t1 VALUES ('2','this is bogus'); create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', USER 'root', PASSWORD '', PORT SLAVE_PORT, SOCKET '', OWNER 'root'); create user guest_select@localhost; grant select on federated.* to guest_select@localhost; create user guest_super@localhost; grant select,SUPER,RELOAD on *.* to guest_super@localhost; create user guest_usage@localhost; grant usage on *.* to guest_usage@localhost; CREATE TABLE federated.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE = FEDERATED CONNECTION = 's1'; select * from federated.t1; id name 1 this is legitimate alter server s1 options (database 'db_bogus'); ERROR 42000: Access denied; you need the SUPER privilege for this operation flush tables; select * from federated.t1; id name 1 this is legitimate alter server s1 options (database 'db_bogus'); ERROR 42000: Access denied; you need the SUPER privilege for this operation flush tables; select * from federated.t1; id name 1 this is legitimate alter server s1 options (database 'db_bogus'); flush tables; select * from federated.t1; id name 2 this is bogus drop server if exists 's1'; ERROR 42000: Access denied; you need the SUPER privilege for this operation create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', USER 'root', PASSWORD '', PORT SLAVE_PORT, SOCKET '', OWNER 'root'); ERROR 42000: Access denied; you need the SUPER privilege for this operation drop server 's1'; create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', USER 'root', PASSWORD '', PORT SLAVE_PORT, SOCKET '', OWNER 'root'); flush tables; select * from federated.t1; id name 1 this is legitimate drop database db_legitimate; drop database db_bogus; drop user guest_super@localhost; drop user guest_usage@localhost; drop user guest_select@localhost; drop table federated.t1; drop server 's1'; # End of 5.1 tests use test; create procedure p1 () begin DECLARE v INT DEFAULT 0; DECLARE e INT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET e = e + 1; WHILE v < 10000 do CREATE SERVER s FOREIGN DATA WRAPPER mysql OPTIONS (USER 'Remote', HOST '192.168.1.106', DATABASE 'test'); ALTER SERVER s OPTIONS (USER 'Remote'); DROP SERVER s; SET v = v + 1; END WHILE; SELECT e > 0; END// use test; call p1(); call p1(); e > 0 1 e > 0 1 drop procedure p1; drop server if exists s; DROP TABLE IF EXISTS federated.t1; DROP DATABASE IF EXISTS federated; DROP TABLE IF EXISTS federated.t1; Loading
mysql-test/r/heap_btree.result +27 −0 Original line number Diff line number Diff line Loading @@ -280,6 +280,33 @@ a 1 1 drop table t1; CREATE TABLE t1 ( c1 CHAR(3), c2 INTEGER, KEY USING BTREE(c1), KEY USING BTREE(c2) ) ENGINE= MEMORY; INSERT INTO t1 VALUES ('ABC',0), ('A',0), ('B',0), ('C',0); UPDATE t1 SET c2= c2 + 1 WHERE c1 = 'A'; SELECT * FROM t1; c1 c2 ABC 0 A 1 B 0 C 0 DROP TABLE t1; CREATE TABLE t1 ( c1 ENUM('1', '2'), UNIQUE USING BTREE(c1) ) ENGINE= MEMORY DEFAULT CHARSET= utf8; INSERT INTO t1 VALUES('1'), ('2'); DROP TABLE t1; CREATE TABLE t1 ( c1 SET('1', '2'), UNIQUE USING BTREE(c1) ) ENGINE= MEMORY DEFAULT CHARSET= utf8; INSERT INTO t1 VALUES('1'), ('2'); DROP TABLE t1; End of 4.1 tests CREATE TABLE t1(val INT, KEY USING BTREE(val)) ENGINE=memory; INSERT INTO t1 VALUES(0); Loading
mysql-test/t/federated_server.test +217 −5 Original line number Diff line number Diff line Loading @@ -17,6 +17,13 @@ CREATE TABLE first_db.t1 ( ) DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS first_db.t2; CREATE TABLE first_db.t2 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) DEFAULT CHARSET=latin1; use second_db; DROP TABLE IF EXISTS second_db.t1; CREATE TABLE second_db.t1 ( Loading @@ -25,6 +32,13 @@ CREATE TABLE second_db.t1 ( ) DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS second_db.t2; CREATE TABLE second_db.t2 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) DEFAULT CHARSET=latin1; connection master; drop server if exists 'server_one'; Loading Loading @@ -61,7 +75,7 @@ eval CREATE TABLE federated.old ( ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/first_db/t1'; INSERT INTO federated.old (id, name) values (1, 'federated.old url'); INSERT INTO federated.old (id, name) values (1, 'federated.old-> first_db.t1, url format'); SELECT * FROM federated.old; Loading @@ -72,9 +86,32 @@ eval CREATE TABLE federated.old2 ( `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/first_db/t2'; INSERT INTO federated.old2 (id, name) values (1, 'federated.old2-> first_db.t2, url format'); SELECT * FROM federated.old2; DROP TABLE IF EXISTS federated.urldb2t1; --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE federated.urldb2t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/second_db/t1'; INSERT INTO federated.urldb2t1 (id, name) values (1, 'federated.urldb2t1 -> second_db.t1, url format'); SELECT * FROM federated.urldb2t1; INSERT INTO federated.old2 (id, name) values (1, 'federated.old2 url'); DROP TABLE IF EXISTS federated.urldb2t2; --replace_result $SLAVE_MYPORT SLAVE_PORT eval CREATE TABLE federated.urldb2t2 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/second_db/t2'; INSERT INTO federated.urldb2t2 (id, name) values (1, 'federated.urldb2t2 -> second_db.t2, url format'); SELECT * FROM federated.urldb2t2; DROP TABLE IF EXISTS federated.t1; CREATE TABLE federated.t1 ( Loading @@ -84,17 +121,30 @@ CREATE TABLE federated.t1 ( ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='server_one'; INSERT INTO federated.t1 (id, name) values (1, 'server_one, new scheme'); INSERT INTO federated.t1 (id, name) values (1, 'server_one, new scheme, first_db.t1'); SELECT * FROM federated.t1; DROP TABLE IF EXISTS federated.whatever; CREATE TABLE federated.whatever ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='server_one/t1'; INSERT INTO federated.whatever (id, name) values (1, 'server_one, new scheme, whatever, first_db.t1'); SELECT * FROM federated.whatever; ALTER SERVER 'server_one' options(DATABASE 'second_db'); flush tables; # FLUSH TABLES is now unneccessary INSERT INTO federated.t1 (id, name) values (1, 'server_two, new scheme'); INSERT INTO federated.t1 (id, name) values (1, 'server_two, new scheme, second_db.t1'); SELECT * FROM federated.t1; INSERT INTO federated.whatever (id, name) values (1, 'server_two, new scheme, whatever, second_db.t1'); SELECT * FROM federated.whatever; drop table federated.t1; drop server 'server_one'; Loading @@ -107,4 +157,166 @@ drop table second_db.t1; drop database first_db; drop database second_db; # # Bug#25671 - CREATE/DROP/ALTER SERVER should require privileges # # Changes to SERVER declarations should require SUPER privilege. # Based upon test case by Giuseppe Maxia create database db_legitimate; create database db_bogus; use db_legitimate; CREATE TABLE db_legitimate.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ); INSERT INTO db_legitimate.t1 VALUES ('1','this is legitimate'); use db_bogus; CREATE TABLE db_bogus.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ; INSERT INTO db_bogus.t1 VALUES ('2','this is bogus'); connection master; --replace_result $SLAVE_MYPORT SLAVE_PORT eval create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', USER 'root', PASSWORD '', PORT $SLAVE_MYPORT, SOCKET '', OWNER 'root'); create user guest_select@localhost; grant select on federated.* to guest_select@localhost; create user guest_super@localhost; grant select,SUPER,RELOAD on *.* to guest_super@localhost; create user guest_usage@localhost; grant usage on *.* to guest_usage@localhost; CREATE TABLE federated.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE = FEDERATED CONNECTION = 's1'; select * from federated.t1; connect (conn_select,127.0.0.1,guest_select,,federated,$MASTER_MYPORT); connect (conn_usage,127.0.0.1,guest_usage,,,$MASTER_MYPORT); connect (conn_super,127.0.0.1,guest_super,,,$MASTER_MYPORT); connection conn_select; --error ER_SPECIFIC_ACCESS_DENIED_ERROR alter server s1 options (database 'db_bogus'); connection master; flush tables; select * from federated.t1; connection conn_usage; --error ER_SPECIFIC_ACCESS_DENIED_ERROR alter server s1 options (database 'db_bogus'); connection master; flush tables; select * from federated.t1; connection conn_super; alter server s1 options (database 'db_bogus'); connection master; flush tables; select * from federated.t1; connection conn_select; --error ER_SPECIFIC_ACCESS_DENIED_ERROR drop server if exists 's1'; --replace_result $SLAVE_MYPORT SLAVE_PORT --error ER_SPECIFIC_ACCESS_DENIED_ERROR eval create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', USER 'root', PASSWORD '', PORT $SLAVE_MYPORT, SOCKET '', OWNER 'root'); connection conn_super; drop server 's1'; --replace_result $SLAVE_MYPORT SLAVE_PORT eval create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', USER 'root', PASSWORD '', PORT $SLAVE_MYPORT, SOCKET '', OWNER 'root'); connection master; flush tables; select * from federated.t1; # clean up test connection slave; drop database db_legitimate; drop database db_bogus; disconnect conn_select; disconnect conn_usage; disconnect conn_super; connection master; drop user guest_super@localhost; drop user guest_usage@localhost; drop user guest_select@localhost; drop table federated.t1; drop server 's1'; --echo # End of 5.1 tests # # Bug#25721 - deadlock with ALTER/CREATE SERVER # connect (other,localhost,root,,); connection master; use test; delimiter //; create procedure p1 () begin DECLARE v INT DEFAULT 0; DECLARE e INT DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET e = e + 1; WHILE v < 10000 do CREATE SERVER s FOREIGN DATA WRAPPER mysql OPTIONS (USER 'Remote', HOST '192.168.1.106', DATABASE 'test'); ALTER SERVER s OPTIONS (USER 'Remote'); DROP SERVER s; SET v = v + 1; END WHILE; SELECT e > 0; END// delimiter ;// connection other; use test; send call p1(); connection master; call p1(); connection other; reap; drop procedure p1; drop server if exists s; source include/federated_cleanup.inc;