mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 10:14:19 +01:00
weave merge mysql-5.1->mysql-5.1-security
This commit is contained in:
commit
aa03fc5333
49 changed files with 1333 additions and 454 deletions
|
@ -76,6 +76,9 @@
|
|||
/* Size of buffer for dump's select query */
|
||||
#define QUERY_LENGTH 1536
|
||||
|
||||
/* Size of comment buffer. */
|
||||
#define COMMENT_LENGTH 2048
|
||||
|
||||
/* ignore table flags */
|
||||
#define IGNORE_NONE 0x00 /* no ignore */
|
||||
#define IGNORE_DATA 0x01 /* don't dump data for this table */
|
||||
|
@ -102,7 +105,7 @@ static my_bool verbose= 0, opt_no_create_info= 0, opt_no_data= 0,
|
|||
opt_complete_insert= 0, opt_drop_database= 0,
|
||||
opt_replace_into= 0,
|
||||
opt_dump_triggers= 0, opt_routines=0, opt_tz_utc=1,
|
||||
opt_events= 0,
|
||||
opt_events= 0, opt_comments_used= 0,
|
||||
opt_alltspcs=0, opt_notspcs= 0;
|
||||
static my_bool insert_pat_inited= 0, debug_info_flag= 0, debug_check_flag= 0;
|
||||
static ulong opt_max_allowed_packet, opt_net_buffer_length;
|
||||
|
@ -509,6 +512,8 @@ static int dump_all_tablespaces();
|
|||
static int dump_tablespaces_for_tables(char *db, char **table_names, int tables);
|
||||
static int dump_tablespaces_for_databases(char** databases);
|
||||
static int dump_tablespaces(char* ts_where);
|
||||
static void print_comment(FILE *sql_file, my_bool is_error, const char *format,
|
||||
...);
|
||||
|
||||
#include <help_start.h>
|
||||
|
||||
|
@ -606,19 +611,19 @@ static void write_header(FILE *sql_file, char *db_name)
|
|||
}
|
||||
else if (!opt_compact)
|
||||
{
|
||||
if (opt_comments)
|
||||
{
|
||||
fprintf(sql_file,
|
||||
"-- MySQL dump %s Distrib %s, for %s (%s)\n--\n",
|
||||
DUMP_VERSION, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE);
|
||||
fprintf(sql_file, "-- Host: %s Database: %s\n",
|
||||
current_host ? current_host : "localhost", db_name ? db_name :
|
||||
"");
|
||||
fputs("-- ------------------------------------------------------\n",
|
||||
sql_file);
|
||||
fprintf(sql_file, "-- Server version\t%s\n",
|
||||
mysql_get_server_info(&mysql_connection));
|
||||
}
|
||||
print_comment(sql_file, 0,
|
||||
"-- MySQL dump %s Distrib %s, for %s (%s)\n--\n",
|
||||
DUMP_VERSION, MYSQL_SERVER_VERSION, SYSTEM_TYPE,
|
||||
MACHINE_TYPE);
|
||||
print_comment(sql_file, 0, "-- Host: %s Database: %s\n",
|
||||
current_host ? current_host : "localhost",
|
||||
db_name ? db_name : "");
|
||||
print_comment(sql_file, 0,
|
||||
"-- ------------------------------------------------------\n"
|
||||
);
|
||||
print_comment(sql_file, 0, "-- Server version\t%s\n",
|
||||
mysql_get_server_info(&mysql_connection));
|
||||
|
||||
if (opt_set_charset)
|
||||
fprintf(sql_file,
|
||||
"\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;"
|
||||
|
@ -676,18 +681,16 @@ static void write_footer(FILE *sql_file)
|
|||
fprintf(sql_file,
|
||||
"/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;\n");
|
||||
fputs("\n", sql_file);
|
||||
if (opt_comments)
|
||||
|
||||
if (opt_dump_date)
|
||||
{
|
||||
if (opt_dump_date)
|
||||
{
|
||||
char time_str[20];
|
||||
get_date(time_str, GETDATE_DATE_TIME, 0);
|
||||
fprintf(sql_file, "-- Dump completed on %s\n",
|
||||
time_str);
|
||||
}
|
||||
else
|
||||
fprintf(sql_file, "-- Dump completed\n");
|
||||
char time_str[20];
|
||||
get_date(time_str, GETDATE_DATE_TIME, 0);
|
||||
print_comment(sql_file, 0, "-- Dump completed on %s\n", time_str);
|
||||
}
|
||||
else
|
||||
print_comment(sql_file, 0, "-- Dump completed\n");
|
||||
|
||||
check_io(sql_file);
|
||||
}
|
||||
} /* write_footer */
|
||||
|
@ -772,6 +775,9 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
extended_insert= opt_drop= opt_lock=
|
||||
opt_disable_keys= opt_autocommit= opt_create_db= 0;
|
||||
break;
|
||||
case 'i':
|
||||
opt_comments_used= 1;
|
||||
break;
|
||||
case 'I':
|
||||
case '?':
|
||||
usage();
|
||||
|
@ -798,11 +804,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
opt_disable_keys= lock_tables= opt_set_charset= 0;
|
||||
break;
|
||||
case (int) OPT_COMPACT:
|
||||
if (opt_compact)
|
||||
{
|
||||
opt_comments= opt_drop= opt_disable_keys= opt_lock= 0;
|
||||
opt_set_charset= 0;
|
||||
}
|
||||
if (opt_compact)
|
||||
{
|
||||
opt_comments= opt_drop= opt_disable_keys= opt_lock= 0;
|
||||
opt_set_charset= 0;
|
||||
}
|
||||
break;
|
||||
case (int) OPT_TABLES:
|
||||
opt_databases=0;
|
||||
break;
|
||||
|
@ -1660,20 +1667,20 @@ static char *quote_for_like(const char *name, char *buff)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
/**
|
||||
Quote and print a string.
|
||||
|
||||
SYNOPSIS
|
||||
print_quoted_xml()
|
||||
xml_file - output file
|
||||
str - string to print
|
||||
len - its length
|
||||
@param xml_file - Output file.
|
||||
@param str - String to print.
|
||||
@param len - Its length.
|
||||
@param is_attribute_name - A check for attribute name or value.
|
||||
|
||||
DESCRIPTION
|
||||
@description
|
||||
Quote '<' '>' '&' '\"' chars and print a string to the xml_file.
|
||||
*/
|
||||
|
||||
static void print_quoted_xml(FILE *xml_file, const char *str, ulong len)
|
||||
static void print_quoted_xml(FILE *xml_file, const char *str, ulong len,
|
||||
my_bool is_attribute_name)
|
||||
{
|
||||
const char *end;
|
||||
|
||||
|
@ -1692,6 +1699,14 @@ static void print_quoted_xml(FILE *xml_file, const char *str, ulong len)
|
|||
case '\"':
|
||||
fputs(""", xml_file);
|
||||
break;
|
||||
case ' ':
|
||||
/* Attribute names cannot contain spaces. */
|
||||
if (is_attribute_name)
|
||||
{
|
||||
fputs("_", xml_file);
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
default:
|
||||
fputc(*str, xml_file);
|
||||
break;
|
||||
|
@ -1752,7 +1767,7 @@ static void print_xml_tag(FILE * xml_file, const char* sbeg,
|
|||
fputs(attribute_name, xml_file);
|
||||
fputc('\"', xml_file);
|
||||
|
||||
print_quoted_xml(xml_file, attribute_value, strlen(attribute_value));
|
||||
print_quoted_xml(xml_file, attribute_value, strlen(attribute_value), 0);
|
||||
fputc('\"', xml_file);
|
||||
|
||||
attribute_name= va_arg(arg_list, char *);
|
||||
|
@ -1792,13 +1807,52 @@ static void print_xml_null_tag(FILE * xml_file, const char* sbeg,
|
|||
fputs("<", xml_file);
|
||||
fputs(stag_atr, xml_file);
|
||||
fputs("\"", xml_file);
|
||||
print_quoted_xml(xml_file, sval, strlen(sval));
|
||||
print_quoted_xml(xml_file, sval, strlen(sval), 0);
|
||||
fputs("\" xsi:nil=\"true\" />", xml_file);
|
||||
fputs(line_end, xml_file);
|
||||
check_io(xml_file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Print xml CDATA section.
|
||||
|
||||
@param xml_file - output file
|
||||
@param str - string to print
|
||||
@param len - length of the string
|
||||
|
||||
@note
|
||||
This function also takes care of the presence of '[[>'
|
||||
string in the str. If found, the CDATA section is broken
|
||||
into two CDATA sections, <![CDATA[]]]]> and <![CDATA[>]].
|
||||
*/
|
||||
|
||||
static void print_xml_cdata(FILE *xml_file, const char *str, ulong len)
|
||||
{
|
||||
const char *end;
|
||||
|
||||
fputs("<![CDATA[\n", xml_file);
|
||||
for (end= str + len; str != end; str++)
|
||||
{
|
||||
switch(*str) {
|
||||
case ']':
|
||||
if ((*(str + 1) == ']') && (*(str + 2) =='>'))
|
||||
{
|
||||
fputs("]]]]><![CDATA[>", xml_file);
|
||||
str += 2;
|
||||
continue;
|
||||
}
|
||||
/* fall through */
|
||||
default:
|
||||
fputc(*str, xml_file);
|
||||
break;
|
||||
}
|
||||
}
|
||||
fputs("\n]]>\n", xml_file);
|
||||
check_io(xml_file);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Print xml tag with many attributes.
|
||||
|
||||
|
@ -1808,6 +1862,7 @@ static void print_xml_null_tag(FILE * xml_file, const char* sbeg,
|
|||
row_name - xml tag name
|
||||
tableRes - query result
|
||||
row - result row
|
||||
str_create - create statement header string
|
||||
|
||||
DESCRIPTION
|
||||
Print tag with many attribute to the xml_file. Format is:
|
||||
|
@ -1817,9 +1872,13 @@ static void print_xml_null_tag(FILE * xml_file, const char* sbeg,
|
|||
*/
|
||||
|
||||
static void print_xml_row(FILE *xml_file, const char *row_name,
|
||||
MYSQL_RES *tableRes, MYSQL_ROW *row)
|
||||
MYSQL_RES *tableRes, MYSQL_ROW *row,
|
||||
const char *str_create)
|
||||
{
|
||||
uint i;
|
||||
my_bool body_found= 0;
|
||||
char *create_stmt_ptr;
|
||||
ulong create_stmt_len= 0;
|
||||
MYSQL_FIELD *field;
|
||||
ulong *lengths= mysql_fetch_lengths(tableRes);
|
||||
|
||||
|
@ -1830,19 +1889,109 @@ static void print_xml_row(FILE *xml_file, const char *row_name,
|
|||
{
|
||||
if ((*row)[i])
|
||||
{
|
||||
fputc(' ', xml_file);
|
||||
print_quoted_xml(xml_file, field->name, field->name_length);
|
||||
fputs("=\"", xml_file);
|
||||
print_quoted_xml(xml_file, (*row)[i], lengths[i]);
|
||||
fputc('"', xml_file);
|
||||
check_io(xml_file);
|
||||
/* For 'create' statements, dump using CDATA. */
|
||||
if ((str_create) && (strcmp(str_create, field->name) == 0))
|
||||
{
|
||||
create_stmt_ptr= (*row)[i];
|
||||
create_stmt_len= lengths[i];
|
||||
body_found= 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
fputc(' ', xml_file);
|
||||
print_quoted_xml(xml_file, field->name, field->name_length, 1);
|
||||
fputs("=\"", xml_file);
|
||||
print_quoted_xml(xml_file, (*row)[i], lengths[i], 0);
|
||||
fputc('"', xml_file);
|
||||
check_io(xml_file);
|
||||
}
|
||||
}
|
||||
}
|
||||
fputs(" />\n", xml_file);
|
||||
|
||||
if (create_stmt_len)
|
||||
{
|
||||
DBUG_ASSERT(body_found);
|
||||
fputs(">\n", xml_file);
|
||||
print_xml_cdata(xml_file, create_stmt_ptr, create_stmt_len);
|
||||
fprintf(xml_file, "\t\t</%s>\n", row_name);
|
||||
}
|
||||
else
|
||||
fputs(" />\n", xml_file);
|
||||
|
||||
check_io(xml_file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Print xml comments.
|
||||
|
||||
@param xml_file - output file
|
||||
@param len - length of comment message
|
||||
@param comment_string - comment message
|
||||
|
||||
@description
|
||||
Print the comment message in the format:
|
||||
"<!-- \n comment string \n -->\n"
|
||||
|
||||
@note
|
||||
Any occurrence of continuous hyphens will be
|
||||
squeezed to a single hyphen.
|
||||
*/
|
||||
|
||||
static void print_xml_comment(FILE *xml_file, ulong len,
|
||||
const char *comment_string)
|
||||
{
|
||||
const char* end;
|
||||
|
||||
fputs("<!-- ", xml_file);
|
||||
|
||||
for (end= comment_string + len; comment_string != end; comment_string++)
|
||||
{
|
||||
/*
|
||||
The string "--" (double-hyphen) MUST NOT occur within xml comments.
|
||||
*/
|
||||
switch (*comment_string) {
|
||||
case '-':
|
||||
if (*(comment_string + 1) == '-') /* Only one hyphen allowed. */
|
||||
break;
|
||||
default:
|
||||
fputc(*comment_string, xml_file);
|
||||
break;
|
||||
}
|
||||
}
|
||||
fputs(" -->\n", xml_file);
|
||||
check_io(xml_file);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* A common printing function for xml and non-xml modes. */
|
||||
|
||||
static void print_comment(FILE *sql_file, my_bool is_error, const char *format,
|
||||
...)
|
||||
{
|
||||
static char comment_buff[COMMENT_LENGTH];
|
||||
va_list args;
|
||||
|
||||
/* If its an error message, print it ignoring opt_comments. */
|
||||
if (!is_error && !opt_comments)
|
||||
return;
|
||||
|
||||
va_start(args, format);
|
||||
my_vsnprintf(comment_buff, COMMENT_LENGTH, format, args);
|
||||
va_end(args);
|
||||
|
||||
if (!opt_xml)
|
||||
{
|
||||
fputs(comment_buff, sql_file);
|
||||
check_io(sql_file);
|
||||
return;
|
||||
}
|
||||
|
||||
print_xml_comment(sql_file, strlen(comment_buff), comment_buff);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
create_delimiter
|
||||
Generate a new (null-terminated) string that does not exist in query
|
||||
|
@ -1909,8 +2058,8 @@ static uint dump_events_for_db(char *db)
|
|||
mysql_real_escape_string(mysql, db_name_buff, db, strlen(db));
|
||||
|
||||
/* nice comments */
|
||||
if (opt_comments)
|
||||
fprintf(sql_file, "\n--\n-- Dumping events for database '%s'\n--\n", db);
|
||||
print_comment(sql_file, 0,
|
||||
"\n--\n-- Dumping events for database '%s'\n--\n", db);
|
||||
|
||||
/*
|
||||
not using "mysql_query_with_error_report" because we may have not
|
||||
|
@ -1925,12 +2074,17 @@ static uint dump_events_for_db(char *db)
|
|||
strcpy(delimiter, ";");
|
||||
if (mysql_num_rows(event_list_res) > 0)
|
||||
{
|
||||
fprintf(sql_file, "/*!50106 SET @save_time_zone= @@TIME_ZONE */ ;\n");
|
||||
if (opt_xml)
|
||||
fputs("\t<events>\n", sql_file);
|
||||
else
|
||||
{
|
||||
fprintf(sql_file, "/*!50106 SET @save_time_zone= @@TIME_ZONE */ ;\n");
|
||||
|
||||
/* Get database collation. */
|
||||
/* Get database collation. */
|
||||
|
||||
if (fetch_db_collation(db_name_buff, db_cl_name, sizeof (db_cl_name)))
|
||||
DBUG_RETURN(1);
|
||||
if (fetch_db_collation(db_name_buff, db_cl_name, sizeof (db_cl_name)))
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
if (switch_character_set_results(mysql, "binary"))
|
||||
DBUG_RETURN(1);
|
||||
|
@ -1947,6 +2101,13 @@ static uint dump_events_for_db(char *db)
|
|||
|
||||
while ((row= mysql_fetch_row(event_res)) != NULL)
|
||||
{
|
||||
if (opt_xml)
|
||||
{
|
||||
print_xml_row(sql_file, "event", event_res, &row,
|
||||
"Create Event");
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
if the user has EXECUTE privilege he can see event names, but not the
|
||||
event body!
|
||||
|
@ -2025,8 +2186,16 @@ static uint dump_events_for_db(char *db)
|
|||
mysql_free_result(event_res);
|
||||
|
||||
} /* end of list of events */
|
||||
fprintf(sql_file, "DELIMITER ;\n");
|
||||
fprintf(sql_file, "/*!50106 SET TIME_ZONE= @save_time_zone */ ;\n");
|
||||
if (opt_xml)
|
||||
{
|
||||
fputs("\t</events>\n", sql_file);
|
||||
check_io(sql_file);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(sql_file, "DELIMITER ;\n");
|
||||
fprintf(sql_file, "/*!50106 SET TIME_ZONE= @save_time_zone */ ;\n");
|
||||
}
|
||||
|
||||
if (switch_character_set_results(mysql, default_charset))
|
||||
DBUG_RETURN(1);
|
||||
|
@ -2080,6 +2249,7 @@ static uint dump_routines_for_db(char *db)
|
|||
const char *routine_type[]= {"FUNCTION", "PROCEDURE"};
|
||||
char db_name_buff[NAME_LEN*2+3], name_buff[NAME_LEN*2+3];
|
||||
char *routine_name;
|
||||
char *query_str;
|
||||
int i;
|
||||
FILE *sql_file= md_result_file;
|
||||
MYSQL_RES *routine_res, *routine_list_res;
|
||||
|
@ -2094,8 +2264,8 @@ static uint dump_routines_for_db(char *db)
|
|||
mysql_real_escape_string(mysql, db_name_buff, db, strlen(db));
|
||||
|
||||
/* nice comments */
|
||||
if (opt_comments)
|
||||
fprintf(sql_file, "\n--\n-- Dumping routines for database '%s'\n--\n", db);
|
||||
print_comment(sql_file, 0,
|
||||
"\n--\n-- Dumping routines for database '%s'\n--\n", db);
|
||||
|
||||
/*
|
||||
not using "mysql_query_with_error_report" because we may have not
|
||||
|
@ -2112,6 +2282,9 @@ static uint dump_routines_for_db(char *db)
|
|||
if (switch_character_set_results(mysql, "binary"))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
if (opt_xml)
|
||||
fputs("\t<routines>\n", sql_file);
|
||||
|
||||
/* 0, retrieve and dump functions, 1, procedures */
|
||||
for (i= 0; i <= 1; i++)
|
||||
{
|
||||
|
@ -2147,13 +2320,25 @@ static uint dump_routines_for_db(char *db)
|
|||
row[2] ? (int) strlen(row[2]) : 0));
|
||||
if (row[2] == NULL)
|
||||
{
|
||||
fprintf(sql_file, "\n-- insufficient privileges to %s\n", query_buff);
|
||||
fprintf(sql_file, "-- does %s have permissions on mysql.proc?\n\n", current_user);
|
||||
print_comment(sql_file, 1, "\n-- insufficient privileges to %s\n",
|
||||
query_buff);
|
||||
print_comment(sql_file, 1,
|
||||
"-- does %s have permissions on mysql.proc?\n\n",
|
||||
current_user);
|
||||
maybe_die(EX_MYSQLERR,"%s has insufficent privileges to %s!", current_user, query_buff);
|
||||
}
|
||||
else if (strlen(row[2]))
|
||||
{
|
||||
char *query_str;
|
||||
if (opt_xml)
|
||||
{
|
||||
if (i) // Procedures.
|
||||
print_xml_row(sql_file, "routine", routine_res, &row,
|
||||
"Create Procedure");
|
||||
else // Functions.
|
||||
print_xml_row(sql_file, "routine", routine_res, &row,
|
||||
"Create Function");
|
||||
continue;
|
||||
}
|
||||
if (opt_drop)
|
||||
fprintf(sql_file, "/*!50003 DROP %s IF EXISTS %s */;\n",
|
||||
routine_type[i], routine_name);
|
||||
|
@ -2224,6 +2409,12 @@ static uint dump_routines_for_db(char *db)
|
|||
mysql_free_result(routine_list_res);
|
||||
} /* end of for i (0 .. 1) */
|
||||
|
||||
if (opt_xml)
|
||||
{
|
||||
fputs("\t</routines>\n", sql_file);
|
||||
check_io(sql_file);
|
||||
}
|
||||
|
||||
if (switch_character_set_results(mysql, default_charset))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
|
@ -2336,16 +2527,16 @@ static uint get_table_structure(char *table, char *db, char *table_type,
|
|||
|
||||
write_header(sql_file, db);
|
||||
}
|
||||
if (!opt_xml && opt_comments)
|
||||
{
|
||||
|
||||
if (strcmp (table_type, "VIEW") == 0) /* view */
|
||||
fprintf(sql_file, "\n--\n-- Temporary table structure for view %s\n--\n\n",
|
||||
result_table);
|
||||
print_comment(sql_file, 0,
|
||||
"\n--\n-- Temporary table structure for view %s\n--\n\n",
|
||||
result_table);
|
||||
else
|
||||
fprintf(sql_file, "\n--\n-- Table structure for table %s\n--\n\n",
|
||||
result_table);
|
||||
check_io(sql_file);
|
||||
}
|
||||
print_comment(sql_file, 0,
|
||||
"\n--\n-- Table structure for table %s\n--\n\n",
|
||||
result_table);
|
||||
|
||||
if (opt_drop)
|
||||
{
|
||||
/*
|
||||
|
@ -2546,9 +2737,10 @@ static uint get_table_structure(char *table, char *db, char *table_type,
|
|||
DBUG_RETURN(0);
|
||||
write_header(sql_file, db);
|
||||
}
|
||||
if (!opt_xml && opt_comments)
|
||||
fprintf(sql_file, "\n--\n-- Table structure for table %s\n--\n\n",
|
||||
result_table);
|
||||
|
||||
print_comment(sql_file, 0,
|
||||
"\n--\n-- Table structure for table %s\n--\n\n",
|
||||
result_table);
|
||||
if (opt_drop)
|
||||
fprintf(sql_file, "DROP TABLE IF EXISTS %s;\n", result_table);
|
||||
if (!opt_xml)
|
||||
|
@ -2599,7 +2791,7 @@ static uint get_table_structure(char *table, char *db, char *table_type,
|
|||
{
|
||||
if (opt_xml)
|
||||
{
|
||||
print_xml_row(sql_file, "field", result, &row);
|
||||
print_xml_row(sql_file, "field", result, &row, NullS);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -2671,7 +2863,7 @@ static uint get_table_structure(char *table, char *db, char *table_type,
|
|||
{
|
||||
if (opt_xml)
|
||||
{
|
||||
print_xml_row(sql_file, "key", result, &row);
|
||||
print_xml_row(sql_file, "key", result, &row, NullS);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -2730,7 +2922,7 @@ static uint get_table_structure(char *table, char *db, char *table_type,
|
|||
else
|
||||
{
|
||||
if (opt_xml)
|
||||
print_xml_row(sql_file, "options", result, &row);
|
||||
print_xml_row(sql_file, "options", result, &row, NullS);
|
||||
else
|
||||
{
|
||||
fputs("/*!",sql_file);
|
||||
|
@ -2774,9 +2966,19 @@ static void dump_trigger_old(FILE *sql_file, MYSQL_RES *show_triggers_rs,
|
|||
char *quoted_table_name= quote_name(table_name, quoted_table_name_buf, 1);
|
||||
|
||||
char name_buff[NAME_LEN * 4 + 3];
|
||||
const char *xml_msg= "\nWarning! mysqldump being run against old server "
|
||||
"that does not\nsupport 'SHOW CREATE TRIGGERS' "
|
||||
"statement. Skipping..\n";
|
||||
|
||||
DBUG_ENTER("dump_trigger_old");
|
||||
|
||||
if (opt_xml)
|
||||
{
|
||||
print_xml_comment(sql_file, strlen(xml_msg), xml_msg);
|
||||
check_io(sql_file);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
fprintf(sql_file,
|
||||
"--\n"
|
||||
"-- WARNING: old server version. "
|
||||
|
@ -2840,13 +3042,22 @@ static int dump_trigger(FILE *sql_file, MYSQL_RES *show_create_trigger_rs,
|
|||
const char *db_cl_name)
|
||||
{
|
||||
MYSQL_ROW row;
|
||||
char *query_str;
|
||||
int db_cl_altered= FALSE;
|
||||
|
||||
DBUG_ENTER("dump_trigger");
|
||||
|
||||
while ((row= mysql_fetch_row(show_create_trigger_rs)))
|
||||
{
|
||||
char *query_str= cover_definer_clause_in_trigger(row[2], strlen(row[2]));
|
||||
if (opt_xml)
|
||||
{
|
||||
print_xml_row(sql_file, "trigger", show_create_trigger_rs, &row,
|
||||
"SQL Original Statement");
|
||||
check_io(sql_file);
|
||||
continue;
|
||||
}
|
||||
|
||||
query_str= cover_definer_clause_in_trigger(row[2], strlen(row[2]));
|
||||
|
||||
|
||||
if (switch_db_collation(sql_file, db_name, ";",
|
||||
|
@ -2936,6 +3147,13 @@ static int dump_triggers_for_table(char *table_name, char *db_name)
|
|||
|
||||
/* Dump triggers. */
|
||||
|
||||
if (! mysql_num_rows(show_triggers_rs))
|
||||
goto skip;
|
||||
|
||||
if (opt_xml)
|
||||
print_xml_tag(sql_file, "\t", "\n", "triggers", "name=",
|
||||
table_name, NullS);
|
||||
|
||||
while ((row= mysql_fetch_row(show_triggers_rs)))
|
||||
{
|
||||
|
||||
|
@ -2968,6 +3186,13 @@ static int dump_triggers_for_table(char *table_name, char *db_name)
|
|||
|
||||
}
|
||||
|
||||
if (opt_xml)
|
||||
{
|
||||
fputs("\t</triggers>\n", sql_file);
|
||||
check_io(sql_file);
|
||||
}
|
||||
|
||||
skip:
|
||||
mysql_free_result(show_triggers_rs);
|
||||
|
||||
if (switch_character_set_results(mysql, default_charset))
|
||||
|
@ -3216,34 +3441,24 @@ static void dump_table(char *table, char *db)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (!opt_xml && opt_comments)
|
||||
{
|
||||
fprintf(md_result_file,"\n--\n-- Dumping data for table %s\n--\n",
|
||||
result_table);
|
||||
check_io(md_result_file);
|
||||
}
|
||||
print_comment(md_result_file, 0,
|
||||
"\n--\n-- Dumping data for table %s\n--\n",
|
||||
result_table);
|
||||
|
||||
dynstr_append_checked(&query_string, "SELECT /*!40001 SQL_NO_CACHE */ * FROM ");
|
||||
dynstr_append_checked(&query_string, result_table);
|
||||
|
||||
if (where)
|
||||
{
|
||||
if (!opt_xml && opt_comments)
|
||||
{
|
||||
fprintf(md_result_file, "-- WHERE: %s\n", where);
|
||||
check_io(md_result_file);
|
||||
}
|
||||
|
||||
print_comment(md_result_file, 0, "-- WHERE: %s\n", where);
|
||||
|
||||
dynstr_append_checked(&query_string, " WHERE ");
|
||||
dynstr_append_checked(&query_string, where);
|
||||
}
|
||||
if (order_by)
|
||||
{
|
||||
if (!opt_xml && opt_comments)
|
||||
{
|
||||
fprintf(md_result_file, "-- ORDER BY: %s\n", order_by);
|
||||
check_io(md_result_file);
|
||||
}
|
||||
print_comment(md_result_file, 0, "-- ORDER BY: %s\n", order_by);
|
||||
|
||||
dynstr_append_checked(&query_string, " ORDER BY ");
|
||||
dynstr_append_checked(&query_string, order_by);
|
||||
}
|
||||
|
@ -3439,7 +3654,7 @@ static void dump_table(char *table, char *db)
|
|||
{
|
||||
print_xml_tag(md_result_file, "\t\t", "", "field", "name=",
|
||||
field->name, NullS);
|
||||
print_quoted_xml(md_result_file, row[i], length);
|
||||
print_quoted_xml(md_result_file, row[i], length, 0);
|
||||
}
|
||||
fputs("</field>\n", md_result_file);
|
||||
}
|
||||
|
@ -3743,11 +3958,9 @@ static int dump_tablespaces(char* ts_where)
|
|||
first= 1;
|
||||
if (first)
|
||||
{
|
||||
if (!opt_xml && opt_comments)
|
||||
{
|
||||
fprintf(md_result_file,"\n--\n-- Logfile group: %s\n--\n", row[0]);
|
||||
check_io(md_result_file);
|
||||
}
|
||||
print_comment(md_result_file, 0, "\n--\n-- Logfile group: %s\n--\n",
|
||||
row[0]);
|
||||
|
||||
fprintf(md_result_file, "\nCREATE");
|
||||
}
|
||||
else
|
||||
|
@ -3815,11 +4028,7 @@ static int dump_tablespaces(char* ts_where)
|
|||
first= 1;
|
||||
if (first)
|
||||
{
|
||||
if (!opt_xml && opt_comments)
|
||||
{
|
||||
fprintf(md_result_file,"\n--\n-- Tablespace: %s\n--\n", row[0]);
|
||||
check_io(md_result_file);
|
||||
}
|
||||
print_comment(md_result_file, 0, "\n--\n-- Tablespace: %s\n--\n", row[0]);
|
||||
fprintf(md_result_file, "\nCREATE");
|
||||
}
|
||||
else
|
||||
|
@ -4009,11 +4218,9 @@ static int init_dumping(char *database, int init_func(char*))
|
|||
*/
|
||||
char quoted_database_buf[NAME_LEN*2+3];
|
||||
char *qdatabase= quote_name(database,quoted_database_buf,opt_quoted);
|
||||
if (opt_comments)
|
||||
{
|
||||
fprintf(md_result_file,"\n--\n-- Current Database: %s\n--\n", qdatabase);
|
||||
check_io(md_result_file);
|
||||
}
|
||||
|
||||
print_comment(md_result_file, 0,
|
||||
"\n--\n-- Current Database: %s\n--\n", qdatabase);
|
||||
|
||||
/* Call the view or table specific function */
|
||||
init_func(qdatabase);
|
||||
|
@ -4087,8 +4294,7 @@ static int dump_all_tables_in_db(char *database)
|
|||
dump_table(table,database);
|
||||
my_free(order_by, MYF(MY_ALLOW_ZERO_PTR));
|
||||
order_by= 0;
|
||||
if (opt_dump_triggers && ! opt_xml &&
|
||||
mysql_get_server_version(mysql) >= 50009)
|
||||
if (opt_dump_triggers && mysql_get_server_version(mysql) >= 50009)
|
||||
{
|
||||
if (dump_triggers_for_table(table, database))
|
||||
{
|
||||
|
@ -4099,14 +4305,12 @@ static int dump_all_tables_in_db(char *database)
|
|||
}
|
||||
}
|
||||
}
|
||||
if (opt_events && !opt_xml &&
|
||||
mysql_get_server_version(mysql) >= 50106)
|
||||
if (opt_events && mysql_get_server_version(mysql) >= 50106)
|
||||
{
|
||||
DBUG_PRINT("info", ("Dumping events for database %s", database));
|
||||
dump_events_for_db(database);
|
||||
}
|
||||
if (opt_routines && !opt_xml &&
|
||||
mysql_get_server_version(mysql) >= 50009)
|
||||
if (opt_routines && mysql_get_server_version(mysql) >= 50009)
|
||||
{
|
||||
DBUG_PRINT("info", ("Dumping routines for database %s", database));
|
||||
dump_routines_for_db(database);
|
||||
|
@ -4341,15 +4545,13 @@ static int dump_selected_tables(char *db, char **table_names, int tables)
|
|||
for (pos= dump_tables; pos < end; pos++)
|
||||
get_view_structure(*pos, db);
|
||||
}
|
||||
if (opt_events && !opt_xml &&
|
||||
mysql_get_server_version(mysql) >= 50106)
|
||||
if (opt_events && mysql_get_server_version(mysql) >= 50106)
|
||||
{
|
||||
DBUG_PRINT("info", ("Dumping events for database %s", db));
|
||||
dump_events_for_db(db);
|
||||
}
|
||||
/* obtain dump of routines (procs/functions) */
|
||||
if (opt_routines && !opt_xml &&
|
||||
mysql_get_server_version(mysql) >= 50009)
|
||||
if (opt_routines && mysql_get_server_version(mysql) >= 50009)
|
||||
{
|
||||
DBUG_PRINT("info", ("Dumping routines for database %s", db));
|
||||
dump_routines_for_db(db);
|
||||
|
@ -4384,10 +4586,9 @@ static int do_show_master_status(MYSQL *mysql_con)
|
|||
if (row && row[0] && row[1])
|
||||
{
|
||||
/* SHOW MASTER STATUS reports file and position */
|
||||
if (opt_comments)
|
||||
fprintf(md_result_file,
|
||||
"\n--\n-- Position to start replication or point-in-time "
|
||||
"recovery from\n--\n\n");
|
||||
print_comment(md_result_file, 0,
|
||||
"\n--\n-- Position to start replication or point-in-time "
|
||||
"recovery from\n--\n\n");
|
||||
fprintf(md_result_file,
|
||||
"%sCHANGE MASTER TO MASTER_LOG_FILE='%s', MASTER_LOG_POS=%s;\n",
|
||||
comment_prefix, row[0], row[1]);
|
||||
|
@ -4850,12 +5051,10 @@ static my_bool get_view_structure(char *table, char* db)
|
|||
write_header(sql_file, db);
|
||||
}
|
||||
|
||||
if (!opt_xml && opt_comments)
|
||||
{
|
||||
fprintf(sql_file, "\n--\n-- Final view structure for view %s\n--\n\n",
|
||||
result_table);
|
||||
check_io(sql_file);
|
||||
}
|
||||
print_comment(sql_file, 0,
|
||||
"\n--\n-- Final view structure for view %s\n--\n\n",
|
||||
result_table);
|
||||
|
||||
/* Table might not exist if this view was dumped with --tab. */
|
||||
fprintf(sql_file, "/*!50001 DROP TABLE IF EXISTS %s*/;\n", opt_quoted_table);
|
||||
if (opt_drop)
|
||||
|
@ -5052,6 +5251,12 @@ int main(int argc, char **argv)
|
|||
exit(exit_code);
|
||||
}
|
||||
|
||||
/*
|
||||
Disable comments in xml mode if 'comments' option is not explicitly used.
|
||||
*/
|
||||
if (opt_xml && !opt_comments_used)
|
||||
opt_comments= 0;
|
||||
|
||||
if (log_error_file)
|
||||
{
|
||||
if(!(stderror_file= freopen(log_error_file, "a+", stderr)))
|
||||
|
|
|
@ -45,11 +45,11 @@
|
|||
* seems to actually advertise this properly, despite Unicode 3.1 having
|
||||
* been around since 2001... */
|
||||
|
||||
/* XXXMYSQL : Added FreeBSD to bypass this check.
|
||||
TODO : Verify if FreeBSD stores ISO 10646 in wchar_t. */
|
||||
/* XXXMYSQL : Added FreeBSD & AIX to bypass this check.
|
||||
TODO : Verify if FreeBSD & AIX stores ISO 10646 in wchar_t. */
|
||||
#if !defined(__NetBSD__) && !defined(__sun) \
|
||||
&& !(defined(__APPLE__) && defined(__MACH__)) \
|
||||
&& !defined(__FreeBSD__)
|
||||
&& !defined(__FreeBSD__) && !defined(_AIX)
|
||||
#ifndef __STDC_ISO_10646__
|
||||
/* In many places it is assumed that the first 127 code points are ASCII
|
||||
* compatible, so ensure wchar_t indeed does ISO 10646 and not some other
|
||||
|
|
|
@ -200,7 +200,7 @@ el_set(EditLine *el, int op, ...)
|
|||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
// XXX: The two strdup's leak
|
||||
/* XXX: The two strdups leak. */
|
||||
ret = map_addfunc(el, Strdup(wargv[0]), Strdup(wargv[1]),
|
||||
func);
|
||||
ct_free_argv(wargv);
|
||||
|
|
|
@ -1978,7 +1978,7 @@ rl_callback_read_char()
|
|||
} else
|
||||
wbuf = NULL;
|
||||
(*(void (*)(const char *))rl_linefunc)(wbuf);
|
||||
//el_set(e, EL_UNBUFFERED, 1);
|
||||
/*el_set(e, EL_UNBUFFERED, 1);*/
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@ hex(a)
|
|||
616263
|
||||
set GLOBAL init_connect="adsfsdfsdfs";
|
||||
select @a;
|
||||
ERROR 08S01: Aborted connection to db: 'test' user: 'user_1' host: 'localhost' (init_connect command failed)
|
||||
select @a;
|
||||
Got one of the listed errors
|
||||
drop table t1;
|
||||
End of 4.1 tests
|
||||
|
|
|
@ -4628,5 +4628,444 @@ ALTER DATABASE `test-database` CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
|
|||
DROP DATABASE `test-database`;
|
||||
USE `test`;
|
||||
#
|
||||
# BUG#11760384 : 52792: mysqldump in XML mode does not dump routines.
|
||||
#
|
||||
CREATE DATABASE BUG52792;
|
||||
USE BUG52792;
|
||||
CREATE TABLE t1 (c1 INT, c2 VARCHAR(20));
|
||||
CREATE TABLE t2 (c1 INT);
|
||||
INSERT INTO t1 VALUES (1, 'aaa'), (2, 'bbb'), (3, 'ccc');
|
||||
INSERT INTO t2 VALUES (1),(2),(3);
|
||||
# Stored Procedures.
|
||||
CREATE PROCEDURE simpleproc1 (OUT param1 INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO param1 FROM t1;
|
||||
END//
|
||||
CREATE PROCEDURE simpleproc2 (OUT param1 INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO param1 FROM t2;
|
||||
END//
|
||||
# Events.
|
||||
CREATE EVENT e1 ON SCHEDULE EVERY 1 SECOND DO DROP DATABASE BUG52792;
|
||||
CREATE EVENT e2 ON SCHEDULE EVERY 1 SECOND DO DROP DATABASE BUG52792;
|
||||
# Functions.
|
||||
CREATE FUNCTION `hello1` (s CHAR(20))
|
||||
RETURNS CHAR(50) DETERMINISTIC
|
||||
RETURN CONCAT('Hello, ' ,s ,'!');
|
||||
CREATE FUNCTION `hello2` (s CHAR(20))
|
||||
RETURNS CHAR(50) DETERMINISTIC
|
||||
RETURN CONCAT(']]>, ' , s ,'!');
|
||||
# Triggers.
|
||||
CREATE TRIGGER trig1 BEFORE INSERT ON t2
|
||||
FOR EACH ROW BEGIN
|
||||
INSERT INTO t2 VALUES(1);
|
||||
END;
|
||||
|
|
||||
CREATE TRIGGER trig2 AFTER INSERT ON t2
|
||||
FOR EACH ROW BEGIN
|
||||
INSERT INTO t2 VALUES(1, ']]>');
|
||||
INSERT INTO t2 VALUES(2, '<![CDATA]]>');
|
||||
INSERT INTO t2 VALUES(3, '<![CDATA[');
|
||||
INSERT INTO t2 VALUES(4, '< > & \ " _');
|
||||
END;
|
||||
|
|
||||
# Views
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
CREATE VIEW v2 AS SELECT * FROM t2;
|
||||
|
||||
# Dumping BUG52792 database in xml format.
|
||||
|
||||
# Running 'replace_regex on timestamp'
|
||||
<?xml version="1.0"?>
|
||||
<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<database name="BUG52792">
|
||||
<table_structure name="t1">
|
||||
<field Field="c1" Type="int(11)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<field Field="c2" Type="varchar(20)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<options Name="t1" Engine="MyISAM" Version="10" Row_format="Dynamic" Rows="3" Avg_row_length="20" Data_length="60" Max_data_length="281474976710655" Index_length="1024" Data_free="0" Create_time="--TIME--" Update_time="--TIME--" Collation="latin1_swedish_ci" Create_options="" Comment="" />
|
||||
</table_structure>
|
||||
<table_data name="t1">
|
||||
<row>
|
||||
<field name="c1">1</field>
|
||||
<field name="c2">aaa</field>
|
||||
</row>
|
||||
<row>
|
||||
<field name="c1">2</field>
|
||||
<field name="c2">bbb</field>
|
||||
</row>
|
||||
<row>
|
||||
<field name="c1">3</field>
|
||||
<field name="c2">ccc</field>
|
||||
</row>
|
||||
</table_data>
|
||||
<table_structure name="t2">
|
||||
<field Field="c1" Type="int(11)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<options Name="t2" Engine="MyISAM" Version="10" Row_format="Fixed" Rows="3" Avg_row_length="7" Data_length="21" Max_data_length="1970324836974591" Index_length="1024" Data_free="0" Create_time="--TIME--" Update_time="--TIME--" Collation="latin1_swedish_ci" Create_options="" Comment="" />
|
||||
</table_structure>
|
||||
<table_data name="t2">
|
||||
<row>
|
||||
<field name="c1">1</field>
|
||||
</row>
|
||||
<row>
|
||||
<field name="c1">2</field>
|
||||
</row>
|
||||
<row>
|
||||
<field name="c1">3</field>
|
||||
</row>
|
||||
</table_data>
|
||||
<triggers name="t2">
|
||||
<trigger Trigger="trig1" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` TRIGGER trig1 BEFORE INSERT ON t2
|
||||
FOR EACH ROW BEGIN
|
||||
INSERT INTO t2 VALUES(1);
|
||||
END
|
||||
]]>
|
||||
</trigger>
|
||||
<trigger Trigger="trig2" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` TRIGGER trig2 AFTER INSERT ON t2
|
||||
FOR EACH ROW BEGIN
|
||||
INSERT INTO t2 VALUES(1, ']]]]><![CDATA[>');
|
||||
INSERT INTO t2 VALUES(2, '<![CDATA]]]]><![CDATA[>');
|
||||
INSERT INTO t2 VALUES(3, '<![CDATA[');
|
||||
INSERT INTO t2 VALUES(4, '< > & \ " _');
|
||||
END
|
||||
]]>
|
||||
</trigger>
|
||||
</triggers>
|
||||
<table_structure name="v1">
|
||||
<field Field="c1" Type="int(11)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<field Field="c2" Type="varchar(20)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<options Name="v1" Comment="VIEW" />
|
||||
</table_structure>
|
||||
<table_structure name="v2">
|
||||
<field Field="c1" Type="int(11)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<options Name="v2" Comment="VIEW" />
|
||||
</table_structure>
|
||||
<events>
|
||||
<event Event="e1" sql_mode="" time_zone="SYSTEM" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE EVENT `e1` ON SCHEDULE EVERY 1 SECOND STARTS '--TIME--' ON COMPLETION NOT PRESERVE ENABLE DO DROP DATABASE BUG52792
|
||||
]]>
|
||||
</event>
|
||||
<event Event="e2" sql_mode="" time_zone="SYSTEM" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE EVENT `e2` ON SCHEDULE EVERY 1 SECOND STARTS '--TIME--' ON COMPLETION NOT PRESERVE ENABLE DO DROP DATABASE BUG52792
|
||||
]]>
|
||||
</event>
|
||||
</events>
|
||||
<routines>
|
||||
<routine Function="hello1" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` FUNCTION `hello1`(s CHAR(20)) RETURNS char(50) CHARSET latin1
|
||||
DETERMINISTIC
|
||||
RETURN CONCAT('Hello, ' ,s ,'!')
|
||||
]]>
|
||||
</routine>
|
||||
<routine Function="hello2" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` FUNCTION `hello2`(s CHAR(20)) RETURNS char(50) CHARSET latin1
|
||||
DETERMINISTIC
|
||||
RETURN CONCAT(']]]]><![CDATA[>, ' , s ,'!')
|
||||
]]>
|
||||
</routine>
|
||||
<routine Procedure="simpleproc1" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` PROCEDURE `simpleproc1`(OUT param1 INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO param1 FROM t1;
|
||||
END
|
||||
]]>
|
||||
</routine>
|
||||
<routine Procedure="simpleproc2" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` PROCEDURE `simpleproc2`(OUT param1 INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO param1 FROM t2;
|
||||
END
|
||||
]]>
|
||||
</routine>
|
||||
</routines>
|
||||
</database>
|
||||
</mysqldump>
|
||||
|
||||
# Dumping BUG52792 database in xml format with comments.
|
||||
|
||||
# Running 'replace_regex on timestamp'
|
||||
<?xml version="1.0"?>
|
||||
<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<database name="BUG52792">
|
||||
<!--
|
||||
-
|
||||
- Table structure for table `t1`
|
||||
-
|
||||
|
||||
-->
|
||||
<table_structure name="t1">
|
||||
<field Field="c1" Type="int(11)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<field Field="c2" Type="varchar(20)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<options Name="t1" Engine="MyISAM" Version="10" Row_format="Dynamic" Rows="3" Avg_row_length="20" Data_length="60" Max_data_length="281474976710655" Index_length="1024" Data_free="0" Create_time="--TIME--" Update_time="--TIME--" Collation="latin1_swedish_ci" Create_options="" Comment="" />
|
||||
</table_structure>
|
||||
<!--
|
||||
-
|
||||
- Dumping data for table `t1`
|
||||
-
|
||||
-->
|
||||
<table_data name="t1">
|
||||
<row>
|
||||
<field name="c1">1</field>
|
||||
<field name="c2">aaa</field>
|
||||
</row>
|
||||
<row>
|
||||
<field name="c1">2</field>
|
||||
<field name="c2">bbb</field>
|
||||
</row>
|
||||
<row>
|
||||
<field name="c1">3</field>
|
||||
<field name="c2">ccc</field>
|
||||
</row>
|
||||
</table_data>
|
||||
<!--
|
||||
-
|
||||
- Table structure for table `t2`
|
||||
-
|
||||
|
||||
-->
|
||||
<table_structure name="t2">
|
||||
<field Field="c1" Type="int(11)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<options Name="t2" Engine="MyISAM" Version="10" Row_format="Fixed" Rows="3" Avg_row_length="7" Data_length="21" Max_data_length="1970324836974591" Index_length="1024" Data_free="0" Create_time="--TIME--" Update_time="--TIME--" Collation="latin1_swedish_ci" Create_options="" Comment="" />
|
||||
</table_structure>
|
||||
<!--
|
||||
-
|
||||
- Dumping data for table `t2`
|
||||
-
|
||||
-->
|
||||
<table_data name="t2">
|
||||
<row>
|
||||
<field name="c1">1</field>
|
||||
</row>
|
||||
<row>
|
||||
<field name="c1">2</field>
|
||||
</row>
|
||||
<row>
|
||||
<field name="c1">3</field>
|
||||
</row>
|
||||
</table_data>
|
||||
<triggers name="t2">
|
||||
<trigger Trigger="trig1" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` TRIGGER trig1 BEFORE INSERT ON t2
|
||||
FOR EACH ROW BEGIN
|
||||
INSERT INTO t2 VALUES(1);
|
||||
END
|
||||
]]>
|
||||
</trigger>
|
||||
<trigger Trigger="trig2" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` TRIGGER trig2 AFTER INSERT ON t2
|
||||
FOR EACH ROW BEGIN
|
||||
INSERT INTO t2 VALUES(1, ']]]]><![CDATA[>');
|
||||
INSERT INTO t2 VALUES(2, '<![CDATA]]]]><![CDATA[>');
|
||||
INSERT INTO t2 VALUES(3, '<![CDATA[');
|
||||
INSERT INTO t2 VALUES(4, '< > & \ " _');
|
||||
END
|
||||
]]>
|
||||
</trigger>
|
||||
</triggers>
|
||||
<!--
|
||||
-
|
||||
- Table structure for table `v1`
|
||||
-
|
||||
|
||||
-->
|
||||
<table_structure name="v1">
|
||||
<field Field="c1" Type="int(11)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<field Field="c2" Type="varchar(20)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<options Name="v1" Comment="VIEW" />
|
||||
</table_structure>
|
||||
<!--
|
||||
-
|
||||
- Table structure for table `v2`
|
||||
-
|
||||
|
||||
-->
|
||||
<table_structure name="v2">
|
||||
<field Field="c1" Type="int(11)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<options Name="v2" Comment="VIEW" />
|
||||
</table_structure>
|
||||
<!--
|
||||
-
|
||||
- Dumping events for database 'BUG52792'
|
||||
-
|
||||
-->
|
||||
<events>
|
||||
<event Event="e1" sql_mode="" time_zone="SYSTEM" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE EVENT `e1` ON SCHEDULE EVERY 1 SECOND STARTS '--TIME--' ON COMPLETION NOT PRESERVE ENABLE DO DROP DATABASE BUG52792
|
||||
]]>
|
||||
</event>
|
||||
<event Event="e2" sql_mode="" time_zone="SYSTEM" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE EVENT `e2` ON SCHEDULE EVERY 1 SECOND STARTS '--TIME--' ON COMPLETION NOT PRESERVE ENABLE DO DROP DATABASE BUG52792
|
||||
]]>
|
||||
</event>
|
||||
</events>
|
||||
<!--
|
||||
-
|
||||
- Dumping routines for database 'BUG52792'
|
||||
-
|
||||
-->
|
||||
<routines>
|
||||
<routine Function="hello1" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` FUNCTION `hello1`(s CHAR(20)) RETURNS char(50) CHARSET latin1
|
||||
DETERMINISTIC
|
||||
RETURN CONCAT('Hello, ' ,s ,'!')
|
||||
]]>
|
||||
</routine>
|
||||
<routine Function="hello2" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` FUNCTION `hello2`(s CHAR(20)) RETURNS char(50) CHARSET latin1
|
||||
DETERMINISTIC
|
||||
RETURN CONCAT(']]]]><![CDATA[>, ' , s ,'!')
|
||||
]]>
|
||||
</routine>
|
||||
<routine Procedure="simpleproc1" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` PROCEDURE `simpleproc1`(OUT param1 INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO param1 FROM t1;
|
||||
END
|
||||
]]>
|
||||
</routine>
|
||||
<routine Procedure="simpleproc2" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` PROCEDURE `simpleproc2`(OUT param1 INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO param1 FROM t2;
|
||||
END
|
||||
]]>
|
||||
</routine>
|
||||
</routines>
|
||||
</database>
|
||||
</mysqldump>
|
||||
|
||||
# Test to check 'Insufficient privileges' error.
|
||||
|
||||
GRANT ALL PRIVILEGES ON BUG52792.* TO user1;
|
||||
# Running 'replace_regex on timestamp'
|
||||
<?xml version="1.0"?>
|
||||
<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<database name="BUG52792">
|
||||
<table_structure name="t1">
|
||||
<field Field="c1" Type="int(11)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<field Field="c2" Type="varchar(20)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<options Name="t1" Engine="MyISAM" Version="10" Row_format="Dynamic" Rows="3" Avg_row_length="20" Data_length="60" Max_data_length="281474976710655" Index_length="1024" Data_free="0" Create_time="--TIME--" Update_time="--TIME--" Collation="latin1_swedish_ci" Create_options="" Comment="" />
|
||||
</table_structure>
|
||||
<table_data name="t1">
|
||||
<row>
|
||||
<field name="c1">1</field>
|
||||
<field name="c2">aaa</field>
|
||||
</row>
|
||||
<row>
|
||||
<field name="c1">2</field>
|
||||
<field name="c2">bbb</field>
|
||||
</row>
|
||||
<row>
|
||||
<field name="c1">3</field>
|
||||
<field name="c2">ccc</field>
|
||||
</row>
|
||||
</table_data>
|
||||
<table_structure name="t2">
|
||||
<field Field="c1" Type="int(11)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<options Name="t2" Engine="MyISAM" Version="10" Row_format="Fixed" Rows="3" Avg_row_length="7" Data_length="21" Max_data_length="1970324836974591" Index_length="1024" Data_free="0" Create_time="--TIME--" Update_time="--TIME--" Collation="latin1_swedish_ci" Create_options="" Comment="" />
|
||||
</table_structure>
|
||||
<table_data name="t2">
|
||||
<row>
|
||||
<field name="c1">1</field>
|
||||
</row>
|
||||
<row>
|
||||
<field name="c1">2</field>
|
||||
</row>
|
||||
<row>
|
||||
<field name="c1">3</field>
|
||||
</row>
|
||||
</table_data>
|
||||
<triggers name="t2">
|
||||
<trigger Trigger="trig1" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` TRIGGER trig1 BEFORE INSERT ON t2
|
||||
FOR EACH ROW BEGIN
|
||||
INSERT INTO t2 VALUES(1);
|
||||
END
|
||||
]]>
|
||||
</trigger>
|
||||
<trigger Trigger="trig2" sql_mode="" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` TRIGGER trig2 AFTER INSERT ON t2
|
||||
FOR EACH ROW BEGIN
|
||||
INSERT INTO t2 VALUES(1, ']]]]><![CDATA[>');
|
||||
INSERT INTO t2 VALUES(2, '<![CDATA]]]]><![CDATA[>');
|
||||
INSERT INTO t2 VALUES(3, '<![CDATA[');
|
||||
INSERT INTO t2 VALUES(4, '< > & \ " _');
|
||||
END
|
||||
]]>
|
||||
</trigger>
|
||||
</triggers>
|
||||
<table_structure name="v1">
|
||||
<field Field="c1" Type="int(11)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<field Field="c2" Type="varchar(20)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<options Name="v1" Comment="VIEW" />
|
||||
</table_structure>
|
||||
<table_structure name="v2">
|
||||
<field Field="c1" Type="int(11)" Null="YES" Key="" Extra="" Comment="" />
|
||||
<options Name="v2" Comment="VIEW" />
|
||||
</table_structure>
|
||||
<events>
|
||||
<event Event="e1" sql_mode="" time_zone="SYSTEM" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE EVENT `e1` ON SCHEDULE EVERY 1 SECOND STARTS '--TIME--' ON COMPLETION NOT PRESERVE ENABLE DO DROP DATABASE BUG52792
|
||||
]]>
|
||||
</event>
|
||||
<event Event="e2" sql_mode="" time_zone="SYSTEM" character_set_client="latin1" collation_connection="latin1_swedish_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE EVENT `e2` ON SCHEDULE EVERY 1 SECOND STARTS '--TIME--' ON COMPLETION NOT PRESERVE ENABLE DO DROP DATABASE BUG52792
|
||||
]]>
|
||||
</event>
|
||||
</events>
|
||||
<routines>
|
||||
<!--
|
||||
- insufficient privileges to SHOW CREATE FUNCTION `hello1`
|
||||
-->
|
||||
<!-- - does user1 have permissions on mysql.proc?
|
||||
|
||||
-->
|
||||
DROP USER user1;
|
||||
DROP DATABASE BUG52792;
|
||||
# UTF-8
|
||||
CREATE DATABASE BUG52792;
|
||||
USE BUG52792;
|
||||
SET NAMES utf8;
|
||||
CREATE FUNCTION `straße` ( c1 CHAR(20))
|
||||
RETURNS CHAR(50) DETERMINISTIC
|
||||
RETURN CONCAT(']]>, ', s, '!');
|
||||
<?xml version="1.0"?>
|
||||
<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<database name="BUG52792">
|
||||
<routines>
|
||||
<routine Function="straße" sql_mode="" character_set_client="utf8" collation_connection="utf8_general_ci" Database_Collation="latin1_swedish_ci">
|
||||
<![CDATA[
|
||||
CREATE DEFINER=`root`@`localhost` FUNCTION `straße`( c1 CHAR(20)) RETURNS char(50) CHARSET latin1
|
||||
DETERMINISTIC
|
||||
RETURN CONCAT(']]]]><![CDATA[>, ', s, '!')
|
||||
]]>
|
||||
</routine>
|
||||
</routines>
|
||||
</database>
|
||||
</mysqldump>
|
||||
DROP DATABASE BUG52792;
|
||||
USE test;
|
||||
#
|
||||
# End of 5.1 tests
|
||||
#
|
||||
|
|
|
@ -34,13 +34,13 @@ USE test;
|
|||
#
|
||||
SET @old_log_warnings = @@log_warnings;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (a VARCHAR(36), b VARCHAR(10));
|
||||
CREATE TABLE t1 (a VARCHAR(36), b VARCHAR(15));
|
||||
SET GLOBAL LOG_WARNINGS = 0;
|
||||
INSERT INTO t1 VALUES(UUID(), 'Bug#46265');
|
||||
INSERT INTO t1 VALUES(UUID(), 'timestamp');
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
SET GLOBAL LOG_WARNINGS = 1;
|
||||
INSERT INTO t1 VALUES(UUID(), 'Bug#46265');
|
||||
INSERT INTO t1 VALUES(UUID(), 'timestamp');
|
||||
Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -80,22 +80,33 @@ eval USE $old_db;
|
|||
--echo # Bug#46265: Can not disable warning about unsafe statements for binary logging
|
||||
--echo #
|
||||
|
||||
# Here introducing a sleep of one Second, just to make sure
|
||||
# that when this test executes with "--repeat" option,
|
||||
# the timestamp value is different and hence the Occcurrence count is one.
|
||||
--sleep 1
|
||||
|
||||
SET @old_log_warnings = @@log_warnings;
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
CREATE TABLE t1 (a VARCHAR(36), b VARCHAR(10));
|
||||
let BINLOG_COUNTER1= `select CONVERT(NOW(),UNSIGNED) as timestmap from dual`;
|
||||
|
||||
CREATE TABLE t1 (a VARCHAR(36), b VARCHAR(15));
|
||||
SET GLOBAL LOG_WARNINGS = 0;
|
||||
INSERT INTO t1 VALUES(UUID(), 'Bug#46265');
|
||||
# Replacing the result file content here.
|
||||
# Instead of writing $BINLOG_COUNTER1 value to result file, writing a fixed string timestamp to it.
|
||||
--replace_result $BINLOG_COUNTER1 timestamp
|
||||
eval INSERT INTO t1 VALUES(UUID(), '$BINLOG_COUNTER1');
|
||||
SET GLOBAL LOG_WARNINGS = 1;
|
||||
INSERT INTO t1 VALUES(UUID(), 'Bug#46265');
|
||||
--replace_result $BINLOG_COUNTER1 timestamp
|
||||
eval INSERT INTO t1 VALUES(UUID(), '$BINLOG_COUNTER1');
|
||||
DROP TABLE t1;
|
||||
|
||||
SET GLOBAL log_warnings = @old_log_warnings;
|
||||
|
||||
let $log_error_= `SELECT @@GLOBAL.log_error`;
|
||||
if(!`select LENGTH('$log_error_')`)
|
||||
if(!$log_error_)
|
||||
{
|
||||
# MySQL Server on windows is started with --console and thus
|
||||
# does not know the location of its .err log, use default location
|
||||
|
@ -111,7 +122,9 @@ perl;
|
|||
use strict;
|
||||
my $log_error= $ENV{'LOG_ERROR'} or die "LOG_ERROR not set";
|
||||
open(FILE, "$log_error") or die("Unable to open $log_error: $!\n");
|
||||
my $count = () = grep(/Bug#46265/g,<FILE>);
|
||||
my $binlog_counter= $ENV{'BINLOG_COUNTER1'} or die "BINLOG_COUNTER1 not set";
|
||||
my $count = () = grep(/$binlog_counter/g,<FILE>);
|
||||
# Grep the timestamp value from the error file.
|
||||
print "Occurrences: $count\n";
|
||||
close(FILE);
|
||||
EOF
|
||||
|
|
|
@ -54,7 +54,7 @@ PASSWORD '',
|
|||
PORT SLAVE_PORT,
|
||||
SOCKET '',
|
||||
OWNER 'root');
|
||||
select * from mysql.servers;
|
||||
select * from mysql.servers order by Server_name;
|
||||
Server_name Host Db Username Password Port Socket Wrapper Owner
|
||||
server_one 127.0.0.1 first_db root SLAVE_PORT mysql root
|
||||
server_two 127.0.0.1 second_db root SLAVE_PORT mysql root
|
||||
|
@ -154,7 +154,7 @@ id name
|
|||
drop table federated.t1;
|
||||
drop server 'server_one';
|
||||
drop server 'server_two';
|
||||
select * from mysql.servers;
|
||||
select * from mysql.servers order by Server_name;
|
||||
Server_name Host Db Username Password Port Socket Wrapper Owner
|
||||
drop table first_db.t1;
|
||||
drop table second_db.t1;
|
||||
|
|
|
@ -62,7 +62,9 @@ eval create server 'server_two' foreign data wrapper 'mysql' options
|
|||
OWNER 'root');
|
||||
|
||||
--replace_result $SLAVE_MYPORT SLAVE_PORT
|
||||
eval select * from mysql.servers;
|
||||
# Adding 'order by' clause here, in order to maintain consistent result out of the select query.
|
||||
#eval select * from mysql.servers;
|
||||
eval select * from mysql.servers order by Server_name;
|
||||
|
||||
DROP TABLE IF EXISTS federated.old;
|
||||
--replace_result $SLAVE_MYPORT SLAVE_PORT
|
||||
|
@ -147,7 +149,9 @@ drop table federated.t1;
|
|||
|
||||
drop server 'server_one';
|
||||
drop server 'server_two';
|
||||
select * from mysql.servers;
|
||||
# Adding 'order by' clause here, in order to maintain consistent result out of the select query.
|
||||
#select * from mysql.servers;
|
||||
eval select * from mysql.servers order by Server_name;
|
||||
|
||||
connection slave;
|
||||
drop table first_db.t1;
|
||||
|
|
25
mysql-test/suite/innodb/r/innodb_bug12400341.result
Normal file
25
mysql-test/suite/innodb/r/innodb_bug12400341.result
Normal file
|
@ -0,0 +1,25 @@
|
|||
call mtr.add_suppression("InnoDB: Warning: cannot find a free slot for an undo log. Do you have too");
|
||||
show variables like "max_connections";
|
||||
Variable_name Value
|
||||
max_connections 64
|
||||
show variables like "innodb_thread_concurrency";
|
||||
Variable_name Value
|
||||
innodb_thread_concurrency 0
|
||||
show variables like "innodb_file_per_table";
|
||||
Variable_name Value
|
||||
innodb_file_per_table ON
|
||||
drop database if exists mysqltest;
|
||||
create database mysqltest;
|
||||
CREATE TABLE mysqltest.transtable (id int unsigned NOT NULL PRIMARY KEY, val int DEFAULT 0) ENGINE=InnoDB;
|
||||
select count(*) from information_schema.processlist;
|
||||
count(*)
|
||||
33
|
||||
CREATE TABLE mysqltest.testtable (id int unsigned not null primary key) ENGINE=InnoDB;
|
||||
ERROR HY000: Can't create table 'mysqltest.testtable' (errno: 177)
|
||||
select count(*) from information_schema.processlist;
|
||||
count(*)
|
||||
33
|
||||
select count(*) from information_schema.processlist;
|
||||
count(*)
|
||||
33
|
||||
drop database mysqltest;
|
1
mysql-test/suite/innodb/t/innodb_bug12400341-master.opt
Normal file
1
mysql-test/suite/innodb/t/innodb_bug12400341-master.opt
Normal file
|
@ -0,0 +1 @@
|
|||
--max_connections=64 --innodb_thread_concurrency=0 --innodb_file_per_table
|
103
mysql-test/suite/innodb/t/innodb_bug12400341.test
Normal file
103
mysql-test/suite/innodb/t/innodb_bug12400341.test
Normal file
|
@ -0,0 +1,103 @@
|
|||
# Test for bug #12400341: INNODB CAN LEAVE ORPHAN IBD FILES AROUND
|
||||
|
||||
-- source include/have_innodb.inc
|
||||
|
||||
if (`select count(*)=0 from information_schema.global_variables where variable_name = 'INNODB_TRX_RSEG_N_SLOTS_DEBUG'`)
|
||||
{
|
||||
--skip Test requires InnoDB built with UNIV_DEBUG definition.
|
||||
}
|
||||
|
||||
call mtr.add_suppression("InnoDB: Warning: cannot find a free slot for an undo log. Do you have too");
|
||||
|
||||
--disable_query_log
|
||||
set @old_innodb_trx_rseg_n_slots_debug = @@innodb_trx_rseg_n_slots_debug;
|
||||
set global innodb_trx_rseg_n_slots_debug = 32;
|
||||
--enable_query_log
|
||||
|
||||
show variables like "max_connections";
|
||||
show variables like "innodb_thread_concurrency";
|
||||
show variables like "innodb_file_per_table";
|
||||
|
||||
--disable_warnings
|
||||
drop database if exists mysqltest;
|
||||
--enable_warnings
|
||||
|
||||
create database mysqltest;
|
||||
CREATE TABLE mysqltest.transtable (id int unsigned NOT NULL PRIMARY KEY, val int DEFAULT 0) ENGINE=InnoDB;
|
||||
|
||||
--disable_query_log
|
||||
#
|
||||
# Insert in 1 transaction which needs over 1 page undo record to avoid the insert_undo cached,
|
||||
# because the cached insert_undo can be reused at "CREATE TABLE" statement later.
|
||||
#
|
||||
START TRANSACTION;
|
||||
let $c = 1024;
|
||||
while ($c)
|
||||
{
|
||||
eval INSERT INTO mysqltest.transtable (id) VALUES ($c);
|
||||
dec $c;
|
||||
}
|
||||
COMMIT;
|
||||
|
||||
let $c = 32;
|
||||
while ($c)
|
||||
{
|
||||
# if failed at here, it might be shortage of file descriptors limit.
|
||||
connect (con$c,localhost,root,,);
|
||||
dec $c;
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
select count(*) from information_schema.processlist;
|
||||
|
||||
#
|
||||
# fill the all undo slots
|
||||
#
|
||||
--disable_query_log
|
||||
let $c = 32;
|
||||
while ($c)
|
||||
{
|
||||
connection con$c;
|
||||
START TRANSACTION;
|
||||
eval UPDATE mysqltest.transtable SET val = 1 WHERE id = 33 - $c;
|
||||
dec $c;
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
connection default;
|
||||
|
||||
--error ER_CANT_CREATE_TABLE
|
||||
CREATE TABLE mysqltest.testtable (id int unsigned not null primary key) ENGINE=InnoDB;
|
||||
|
||||
select count(*) from information_schema.processlist;
|
||||
|
||||
--disable_query_log
|
||||
let $c = 32;
|
||||
while ($c)
|
||||
{
|
||||
connection con$c;
|
||||
ROLLBACK;
|
||||
dec $c;
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
connection default;
|
||||
select count(*) from information_schema.processlist;
|
||||
|
||||
--disable_query_log
|
||||
let $c = 32;
|
||||
while ($c)
|
||||
{
|
||||
disconnect con$c;
|
||||
dec $c;
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
#
|
||||
# If the isolated .ibd file remained, the drop database should fail.
|
||||
#
|
||||
drop database mysqltest;
|
||||
|
||||
--disable_query_log
|
||||
set global innodb_trx_rseg_n_slots_debug = @old_innodb_trx_rseg_n_slots_debug;
|
||||
--enable_query_log
|
25
mysql-test/suite/innodb_plugin/r/innodb_bug12400341.result
Normal file
25
mysql-test/suite/innodb_plugin/r/innodb_bug12400341.result
Normal file
|
@ -0,0 +1,25 @@
|
|||
call mtr.add_suppression("InnoDB: Warning: cannot find a free slot for an undo log. Do you have too");
|
||||
show variables like "max_connections";
|
||||
Variable_name Value
|
||||
max_connections 64
|
||||
show variables like "innodb_thread_concurrency";
|
||||
Variable_name Value
|
||||
innodb_thread_concurrency 0
|
||||
show variables like "innodb_file_per_table";
|
||||
Variable_name Value
|
||||
innodb_file_per_table ON
|
||||
drop database if exists mysqltest;
|
||||
create database mysqltest;
|
||||
CREATE TABLE mysqltest.transtable (id int unsigned NOT NULL PRIMARY KEY, val int DEFAULT 0) ENGINE=InnoDB;
|
||||
select count(*) from information_schema.processlist;
|
||||
count(*)
|
||||
33
|
||||
CREATE TABLE mysqltest.testtable (id int unsigned not null primary key) ENGINE=InnoDB;
|
||||
ERROR HY000: Can't create table 'mysqltest.testtable' (errno: 177)
|
||||
select count(*) from information_schema.processlist;
|
||||
count(*)
|
||||
33
|
||||
select count(*) from information_schema.processlist;
|
||||
count(*)
|
||||
33
|
||||
drop database mysqltest;
|
|
@ -0,0 +1 @@
|
|||
--max_connections=64 --innodb_thread_concurrency=0 --innodb_file_per_table
|
103
mysql-test/suite/innodb_plugin/t/innodb_bug12400341.test
Normal file
103
mysql-test/suite/innodb_plugin/t/innodb_bug12400341.test
Normal file
|
@ -0,0 +1,103 @@
|
|||
# Test for bug #12400341: INNODB CAN LEAVE ORPHAN IBD FILES AROUND
|
||||
|
||||
-- source include/have_innodb_plugin.inc
|
||||
|
||||
if (`select count(*)=0 from information_schema.global_variables where variable_name = 'INNODB_TRX_RSEG_N_SLOTS_DEBUG'`)
|
||||
{
|
||||
--skip Test requires InnoDB built with UNIV_DEBUG definition.
|
||||
}
|
||||
|
||||
call mtr.add_suppression("InnoDB: Warning: cannot find a free slot for an undo log. Do you have too");
|
||||
|
||||
--disable_query_log
|
||||
set @old_innodb_trx_rseg_n_slots_debug = @@innodb_trx_rseg_n_slots_debug;
|
||||
set global innodb_trx_rseg_n_slots_debug = 32;
|
||||
--enable_query_log
|
||||
|
||||
show variables like "max_connections";
|
||||
show variables like "innodb_thread_concurrency";
|
||||
show variables like "innodb_file_per_table";
|
||||
|
||||
--disable_warnings
|
||||
drop database if exists mysqltest;
|
||||
--enable_warnings
|
||||
|
||||
create database mysqltest;
|
||||
CREATE TABLE mysqltest.transtable (id int unsigned NOT NULL PRIMARY KEY, val int DEFAULT 0) ENGINE=InnoDB;
|
||||
|
||||
--disable_query_log
|
||||
#
|
||||
# Insert in 1 transaction which needs over 1 page undo record to avoid the insert_undo cached,
|
||||
# because the cached insert_undo can be reused at "CREATE TABLE" statement later.
|
||||
#
|
||||
START TRANSACTION;
|
||||
let $c = 1024;
|
||||
while ($c)
|
||||
{
|
||||
eval INSERT INTO mysqltest.transtable (id) VALUES ($c);
|
||||
dec $c;
|
||||
}
|
||||
COMMIT;
|
||||
|
||||
let $c = 32;
|
||||
while ($c)
|
||||
{
|
||||
# if failed at here, it might be shortage of file descriptors limit.
|
||||
connect (con$c,localhost,root,,);
|
||||
dec $c;
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
select count(*) from information_schema.processlist;
|
||||
|
||||
#
|
||||
# fill the all undo slots
|
||||
#
|
||||
--disable_query_log
|
||||
let $c = 32;
|
||||
while ($c)
|
||||
{
|
||||
connection con$c;
|
||||
START TRANSACTION;
|
||||
eval UPDATE mysqltest.transtable SET val = 1 WHERE id = 33 - $c;
|
||||
dec $c;
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
connection default;
|
||||
|
||||
--error ER_CANT_CREATE_TABLE
|
||||
CREATE TABLE mysqltest.testtable (id int unsigned not null primary key) ENGINE=InnoDB;
|
||||
|
||||
select count(*) from information_schema.processlist;
|
||||
|
||||
--disable_query_log
|
||||
let $c = 32;
|
||||
while ($c)
|
||||
{
|
||||
connection con$c;
|
||||
ROLLBACK;
|
||||
dec $c;
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
connection default;
|
||||
select count(*) from information_schema.processlist;
|
||||
|
||||
--disable_query_log
|
||||
let $c = 32;
|
||||
while ($c)
|
||||
{
|
||||
disconnect con$c;
|
||||
dec $c;
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
#
|
||||
# If the isolated .ibd file remained, the drop database should fail.
|
||||
#
|
||||
drop database mysqltest;
|
||||
|
||||
--disable_query_log
|
||||
set global innodb_trx_rseg_n_slots_debug = @old_innodb_trx_rseg_n_slots_debug;
|
||||
--enable_query_log
|
|
@ -36,6 +36,14 @@ connection con0;
|
|||
set GLOBAL init_connect="adsfsdfsdfs";
|
||||
connect (con5,localhost,user_1,,);
|
||||
connection con5;
|
||||
# BUG#11755281/47032: ERROR 2006 / ERROR 2013 INSTEAD OF PROPER ERROR MESSAGE
|
||||
# We now throw a proper error message here:
|
||||
--replace_regex /connection .* to/connection to/
|
||||
--error ER_NEW_ABORTING_CONNECTION
|
||||
select @a;
|
||||
# We got disconnected after receiving the above error message; any further
|
||||
# requests should fail with a notice that no one's listening to us.
|
||||
# --error CR_SERVER_GONE_ERROR,CR_SERVER_LOST
|
||||
--error 2013,2006
|
||||
select @a;
|
||||
connection con0;
|
||||
|
|
|
@ -2196,6 +2196,118 @@ DROP DATABASE `test-database`;
|
|||
# Switching back to test database.
|
||||
USE `test`;
|
||||
|
||||
--echo #
|
||||
--echo # BUG#11760384 : 52792: mysqldump in XML mode does not dump routines.
|
||||
--echo #
|
||||
CREATE DATABASE BUG52792;
|
||||
USE BUG52792;
|
||||
CREATE TABLE t1 (c1 INT, c2 VARCHAR(20));
|
||||
CREATE TABLE t2 (c1 INT);
|
||||
INSERT INTO t1 VALUES (1, 'aaa'), (2, 'bbb'), (3, 'ccc');
|
||||
INSERT INTO t2 VALUES (1),(2),(3);
|
||||
|
||||
--echo # Stored Procedures.
|
||||
|
||||
DELIMITER //;
|
||||
CREATE PROCEDURE simpleproc1 (OUT param1 INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO param1 FROM t1;
|
||||
END//
|
||||
DELIMITER ;//
|
||||
|
||||
DELIMITER //;
|
||||
CREATE PROCEDURE simpleproc2 (OUT param1 INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO param1 FROM t2;
|
||||
END//
|
||||
DELIMITER ;//
|
||||
|
||||
--echo # Events.
|
||||
|
||||
CREATE EVENT e1 ON SCHEDULE EVERY 1 SECOND DO DROP DATABASE BUG52792;
|
||||
CREATE EVENT e2 ON SCHEDULE EVERY 1 SECOND DO DROP DATABASE BUG52792;
|
||||
|
||||
--echo # Functions.
|
||||
|
||||
CREATE FUNCTION `hello1` (s CHAR(20))
|
||||
RETURNS CHAR(50) DETERMINISTIC
|
||||
RETURN CONCAT('Hello, ' ,s ,'!');
|
||||
|
||||
CREATE FUNCTION `hello2` (s CHAR(20))
|
||||
RETURNS CHAR(50) DETERMINISTIC
|
||||
RETURN CONCAT(']]>, ' , s ,'!');
|
||||
|
||||
--echo # Triggers.
|
||||
|
||||
DELIMITER |;
|
||||
CREATE TRIGGER trig1 BEFORE INSERT ON t2
|
||||
FOR EACH ROW BEGIN
|
||||
INSERT INTO t2 VALUES(1);
|
||||
END;
|
||||
|
|
||||
DELIMITER ;|
|
||||
|
||||
DELIMITER |;
|
||||
CREATE TRIGGER trig2 AFTER INSERT ON t2
|
||||
FOR EACH ROW BEGIN
|
||||
INSERT INTO t2 VALUES(1, ']]>');
|
||||
INSERT INTO t2 VALUES(2, '<![CDATA]]>');
|
||||
INSERT INTO t2 VALUES(3, '<![CDATA[');
|
||||
INSERT INTO t2 VALUES(4, '< > & \ " _');
|
||||
END;
|
||||
|
|
||||
DELIMITER ;|
|
||||
|
||||
--echo # Views
|
||||
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
CREATE VIEW v2 AS SELECT * FROM t2;
|
||||
--echo
|
||||
--echo # Dumping BUG52792 database in xml format.
|
||||
--echo
|
||||
--echo # Running 'replace_regex on timestamp'
|
||||
--replace_regex /[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/--TIME--/
|
||||
--exec $MYSQL_DUMP --user=root --compact -R -E --triggers -X BUG52792
|
||||
--echo
|
||||
--echo # Dumping BUG52792 database in xml format with comments.
|
||||
--echo
|
||||
--echo # Running 'replace_regex on timestamp'
|
||||
--replace_regex /[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/--TIME--/
|
||||
--exec $MYSQL_DUMP --comments --user=root -R -E --triggers -X BUG52792
|
||||
|
||||
--echo
|
||||
--echo # Test to check 'Insufficient privileges' error.
|
||||
--echo
|
||||
|
||||
GRANT ALL PRIVILEGES ON BUG52792.* TO user1;
|
||||
|
||||
connect (conn_1, localhost, user1, , BUG52792, $MASTER_MYPORT, $MASTER_MYSOCK);
|
||||
connection conn_1;
|
||||
|
||||
--echo # Running 'replace_regex on timestamp'
|
||||
--replace_regex /[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/--TIME--/
|
||||
--error 2
|
||||
--exec $MYSQL_DUMP --user=user1 -R -E --triggers -X BUG52792
|
||||
|
||||
connection default;
|
||||
disconnect conn_1;
|
||||
|
||||
DROP USER user1;
|
||||
DROP DATABASE BUG52792;
|
||||
--echo # UTF-8
|
||||
CREATE DATABASE BUG52792;
|
||||
USE BUG52792;
|
||||
SET NAMES utf8;
|
||||
CREATE FUNCTION `straße` ( c1 CHAR(20))
|
||||
RETURNS CHAR(50) DETERMINISTIC
|
||||
RETURN CONCAT(']]>, ', s, '!');
|
||||
|
||||
--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --skip-comments --default-character-set=utf8 --compatible=mysql323 -R -X BUG52792
|
||||
|
||||
DROP DATABASE BUG52792;
|
||||
|
||||
USE test;
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.1 tests
|
||||
--echo #
|
||||
|
|
|
@ -1342,13 +1342,38 @@ static void prepare_new_connection_state(THD* thd)
|
|||
execute_init_command(thd, &sys_init_connect, &LOCK_sys_init_connect);
|
||||
if (thd->is_error())
|
||||
{
|
||||
thd->killed= THD::KILL_CONNECTION;
|
||||
ulong packet_length;
|
||||
NET *net= &thd->net;
|
||||
|
||||
sql_print_warning(ER(ER_NEW_ABORTING_CONNECTION),
|
||||
thd->thread_id,(thd->db ? thd->db : "unconnected"),
|
||||
thd->thread_id,
|
||||
thd->db ? thd->db : "unconnected",
|
||||
sctx->user ? sctx->user : "unauthenticated",
|
||||
sctx->host_or_ip, "init_connect command failed");
|
||||
sql_print_warning("%s", thd->main_da.message());
|
||||
|
||||
thd->lex->current_select= 0;
|
||||
my_net_set_read_timeout(net, thd->variables.net_wait_timeout);
|
||||
thd->clear_error();
|
||||
net_new_transaction(net);
|
||||
packet_length= my_net_read(net);
|
||||
/*
|
||||
If my_net_read() failed, my_error() has been already called,
|
||||
and the main Diagnostics Area contains an error condition.
|
||||
*/
|
||||
if (packet_length != packet_error)
|
||||
my_error(ER_NEW_ABORTING_CONNECTION, MYF(0),
|
||||
thd->thread_id,
|
||||
thd->db ? thd->db : "unconnected",
|
||||
sctx->user ? sctx->user : "unauthenticated",
|
||||
sctx->host_or_ip, "init_connect command failed");
|
||||
|
||||
thd->server_status&= ~SERVER_STATUS_CLEAR_SET;
|
||||
net_end_statement(thd);
|
||||
thd->killed = THD::KILL_CONNECTION;
|
||||
return;
|
||||
}
|
||||
|
||||
thd->proc_info=0;
|
||||
thd->set_time();
|
||||
thd->init_for_queries();
|
||||
|
|
|
@ -1651,6 +1651,16 @@ int ha_federated::close(void)
|
|||
mysql_close(mysql);
|
||||
mysql= NULL;
|
||||
|
||||
/*
|
||||
mysql_close() might return an error if a remote server's gone
|
||||
for some reason. If that happens while removing a table from
|
||||
the table cache, the error will be propagated to a client even
|
||||
if the original query was not issued against the FEDERATED table.
|
||||
So, don't propagate errors from mysql_close().
|
||||
*/
|
||||
if (table->in_use)
|
||||
table->in_use->clear_error();
|
||||
|
||||
DBUG_RETURN(free_share(share));
|
||||
}
|
||||
|
||||
|
|
|
@ -634,7 +634,7 @@ buf_pool_init(
|
|||
/*----------------------------------------*/
|
||||
} else {
|
||||
buf_pool->frame_mem = os_mem_alloc_large(
|
||||
UNIV_PAGE_SIZE * (n_frames + 1), TRUE, FALSE);
|
||||
UNIV_PAGE_SIZE * (n_frames + 1), FALSE);
|
||||
}
|
||||
|
||||
if (buf_pool->frame_mem == NULL) {
|
||||
|
@ -756,12 +756,8 @@ buf_pool_init(
|
|||
block = buf_pool_get_nth_block(buf_pool, i);
|
||||
|
||||
if (block->frame) {
|
||||
/* Wipe contents of frame to eliminate a Purify
|
||||
warning */
|
||||
UNIV_MEM_INVALID(block->frame, UNIV_PAGE_SIZE);
|
||||
|
||||
#ifdef HAVE_purify
|
||||
memset(block->frame, '\0', UNIV_PAGE_SIZE);
|
||||
#endif
|
||||
if (srv_use_awe) {
|
||||
/* Add to the list of blocks mapped to
|
||||
frames */
|
||||
|
|
|
@ -9060,6 +9060,13 @@ static MYSQL_SYSVAR_UINT(change_buffering_debug, ibuf_debug,
|
|||
NULL, NULL, 0, 0, 1, 0);
|
||||
#endif /* UNIV_DEBUG || UNIV_IBUF_DEBUG */
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
static MYSQL_SYSVAR_UINT(trx_rseg_n_slots_debug, trx_rseg_n_slots_debug,
|
||||
PLUGIN_VAR_RQCMDARG,
|
||||
"Debug flags for InnoDB to limit TRX_RSEG_N_SLOTS for trx_rsegf_undo_find_free()",
|
||||
NULL, NULL, 0, 0, 1024, 0);
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
static struct st_mysql_sys_var* innobase_system_variables[]= {
|
||||
MYSQL_SYSVAR(additional_mem_pool_size),
|
||||
MYSQL_SYSVAR(autoextend_increment),
|
||||
|
@ -9105,6 +9112,9 @@ static struct st_mysql_sys_var* innobase_system_variables[]= {
|
|||
#if defined UNIV_DEBUG || defined UNIV_IBUF_DEBUG
|
||||
MYSQL_SYSVAR(change_buffering_debug),
|
||||
#endif /* UNIV_DEBUG || UNIV_IBUF_DEBUG */
|
||||
#ifdef UNIV_DEBUG
|
||||
MYSQL_SYSVAR(trx_rseg_n_slots_debug),
|
||||
#endif /* UNIV_DEBUG */
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
|
@ -194,10 +194,6 @@ mem_heap_alloc(
|
|||
caller */
|
||||
buf = (byte*)buf + MEM_FIELD_HEADER_SIZE;
|
||||
|
||||
#endif
|
||||
#ifdef UNIV_SET_MEM_TO_ZERO
|
||||
UNIV_MEM_ALLOC(buf, n);
|
||||
memset(buf, '\0', n);
|
||||
#endif
|
||||
UNIV_MEM_ALLOC(buf, n);
|
||||
return(buf);
|
||||
|
|
|
@ -104,14 +104,6 @@ ulint
|
|||
os_proc_get_number(void);
|
||||
/*====================*/
|
||||
/********************************************************************
|
||||
Allocates non-cacheable memory. */
|
||||
|
||||
void*
|
||||
os_mem_alloc_nocache(
|
||||
/*=================*/
|
||||
/* out: allocated memory */
|
||||
ulint n); /* in: number of bytes */
|
||||
/********************************************************************
|
||||
Allocates large pages memory. */
|
||||
|
||||
void*
|
||||
|
@ -119,9 +111,6 @@ os_mem_alloc_large(
|
|||
/*===============*/
|
||||
/* out: allocated memory */
|
||||
ulint n, /* in: number of bytes */
|
||||
ibool set_to_zero, /* in: TRUE if allocated memory
|
||||
should be set to zero if
|
||||
UNIV_SET_MEM_TO_ZERO is defined */
|
||||
ibool assert_on_error);/* in: if TRUE, we crash mysqld if
|
||||
the memory cannot be allocated */
|
||||
/********************************************************************
|
||||
|
|
|
@ -8,6 +8,7 @@ Created 3/26/1996 Heikki Tuuri
|
|||
|
||||
#include "srv0srv.h"
|
||||
#include "mtr0log.h"
|
||||
#include "trx0sys.h"
|
||||
|
||||
/**********************************************************************
|
||||
Gets a rollback segment header. */
|
||||
|
@ -113,7 +114,13 @@ trx_rsegf_undo_find_free(
|
|||
ulint i;
|
||||
ulint page_no;
|
||||
|
||||
for (i = 0; i < TRX_RSEG_N_SLOTS; i++) {
|
||||
for (i = 0;
|
||||
#ifndef UNIV_DEBUG
|
||||
i < TRX_RSEG_N_SLOTS;
|
||||
#else
|
||||
i < (trx_rseg_n_slots_debug ? trx_rseg_n_slots_debug : TRX_RSEG_N_SLOTS);
|
||||
#endif
|
||||
i++) {
|
||||
|
||||
page_no = trx_rsegf_get_nth_undo(rsegf, i, mtr);
|
||||
|
||||
|
|
|
@ -47,6 +47,11 @@ extern ibool trx_doublewrite_buf_is_being_created;
|
|||
extern ibool trx_doublewrite_must_reset_space_ids;
|
||||
extern ibool trx_sys_multiple_tablespace_format;
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
/* Flag to control TRX_RSEG_N_SLOTS behavior debugging. */
|
||||
extern uint trx_rseg_n_slots_debug;
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
Creates the doublewrite buffer to a new InnoDB installation. The header of the
|
||||
doublewrite buffer is placed on the trx system header page. */
|
||||
|
|
|
@ -72,14 +72,6 @@ Microsoft Visual C++ */
|
|||
/* DEBUG VERSION CONTROL
|
||||
===================== */
|
||||
|
||||
/* The following flag will make InnoDB to initialize
|
||||
all memory it allocates to zero. It hides Purify
|
||||
warnings about reading unallocated memory unless
|
||||
memory is read outside the allocated blocks. */
|
||||
/*
|
||||
#define UNIV_INIT_MEM_TO_ZERO
|
||||
*/
|
||||
|
||||
/* Make a non-inline debug version */
|
||||
|
||||
#if defined HAVE_VALGRIND
|
||||
|
@ -112,15 +104,6 @@ operations (very slow); also UNIV_DEBUG must be defined */
|
|||
#define UNIV_BTR_DEBUG /* check B-tree links */
|
||||
#define UNIV_LIGHT_MEM_DEBUG /* light memory debugging */
|
||||
|
||||
#ifdef HAVE_purify
|
||||
/* The following sets all new allocated memory to zero before use:
|
||||
this can be used to eliminate unnecessary Purify warnings, but note that
|
||||
it also masks many bugs Purify could detect. For detailed Purify analysis it
|
||||
is best to remove the define below and look through the warnings one
|
||||
by one. */
|
||||
#define UNIV_SET_MEM_TO_ZERO
|
||||
#endif
|
||||
|
||||
/*
|
||||
#define UNIV_SQL_DEBUG
|
||||
#define UNIV_LOG_DEBUG
|
||||
|
|
|
@ -30,38 +30,18 @@ ut_memcmp(const void* str1, const void* str2, ulint n);
|
|||
|
||||
|
||||
/**************************************************************************
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined and set_to_zero is TRUE. */
|
||||
Allocates memory. */
|
||||
|
||||
void*
|
||||
ut_malloc_low(
|
||||
/*==========*/
|
||||
/* out, own: allocated memory */
|
||||
ulint n, /* in: number of bytes to allocate */
|
||||
ibool set_to_zero, /* in: TRUE if allocated memory
|
||||
should be set to zero if
|
||||
UNIV_SET_MEM_TO_ZERO is defined */
|
||||
ibool assert_on_error); /* in: if TRUE, we crash mysqld if
|
||||
the memory cannot be allocated */
|
||||
/**************************************************************************
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined. */
|
||||
|
||||
void*
|
||||
ut_malloc(
|
||||
/*======*/
|
||||
/* out, own: allocated memory */
|
||||
ulint n); /* in: number of bytes to allocate */
|
||||
/**************************************************************************
|
||||
Tests if malloc of n bytes would succeed. ut_malloc() asserts if memory runs
|
||||
out. It cannot be used if we want to return an error message. Prints to
|
||||
stderr a message if fails. */
|
||||
|
||||
ibool
|
||||
ut_test_malloc(
|
||||
/*===========*/
|
||||
/* out: TRUE if succeeded */
|
||||
ulint n); /* in: try to allocate this many bytes */
|
||||
Allocates memory. */
|
||||
#define ut_malloc(n) ut_malloc_low(n, TRUE)
|
||||
/**************************************************************************
|
||||
Frees a memory block allocated with ut_malloc. */
|
||||
|
||||
|
|
|
@ -96,7 +96,7 @@ ut_rnd_interval(
|
|||
|
||||
rnd = ut_rnd_gen_ulint();
|
||||
|
||||
return(low + (rnd % (high - low + 1)));
|
||||
return(low + (rnd % (high - low)));
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
|
|
|
@ -196,11 +196,7 @@ mem_pool_create(
|
|||
|
||||
pool = ut_malloc(sizeof(mem_pool_t));
|
||||
|
||||
/* We do not set the memory to zero (FALSE) in the pool,
|
||||
but only when allocated at a higher level in mem0mem.c.
|
||||
This is to avoid masking useful Purify warnings. */
|
||||
|
||||
pool->buf = ut_malloc_low(size, FALSE, TRUE);
|
||||
pool->buf = ut_malloc_low(size, TRUE);
|
||||
pool->size = size;
|
||||
|
||||
mutex_create(&pool->mutex, SYNC_MEM_POOL);
|
||||
|
|
|
@ -531,28 +531,6 @@ os_proc_get_number(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
Allocates non-cacheable memory. */
|
||||
|
||||
void*
|
||||
os_mem_alloc_nocache(
|
||||
/*=================*/
|
||||
/* out: allocated memory */
|
||||
ulint n) /* in: number of bytes */
|
||||
{
|
||||
#ifdef __WIN__
|
||||
void* ptr;
|
||||
|
||||
ptr = VirtualAlloc(NULL, n, MEM_COMMIT,
|
||||
PAGE_READWRITE | PAGE_NOCACHE);
|
||||
ut_a(ptr);
|
||||
|
||||
return(ptr);
|
||||
#else
|
||||
return(ut_malloc(n));
|
||||
#endif
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
Allocates large pages memory. */
|
||||
|
||||
|
@ -561,9 +539,6 @@ os_mem_alloc_large(
|
|||
/*===============*/
|
||||
/* out: allocated memory */
|
||||
ulint n, /* in: number of bytes */
|
||||
ibool set_to_zero, /* in: TRUE if allocated memory
|
||||
should be set to zero if
|
||||
UNIV_SET_MEM_TO_ZERO is defined */
|
||||
ibool assert_on_error)/* in: if TRUE, we crash mysqld if
|
||||
the memory cannot be allocated */
|
||||
{
|
||||
|
@ -602,12 +577,6 @@ os_mem_alloc_large(
|
|||
#endif
|
||||
|
||||
if (ptr) {
|
||||
if (set_to_zero) {
|
||||
#ifdef UNIV_SET_MEM_TO_ZERO
|
||||
memset(ptr, '\0', size);
|
||||
#endif
|
||||
}
|
||||
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
|
@ -616,7 +585,7 @@ os_mem_alloc_large(
|
|||
skip:
|
||||
#endif /* HAVE_LARGE_PAGES */
|
||||
|
||||
return(ut_malloc_low(n, set_to_zero, assert_on_error));
|
||||
return(ut_malloc_low(n, assert_on_error));
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
|
|
|
@ -1948,6 +1948,18 @@ row_create_table_for_mysql(
|
|||
FALSE);
|
||||
}
|
||||
|
||||
} else if (err == DB_TOO_MANY_CONCURRENT_TRXS) {
|
||||
/* We already have .ibd file here. it should be deleted. */
|
||||
if (table->space
|
||||
&& !fil_delete_tablespace(table->space)) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
" InnoDB: Error: not able to"
|
||||
" delete tablespace %lu of table ",
|
||||
(ulong) table->space);
|
||||
ut_print_name(stderr, trx, TRUE, table->name);
|
||||
fputs("!\n", stderr);
|
||||
}
|
||||
} else if (err == DB_DUPLICATE_KEY) {
|
||||
ut_print_timestamp(stderr);
|
||||
|
||||
|
|
|
@ -54,6 +54,10 @@ InnoDB. */
|
|||
char trx_sys_mysql_bin_log_name[TRX_SYS_MYSQL_LOG_NAME_LEN];
|
||||
ib_longlong trx_sys_mysql_bin_log_pos = -1;
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
/* Flag to control TRX_RSEG_N_SLOTS behavior debugging. */
|
||||
uint trx_rseg_n_slots_debug = 0;
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
Determines if a page number is located inside the doublewrite buffer. */
|
||||
|
|
|
@ -54,17 +54,13 @@ ut_mem_block_list_init(void)
|
|||
}
|
||||
|
||||
/**************************************************************************
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined and set_to_zero is TRUE. */
|
||||
Allocates memory. */
|
||||
|
||||
void*
|
||||
ut_malloc_low(
|
||||
/*==========*/
|
||||
/* out, own: allocated memory */
|
||||
ulint n, /* in: number of bytes to allocate */
|
||||
ibool set_to_zero, /* in: TRUE if allocated memory should be
|
||||
set to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined */
|
||||
ibool assert_on_error)/* in: if TRUE, we crash mysqld if the
|
||||
memory cannot be allocated */
|
||||
{
|
||||
|
@ -156,12 +152,6 @@ retry:
|
|||
#endif
|
||||
}
|
||||
|
||||
if (set_to_zero) {
|
||||
#ifdef UNIV_SET_MEM_TO_ZERO
|
||||
memset(ret, '\0', n + sizeof(ut_mem_block_t));
|
||||
#endif
|
||||
}
|
||||
|
||||
UNIV_MEM_ALLOC(ret, n + sizeof(ut_mem_block_t));
|
||||
|
||||
((ut_mem_block_t*)ret)->size = n + sizeof(ut_mem_block_t);
|
||||
|
@ -176,59 +166,6 @@ retry:
|
|||
return((void*)((byte*)ret + sizeof(ut_mem_block_t)));
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined. */
|
||||
|
||||
void*
|
||||
ut_malloc(
|
||||
/*======*/
|
||||
/* out, own: allocated memory */
|
||||
ulint n) /* in: number of bytes to allocate */
|
||||
{
|
||||
return(ut_malloc_low(n, TRUE, TRUE));
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
Tests if malloc of n bytes would succeed. ut_malloc() asserts if memory runs
|
||||
out. It cannot be used if we want to return an error message. Prints to
|
||||
stderr a message if fails. */
|
||||
|
||||
ibool
|
||||
ut_test_malloc(
|
||||
/*===========*/
|
||||
/* out: TRUE if succeeded */
|
||||
ulint n) /* in: try to allocate this many bytes */
|
||||
{
|
||||
void* ret;
|
||||
|
||||
ret = malloc(n);
|
||||
|
||||
if (ret == NULL) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
" InnoDB: Error: cannot allocate"
|
||||
" %lu bytes of memory for\n"
|
||||
"InnoDB: a BLOB with malloc! Total allocated memory\n"
|
||||
"InnoDB: by InnoDB %lu bytes."
|
||||
" Operating system errno: %d\n"
|
||||
"InnoDB: Check if you should increase"
|
||||
" the swap file or\n"
|
||||
"InnoDB: ulimits of your operating system.\n"
|
||||
"InnoDB: On FreeBSD check you have"
|
||||
" compiled the OS with\n"
|
||||
"InnoDB: a big enough maximum process size.\n",
|
||||
(ulong) n,
|
||||
(ulong) ut_total_allocated_memory,
|
||||
(int) errno);
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
free(ret);
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
Frees a memory block allocated with ut_malloc. */
|
||||
|
||||
|
|
|
@ -1,7 +1,16 @@
|
|||
2012-01-04 The InnoDB Team
|
||||
|
||||
* row/row0mysql.c:
|
||||
Fix Bug#12400341: INNODB CAN LEAVE ORPHAN IBD FILES AROUND
|
||||
|
||||
2011-12-22 The InnoDB Team
|
||||
|
||||
* row/row0sel.c:
|
||||
Fix Bug#63775 Server crash on handler read next after delete record.
|
||||
2011-12-21 The InnoDB Team
|
||||
|
||||
* include/ut0rnd.ic:
|
||||
Fix Bug#11866367:FPE WHEN SETTING INNODB_SPIN_WAIT_DELAY
|
||||
|
||||
2011-12-13 The InnoDB Team
|
||||
|
||||
|
|
|
@ -750,11 +750,8 @@ buf_chunk_init(
|
|||
for (i = chunk->size; i--; ) {
|
||||
|
||||
buf_block_init(block, frame);
|
||||
UNIV_MEM_INVALID(block->frame, UNIV_PAGE_SIZE);
|
||||
|
||||
#ifdef HAVE_purify
|
||||
/* Wipe contents of frame to eliminate a Purify warning */
|
||||
memset(block->frame, '\0', UNIV_PAGE_SIZE);
|
||||
#endif
|
||||
/* Add the block to the free list */
|
||||
UT_LIST_ADD_LAST(list, buf_pool->free, (&block->page));
|
||||
ut_d(block->page.in_free_list = TRUE);
|
||||
|
|
|
@ -11033,6 +11033,13 @@ static MYSQL_SYSVAR_ULONG(read_ahead_threshold, srv_read_ahead_threshold,
|
|||
"trigger a readahead.",
|
||||
NULL, NULL, 56, 0, 64, 0);
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
static MYSQL_SYSVAR_UINT(trx_rseg_n_slots_debug, trx_rseg_n_slots_debug,
|
||||
PLUGIN_VAR_RQCMDARG,
|
||||
"Debug flags for InnoDB to limit TRX_RSEG_N_SLOTS for trx_rsegf_undo_find_free()",
|
||||
NULL, NULL, 0, 0, 1024, 0);
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
static struct st_mysql_sys_var* innobase_system_variables[]= {
|
||||
MYSQL_SYSVAR(additional_mem_pool_size),
|
||||
MYSQL_SYSVAR(autoextend_increment),
|
||||
|
@ -11094,6 +11101,9 @@ static struct st_mysql_sys_var* innobase_system_variables[]= {
|
|||
MYSQL_SYSVAR(random_read_ahead),
|
||||
MYSQL_SYSVAR(read_ahead_threshold),
|
||||
MYSQL_SYSVAR(io_capacity),
|
||||
#ifdef UNIV_DEBUG
|
||||
MYSQL_SYSVAR(trx_rseg_n_slots_debug),
|
||||
#endif /* UNIV_DEBUG */
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
|
@ -208,10 +208,6 @@ mem_heap_alloc(
|
|||
caller */
|
||||
buf = (byte*)buf + MEM_FIELD_HEADER_SIZE;
|
||||
|
||||
#endif
|
||||
#ifdef UNIV_SET_MEM_TO_ZERO
|
||||
UNIV_MEM_ALLOC(buf, n);
|
||||
memset(buf, '\0', n);
|
||||
#endif
|
||||
UNIV_MEM_ALLOC(buf, n);
|
||||
return(buf);
|
||||
|
|
|
@ -25,6 +25,7 @@ Created 3/26/1996 Heikki Tuuri
|
|||
|
||||
#include "srv0srv.h"
|
||||
#include "mtr0log.h"
|
||||
#include "trx0sys.h"
|
||||
|
||||
/******************************************************************//**
|
||||
Gets a rollback segment header.
|
||||
|
@ -131,7 +132,13 @@ trx_rsegf_undo_find_free(
|
|||
ulint i;
|
||||
ulint page_no;
|
||||
|
||||
for (i = 0; i < TRX_RSEG_N_SLOTS; i++) {
|
||||
for (i = 0;
|
||||
#ifndef UNIV_DEBUG
|
||||
i < TRX_RSEG_N_SLOTS;
|
||||
#else
|
||||
i < (trx_rseg_n_slots_debug ? trx_rseg_n_slots_debug : TRX_RSEG_N_SLOTS);
|
||||
#endif
|
||||
i++) {
|
||||
|
||||
page_no = trx_rsegf_get_nth_undo(rsegf, i, mtr);
|
||||
|
||||
|
|
|
@ -229,6 +229,12 @@ trx_id_t
|
|||
trx_sys_get_new_trx_no(void);
|
||||
/*========================*/
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
/* Flag to control TRX_RSEG_N_SLOTS behavior debugging. */
|
||||
extern uint trx_rseg_n_slots_debug;
|
||||
#endif
|
||||
|
||||
/*****************************************************************//**
|
||||
Writes a trx id to an index page. In case that the id size changes in
|
||||
some future version, this function should be used instead of
|
||||
|
|
|
@ -146,14 +146,6 @@ Sun Studio */
|
|||
/* DEBUG VERSION CONTROL
|
||||
===================== */
|
||||
|
||||
/* The following flag will make InnoDB to initialize
|
||||
all memory it allocates to zero. It hides Purify
|
||||
warnings about reading unallocated memory unless
|
||||
memory is read outside the allocated blocks. */
|
||||
/*
|
||||
#define UNIV_INIT_MEM_TO_ZERO
|
||||
*/
|
||||
|
||||
/* When this macro is defined then additional test functions will be
|
||||
compiled. These functions live at the end of each relevant source file
|
||||
and have "test_" prefix. These functions are not called from anywhere in
|
||||
|
@ -218,15 +210,6 @@ operations (very slow); also UNIV_DEBUG must be defined */
|
|||
#define UNIV_BTR_DEBUG /* check B-tree links */
|
||||
#define UNIV_LIGHT_MEM_DEBUG /* light memory debugging */
|
||||
|
||||
#ifdef HAVE_purify
|
||||
/* The following sets all new allocated memory to zero before use:
|
||||
this can be used to eliminate unnecessary Purify warnings, but note that
|
||||
it also masks many bugs Purify could detect. For detailed Purify analysis it
|
||||
is best to remove the define below and look through the warnings one
|
||||
by one. */
|
||||
#define UNIV_SET_MEM_TO_ZERO
|
||||
#endif
|
||||
|
||||
/*
|
||||
#define UNIV_SQL_DEBUG
|
||||
#define UNIV_LOG_DEBUG
|
||||
|
|
|
@ -78,40 +78,19 @@ ut_mem_init(void);
|
|||
/*=============*/
|
||||
|
||||
/**********************************************************************//**
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined and set_to_zero is TRUE.
|
||||
Allocates memory.
|
||||
@return own: allocated memory */
|
||||
UNIV_INTERN
|
||||
void*
|
||||
ut_malloc_low(
|
||||
/*==========*/
|
||||
ulint n, /*!< in: number of bytes to allocate */
|
||||
ibool set_to_zero, /*!< in: TRUE if allocated memory
|
||||
should be set to zero if
|
||||
UNIV_SET_MEM_TO_ZERO is defined */
|
||||
ibool assert_on_error); /*!< in: if TRUE, we crash mysqld if
|
||||
ibool assert_on_error) /*!< in: if TRUE, we crash mysqld if
|
||||
the memory cannot be allocated */
|
||||
__attribute__((malloc));
|
||||
/**********************************************************************//**
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined.
|
||||
@return own: allocated memory */
|
||||
UNIV_INTERN
|
||||
void*
|
||||
ut_malloc(
|
||||
/*======*/
|
||||
ulint n); /*!< in: number of bytes to allocate */
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/**********************************************************************//**
|
||||
Tests if malloc of n bytes would succeed. ut_malloc() asserts if memory runs
|
||||
out. It cannot be used if we want to return an error message. Prints to
|
||||
stderr a message if fails.
|
||||
@return TRUE if succeeded */
|
||||
UNIV_INTERN
|
||||
ibool
|
||||
ut_test_malloc(
|
||||
/*===========*/
|
||||
ulint n); /*!< in: try to allocate this many bytes */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
Allocates memory. */
|
||||
#define ut_malloc(n) ut_malloc_low(n, TRUE)
|
||||
/**********************************************************************//**
|
||||
Frees a memory block allocated with ut_malloc. Freeing a NULL pointer is
|
||||
a nop. */
|
||||
|
|
|
@ -114,7 +114,7 @@ ut_rnd_interval(
|
|||
|
||||
rnd = ut_rnd_gen_ulint();
|
||||
|
||||
return(low + (rnd % (high - low + 1)));
|
||||
return(low + (rnd % (high - low)));
|
||||
}
|
||||
|
||||
/*********************************************************//**
|
||||
|
|
|
@ -223,11 +223,7 @@ mem_pool_create(
|
|||
|
||||
pool = ut_malloc(sizeof(mem_pool_t));
|
||||
|
||||
/* We do not set the memory to zero (FALSE) in the pool,
|
||||
but only when allocated at a higher level in mem0mem.c.
|
||||
This is to avoid masking useful Purify warnings. */
|
||||
|
||||
pool->buf = ut_malloc_low(size, FALSE, TRUE);
|
||||
pool->buf = ut_malloc_low(size, TRUE);
|
||||
pool->size = size;
|
||||
|
||||
mutex_create(&pool->mutex, SYNC_MEM_POOL);
|
||||
|
|
|
@ -111,9 +111,6 @@ os_mem_alloc_large(
|
|||
os_fast_mutex_lock(&ut_list_mutex);
|
||||
ut_total_allocated_memory += size;
|
||||
os_fast_mutex_unlock(&ut_list_mutex);
|
||||
# ifdef UNIV_SET_MEM_TO_ZERO
|
||||
memset(ptr, '\0', size);
|
||||
# endif
|
||||
UNIV_MEM_ALLOC(ptr, size);
|
||||
return(ptr);
|
||||
}
|
||||
|
|
|
@ -1900,6 +1900,20 @@ err_exit:
|
|||
}
|
||||
break;
|
||||
|
||||
case DB_TOO_MANY_CONCURRENT_TRXS:
|
||||
/* We already have .ibd file here. it should be deleted. */
|
||||
|
||||
if (table->space && !fil_delete_tablespace(table->space)) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
" InnoDB: Error: not able to"
|
||||
" delete tablespace %lu of table ",
|
||||
(ulong) table->space);
|
||||
ut_print_name(stderr, trx, TRUE, table->name);
|
||||
fputs("!\n", stderr);
|
||||
}
|
||||
/* fall through */
|
||||
|
||||
case DB_DUPLICATE_KEY:
|
||||
default:
|
||||
/* We may also get err == DB_ERROR if the .ibd file for the
|
||||
|
|
|
@ -127,6 +127,11 @@ static const char* file_format_name_map[] = {
|
|||
static const ulint FILE_FORMAT_NAME_N
|
||||
= sizeof(file_format_name_map) / sizeof(file_format_name_map[0]);
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
/* Flag to control TRX_RSEG_N_SLOTS behavior debugging. */
|
||||
uint trx_rseg_n_slots_debug = 0;
|
||||
#endif
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/** This is used to track the maximum file format id known to InnoDB. It's
|
||||
updated via SET GLOBAL innodb_file_format_check = 'x' or when we open
|
||||
|
|
|
@ -84,17 +84,13 @@ ut_mem_init(void)
|
|||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
/**********************************************************************//**
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined and set_to_zero is TRUE.
|
||||
Allocates memory.
|
||||
@return own: allocated memory */
|
||||
UNIV_INTERN
|
||||
void*
|
||||
ut_malloc_low(
|
||||
/*==========*/
|
||||
ulint n, /*!< in: number of bytes to allocate */
|
||||
ibool set_to_zero, /*!< in: TRUE if allocated memory should be
|
||||
set to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined */
|
||||
ibool assert_on_error)/*!< in: if TRUE, we crash mysqld if the
|
||||
memory cannot be allocated */
|
||||
{
|
||||
|
@ -106,12 +102,6 @@ ut_malloc_low(
|
|||
ret = malloc(n);
|
||||
ut_a(ret || !assert_on_error);
|
||||
|
||||
#ifdef UNIV_SET_MEM_TO_ZERO
|
||||
if (set_to_zero) {
|
||||
memset(ret, '\0', n);
|
||||
UNIV_MEM_ALLOC(ret, n);
|
||||
}
|
||||
#endif
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
@ -199,12 +189,6 @@ retry:
|
|||
#endif
|
||||
}
|
||||
|
||||
if (set_to_zero) {
|
||||
#ifdef UNIV_SET_MEM_TO_ZERO
|
||||
memset(ret, '\0', n + sizeof(ut_mem_block_t));
|
||||
#endif
|
||||
}
|
||||
|
||||
UNIV_MEM_ALLOC(ret, n + sizeof(ut_mem_block_t));
|
||||
|
||||
((ut_mem_block_t*)ret)->size = n + sizeof(ut_mem_block_t);
|
||||
|
@ -221,74 +205,10 @@ retry:
|
|||
void* ret = malloc(n);
|
||||
ut_a(ret || !assert_on_error);
|
||||
|
||||
# ifdef UNIV_SET_MEM_TO_ZERO
|
||||
if (set_to_zero) {
|
||||
memset(ret, '\0', n);
|
||||
}
|
||||
# endif
|
||||
return(ret);
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
}
|
||||
|
||||
/**********************************************************************//**
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined.
|
||||
@return own: allocated memory */
|
||||
UNIV_INTERN
|
||||
void*
|
||||
ut_malloc(
|
||||
/*======*/
|
||||
ulint n) /*!< in: number of bytes to allocate */
|
||||
{
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
return(ut_malloc_low(n, TRUE, TRUE));
|
||||
#else /* !UNIV_HOTBACKUP */
|
||||
return(malloc(n));
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
}
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/**********************************************************************//**
|
||||
Tests if malloc of n bytes would succeed. ut_malloc() asserts if memory runs
|
||||
out. It cannot be used if we want to return an error message. Prints to
|
||||
stderr a message if fails.
|
||||
@return TRUE if succeeded */
|
||||
UNIV_INTERN
|
||||
ibool
|
||||
ut_test_malloc(
|
||||
/*===========*/
|
||||
ulint n) /*!< in: try to allocate this many bytes */
|
||||
{
|
||||
void* ret;
|
||||
|
||||
ret = malloc(n);
|
||||
|
||||
if (ret == NULL) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
" InnoDB: Error: cannot allocate"
|
||||
" %lu bytes of memory for\n"
|
||||
"InnoDB: a BLOB with malloc! Total allocated memory\n"
|
||||
"InnoDB: by InnoDB %lu bytes."
|
||||
" Operating system errno: %d\n"
|
||||
"InnoDB: Check if you should increase"
|
||||
" the swap file or\n"
|
||||
"InnoDB: ulimits of your operating system.\n"
|
||||
"InnoDB: On FreeBSD check you have"
|
||||
" compiled the OS with\n"
|
||||
"InnoDB: a big enough maximum process size.\n",
|
||||
(ulong) n,
|
||||
(ulong) ut_total_allocated_memory,
|
||||
(int) errno);
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
free(ret);
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
/**********************************************************************//**
|
||||
Frees a memory block allocated with ut_malloc. Freeing a NULL pointer is
|
||||
a nop. */
|
||||
|
|
|
@ -429,7 +429,7 @@ my_bool test_intersect(MY_BITMAP *map, uint bitsize)
|
|||
{
|
||||
uint bitsize2 = 1 + get_rand_bit(MAX_TESTED_BITMAP_SIZE - 1);
|
||||
MY_BITMAP map2;
|
||||
uint32 map2buf[bitsize2];
|
||||
uint32 map2buf[MAX_TESTED_BITMAP_SIZE];
|
||||
uint i, test_bit1, test_bit2, test_bit3;
|
||||
if (bitmap_init(&map2, map2buf, bitsize2, FALSE))
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue