Commit dbba17da authored by Luis Soares's avatar Luis Soares

DBUG_PRINT in solaris does not work well with NULL parameters.

HA_ERR was returning 0 (null string) when no error happened 
(error=0). Since HA_ERR is used in DBUG_PRINT, regardless there 
was an error or not, the server could crash in solaris debug
builds.

We fix this by:

  - deploying an assertion that ensures that the function 
    is not called when no error has happened;
  - making sure that HA_ERR is only called when an error 
    happened;
  - making HA_ERR return "No Error", instead of 0, for 
    non-debug builds if it is called when no error happened.

This will make HA_ERR return values to work with DBUG_PRINT on
solaris debug builds.
parent ce8077d8
...@@ -59,6 +59,11 @@ static int rows_event_stmt_cleanup(Relay_log_info const *rli, THD* thd); ...@@ -59,6 +59,11 @@ static int rows_event_stmt_cleanup(Relay_log_info const *rli, THD* thd);
static const char *HA_ERR(int i) static const char *HA_ERR(int i)
{ {
/*
This function should only be called in case of an error
was detected
*/
DBUG_ASSERT(i != 0);
switch (i) { switch (i) {
case HA_ERR_KEY_NOT_FOUND: return "HA_ERR_KEY_NOT_FOUND"; case HA_ERR_KEY_NOT_FOUND: return "HA_ERR_KEY_NOT_FOUND";
case HA_ERR_FOUND_DUPP_KEY: return "HA_ERR_FOUND_DUPP_KEY"; case HA_ERR_FOUND_DUPP_KEY: return "HA_ERR_FOUND_DUPP_KEY";
...@@ -111,7 +116,7 @@ static const char *HA_ERR(int i) ...@@ -111,7 +116,7 @@ static const char *HA_ERR(int i)
case HA_ERR_CORRUPT_EVENT: return "HA_ERR_CORRUPT_EVENT"; case HA_ERR_CORRUPT_EVENT: return "HA_ERR_CORRUPT_EVENT";
case HA_ERR_ROWS_EVENT_APPLY : return "HA_ERR_ROWS_EVENT_APPLY"; case HA_ERR_ROWS_EVENT_APPLY : return "HA_ERR_ROWS_EVENT_APPLY";
} }
return 0; return "No Error!";
} }
/** /**
...@@ -132,7 +137,7 @@ static void inline slave_rows_error_report(enum loglevel level, int ha_error, ...@@ -132,7 +137,7 @@ static void inline slave_rows_error_report(enum loglevel level, int ha_error,
TABLE *table, const char * type, TABLE *table, const char * type,
const char *log_name, ulong pos) const char *log_name, ulong pos)
{ {
const char *handler_error= HA_ERR(ha_error); const char *handler_error= (ha_error ? HA_ERR(ha_error) : NULL);
char buff[MAX_SLAVE_ERRMSG], *slider; char buff[MAX_SLAVE_ERRMSG], *slider;
const char *buff_end= buff + sizeof(buff); const char *buff_end= buff + sizeof(buff);
uint len; uint len;
...@@ -7596,6 +7601,7 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli) ...@@ -7596,6 +7601,7 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli)
error= do_exec_row(rli); error= do_exec_row(rli);
if (error)
DBUG_PRINT("info", ("error: %s", HA_ERR(error))); DBUG_PRINT("info", ("error: %s", HA_ERR(error)));
DBUG_ASSERT(error != HA_ERR_RECORD_DELETED); DBUG_ASSERT(error != HA_ERR_RECORD_DELETED);
...@@ -9344,6 +9350,7 @@ int Rows_log_event::find_row(const Relay_log_info *rli) ...@@ -9344,6 +9350,7 @@ int Rows_log_event::find_row(const Relay_log_info *rli)
restart_rnd_next: restart_rnd_next:
error= table->file->rnd_next(table->record[0]); error= table->file->rnd_next(table->record[0]);
if (error)
DBUG_PRINT("info", ("error: %s", HA_ERR(error))); DBUG_PRINT("info", ("error: %s", HA_ERR(error)));
switch (error) { switch (error) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment