diff options
author | Anel Husakovic <anel@mariadb.org> | 2019-06-20 01:15:40 -0700 |
---|---|---|
committer | Anel Husakovic <anel@mariadb.org> | 2019-06-21 03:08:10 -0700 |
commit | 3a66e3183cd444fab43b7832b8590e7039a6bc5d (patch) | |
tree | 35144a0ee82366e68a85944416c0f6e18e9b34dd | |
parent | 192aa295b4bc877d0fed24154c57304c3f789179 (diff) | |
download | mariadb-git-bb-anel-MDEV-17429.tar.gz |
MDEV-17429 mysqldump uses 10.3 options with pre-10.3 servers and breaksbb-anel-MDEV-17429
-rw-r--r-- | client/mysqldump.c | 6 | ||||
-rw-r--r-- | mysql-test/main/mysqldump-compat-102.opt | 1 | ||||
-rw-r--r-- | mysql-test/main/mysqldump-compat-102.result | 110 | ||||
-rw-r--r-- | mysql-test/main/mysqldump-compat-102.test | 83 |
4 files changed, 198 insertions, 2 deletions
diff --git a/client/mysqldump.c b/client/mysqldump.c index 10f9739d637..88cf4447f18 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -2524,7 +2524,9 @@ static uint dump_routines_for_db(char *db) char db_cl_name[MY_CS_NAME_SIZE]; int db_cl_altered= FALSE; - + // before 10.3 packages are not supported + uint upper_bound= mysql_get_server_version(mysql) >= 100300 ? + array_elements(routine_type) : 2; DBUG_ENTER("dump_routines_for_db"); DBUG_PRINT("enter", ("db: '%s'", db)); @@ -2554,7 +2556,7 @@ static uint dump_routines_for_db(char *db) fputs("\t<routines>\n", sql_file); /* 0, retrieve and dump functions, 1, procedures, etc. */ - for (i= 0; i < array_elements(routine_type); i++) + for (i= 0; i < upper_bound; i++) { my_snprintf(query_buff, sizeof(query_buff), "SHOW %s STATUS WHERE Db = '%s'", diff --git a/mysql-test/main/mysqldump-compat-102.opt b/mysql-test/main/mysqldump-compat-102.opt new file mode 100644 index 00000000000..d309bba8e76 --- /dev/null +++ b/mysql-test/main/mysqldump-compat-102.opt @@ -0,0 +1 @@ +-V10.2.1-MariaDB diff --git a/mysql-test/main/mysqldump-compat-102.result b/mysql-test/main/mysqldump-compat-102.result new file mode 100644 index 00000000000..b58c33927cf --- /dev/null +++ b/mysql-test/main/mysqldump-compat-102.result @@ -0,0 +1,110 @@ +# +# MDEV-17429 mysqldump uses 10.3 options with pre-10.3 servers and breaks +# +SELECT @@version; +@@version +10.2.1-MariaDB +SET sql_mode=ORACLE; +CREATE DATABASE db1_mdev17429; +USE db1_mdev17429; +CREATE PROCEDURE p1(a INT) +AS BEGIN +NULL; +END; +$$ +CREATE OR REPLACE PACKAGE employee_tools AS +FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2); +PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2)); +PROCEDURE raiseSalaryStd(eid INT); +PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2)); +END; +$$ +CREATE PACKAGE BODY employee_tools AS +-- package body variables +stdRaiseAmount DECIMAL(10,2):=500; +-- private routines +PROCEDURE log (eid INT, ecmnt TEXT) AS +BEGIN +INSERT INTO employee_log (id, cmnt) VALUES (eid, ecmnt); +END; +-- public routines +PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2)) AS +eid INT; +BEGIN +INSERT INTO employee (name, salary) VALUES (ename, esalary); +eid:= last_insert_id(); +log(eid, 'hire ' || ename); +END; +FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2) AS +nSalary DECIMAL(10,2); +BEGIN +SELECT salary INTO nSalary FROM employee WHERE id=eid; +log(eid, 'getSalary id=' || eid || ' salary=' || nSalary); +RETURN nSalary; +END; +PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2)) AS +BEGIN +UPDATE employee SET salary=salary+amount WHERE id=eid; +log(eid, 'raiseSalary id=' || eid || ' amount=' || amount); +END; +PROCEDURE raiseSalaryStd(eid INT) AS +BEGIN +raiseSalary(eid, stdRaiseAmount); +log(eid, 'raiseSalaryStd id=' || eid); +END; +BEGIN +-- This code is executed when the current session +-- accesses any of the package routines for the first time +log(0, 'Session ' || connection_id() || ' ' || current_user || ' started'); +END; +$$ +-- MySQL dump DUMPVERSION Distrib DISTVERSION, for OS +-- +-- Host: localhost Database: db1_mdev17429 +-- ------------------------------------------------------ +-- Server version 10.2.1-MariaDB + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Dumping routines for database 'db1_mdev17429' +-- +/*!50003 DROP PROCEDURE IF EXISTS `p1` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = latin1 */ ; +/*!50003 SET character_set_results = latin1 */ ; +/*!50003 SET collation_connection = latin1_swedish_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SIMULTANEOUS_ASSIGNMENT' */ ; +DELIMITER ;; +CREATE DEFINER="root"@"localhost" PROCEDURE "p1"(a INT) +AS BEGIN +NULL; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on TIMESTAMP +DROP DATABASE db1_mdev17429; +SET sql_mode=DEFAULT; diff --git a/mysql-test/main/mysqldump-compat-102.test b/mysql-test/main/mysqldump-compat-102.test new file mode 100644 index 00000000000..582635dadc1 --- /dev/null +++ b/mysql-test/main/mysqldump-compat-102.test @@ -0,0 +1,83 @@ +# Embedded server doesn't support external clients +--source include/not_embedded.inc + +--echo # +--echo # MDEV-17429 mysqldump uses 10.3 options with pre-10.3 servers and breaks +--echo # + +# Make sure the server reports itself as 10.2.1-MariaDB +SELECT @@version; + +SET sql_mode=ORACLE; +CREATE DATABASE db1_mdev17429; +USE db1_mdev17429; + +DELIMITER $$; + +CREATE PROCEDURE p1(a INT) +AS BEGIN + NULL; +END; +$$ + +CREATE OR REPLACE PACKAGE employee_tools AS + FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2); + PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2)); + PROCEDURE raiseSalaryStd(eid INT); + PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2)); +END; +$$ +CREATE PACKAGE BODY employee_tools AS + -- package body variables + stdRaiseAmount DECIMAL(10,2):=500; + + -- private routines + PROCEDURE log (eid INT, ecmnt TEXT) AS + BEGIN + INSERT INTO employee_log (id, cmnt) VALUES (eid, ecmnt); + END; + + -- public routines + PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2)) AS + eid INT; + BEGIN + INSERT INTO employee (name, salary) VALUES (ename, esalary); + eid:= last_insert_id(); + log(eid, 'hire ' || ename); + END; + + FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2) AS + nSalary DECIMAL(10,2); + BEGIN + SELECT salary INTO nSalary FROM employee WHERE id=eid; + log(eid, 'getSalary id=' || eid || ' salary=' || nSalary); + RETURN nSalary; + END; + + PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2)) AS + BEGIN + UPDATE employee SET salary=salary+amount WHERE id=eid; + log(eid, 'raiseSalary id=' || eid || ' amount=' || amount); + END; + + PROCEDURE raiseSalaryStd(eid INT) AS + BEGIN + raiseSalary(eid, stdRaiseAmount); + log(eid, 'raiseSalaryStd id=' || eid); + END; + +BEGIN + -- This code is executed when the current session + -- accesses any of the package routines for the first time + log(0, 'Session ' || connection_id() || ' ' || current_user || ' started'); +END; +$$ +DELIMITER ;$$ + +# mysqldump output is expected to have standalone PROCEDURE/FUNCTION, but not PACKAGE/PACKAGE BODY. + +--replace_regex /-- MySQL dump.*[^\n]/-- MySQL dump DUMPVERSION Distrib DISTVERSION, for OS/ / on [0-9 :-]+/ on TIMESTAMP/ +--exec $MYSQL_DUMP --quick --routines --triggers --no-create-info --skip-lock-tables --no-data --compress -uroot db1_mdev17429 + +DROP DATABASE db1_mdev17429; +SET sql_mode=DEFAULT; |