Skip to content

Commit c678844

Browse files
committed
mysqldump: remove dead and broken code
since 2006 (3840774) mysqldump tried to be smart when dumping events - it tried to automatically detected a delimiter per event that was not present in the event body, using ";;" by default. This never worked, was broken since the first commit. It either used the default ";;" or failed after trying the same ";;" delimiter 2147483646 times. All other objects (routines, triggers, etc) used a hard-coded ";;" for 20 years, which apparently worked fine. Let's remove the old broken logic and dump events like all other objects,
1 parent 88b9989 commit c678844

5 files changed

Lines changed: 255 additions & 332 deletions

File tree

client/mysqldump.cc

Lines changed: 53 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -1744,7 +1744,6 @@ static char *my_case_str(const char *str,
17441744

17451745
static int switch_db_collation(FILE *sql_file,
17461746
const char *db_name,
1747-
const char *delimiter,
17481747
const char *current_db_cl_name,
17491748
const char *required_db_cl_name,
17501749
int *db_cl_altered)
@@ -1760,11 +1759,10 @@ static int switch_db_collation(FILE *sql_file,
17601759
return 1;
17611760

17621761
fprintf(sql_file,
1763-
"ALTER DATABASE %s CHARACTER SET %s COLLATE %s %s\n",
1762+
"ALTER DATABASE %s CHARACTER SET %s COLLATE %s ;\n",
17641763
(const char *) quoted_db_name,
17651764
(const char *) db_cl->cs_name.str,
1766-
(const char *) db_cl->coll_name.str,
1767-
(const char *) delimiter);
1765+
(const char *) db_cl->coll_name.str);
17681766

17691767
*db_cl_altered= 1;
17701768

@@ -1779,7 +1777,6 @@ static int switch_db_collation(FILE *sql_file,
17791777

17801778
static int restore_db_collation(FILE *sql_file,
17811779
const char *db_name,
1782-
const char *delimiter,
17831780
const char *db_cl_name)
17841781
{
17851782
char quoted_db_buf[NAME_LEN * 2 + 3];
@@ -1791,100 +1788,71 @@ static int restore_db_collation(FILE *sql_file,
17911788
return 1;
17921789

17931790
fprintf(sql_file,
1794-
"ALTER DATABASE %s CHARACTER SET %s COLLATE %s %s\n",
1791+
"ALTER DATABASE %s CHARACTER SET %s COLLATE %s ;\n",
17951792
(const char *) quoted_db_name,
17961793
(const char *) db_cl->cs_name.str,
1797-
(const char *) db_cl->coll_name.str,
1798-
(const char *) delimiter);
1794+
(const char *) db_cl->coll_name.str);
17991795

18001796
return 0;
18011797
}
18021798

18031799

18041800
static void switch_cs_variables(FILE *sql_file,
1805-
const char *delimiter,
18061801
const char *character_set_client,
18071802
const char *character_set_results,
18081803
const char *collation_connection)
18091804
{
18101805
fprintf(sql_file,
1811-
"/*!50003 SET @saved_cs_client = @@character_set_client */ %s\n"
1812-
"/*!50003 SET @saved_cs_results = @@character_set_results */ %s\n"
1813-
"/*!50003 SET @saved_col_connection = @@collation_connection */ %s\n"
1814-
"/*!50003 SET character_set_client = %s */ %s\n"
1815-
"/*!50003 SET character_set_results = %s */ %s\n"
1816-
"/*!50003 SET collation_connection = %s */ %s\n",
1817-
(const char *) delimiter,
1818-
(const char *) delimiter,
1819-
(const char *) delimiter,
1820-
1806+
"/*!50003 SET @saved_cs_client = @@character_set_client */ ;\n"
1807+
"/*!50003 SET @saved_cs_results = @@character_set_results */ ;\n"
1808+
"/*!50003 SET @saved_col_connection = @@collation_connection */ ;\n"
1809+
"/*!50003 SET character_set_client = %s */ ;\n"
1810+
"/*!50003 SET character_set_results = %s */ ;\n"
1811+
"/*!50003 SET collation_connection = %s */ ;\n",
18211812
(const char *) character_set_client,
1822-
(const char *) delimiter,
1823-
18241813
(const char *) character_set_results,
1825-
(const char *) delimiter,
1826-
1827-
(const char *) collation_connection,
1828-
(const char *) delimiter);
1814+
(const char *) collation_connection);
18291815
}
18301816

18311817

1832-
static void restore_cs_variables(FILE *sql_file,
1833-
const char *delimiter)
1818+
static void restore_cs_variables(FILE *sql_file)
18341819
{
18351820
fprintf(sql_file,
1836-
"/*!50003 SET character_set_client = @saved_cs_client */ %s\n"
1837-
"/*!50003 SET character_set_results = @saved_cs_results */ %s\n"
1838-
"/*!50003 SET collation_connection = @saved_col_connection */ %s\n",
1839-
(const char *) delimiter,
1840-
(const char *) delimiter,
1841-
(const char *) delimiter);
1821+
"/*!50003 SET character_set_client = @saved_cs_client */ ;\n"
1822+
"/*!50003 SET character_set_results = @saved_cs_results */ ;\n"
1823+
"/*!50003 SET collation_connection = @saved_col_connection */ ;\n");
18421824
}
18431825

