Browse Source
WL# 3031
WL# 3031
Backport of functionality in private 5.2 tree. Added new language to parser, new mysql.servers table and associated code to be used by the federated storage engine to allow central connection information per WL entry. libmysqld/Makefile.am: WL# 3031 Added sql_servers.cc to libmysqld Makefile.am mysql-test/lib/init_db.sql: WL# 3031 Added mysql.servers creation to init_db.sql, which is in turn called by mysql-test-run.pl scripts/mysql_create_system_tables.sh: WL# 3031 Added mysql.servers table creation to script called by non-perl mysql-test-run sql/Makefile.am: WL# 3031 Added sql_servers source and headers to Makefile.am to be built sql/lex.h: WL# 3031 Added tokens needed for SERVERS scheme sql/mysql_priv.h: WL #3031 Added sql_servers.h to mysql_priv.h so mysqld.cc and other code can link with sql_servers code sql/mysqld.cc: WL# 3031 Added servers_free and servers_init to mysqld sql/sql_lex.cc: WL# 3031 Added lex->server_options parameter initialisation sql/sql_lex.h: WL #3031 Added SQLCOM commands needed for sql_server actions sql/sql_parse.cc: WL# 3031 Added switch actions for new SQLCOM sql_server actions sql/sql_yacc.yy: WL #3031 Added tokens needed for sql_servers, CREATE/DROP/ALTER server functionality sql/share/errmsg.txt: WL# 3031 Added two new errors to errormsg.sys storage/federated/ha_federated.cc: WL #3031 Modified federated storage engine to use new connection scheme (servers table) if connection string only specifies connection name vs. complete URL storage/federated/ha_federated.h: WL# 3031 Added new share members needed for connection scheme sql/sql_servers.cc: WL #3031 sql_servers.cc - all methods required for manipulating mysql.servers table to work with federated new connection scheme (CREATE/ALTER/DROP SERVER ...) sql/sql_servers.h: WL #3031 New header file for sql_servers functionality mysql-test/r/federated_server.result: WL #3031 New test results for testing new connection scheme sql/sql_yacc.yy.bak: WL #3031 Added tokens and definitions required for new CREATE/ALTER/DROP SERVER for sql_servers functionality. See WL for details. mysql-test/t/federated_server.test: WL #3031 New test for testing CREATE/ALTER/DROP SERVER, as well as testing that federated works with both tradition connection scheme as well as new connection scheme.pull/374/head
19 changed files with 13243 additions and 89 deletions
-
3libmysqld/Makefile.am
-
14mysql-test/lib/init_db.sql
-
112mysql-test/r/federated_server.result
-
103mysql-test/t/federated_server.test
-
27scripts/mysql_create_system_tables.sh
-
5sql/Makefile.am
-
7sql/lex.h
-
1sql/mysql_priv.h
-
4sql/mysqld.cc
-
5sql/share/errmsg.txt
-
15sql/sql_lex.cc
-
10sql/sql_lex.h
-
52sql/sql_parse.cc
-
1238sql/sql_servers.cc
-
66sql/sql_servers.h
-
83sql/sql_yacc.yy
-
11279sql/sql_yacc.yy.bak
-
300storage/federated/ha_federated.cc
-
8storage/federated/ha_federated.h
@ -0,0 +1,112 @@ |
|||
stop slave; |
|||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; |
|||
reset master; |
|||
reset slave; |
|||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; |
|||
start slave; |
|||
stop slave; |
|||
DROP DATABASE IF EXISTS federated; |
|||
CREATE DATABASE federated; |
|||
DROP DATABASE IF EXISTS federated; |
|||
CREATE DATABASE federated; |
|||
create database first_db; |
|||
create database second_db; |
|||
use first_db; |
|||
DROP TABLE IF EXISTS first_db.t1; |
|||
Warnings: |
|||
Note 1051 Unknown table 't1' |
|||
CREATE TABLE first_db.t1 ( |
|||
`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: |
|||
Note 1051 Unknown table 't1' |
|||
CREATE TABLE second_db.t1 ( |
|||
`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', |
|||
DATABASE 'first_db', |
|||
USER 'root', |
|||
PASSWORD '', |
|||
PORT 9308, |
|||
SOCKET '', |
|||
OWNER 'root'); |
|||
drop server if exists 'server_two'; |
|||
create server 'server_two' foreign data wrapper 'mysql' options |
|||
(HOST '127.0.0.1', |
|||
DATABASE 'second_db', |
|||
USER 'root', |
|||
PASSWORD '', |
|||
PORT 9308, |
|||
SOCKET '', |
|||
OWNER 'root'); |
|||
select * from mysql.servers; |
|||
Server_name Host Db Username Password Port Socket Wrapper Owner |
|||
test localhost test root 0 mysql root |
|||
server_one 127.0.0.1 first_db root 9308 mysql root |
|||
server_two 127.0.0.1 second_db root 9308 mysql root |
|||
DROP TABLE IF EXISTS federated.old; |
|||
Warnings: |
|||
Note 1051 Unknown table 'old' |
|||
CREATE TABLE federated.old ( |
|||
`id` int(20) NOT NULL, |
|||
`name` varchar(64) NOT NULL default '' |
|||
) |
|||
ENGINE="FEDERATED" DEFAULT CHARSET=latin1 |
|||
CONNECTION='mysql://root@127.0.0.1:9308/first_db/t1'; |
|||
INSERT INTO federated.old (id, name) values (1, 'federated.old url'); |
|||
SELECT * FROM federated.old; |
|||
id name |
|||
1 federated.old url |
|||
DROP TABLE IF EXISTS federated.old2; |
|||
Warnings: |
|||
Note 1051 Unknown table 'old2' |
|||
CREATE TABLE federated.old2 ( |
|||
`id` int(20) NOT NULL, |
|||
`name` varchar(64) NOT NULL default '' |
|||
) |
|||
ENGINE="FEDERATED" DEFAULT CHARSET=latin1 |
|||
CONNECTION='mysql://root@127.0.0.1:9308/second_db/t1'; |
|||
INSERT INTO federated.old2 (id, name) values (1, 'federated.old2 url'); |
|||
DROP TABLE IF EXISTS federated.t1; |
|||
Warnings: |
|||
Note 1051 Unknown table 't1' |
|||
CREATE TABLE federated.t1 ( |
|||
`id` int(20) NOT NULL, |
|||
`name` varchar(64) NOT NULL default '' |
|||
) |
|||
ENGINE="FEDERATED" DEFAULT CHARSET=latin1 |
|||
CONNECTION='server_one'; |
|||
INSERT INTO federated.t1 (id, name) values (1, 'server_one, new scheme'); |
|||
SELECT * FROM federated.t1; |
|||
id name |
|||
1 federated.old url |
|||
1 server_one, new scheme |
|||
ALTER SERVER 'server_one' options(DATABASE 'second_db'); |
|||
flush tables; |
|||
INSERT INTO federated.t1 (id, name) values (1, 'server_two, new scheme'); |
|||
SELECT * FROM federated.t1; |
|||
id name |
|||
1 federated.old2 url |
|||
1 server_two, new scheme |
|||
drop table federated.t1; |
|||
drop server 'server_one'; |
|||
drop server 'server_two'; |
|||
select * from mysql.servers; |
|||
Server_name Host Db Username Password Port Socket Wrapper Owner |
|||
test localhost test root 0 mysql root |
|||
drop table first_db.t1; |
|||
drop table second_db.t1; |
|||
drop database first_db; |
|||
drop database second_db; |
|||
DROP TABLE IF EXISTS federated.t1; |
|||
DROP DATABASE IF EXISTS federated; |
|||
DROP TABLE IF EXISTS federated.t1; |
|||
DROP DATABASE IF EXISTS federated; |
@ -0,0 +1,103 @@ |
|||
# should work with embedded server after mysqltest is fixed |
|||
-- source include/not_embedded.inc |
|||
source include/federated.inc; |
|||
|
|||
connection slave; |
|||
create database first_db; |
|||
create database second_db; |
|||
|
|||
use first_db; |
|||
|
|||
DROP TABLE IF EXISTS first_db.t1; |
|||
CREATE TABLE first_db.t1 ( |
|||
`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 ( |
|||
`id` int(20) NOT NULL, |
|||
`name` varchar(64) NOT NULL default '' |
|||
) |
|||
DEFAULT CHARSET=latin1; |
|||
|
|||
connection master; |
|||
|
|||
drop server if exists 'server_one'; |
|||
eval create server 'server_one' foreign data wrapper 'mysql' options |
|||
(HOST '127.0.0.1', |
|||
DATABASE 'first_db', |
|||
USER 'root', |
|||
PASSWORD '', |
|||
PORT $SLAVE_MYPORT, |
|||
SOCKET '', |
|||
OWNER 'root'); |
|||
|
|||
drop server if exists 'server_two'; |
|||
eval create server 'server_two' foreign data wrapper 'mysql' options |
|||
(HOST '127.0.0.1', |
|||
DATABASE 'second_db', |
|||
USER 'root', |
|||
PASSWORD '', |
|||
PORT $SLAVE_MYPORT, |
|||
SOCKET '', |
|||
OWNER 'root'); |
|||
|
|||
select * from mysql.servers; |
|||
|
|||
DROP TABLE IF EXISTS federated.old; |
|||
eval CREATE TABLE federated.old ( |
|||
`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/first_db/t1'; |
|||
|
|||
INSERT INTO federated.old (id, name) values (1, 'federated.old url'); |
|||
|
|||
SELECT * FROM federated.old; |
|||
|
|||
DROP TABLE IF EXISTS federated.old2; |
|||
eval CREATE TABLE federated.old2 ( |
|||
`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.old2 (id, name) values (1, 'federated.old2 url'); |
|||
|
|||
DROP TABLE IF EXISTS federated.t1; |
|||
CREATE TABLE federated.t1 ( |
|||
`id` int(20) NOT NULL, |
|||
`name` varchar(64) NOT NULL default '' |
|||
) |
|||
ENGINE="FEDERATED" DEFAULT CHARSET=latin1 |
|||
CONNECTION='server_one'; |
|||
|
|||
INSERT INTO federated.t1 (id, name) values (1, 'server_one, new scheme'); |
|||
|
|||
SELECT * FROM federated.t1; |
|||
|
|||
ALTER SERVER 'server_one' options(DATABASE 'second_db'); |
|||
|
|||
flush tables; |
|||
|
|||
INSERT INTO federated.t1 (id, name) values (1, 'server_two, new scheme'); |
|||
SELECT * FROM federated.t1; |
|||
|
|||
drop table federated.t1; |
|||
|
|||
drop server 'server_one'; |
|||
drop server 'server_two'; |
|||
select * from mysql.servers; |
|||
|
|||
connection slave; |
|||
drop table first_db.t1; |
|||
drop table second_db.t1; |
|||
drop database first_db; |
|||
drop database second_db; |
|||
|
|||
source include/federated_cleanup.inc; |
1238
sql/sql_servers.cc
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,66 @@ |
|||
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB |
|||
|
|||
This program is free software; you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation; either version 2 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program; if not, write to the Free Software |
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ |
|||
|
|||
#include "slave.h" // for tables_ok(), rpl_filter |
|||
|
|||
/* structs */ |
|||
typedef struct st_federated_server |
|||
{ |
|||
char *server_name; |
|||
long port; |
|||
uint server_name_length; |
|||
char *db, *scheme, *username, *password, *socket, *owner, *host, *sport; |
|||
} FOREIGN_SERVER; |
|||
|
|||
/* cache handlers */ |
|||
my_bool servers_init(bool dont_read_server_table); |
|||
static my_bool servers_load(THD *thd, TABLE_LIST *tables); |
|||
my_bool servers_reload(THD *thd); |
|||
my_bool get_server_from_table_to_cache(TABLE *table); |
|||
void servers_free(bool end=0); |
|||
|
|||
/* insert functions */ |
|||
int create_server(THD *thd, LEX_SERVER_OPTIONS *server_options); |
|||
int insert_server(THD *thd, FOREIGN_SERVER *server_options); |
|||
int insert_server_record(TABLE *table, FOREIGN_SERVER *server); |
|||
int insert_server_record_into_cache(FOREIGN_SERVER *server); |
|||
void store_server_fields_for_insert(TABLE *table, FOREIGN_SERVER *server); |
|||
void store_server_fields_for_insert(TABLE *table, |
|||
FOREIGN_SERVER *existing, |
|||
FOREIGN_SERVER *altered); |
|||
int prepare_server_struct_for_insert(LEX_SERVER_OPTIONS *server_options, |
|||
FOREIGN_SERVER *server); |
|||
|
|||
/* drop functions */ |
|||
int drop_server(THD *thd, LEX_SERVER_OPTIONS *server_options); |
|||
int delete_server_record(TABLE *table, |
|||
char *server_name, |
|||
int server_name_length); |
|||
int delete_server_record_in_cache(LEX_SERVER_OPTIONS *server_options); |
|||
|
|||
/* update functions */ |
|||
int alter_server(THD *thd, LEX_SERVER_OPTIONS *server_options); |
|||
int prepare_server_struct_for_update(LEX_SERVER_OPTIONS *server_options, |
|||
FOREIGN_SERVER *existing, |
|||
FOREIGN_SERVER *altered); |
|||
int update_server(THD *thd, FOREIGN_SERVER *existing, FOREIGN_SERVER *altered); |
|||
int update_server_record(TABLE *table, FOREIGN_SERVER *server); |
|||
int update_server_record_in_cache(FOREIGN_SERVER *existing, |
|||
FOREIGN_SERVER *altered); |
|||
/* utility functions */ |
|||
void merge_server_struct(FOREIGN_SERVER *from, FOREIGN_SERVER *to); |
|||
FOREIGN_SERVER *get_server_by_name(const char *server_name); |
|||
my_bool server_exists_in_table(THD *thd, char *server_name); |
11279
sql/sql_yacc.yy.bak
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue