diff --git a/mysql-test/r/servers.result b/mysql-test/r/servers.result index c9d82c9cfcc..ab5e444b134 100644 --- a/mysql-test/r/servers.result +++ b/mysql-test/r/servers.result @@ -4,5 +4,22 @@ CREATE SERVER s1 FOREIGN DATA WRAPPER mysql OPTIONS(HOST 'localhost'); SELECT * FROM mysql.servers; Server_name Host Db Username Password Port Socket Wrapper Owner -s1 localhost 0 mysql +s1 localhost 3306 mysql +DROP SERVER s1; +CREATE SERVER s1 FOREIGN DATA WRAPPER foo OPTIONS(USER 'bar'); +SELECT * FROM mysql.servers; +Server_name Host Db Username Password Port Socket Wrapper Owner +s1 bar 0 foo +DROP SERVER s1; +CREATE SERVER s1 FOREIGN DATA WRAPPER mysql OPTIONS(USER 'bar'); +ERROR HY000: Can't create federated table. Foreign data src error: either HOST or SOCKET must be set +CREATE SERVER s1 FOREIGN DATA WRAPPER mysql OPTIONS(HOST 'bar'); +SELECT * FROM mysql.servers; +Server_name Host Db Username Password Port Socket Wrapper Owner +s1 bar 3306 mysql +DROP SERVER s1; +CREATE SERVER s1 FOREIGN DATA WRAPPER mysql OPTIONS(SOCKET 'bar'); +SELECT * FROM mysql.servers; +Server_name Host Db Username Password Port Socket Wrapper Owner +s1 3306 bar mysql DROP SERVER s1; diff --git a/mysql-test/suite/federated/federated_server.result b/mysql-test/suite/federated/federated_server.result index 3855964e2ba..2f04f1443ba 100644 --- a/mysql-test/suite/federated/federated_server.result +++ b/mysql-test/suite/federated/federated_server.result @@ -246,7 +246,7 @@ drop user guest_usage@localhost; drop user guest_select@localhost; drop table federated.t1; drop server 's1'; -create server 's1' foreign data wrapper 'mysql' options (port 3306); +create server 's1' foreign data wrapper 'mysql' options (host 'foo'); alter server 's1' options (host 'localhost', database '', user '', password '', socket '', owner '', port 3306); diff --git a/mysql-test/suite/federated/federated_server.test b/mysql-test/suite/federated/federated_server.test index c47a1acf2a3..3d491b1dfdf 100644 --- a/mysql-test/suite/federated/federated_server.test +++ b/mysql-test/suite/federated/federated_server.test @@ -292,7 +292,7 @@ drop server 's1'; # # Bug#30671 - ALTER SERVER causes the server to crash # -create server 's1' foreign data wrapper 'mysql' options (port 3306); +create server 's1' foreign data wrapper 'mysql' options (host 'foo'); alter server 's1' options (host 'localhost', database '', user '', password '', socket '', owner '', port 3306); diff --git a/mysql-test/suite/federated/federatedx.result b/mysql-test/suite/federated/federatedx.result index c93ff1493d9..522b286c545 100644 --- a/mysql-test/suite/federated/federatedx.result +++ b/mysql-test/suite/federated/federatedx.result @@ -2143,7 +2143,7 @@ DROP TABLE t1; #Switch to Connection Slave DROP TABLE t1; End of 5.0 tests -create server 's1' foreign data wrapper 'mysql' options (port 3306); +create server 's1' foreign data wrapper 'mysql' options (host 'foo'); drop server 's1'; # # Bug #32426: FEDERATED query returns corrupt results for ORDER BY on a TEXT diff --git a/mysql-test/suite/federated/federatedx.test b/mysql-test/suite/federated/federatedx.test index c4067070d14..e79970f8dcd 100644 --- a/mysql-test/suite/federated/federatedx.test +++ b/mysql-test/suite/federated/federatedx.test @@ -1966,7 +1966,7 @@ connection default; --echo End of 5.0 tests -create server 's1' foreign data wrapper 'mysql' options (port 3306); +create server 's1' foreign data wrapper 'mysql' options (host 'foo'); drop server 's1'; diff --git a/mysql-test/t/servers.test b/mysql-test/t/servers.test index ee0fa637b87..37817937ab5 100644 --- a/mysql-test/t/servers.test +++ b/mysql-test/t/servers.test @@ -6,3 +6,20 @@ CREATE SERVER s1 FOREIGN DATA WRAPPER mysql OPTIONS(HOST 'localhost'); SELECT * FROM mysql.servers; DROP SERVER s1; + +CREATE SERVER s1 FOREIGN DATA WRAPPER foo OPTIONS(USER 'bar'); +SELECT * FROM mysql.servers; +DROP SERVER s1; + +--error ER_CANT_CREATE_FEDERATED_TABLE +CREATE SERVER s1 FOREIGN DATA WRAPPER mysql OPTIONS(USER 'bar'); + +CREATE SERVER s1 FOREIGN DATA WRAPPER mysql OPTIONS(HOST 'bar'); +SELECT * FROM mysql.servers; +DROP SERVER s1; + +CREATE SERVER s1 FOREIGN DATA WRAPPER mysql OPTIONS(SOCKET 'bar'); +SELECT * FROM mysql.servers; +DROP SERVER s1; + + diff --git a/sql/sql_servers.cc b/sql/sql_servers.cc index 670ad182e8b..1fd46027725 100644 --- a/sql/sql_servers.cc +++ b/sql/sql_servers.cc @@ -1078,6 +1078,7 @@ static FOREIGN_SERVER * prepare_server_struct_for_insert(LEX_SERVER_OPTIONS *server_options) { FOREIGN_SERVER *server; + ulong default_port= 0; DBUG_ENTER("prepare_server_struct"); if (!(server= (FOREIGN_SERVER *)alloc_root(&mem, sizeof(FOREIGN_SERVER)))) @@ -1095,6 +1096,18 @@ prepare_server_struct_for_insert(LEX_SERVER_OPTIONS *server_options) SET_SERVER_OR_RETURN(server_name, NULL); SET_SERVER_OR_RETURN(scheme, NULL); + /* scheme-specific checks */ + if (!strcasecmp(server->scheme, "mysql")) + { + default_port= MYSQL_PORT; + if (!server_options->host.str && !server_options->socket.str) + { + my_error(ER_CANT_CREATE_FEDERATED_TABLE, MYF(0), + "either HOST or SOCKET must be set"); + DBUG_RETURN(NULL); + } + } + SET_SERVER_OR_RETURN(host, ""); SET_SERVER_OR_RETURN(db, ""); SET_SERVER_OR_RETURN(username, ""); @@ -1104,9 +1117,9 @@ prepare_server_struct_for_insert(LEX_SERVER_OPTIONS *server_options) server->server_name_length= server_options->server_name.length; - /* set to 0 if not specified */ + /* set to default_port if not specified */ server->port= server_options->port > -1 ? - server_options->port : 0; + server_options->port : default_port; DBUG_RETURN(server); }