18441826

1845-
static void switch_sql_mode(FILE *sql_file,
1846-
const char *delimiter,
1847-
const char *sql_mode)
1827+
static void switch_sql_mode(FILE *sql_file, const char *sql_mode)
18481828
{
18491829
fprintf(sql_file,
1850-
"/*!50003 SET @saved_sql_mode = @@sql_mode */ %s\n"
1851-
"/*!50003 SET sql_mode = '%s' */ %s\n",
1852-
(const char *) delimiter,
1853-
1854-
(const char *) sql_mode,
1855-
(const char *) delimiter);
1830+
"/*!50003 SET @saved_sql_mode = @@sql_mode */ ;\n"
1831+
"/*!50003 SET sql_mode = '%s' */ ;\n",
1832+
(const char *) sql_mode);
18561833
}
18571834

18581835

1859-
static void restore_sql_mode(FILE *sql_file,
1860-
const char *delimiter)
1836+
static void restore_sql_mode(FILE *sql_file)
18611837
{
18621838
fprintf(sql_file,
1863-
"/*!50003 SET sql_mode = @saved_sql_mode */ %s\n",
1864-
(const char *) delimiter);
1839+
"/*!50003 SET sql_mode = @saved_sql_mode */ ;\n");
18651840
}
18661841

18671842

1868-
static void switch_time_zone(FILE *sql_file,
1869-
const char *delimiter,
1870-
const char *time_zone)
1843+
static void switch_time_zone(FILE *sql_file, const char *time_zone)
18711844
{
18721845
fprintf(sql_file,
1873-
"/*!50003 SET @saved_time_zone = @@time_zone */ %s\n"
1874-
"/*!50003 SET time_zone = '%s' */ %s\n",
1875-
(const char *) delimiter,
1876-
1877-
(const char *) time_zone,
1878-
(const char *) delimiter);
1846+
"/*!50003 SET @saved_time_zone = @@time_zone */ ;\n"
1847+
"/*!50003 SET time_zone = '%s' */ ;\n",
1848+
(const char *) time_zone);
18791849
}
18801850

18811851

1882-
static void restore_time_zone(FILE *sql_file,
1883-
const char *delimiter)
1852+
static void restore_time_zone(FILE *sql_file)
18841853
{
18851854
fprintf(sql_file,
1886-
"/*!50003 SET time_zone = @saved_time_zone */ %s\n",
1887-
(const char *) delimiter);
1855+
"/*!50003 SET time_zone = @saved_time_zone */ ;\n");
18881856
}
18891857

18901858

@@ -2679,44 +2647,6 @@ static void print_comment(FILE *sql_file, my_bool is_error, const char *format,
26792647
print_xml_comment(sql_file, strlen(comment_buff), comment_buff);
26802648
}
26812649

