diff options
author | monty@mysql.com/nosik.monty.fi <> | 2007-08-02 07:49:29 +0300 |
---|---|---|
committer | monty@mysql.com/nosik.monty.fi <> | 2007-08-02 07:49:29 +0300 |
commit | 4f33d95fa3be042234a2cc8e351bdf52cea3376d (patch) | |
tree | 7bd722b93e8b1ca257eabf112b7b9ad29446e595 | |
parent | 96f90711a7fb6f6c33b56b0c6519e1f1a7226277 (diff) | |
download | mariadb-git-4f33d95fa3be042234a2cc8e351bdf52cea3376d.tar.gz |
Set --debug-check if one uses DBUG_PUSH in all clients
Fixed bug in query cache that made it impossible to run mysqld with --debug
Fixed memory leaks in mysqldump and mysqltest
Memory leaks associated with wrong usage of mysqltest is not fixed. To find these, run
mysql-test-run --debug mysqltest
-rw-r--r-- | client/mysql_upgrade.c | 1 | ||||
-rw-r--r-- | client/mysqlcheck.c | 1 | ||||
-rw-r--r-- | client/mysqldump.c | 56 | ||||
-rw-r--r-- | client/mysqlimport.c | 1 | ||||
-rw-r--r-- | client/mysqlshow.c | 1 | ||||
-rw-r--r-- | client/mysqlslap.c | 1 | ||||
-rw-r--r-- | client/mysqltest.c | 24 | ||||
-rw-r--r-- | dbug/dbug.c | 7 | ||||
-rw-r--r-- | mysys/my_init.c | 6 | ||||
-rw-r--r-- | sql/sql_cache.cc | 7 |
10 files changed, 72 insertions, 33 deletions
diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c index 6611a74ea7f..5da0235c913 100644 --- a/client/mysql_upgrade.c +++ b/client/mysql_upgrade.c @@ -218,6 +218,7 @@ get_one_option(int optid, const struct my_option *opt, case '#': DBUG_PUSH(argument ? argument : default_dbug_option); add_option= FALSE; + debug_check_flag= 1; break; case 'p': diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index 622975c51d5..ee8d5c0d6d3 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -310,6 +310,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; case '#': DBUG_PUSH(argument ? argument : "d:t:o"); + debug_check_flag= 1; break; #include <sslopt-case.h> case OPT_TABLES: diff --git a/client/mysqldump.c b/client/mysqldump.c index 60252be0910..c55ca4577b9 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -729,7 +729,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; case '#': DBUG_PUSH(argument ? argument : default_dbug_option); - debug_info_flag= 1; + debug_check_flag= 1; break; #include <sslopt-case.h> case 'V': print_version(); exit(0); @@ -2070,7 +2070,6 @@ static uint get_table_structure(char *table, char *db, char *table_type, int len; MYSQL_RES *result; MYSQL_ROW row; - DBUG_ENTER("get_table_structure"); DBUG_PRINT("enter", ("db: %s table: %s", db, table)); @@ -2472,6 +2471,7 @@ static uint get_table_structure(char *table, char *db, char *table_type, fprintf(sql_file, " (%s)",row[7]); /* Sub key */ check_io(sql_file); } + mysql_free_result(result); if (!opt_xml) { if (keynr) @@ -2813,7 +2813,7 @@ static void dump_table(char *table, char *db) /* The "table" could be a view. If so, we don't do anything here. */ - if (strcmp (table_type, "VIEW") == 0) + if (strcmp(table_type, "VIEW") == 0) DBUG_VOID_RETURN; /* Check --no-data flag */ @@ -2903,6 +2903,7 @@ static void dump_table(char *table, char *db) if (mysql_real_query(mysql, query_string.str, query_string.length)) { DB_error(mysql, "when executing 'SELECT INTO OUTFILE'"); + dynstr_free(&query_string); DBUG_VOID_RETURN; } } @@ -3257,8 +3258,8 @@ static void dump_table(char *table, char *db) check_io(md_result_file); } mysql_free_result(res); - dynstr_free(&query_string); } + dynstr_free(&query_string); DBUG_VOID_RETURN; err: @@ -3379,6 +3380,7 @@ static int dump_tablespaces(char* ts_where) char extra_format[]= "UNDO_BUFFER_SIZE="; char *ubs; char *endsemi; + DBUG_ENTER("dump_tablespaces"); init_dynamic_string_checked(&sqlbuf, "SELECT LOGFILE_GROUP_NAME," @@ -3410,6 +3412,7 @@ static int dump_tablespaces(char* ts_where) if (mysql_query(mysql, sqlbuf.str) || !(tableres = mysql_store_result(mysql))) { + dynstr_free(&sqlbuf); if (mysql_errno(mysql) == ER_BAD_TABLE_ERROR || mysql_errno(mysql) == ER_BAD_DB_ERROR || mysql_errno(mysql) == ER_UNKNOWN_TABLE) @@ -3418,12 +3421,12 @@ static int dump_tablespaces(char* ts_where) "\n--\n-- Not dumping tablespaces as no INFORMATION_SCHEMA.FILES" " table on this server\n--\n"); check_io(md_result_file); - return 0; + DBUG_RETURN(0); } - my_printf_error(0, "Error: Couldn't dump tablespaces %s", + my_printf_error(0, "Error: '%s' when trying to dump tablespaces", MYF(0), mysql_error(mysql)); - return 1; + DBUG_RETURN(1); } buf[0]= 0; @@ -3475,6 +3478,7 @@ static int dump_tablespaces(char* ts_where) } } dynstr_free(&sqlbuf); + mysql_free_result(tableres); init_dynamic_string_checked(&sqlbuf, "SELECT DISTINCT TABLESPACE_NAME," " FILE_NAME," @@ -3492,7 +3496,10 @@ static int dump_tablespaces(char* ts_where) dynstr_append_checked(&sqlbuf, " ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME"); if (mysql_query_with_error_report(mysql, &tableres, sqlbuf.str)) - return 1; + { + dynstr_free(&sqlbuf); + DBUG_RETURN(1); + } buf[0]= 0; while ((row= mysql_fetch_row(tableres))) @@ -3538,8 +3545,9 @@ static int dump_tablespaces(char* ts_where) } } + mysql_free_result(tableres); dynstr_free(&sqlbuf); - return 0; + DBUG_RETURN(0); } static int dump_all_databases() @@ -3626,8 +3634,11 @@ RETURN VALUES 0 Success. 1 Failure. */ + int init_dumping_tables(char *qdatabase) { + DBUG_ENTER("init_dumping_tables"); + if (!opt_create_db) { char qbuf[256]; @@ -3660,10 +3671,10 @@ int init_dumping_tables(char *qdatabase) { fprintf(md_result_file,"\n%s;\n",row[1]); } + mysql_free_result(dbinfo); } } - - return 0; + DBUG_RETURN(0); } /* init_dumping_tables */ @@ -3931,8 +3942,13 @@ static int dump_selected_tables(char *db, char **table_names, int tables) } else { - maybe_die(EX_ILLEGAL_TABLE, "Couldn't find table: \"%s\"", *table_names); - /* We shall countinue here, if --force was given */ + if (!ignore_errors) + { + dynstr_free(&lock_tables_query); + free_root(&root, MYF(0)); + } + maybe_die(EX_ILLEGAL_TABLE, "Couldn't find table: \"%s\"", *table_names); + /* We shall countinue here, if --force was given */ } } end= pos; @@ -3941,14 +3957,25 @@ static int dump_selected_tables(char *db, char **table_names, int tables) { if (mysql_real_query(mysql, lock_tables_query.str, lock_tables_query.length-1)) + { + if (!ignore_errors) + { + dynstr_free(&lock_tables_query); + free_root(&root, MYF(0)); + } DB_error(mysql, "when doing LOCK TABLES"); /* We shall countinue here, if --force was given */ + } } dynstr_free(&lock_tables_query); if (flush_logs) { if (mysql_refresh(mysql, REFRESH_LOG)) + { + if (!ignore_errors) + free_root(&root, MYF(0)); DB_error(mysql, "when doing refresh"); + } /* We shall countinue here, if --force was given */ } if (opt_xml) @@ -4511,6 +4538,9 @@ static my_bool get_view_structure(char *table, char* db) if (!(table_res= mysql_store_result(mysql)) || !(row= mysql_fetch_row(table_res))) { + if (table_res) + mysql_free_result(table_res); + dynstr_free(&ds_view); DB_error(mysql, "when trying to save the result of SHOW CREATE TABLE in ds_view."); DBUG_RETURN(1); } diff --git a/client/mysqlimport.c b/client/mysqlimport.c index b09ae7a172a..afd9454d6be 100644 --- a/client/mysqlimport.c +++ b/client/mysqlimport.c @@ -240,6 +240,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; case '#': DBUG_PUSH(argument ? argument : "d:t:o"); + debug_check_flag= 1; break; #include <sslopt-case.h> case 'V': print_version(); exit(0); diff --git a/client/mysqlshow.c b/client/mysqlshow.c index fb89589f3e1..a7f6cadf450 100644 --- a/client/mysqlshow.c +++ b/client/mysqlshow.c @@ -299,6 +299,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; case '#': DBUG_PUSH(argument ? argument : "d:t:o"); + debug_check_flag= 1; break; #include <sslopt-case.h> case 'V': diff --git a/client/mysqlslap.c b/client/mysqlslap.c index 33173858228..709b70a9952 100644 --- a/client/mysqlslap.c +++ b/client/mysqlslap.c @@ -699,6 +699,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; case '#': DBUG_PUSH(argument ? argument : default_dbug_option); + debug_check_flag= 1; break; #include <sslopt-case.h> case 'V': diff --git a/client/mysqltest.c b/client/mysqltest.c index cbe34bb6690..7ba57f7515c 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -809,10 +809,9 @@ void free_used_memory() static void cleanup_and_exit(int exit_code) { free_used_memory(); - my_end(my_end_arg | MY_CHECK_ERROR); + my_end(my_end_arg); - if (!silent) - { + if (!silent) { switch (exit_code) { case 1: printf("not ok\n"); @@ -1085,8 +1084,7 @@ void check_result(DYNAMIC_STRING* ds) DBUG_ENTER("check_result"); DBUG_ASSERT(result_file_name); - switch (dyn_string_cmp(ds, result_file_name)) - { + switch (dyn_string_cmp(ds, result_file_name)) { case RESULT_OK: break; /* ok */ case RESULT_LENGTH_MISMATCH: @@ -1930,7 +1928,10 @@ void do_exec(struct st_command *command) command->first_argument, ds_cmd.str)); if (!(res_file= my_popen(&ds_cmd, "r")) && command->abort_on_error) + { + dynstr_free(&ds_cmd); die("popen(\"%s\", \"r\") failed", command->first_argument); + } while (fgets(buf, sizeof(buf), res_file)) { @@ -1954,6 +1955,7 @@ void do_exec(struct st_command *command) { log_msg("exec of '%s failed, error: %d, status: %d, errno: %d", ds_cmd.str, error, status, errno); + dynstr_free(&ds_cmd); die("command \"%s\" failed", command->first_argument); } @@ -1972,8 +1974,11 @@ void do_exec(struct st_command *command) } } if (!ok) + { + dynstr_free(&ds_cmd); die("command \"%s\" failed with wrong error: %d", command->first_argument, status); + } } else if (command->expected_errors.err[0].type == ERR_ERRNO && command->expected_errors.err[0].code.errnum != 0) @@ -1981,6 +1986,7 @@ void do_exec(struct st_command *command) /* Error code we wanted was != 0, i.e. not an expected success */ log_msg("exec of '%s failed, error: %d, errno: %d", ds_cmd.str, error, errno); + dynstr_free(&ds_cmd); die("command \"%s\" succeeded - should have failed with errno %d...", command->first_argument, command->expected_errors.err[0].code.errnum); } @@ -4632,6 +4638,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), case '#': #ifndef DBUG_OFF DBUG_PUSH(argument ? argument : "d:t:S:i:O,/tmp/mysqltest.trace"); + debug_check_flag= 1; #endif break; case 'r': @@ -5388,11 +5395,8 @@ end: ds - dynamic string which is used for output buffer NOTE - If there is an unexpected error this function will abort mysqltest - immediately. - - RETURN VALUE - error - function will not return + If there is an unexpected error this function will abort mysqltest + immediately. */ void handle_error(struct st_command *command, diff --git a/dbug/dbug.c b/dbug/dbug.c index 83c9ea37de1..9d638c299d3 100644 --- a/dbug/dbug.c +++ b/dbug/dbug.c @@ -1184,7 +1184,7 @@ void _db_dump_(uint _line_, const char *keyword, fprintf(cs->stack->out_file, "%s: ", cs->func); } sprintf(dbuff,"%s: Memory: 0x%lx Bytes: (%ld)\n", - keyword,(ulong) memory, length); + keyword, (ulong) memory, (long) length); (void) fputs(dbuff,cs->stack->out_file); pos=0; @@ -1449,6 +1449,7 @@ static void FreeState(CODE_STATE *cs, struct settings *state, int free_state) FreeList(state->p_functions); if (!is_shared(state, out_file)) DBUGCloseFile(cs, state->out_file); + (void) fflush(cs->stack->out_file); if (state->prof_file) DBUGCloseFile(cs, state->prof_file); if (free_state) @@ -1882,7 +1883,6 @@ static FILE *OpenProfile(CODE_STATE *cs, const char *name) { (void) fprintf(cs->stack->out_file, ERR_OPEN, cs->process, name); perror(""); - dbug_flush(0); (void) Delay(cs->stack->delay); } else @@ -1892,7 +1892,6 @@ static FILE *OpenProfile(CODE_STATE *cs, const char *name) { (void) fprintf(cs->stack->out_file, ERR_OPEN, cs->process, name); perror(""); - dbug_flush(0); } else { @@ -1931,7 +1930,7 @@ static void DBUGCloseFile(CODE_STATE *cs, FILE *fp) pthread_mutex_lock(&THR_LOCK_dbug); (void) fprintf(cs->stack->out_file, ERR_CLOSE, cs->process); perror(""); - dbug_flush(0); + dbug_flush(cs); } } diff --git a/mysys/my_init.c b/mysys/my_init.c index 127e94c958b..257edb351b4 100644 --- a/mysys/my_init.c +++ b/mysys/my_init.c @@ -134,14 +134,14 @@ void my_end(int infoflag) We do not use DBUG_ENTER here, as after cleanup DBUG is no longer operational, so we cannot use DBUG_RETURN. */ - DBUG_PRINT("info",("Shutting down")); + DBUG_PRINT("info",("Shutting down: infoflag: %d print_info: %d", + infoflag, print_info)); if (!info_file) { info_file= stderr; print_info= 0; } - DBUG_PRINT("info",("Shutting down: print_info: %d", print_info)); if ((infoflag & MY_CHECK_ERROR) || print_info) { /* Test if some file is left open */ @@ -186,7 +186,7 @@ Voluntary context switches %ld, Involuntary context switches %ld\n", fprintf(info_file,"\nRun time: %.1f\n",(double) clock()/CLOCKS_PER_SEC); #endif #if defined(SAFEMALLOC) - TERMINATE(stderr, 1); /* Give statistic on screen */ + TERMINATE(stderr, (infoflag & MY_GIVE_INFO) != 0); #elif defined(__WIN__) && defined(_MSC_VER) _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE ); _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR ); diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index cab9ef94d6d..ea73046ff17 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -862,6 +862,7 @@ Query_cache::Query_cache(ulong query_cache_limit_arg, ulong Query_cache::resize(ulong query_cache_size_arg) { + ulong new_query_cache_size; DBUG_ENTER("Query_cache::resize"); DBUG_PRINT("qcache", ("from %lu to %lu",query_cache_size, query_cache_size_arg)); @@ -876,13 +877,13 @@ ulong Query_cache::resize(ulong query_cache_size_arg) free_cache(); query_cache_size= query_cache_size_arg; - ulong new_query_cache_size= init_cache(); - - DBUG_EXECUTE("check_querycache",check_integrity(0);); + new_query_cache_size= init_cache(); STRUCT_LOCK(&structure_guard_mutex); m_cache_status= Query_cache::NO_FLUSH_IN_PROGRESS; pthread_cond_signal(&COND_cache_status_changed); + if (new_query_cache_size) + DBUG_EXECUTE("check_querycache",check_integrity(1);); STRUCT_UNLOCK(&structure_guard_mutex); DBUG_RETURN(new_query_cache_size); |