Fixes for Opensolaris (to get buildbot green)

- Fixed memory leaks in mysqldump
- Fixed printf of NULL which caused crashes on OpenSolaris when using --debug
- Fixed realloc() problem that caused out of memory when running mysqldump.test on OpenSolaris


client/mysqldump.c:
  Fixed memory leaks
  Fixed printf of NULL which caused crashes on OpenSolaris when using --debug
client/mysqltest.cc:
  Fixed printf of NULL which caused crashes on OpenSolaris when using --debug
include/my_global.h:
  Added simple macro val_or_null() to simplify detecting of NULL strings for printf
sql/handler.cc:
  Fixed printf of NULL which caused crashes on OpenSolaris when using --debug
sql/sql_db.cc:
  Fixed printf of NULL which caused crashes on OpenSolaris when using --debug
  Removed testing of 'new_db_name' as this is guranteed never NULL
sql/sql_show.cc:
  Fixed printf of NULL which caused crashes on OpenSolaris when using --debug
storage/csv/ha_tina.cc:
  Fixed realloc() problem that caused out of memory when running mysqldump.test on OpenSolaris
  (OpenSolaris default malloc() can't handle a lot of reallocs() of strings that are growing one byte at a time)
  This did speed up logging to cvs with a magnitude for large strings.
This commit is contained in:
Michael Widenius 2010-06-23 03:48:11 +03:00
parent cfbee9359c
commit 5a2f40d48a
7 changed files with 21 additions and 13 deletions

View File

@ -1441,6 +1441,7 @@ static void free_resources()
if (md_result_file && md_result_file != stdout) if (md_result_file && md_result_file != stdout)
my_fclose(md_result_file, MYF(0)); my_fclose(md_result_file, MYF(0));
my_free(opt_password, MYF(MY_ALLOW_ZERO_PTR)); my_free(opt_password, MYF(MY_ALLOW_ZERO_PTR));
my_free(current_host, MYF(MY_ALLOW_ZERO_PTR));
if (hash_inited(&ignore_table)) if (hash_inited(&ignore_table))
hash_free(&ignore_table); hash_free(&ignore_table);
if (extended_insert) if (extended_insert)
@ -4222,7 +4223,7 @@ static char *get_actual_table_name(const char *old_table_name, MEM_ROOT *root)
} }
mysql_free_result(table_res); mysql_free_result(table_res);
} }
DBUG_PRINT("exit", ("new_table_name: %s", name)); DBUG_PRINT("exit", ("new_table_name: %s", val_or_null(name)));
DBUG_RETURN(name); DBUG_RETURN(name);
} }
@ -4818,6 +4819,7 @@ static my_bool get_view_structure(char *table, char* db)
field= mysql_fetch_field_direct(table_res, 0); field= mysql_fetch_field_direct(table_res, 0);
if (strcmp(field->name, "View") != 0) if (strcmp(field->name, "View") != 0)
{ {
mysql_free_result(table_res);
switch_character_set_results(mysql, default_charset); switch_character_set_results(mysql, default_charset);
verbose_msg("-- It's base table, skipped\n"); verbose_msg("-- It's base table, skipped\n");
DBUG_RETURN(0); DBUG_RETURN(0);
@ -4827,8 +4829,10 @@ static my_bool get_view_structure(char *table, char* db)
if (path) if (path)
{ {
if (!(sql_file= open_sql_file_for_table(table, O_WRONLY))) if (!(sql_file= open_sql_file_for_table(table, O_WRONLY)))
{
mysql_free_result(table_res);
DBUG_RETURN(1); DBUG_RETURN(1);
}
write_header(sql_file, db); write_header(sql_file, db);
} }

View File

@ -541,7 +541,7 @@ public:
{ {
DBUG_ENTER("LogFile::open"); DBUG_ENTER("LogFile::open");
DBUG_PRINT("enter", ("dir: '%s', name: '%s'", DBUG_PRINT("enter", ("dir: '%s', name: '%s'",
dir, name)); val_or_null(dir), val_or_null(name)));
if (!name) if (!name)
{ {
m_file= stdout; m_file= stdout;

View File

@ -90,6 +90,9 @@
#define IF_WIN(A,B) (B) #define IF_WIN(A,B) (B)
#endif #endif
/* Make it easier to print null strings */
#define val_or_null(A) ((A) ? (const char*) (A) : "(null)")
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
#ifdef WITH_NDB_BINLOG #ifdef WITH_NDB_BINLOG
#define HAVE_NDB_BINLOG 1 #define HAVE_NDB_BINLOG 1

View File

@ -3865,7 +3865,8 @@ ha_find_files(THD *thd,const char *db,const char *path,
int error= 0; int error= 0;
DBUG_ENTER("ha_find_files"); DBUG_ENTER("ha_find_files");
DBUG_PRINT("enter", ("db: '%s' path: '%s' wild: '%s' dir: %d", DBUG_PRINT("enter", ("db: '%s' path: '%s' wild: '%s' dir: %d",
db, path, wild ? wild : "NULL", dir)); val_or_null(db), val_or_null(path),
val_or_null(wild), dir));
st_find_files_args args= {db, path, wild, dir, files}; st_find_files_args args= {db, path, wild, dir, files};
plugin_foreach(thd, find_files_handlerton, plugin_foreach(thd, find_files_handlerton,

View File

@ -1539,12 +1539,9 @@ bool mysql_change_db(THD *thd, const LEX_STRING *new_db_name, bool force_switch)
Security_context *sctx= thd->security_ctx; Security_context *sctx= thd->security_ctx;
ulong db_access= sctx->db_access; ulong db_access= sctx->db_access;
CHARSET_INFO *db_default_cl; CHARSET_INFO *db_default_cl;
DBUG_ENTER("mysql_change_db"); DBUG_ENTER("mysql_change_db");
DBUG_PRINT("enter",("name: '%s'", new_db_name->str));
if (new_db_name == NULL || if (new_db_name->length == 0)
new_db_name->length == 0)
{ {
if (force_switch) if (force_switch)
{ {
@ -1553,8 +1550,7 @@ bool mysql_change_db(THD *thd, const LEX_STRING *new_db_name, bool force_switch)
after loading stored program. The thing is that loading of stored after loading stored program. The thing is that loading of stored
program can happen when there is no current database. program can happen when there is no current database.
TODO: actually, new_db_name and new_db_name->str seem to be always In case of stored program, new_db_name->str == "" and
non-NULL. In case of stored program, new_db_name->str == "" and
new_db_name->length == 0. new_db_name->length == 0.
*/ */
@ -1569,6 +1565,7 @@ bool mysql_change_db(THD *thd, const LEX_STRING *new_db_name, bool force_switch)
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
} }
DBUG_PRINT("enter",("name: '%s'", new_db_name->str));
if (is_schema_db(new_db_name->str, new_db_name->length)) if (is_schema_db(new_db_name->str, new_db_name->length))
{ {

View File

@ -3563,9 +3563,9 @@ int fill_schema_schemata(THD *thd, TABLE_LIST *tables, COND *cond)
if (get_lookup_field_values(thd, cond, tables, &lookup_field_vals)) if (get_lookup_field_values(thd, cond, tables, &lookup_field_vals))
DBUG_RETURN(0); DBUG_RETURN(0);
DBUG_PRINT("INDEX VALUES",("db_name='%s', table_name='%s'", DBUG_PRINT("INDEX VALUES",("db_name: %s table_name: %s",
lookup_field_vals.db_value.str, val_or_null(lookup_field_vals.db_value.str),
lookup_field_vals.table_value.str)); val_or_null(lookup_field_vals.table_value.str)));
if (make_db_list(thd, &db_names, &lookup_field_vals, if (make_db_list(thd, &db_names, &lookup_field_vals,
&with_i_schema)) &with_i_schema))
DBUG_RETURN(1); DBUG_RETURN(1);

View File

@ -489,6 +489,9 @@ int ha_tina::encode_quote(uchar *buf)
ptr= attribute.ptr(); ptr= attribute.ptr();
end_ptr= attribute.length() + ptr; end_ptr= attribute.length() + ptr;
if (buffer.realloc(attribute.length()*2+2))
return 0; // Failure
buffer.append('"'); buffer.append('"');
while (ptr < end_ptr) while (ptr < end_ptr)