2682-
/*
2683-
create_delimiter
2684-
Generate a new (null-terminated) string that does not exist in query
2685-
and is therefore suitable for use as a query delimiter. Store this
2686-
delimiter in delimiter_buff .
2687-
2688-
This is quite simple in that it doesn't even try to parse statements as an
2689-
interpreter would. It merely returns a string that is not in the query, which
2690-
is much more than adequate for constructing a delimiter.
2691-
2692-
RETURN
2693-
ptr to the delimiter on Success
2694-
NULL on Failure
2695-
*/
2696-
static char *create_delimiter(char *query, char *delimiter_buff,
2697-
int delimiter_max_size)
2698-
{
2699-
int proposed_length;
2700-
char *presence;
2701-
2702-
delimiter_buff[0]= ';'; /* start with one semicolon, and */
2703-
2704-
for (proposed_length= 2; proposed_length < delimiter_max_size;
2705-
delimiter_max_size++) {
2706-
2707-
delimiter_buff[proposed_length-1]= ';'; /* add semicolons, until */
2708-
delimiter_buff[proposed_length]= '\0';
2709-
2710-
presence = strstr(query, delimiter_buff);
2711-
if (presence == NULL) { /* the proposed delimiter is not in the query. */
2712-
return delimiter_buff;
2713-
}
2714-
2715-
}
2716-
return NULL; /* but if we run out of space, return nothing at all. */
2717-
}
2718-
2719-
27202650
/*
27212651
dump_events_for_db
27222652
-- retrieves list of events for a given db, and prints out
@@ -2731,7 +2661,6 @@ static uint dump_events_for_db(char *db)
27312661
char query_buff[QUERY_LENGTH];
27322662
char db_name_buff[NAME_LEN*2+3], name_buff[NAME_LEN*2+3];
27332663
char *event_name;
2734-
char delimiter[QUERY_LENGTH];
27352664
FILE *sql_file= md_result_file;
27362665
MYSQL_RES *event_res= NULL, *event_list_res= NULL;
27372666
MYSQL_ROW row, event_list_row;
@@ -2759,7 +2688,6 @@ static uint dump_events_for_db(char *db)
27592688
if (mysql_query_with_error_report(mysql, &event_list_res, "show events"))
27602689
DBUG_RETURN(0);
27612690

2762-
safe_strcpy(delimiter, sizeof(delimiter), ";");
27632691
if (mysql_num_rows(event_list_res) > 0)
27642692
{
27652693
if (opt_xml)
@@ -2805,25 +2733,16 @@ static uint dump_events_for_db(char *db)
28052733
char *query_str;
28062734

28072735
if (opt_drop)
2808-
fprintf(sql_file, "/*!50106 DROP EVENT IF EXISTS %s */%s\n",
2809-
event_name, delimiter);
2810-
2811-
if (create_delimiter(row[3], delimiter, sizeof(delimiter)) == NULL)
2812-
{
2813-
fprintf(stderr, "%s: Warning: Can't create delimiter for event '%s'\n",
2814-
my_progname_short, event_name);
2815-
goto err;
2816-
}
2817-
2818-
fprintf(sql_file, "DELIMITER %s\n", delimiter);
2736+
fprintf(sql_file, "/*!50106 DROP EVENT IF EXISTS %s */;\n",
2737+
event_name);
28192738

28202739
if (mysql_num_fields(event_res) >= 7)
28212740
{
2822-
if (switch_db_collation(sql_file, db_name_buff, delimiter,
2741+
if (switch_db_collation(sql_file, db_name_buff,
28232742
db_cl_name, row[6], &db_cl_altered))
28242743
goto err;
28252744

2826-
switch_cs_variables(sql_file, delimiter,
2745+
switch_cs_variables(sql_file,
28272746
row[4], /* character_set_client */
28282747
row[4], /* character_set_results */
28292748
row[5]); /* collation_connection */
@@ -2846,32 +2765,31 @@ static uint dump_events_for_db(char *db)
28462765
"--\n");
28472766
}
28482767

2849-
switch_sql_mode(sql_file, delimiter, row[1]);
2768+
switch_sql_mode(sql_file, row[1]);
28502769

2851-
switch_time_zone(sql_file, delimiter, row[2]);
2770+
switch_time_zone(sql_file, row[2]);
28522771

28532772
query_str= cover_definer_clause(row[3], strlen(row[3]),
28542773
C_STRING_WITH_LEN("50117"),
28552774
C_STRING_WITH_LEN("50106"),
28562775
C_STRING_WITH_LEN(" EVENT"));
28572776

2858-
fprintf(sql_file,
2859-
"/*!50106 %s \n*/ %s\n",
2860-
(const char *) (query_str != NULL ? query_str : row[3]),
2861-
(const char *) delimiter);
2777+
fprintf(sql_file, "DELIMITER ;;\n"
2778+
"/*!50106 %s \n*/ ;;\n"
2779+
"DELIMITER ;\n",
2780+
(const char *) (query_str != NULL ? query_str : row[3]));
28622781

28632782
my_free(query_str);
2864-
restore_time_zone(sql_file, delimiter);
2865-
restore_sql_mode(sql_file, delimiter);
2783+
restore_time_zone(sql_file);
2784+
restore_sql_mode(sql_file);
28662785

28672786
if (mysql_num_fields(event_res) >= 7)
28682787
{
2869-
restore_cs_variables(sql_file, delimiter);
2788+
restore_cs_variables(sql_file);
28702789

28712790
if (db_cl_altered)
28722791
{
2873-
if (restore_db_collation(sql_file, db_name_buff, delimiter,
2874-
db_cl_name))
2792+
if (restore_db_collation(sql_file, db_name_buff, db_cl_name))
28752793
goto err;
28762794
}
28772795
}
@@ -2888,7 +2806,6 @@ static uint dump_events_for_db(char *db)
28882806
}
28892807
else
28902808
{
2891-
fprintf(sql_file, "DELIMITER ;\n");
28922809
fprintf(sql_file, "/*!50106 SET TIME_ZONE= @save_time_zone */ ;\n");
28932810
}
28942811

@@ -3048,15 +2965,15 @@ static uint dump_routines_for_db(char *db)
30482965
continue;
30492966
}
30502967

