Commit 4e72191c authored by unknown's avatar unknown
Browse files

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.
parent 46fd7dec
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -72,7 +72,8 @@ sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \
        event_queue.cc event_db_repository.cc \
	rpl_filter.cc sql_partition.cc sql_builtin.cc sql_plugin.cc \
	sql_tablespace.cc \
	rpl_injector.cc my_user.c partition_info.cc
	rpl_injector.cc my_user.c partition_info.cc \
	sql_servers.cc

libmysqld_int_a_SOURCES= $(libmysqld_sources) $(libmysqlsources) $(sqlsources)
libmysqld_a_SOURCES=
+14 −0
Original line number Diff line number Diff line
@@ -114,6 +114,20 @@ REPLACE INTO user VALUES ('127.0.0.1' ,'root','','Y','Y','Y','Y','Y','Y','Y','Y
INSERT  INTO user (host,user) VALUES ('localhost','');
INSERT  INTO user (host,user) VALUES ('@HOSTNAME@%','');

CREATE TABLE servers (
  Server_name char(64) NOT NULL DEFAULT '',
  Host char(64) NOT NULL DEFAULT '',
  Db char(64) NOT NULL DEFAULT '',
  Username char(64) NOT NULL DEFAULT '',
  Password char(64) NOT NULL DEFAULT '',
  Port INT(4) NOT NULL DEFAULT '0',
  Socket char(64) NOT NULL DEFAULT '',
  Wrapper char(64) NOT NULL DEFAULT '',
  Owner char(64) NOT NULL DEFAULT '',
  PRIMARY KEY (Server_name))
  comment='MySQL Foreign Servers table';

INSERT INTO servers VALUES ('test','localhost','test','root','', 0,'','mysql','root');

CREATE TABLE func (
  name char(64) binary DEFAULT '' NOT NULL,
+112 −0
Original line number Diff line number Diff line
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;
+103 −0
Original line number Diff line number Diff line
# 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;
+27 −0
Original line number Diff line number Diff line
@@ -192,6 +192,33 @@ then
  fi 
fi

# Check for old tables
if test ! -f $mdata/servers.frm
then
  if test "$1" = "verbose" ; then
  echo "Preparing servers table" 1>&2;
  fi

  c_d="$c_d

CREATE TABLE  servers ("
  c_d="$c_d   Server_name char(64) NOT NULL,"
  c_d="$c_d   Hostname char(64) NOT NULL,"
  c_d="$c_d   Db char(64) NOT NULL,"
  c_d="$c_d   Username char(64) NOT NULL,"
  c_d="$c_d   Passwd char(64) NOT NULL,"
  c_d="$c_d   Portnum INT(4),"
  c_d="$c_d   Sock char(64),"
  c_d="$c_d   Scheme char(64) NOT NULL,"
  c_d="$c_d   Owner char(64) NOT NULL,"
  c_d="$c_d   PRIMARY KEY  (Server_name));"

  i_d="INSERT INTO servers VALUES
    ('test','localhost','test','root','', 0,
     '','mysql','root');
    "
fi

if test ! -f $mdata/func.frm
then
  if test "$1" = "verbose" ; then
Loading