Skip to content

Commit 620f4f8

Browse files
committed
MDEV-17429 mysqldump uses 10.3 options with pre-10.3 servers and breaks
1 parent 68c15ee commit 620f4f8

File tree

4 files changed

+198
-2
lines changed

4 files changed

+198
-2
lines changed

client/mysqldump.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2524,7 +2524,9 @@ static uint dump_routines_for_db(char *db)
25242524

25252525
char db_cl_name[MY_CS_NAME_SIZE];
25262526
int db_cl_altered= FALSE;
2527-
2527+
// before 10.3 packages are not supported
2528+
uint upper_bound= mysql_get_server_version(mysql) >= 100300 ?
2529+
array_elements(routine_type) : 2;
25282530
DBUG_ENTER("dump_routines_for_db");
25292531
DBUG_PRINT("enter", ("db: '%s'", db));
25302532

@@ -2554,7 +2556,7 @@ static uint dump_routines_for_db(char *db)
25542556
fputs("\t<routines>\n", sql_file);
25552557

25562558
/* 0, retrieve and dump functions, 1, procedures, etc. */
2557-
for (i= 0; i < array_elements(routine_type); i++)
2559+
for (i= 0; i < upper_bound; i++)
25582560
{
25592561
my_snprintf(query_buff, sizeof(query_buff),
25602562
"SHOW %s STATUS WHERE Db = '%s'",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
-V10.2.1-MariaDB
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#
2+
# MDEV-17429 mysqldump uses 10.3 options with pre-10.3 servers and breaks
3+
#
4+
SELECT @@version;
5+
@@version
6+
10.2.1-MariaDB
7+
SET sql_mode=ORACLE;
8+
CREATE DATABASE db1_mdev17429;
9+
USE db1_mdev17429;
10+
CREATE PROCEDURE p1(a INT)
11+
AS BEGIN
12+
NULL;
13+
END;
14+
$$
15+
CREATE OR REPLACE PACKAGE employee_tools AS
16+
FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2);
17+
PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2));
18+
PROCEDURE raiseSalaryStd(eid INT);
19+
PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2));
20+
END;
21+
$$
22+
CREATE PACKAGE BODY employee_tools AS
23+
-- package body variables
24+
stdRaiseAmount DECIMAL(10,2):=500;
25+
-- private routines
26+
PROCEDURE log (eid INT, ecmnt TEXT) AS
27+
BEGIN
28+
INSERT INTO employee_log (id, cmnt) VALUES (eid, ecmnt);
29+
END;
30+
-- public routines
31+
PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2)) AS
32+
eid INT;
33+
BEGIN
34+
INSERT INTO employee (name, salary) VALUES (ename, esalary);
35+
eid:= last_insert_id();
36+
log(eid, 'hire ' || ename);
37+
END;
38+
FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2) AS
39+
nSalary DECIMAL(10,2);
40+
BEGIN
41+
SELECT salary INTO nSalary FROM employee WHERE id=eid;
42+
log(eid, 'getSalary id=' || eid || ' salary=' || nSalary);
43+
RETURN nSalary;
44+
END;
45+
PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2)) AS
46+
BEGIN
47+
UPDATE employee SET salary=salary+amount WHERE id=eid;
48+
log(eid, 'raiseSalary id=' || eid || ' amount=' || amount);
49+
END;
50+
PROCEDURE raiseSalaryStd(eid INT) AS
51+
BEGIN
52+
raiseSalary(eid, stdRaiseAmount);
53+
log(eid, 'raiseSalaryStd id=' || eid);
54+
END;
55+
BEGIN
56+
-- This code is executed when the current session
57+
-- accesses any of the package routines for the first time
58+
log(0, 'Session ' || connection_id() || ' ' || current_user || ' started');
59+
END;
60+
$$
61+
-- MySQL dump DUMPVERSION Distrib DISTVERSION, for OS
62+
--
63+
-- Host: localhost Database: db1_mdev17429
64+
-- ------------------------------------------------------
65+
-- Server version 10.2.1-MariaDB
66+
67+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
68+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
69+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
70+
/*!40101 SET NAMES utf8mb4 */;
71+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
72+
/*!40103 SET TIME_ZONE='+00:00' */;
73+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
74+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
75+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
76+
77+
--
78+
-- Dumping routines for database 'db1_mdev17429'
79+
--
80+
/*!50003 DROP PROCEDURE IF EXISTS `p1` */;
81+
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
82+
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
83+
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
84+
/*!50003 SET character_set_client = latin1 */ ;
85+
/*!50003 SET character_set_results = latin1 */ ;
86+
/*!50003 SET collation_connection = latin1_swedish_ci */ ;
87+
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
88+
/*!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' */ ;
89+
DELIMITER ;;
90+
CREATE DEFINER="root"@"localhost" PROCEDURE "p1"(a INT)
91+
AS BEGIN
92+
NULL;
93+
END ;;
94+
DELIMITER ;
95+
/*!50003 SET sql_mode = @saved_sql_mode */ ;
96+
/*!50003 SET character_set_client = @saved_cs_client */ ;
97+
/*!50003 SET character_set_results = @saved_cs_results */ ;
98+
/*!50003 SET collation_connection = @saved_col_connection */ ;
99+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
100+
101+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
102+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
103+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
104+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
105+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
106+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
107+
108+
-- Dump completed on TIMESTAMP
109+
DROP DATABASE db1_mdev17429;
110+
SET sql_mode=DEFAULT;
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# Embedded server doesn't support external clients
2+
--source include/not_embedded.inc
3+
4+
--echo #
5+
--echo # MDEV-17429 mysqldump uses 10.3 options with pre-10.3 servers and breaks
6+
--echo #
7+
8+
# Make sure the server reports itself as 10.2.1-MariaDB
9+
SELECT @@version;
10+
11+
SET sql_mode=ORACLE;
12+
CREATE DATABASE db1_mdev17429;
13+
USE db1_mdev17429;
14+
15+
DELIMITER $$;
16+
17+
CREATE PROCEDURE p1(a INT)
18+
AS BEGIN
19+
NULL;
20+
END;
21+
$$
22+
23+
CREATE OR REPLACE PACKAGE employee_tools AS
24+
FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2);
25+
PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2));
26+
PROCEDURE raiseSalaryStd(eid INT);
27+
PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2));
28+
END;
29+
$$
30+
CREATE PACKAGE BODY employee_tools AS
31+
-- package body variables
32+
stdRaiseAmount DECIMAL(10,2):=500;
33+
34+
-- private routines
35+
PROCEDURE log (eid INT, ecmnt TEXT) AS
36+
BEGIN
37+
INSERT INTO employee_log (id, cmnt) VALUES (eid, ecmnt);
38+
END;
39+
40+
-- public routines
41+
PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2)) AS
42+
eid INT;
43+
BEGIN
44+
INSERT INTO employee (name, salary) VALUES (ename, esalary);
45+
eid:= last_insert_id();
46+
log(eid, 'hire ' || ename);
47+
END;
48+
49+
FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2) AS
50+
nSalary DECIMAL(10,2);
51+
BEGIN
52+
SELECT salary INTO nSalary FROM employee WHERE id=eid;
53+
log(eid, 'getSalary id=' || eid || ' salary=' || nSalary);
54+
RETURN nSalary;
55+
END;
56+
57+
PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2)) AS
58+
BEGIN
59+
UPDATE employee SET salary=salary+amount WHERE id=eid;
60+
log(eid, 'raiseSalary id=' || eid || ' amount=' || amount);
61+
END;
62+
63+
PROCEDURE raiseSalaryStd(eid INT) AS
64+
BEGIN
65+
raiseSalary(eid, stdRaiseAmount);
66+
log(eid, 'raiseSalaryStd id=' || eid);
67+
END;
68+
69+
BEGIN
70+
-- This code is executed when the current session
71+
-- accesses any of the package routines for the first time
72+
log(0, 'Session ' || connection_id() || ' ' || current_user || ' started');
73+
END;
74+
$$
75+
DELIMITER ;$$
76+
77+
# mysqldump output is expected to have standalone PROCEDURE/FUNCTION, but not PACKAGE/PACKAGE BODY.
78+
79+
--replace_regex /-- MySQL dump.*[^\n]/-- MySQL dump DUMPVERSION Distrib DISTVERSION, for OS/ / on [0-9 :-]+/ on TIMESTAMP/
80+
--exec $MYSQL_DUMP --quick --routines --triggers --no-create-info --skip-lock-tables --no-data --compress -uroot db1_mdev17429
81+
82+
DROP DATABASE db1_mdev17429;
83+
SET sql_mode=DEFAULT;

0 commit comments

Comments
 (0)