3051-
switch_sql_mode(sql_file, ";", row[1]);
2968+
switch_sql_mode(sql_file, row[1]);
30522969

30532970
if (opt_drop)
30542971
fprintf(sql_file, "/*!50003 DROP %s IF EXISTS %s */;\n",
30552972
routine_type[i], routine_name);
30562973

30572974
if (mysql_num_fields(routine_res) >= 6)
30582975
{
3059-
if (switch_db_collation(sql_file, db, ";",
2976+
if (switch_db_collation(sql_file, db,
30602977
db_cl_name, row[5], &db_cl_altered))
30612978
{
30622979
mysql_free_result(routine_res);
@@ -3065,7 +2982,7 @@ static uint dump_routines_for_db(char *db)
30652982
DBUG_RETURN(1);
30662983
}
30672984

3068-
switch_cs_variables(sql_file, ";",
2985+
switch_cs_variables(sql_file,
30692986
row[3], /* character_set_client */
30702987
row[3], /* character_set_results */
30712988
row[4]); /* collation_connection */
@@ -3096,15 +3013,15 @@ static uint dump_routines_for_db(char *db)
30963013
"DELIMITER ;\n",
30973014
(const char *) row[2]);
30983015

3099-
restore_sql_mode(sql_file, ";");
3016+
restore_sql_mode(sql_file);
31003017

31013018
if (mysql_num_fields(routine_res) >= 6)
31023019
{
3103-
restore_cs_variables(sql_file, ";");
3020+
restore_cs_variables(sql_file);
31043021

31053022
if (db_cl_altered)
31063023
{
3107-
if (restore_db_collation(sql_file, db, ";", db_cl_name))
3024+
if (restore_db_collation(sql_file, db, db_cl_name))
31083025
{
31093026
mysql_free_result(routine_res);
31103027
mysql_free_result(routine_list_res);
@@ -4010,16 +3927,16 @@ static int dump_trigger(FILE *sql_file, MYSQL_RES *show_create_trigger_rs,
40103927
continue;
40113928
}
40123929

4013-
if (switch_db_collation(sql_file, db_name, ";",
3930+
if (switch_db_collation(sql_file, db_name,
40143931
db_cl_name, row[5], &db_cl_altered))
40153932
DBUG_RETURN(TRUE);
40163933

4017-
switch_cs_variables(sql_file, ";",
3934+
switch_cs_variables(sql_file,
40183935
row[3], /* character_set_client */
40193936
row[3], /* character_set_results */
40203937
row[4]); /* collation_connection */
40213938

4022-
switch_sql_mode(sql_file, ";", row[1]);
3939+
switch_sql_mode(sql_file, row[1]);
40233940

40243941
if (opt_drop_trigger)
40253942
fprintf(sql_file, "/*!50032 DROP TRIGGER IF EXISTS %s */;\n",
@@ -4037,12 +3954,12 @@ static int dump_trigger(FILE *sql_file, MYSQL_RES *show_create_trigger_rs,
40373954

40383955
my_free(query_str);
40393956

4040-
restore_sql_mode(sql_file, ";");
4041-
restore_cs_variables(sql_file, ";");
3957+
restore_sql_mode(sql_file);
3958+
restore_cs_variables(sql_file);
40423959

40433960
if (db_cl_altered)
40443961
{
4045-
if (restore_db_collation(sql_file, db_name, ";", db_cl_name))
3962+
if (restore_db_collation(sql_file, db_name, db_cl_name))
40463963
DBUG_RETURN(TRUE);
40473964
}
40483965
}

0 commit comments

Comments
 (0)