summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/mysql_priv.h1
-rw-r--r--sql/mysqld.cc25
-rw-r--r--sql/repl_failsafe.cc2
-rw-r--r--sql/repl_failsafe.h2
-rw-r--r--sql/rpl_handler.cc10
-rw-r--r--sql/rpl_mi.cc23
-rw-r--r--sql/rpl_mi.h4
-rw-r--r--sql/rpl_rli.cc2
-rw-r--r--sql/share/errmsg-utf8.txt4
-rw-r--r--sql/slave.cc18
-rw-r--r--sql/sql_base.cc2
-rw-r--r--sql/sql_class.cc6
-rw-r--r--sql/sql_lex.cc2
-rw-r--r--sql/sql_lex.h14
-rw-r--r--sql/sql_repl.cc6
-rw-r--r--sql/sql_select.cc2
-rw-r--r--sql/sql_table.cc2
-rw-r--r--sql/sql_yacc.yy4
-rw-r--r--sql/sys_vars.cc6
19 files changed, 77 insertions, 58 deletions
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 944bc9d4cdd..8daf8f5ecb3 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -235,6 +235,7 @@ typedef struct my_locale_errmsgs
extern char err_shared_dir[];
+/** @note Keep this a POD-type because we use offsetof() on it */
typedef struct my_locale_st
{
uint number;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 75ab43fe701..983f1750a38 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -932,8 +932,6 @@ static bool add_terminator(DYNAMIC_ARRAY *options);
extern "C" my_bool mysqld_get_one_option(int, const struct my_option *, char *);
static void set_server_version(void);
static int init_thread_environment();
-static void init_error_log_mutex();
-static void clean_up_error_log_mutex();
static char *get_relative_path(const char *path);
static int fix_paths(void);
void handle_connections_sockets();
@@ -1350,6 +1348,18 @@ extern "C" sig_handler print_signal_warning(int sig)
#ifndef EMBEDDED_LIBRARY
+static void init_error_log_mutex()
+{
+ mysql_mutex_init(key_LOCK_error_log, &LOCK_error_log, MY_MUTEX_INIT_FAST);
+}
+
+
+static void clean_up_error_log_mutex()
+{
+ mysql_mutex_destroy(&LOCK_error_log);
+}
+
+
/**
cleanup all memory and end program nicely.
@@ -3364,7 +3374,7 @@ static int init_common_variables()
set the def_value member to 0 in my_long_options and initialize it
to the correct value here.
*/
- default_storage_engine="MyISAM";
+ default_storage_engine= const_cast<char *>("MyISAM");
/*
Add server status variables to the dynamic list of
@@ -3705,15 +3715,6 @@ You should consider changing lower_case_table_names to 1 or 2",
return 0;
}
-static void init_error_log_mutex()
-{
- mysql_mutex_init(key_LOCK_error_log, &LOCK_error_log, MY_MUTEX_INIT_FAST);
-}
-
-static void clean_up_error_log_mutex()
-{
- mysql_mutex_destroy(&LOCK_error_log);
-}
static int init_thread_environment()
{
diff --git a/sql/repl_failsafe.cc b/sql/repl_failsafe.cc
index 5bf87dea90e..29443eb6e65 100644
--- a/sql/repl_failsafe.cc
+++ b/sql/repl_failsafe.cc
@@ -38,7 +38,7 @@
#define SLAVE_ERRMSG_SIZE (FN_REFLEN+64)
-uint rpl_status=RPL_NULL;
+RPL_STATUS rpl_status=RPL_NULL;
mysql_mutex_t LOCK_rpl_status;
mysql_cond_t COND_rpl_status;
HASH slave_list;
diff --git a/sql/repl_failsafe.h b/sql/repl_failsafe.h
index dd6770be0b4..94b151aaee7 100644
--- a/sql/repl_failsafe.h
+++ b/sql/repl_failsafe.h
@@ -26,7 +26,7 @@ typedef enum {RPL_AUTH_MASTER=0,RPL_IDLE_SLAVE,RPL_ACTIVE_SLAVE,
RPL_LOST_SOLDIER,RPL_TROOP_SOLDIER,
RPL_RECOVERY_CAPTAIN,RPL_NULL /* inactive */,
RPL_ANY /* wild card used by change_rpl_status */ } RPL_STATUS;
-extern uint rpl_status;
+extern RPL_STATUS rpl_status;
extern mysql_mutex_t LOCK_rpl_status;
extern mysql_cond_t COND_rpl_status;
diff --git a/sql/rpl_handler.cc b/sql/rpl_handler.cc
index ebd6e4e0c0b..5a406866513 100644
--- a/sql/rpl_handler.cc
+++ b/sql/rpl_handler.cc
@@ -190,8 +190,8 @@ int Trans_delegate::after_commit(THD *thd, bool all)
{
Trans_param param;
bool is_real_trans= (all || thd->transaction.all.ha_list == 0);
- if (is_real_trans)
- param.flags |= TRANS_IS_REAL_TRANS;
+
+ param.flags = is_real_trans ? TRANS_IS_REAL_TRANS : 0;
Trans_binlog_info *log_info=
my_pthread_getspecific_ptr(Trans_binlog_info*, RPL_TRANS_BINLOG_INFO);
@@ -218,8 +218,8 @@ int Trans_delegate::after_rollback(THD *thd, bool all)
{
Trans_param param;
bool is_real_trans= (all || thd->transaction.all.ha_list == 0);
- if (is_real_trans)
- param.flags |= TRANS_IS_REAL_TRANS;
+
+ param.flags = is_real_trans ? TRANS_IS_REAL_TRANS : 0;
Trans_binlog_info *log_info=
my_pthread_getspecific_ptr(Trans_binlog_info*, RPL_TRANS_BINLOG_INFO);
@@ -228,7 +228,7 @@ int Trans_delegate::after_rollback(THD *thd, bool all)
param.log_pos= log_info ? log_info->log_pos : 0;
int ret= 0;
- FOREACH_OBSERVER(ret, after_commit, thd, (&param));
+ FOREACH_OBSERVER(ret, after_rollback, thd, (&param));
/*
This is the end of a real transaction or autocommit statement, we
diff --git a/sql/rpl_mi.cc b/sql/rpl_mi.cc
index 38382fd2a0e..7dad340cfa6 100644
--- a/sql/rpl_mi.cc
+++ b/sql/rpl_mi.cc
@@ -33,8 +33,8 @@ int init_dynarray_intvar_from_file(DYNAMIC_ARRAY* arr, IO_CACHE* f);
Master_info::Master_info(bool is_slave_recovery)
:Slave_reporting_capability("I/O"),
ssl(0), ssl_verify_server_cert(0), fd(-1), io_thd(0),
- port(MYSQL_PORT), connect_retry(DEFAULT_CONNECT_RETRY), inited(0),
- rli(is_slave_recovery), abort_slave(0),
+ rli(is_slave_recovery), port(MYSQL_PORT),
+ connect_retry(DEFAULT_CONNECT_RETRY), inited(0), abort_slave(0),
slave_running(0), slave_run_id(0), sync_counter(0),
heartbeat_period(0), received_heartbeats(0), master_id(0)
{
@@ -369,7 +369,7 @@ file '%s')", fname);
mi->rli.is_relay_log_recovery= FALSE;
// now change cache READ -> WRITE - must do this before flush_master_info
reinit_io_cache(&mi->file, WRITE_CACHE, 0L, 0, 1);
- if ((error=test(flush_master_info(mi, 1))))
+ if ((error=test(flush_master_info(mi, TRUE, TRUE))))
sql_print_error("Failed to flush master info file");
mysql_mutex_unlock(&mi->data_lock);
DBUG_RETURN(error);
@@ -395,7 +395,9 @@ err:
1 - flush master info failed
0 - all ok
*/
-int flush_master_info(Master_info* mi, bool flush_relay_log_cache)
+int flush_master_info(Master_info* mi,
+ bool flush_relay_log_cache,
+ bool need_lock_relay_log)
{
IO_CACHE* file = &mi->file;
char lbuf[22];
@@ -418,8 +420,19 @@ int flush_master_info(Master_info* mi, bool flush_relay_log_cache)
*/
if (flush_relay_log_cache)
{
+ mysql_mutex_t *log_lock= mi->rli.relay_log.get_log_lock();
IO_CACHE *log_file= mi->rli.relay_log.get_log_file();
- if (flush_io_cache(log_file))
+
+ if (need_lock_relay_log)
+ mysql_mutex_lock(log_lock);
+
+ mysql_mutex_assert_owner(log_lock);
+ err= flush_io_cache(log_file);
+
+ if (need_lock_relay_log)
+ mysql_mutex_unlock(log_lock);
+
+ if (err)
DBUG_RETURN(2);
}
diff --git a/sql/rpl_mi.h b/sql/rpl_mi.h
index 6dd9fab7904..c4ca5714306 100644
--- a/sql/rpl_mi.h
+++ b/sql/rpl_mi.h
@@ -119,7 +119,9 @@ int init_master_info(Master_info* mi, const char* master_info_fname,
bool abort_if_no_master_info_file,
int thread_mask);
void end_master_info(Master_info* mi);
-int flush_master_info(Master_info* mi, bool flush_relay_log_cache);
+int flush_master_info(Master_info* mi,
+ bool flush_relay_log_cache,
+ bool need_lock_relay_log);
int change_master_server_id_cmp(ulong *id1, ulong *id2);
#endif /* HAVE_REPLICATION */
diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc
index a982cfd25a4..1b3c25dfda2 100644
--- a/sql/rpl_rli.cc
+++ b/sql/rpl_rli.cc
@@ -123,7 +123,7 @@ int init_relay_log_info(Relay_log_info* rli,
/*
The relay log will now be opened, as a SEQ_READ_APPEND IO_CACHE.
Note that the I/O thread flushes it to disk after writing every
- event, in flush_master_info(mi, 1).
+ event, in flush_master_info(mi, 1, ?).
*/
/*
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt
index 33a68f1489e..6591f9d5cb7 100644
--- a/sql/share/errmsg-utf8.txt
+++ b/sql/share/errmsg-utf8.txt
@@ -6280,8 +6280,8 @@ ER_BINLOG_UNSAFE_INSERT_DELAYED
eng "Statement uses INSERT DELAYED. This is unsafe because the time when rows are inserted cannot be predicted."
ER_BINLOG_UNSAFE_SYSTEM_TABLE
eng "Statement uses the general_log, slow_log or performance_schema table(s). This is unsafe because system tables may differ on slave."
-ER_BINLOG_UNSAFE_TWO_AUTOINC_COLUMNS
- eng "Statement updates two AUTO_INCREMENT columns. This is unsafe because the generated value cannot be predicted by slave."
+ER_BINLOG_UNSAFE_AUTOINC_COLUMNS
+ eng "Statement invokes a trigger or a stored function that inserts into AUTO_INCREMENT column which is unsafe to binlog in STATEMENT format because slave may execute it non-deterministically."
ER_BINLOG_UNSAFE_UDF
eng "Statement uses a UDF. It cannot be determined if the UDF will return the same value on slave."
ER_BINLOG_UNSAFE_SYSTEM_VARIABLE
diff --git a/sql/slave.cc b/sql/slave.cc
index a4f16f6ed28..c7469d41a26 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -510,7 +510,7 @@ int terminate_slave_threads(Master_info* mi,int thread_mask,bool skip_lock)
DBUG_PRINT("info",("Flushing relay log and master info file."));
if (current_thd)
thd_proc_info(current_thd, "Flushing relay log and master info files.");
- if (flush_master_info(mi, TRUE /* flush relay log */))
+ if (flush_master_info(mi, TRUE, FALSE))
DBUG_RETURN(ER_ERROR_DURING_FLUSH_LOGS);
if (my_sync(mi->rli.relay_log.get_log_file()->file, MYF(MY_WME)))
@@ -1111,7 +1111,7 @@ int init_dynarray_intvar_from_file(DYNAMIC_ARRAY* arr, IO_CACHE* f)
memcpy(buf_act, buf, read_size);
snd_size= my_b_gets(f, buf_act + read_size, max_size - read_size);
if (snd_size == 0 ||
- (snd_size + 1 == max_size - read_size) && buf[max_size - 2] != '\n')
+ ((snd_size + 1 == max_size - read_size) && buf[max_size - 2] != '\n'))
{
/*
failure to make the 2nd read or short read again
@@ -1601,7 +1601,7 @@ static void write_ignored_events_info_to_relay_log(THD *thd, Master_info *mi)
" to the relay log, SHOW SLAVE STATUS may be"
" inaccurate");
rli->relay_log.harvest_bytes_written(&rli->log_space_total);
- if (flush_master_info(mi, 1))
+ if (flush_master_info(mi, TRUE, FALSE))
sql_print_error("Failed to flush master info file");
delete ev;
}
@@ -2928,7 +2928,7 @@ Stopping slave I/O thread due to out-of-memory error from master");
goto err;
}
- if (flush_master_info(mi, 1))
+ if (flush_master_info(mi, TRUE, TRUE))
{
sql_print_error("Failed to flush master info file");
goto err;
@@ -3943,8 +3943,8 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
/* everything is filtered out from non-master */
(s_id != mi->master_id ||
/* for the master meta information is necessary */
- buf[EVENT_TYPE_OFFSET] != FORMAT_DESCRIPTION_EVENT &&
- buf[EVENT_TYPE_OFFSET] != ROTATE_EVENT)))
+ (buf[EVENT_TYPE_OFFSET] != FORMAT_DESCRIPTION_EVENT &&
+ buf[EVENT_TYPE_OFFSET] != ROTATE_EVENT))))
{
/*
Do not write it to the relay log.
@@ -3964,9 +3964,9 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
as well as rli->group_relay_log_pos.
*/
if (!(s_id == ::server_id && !mi->rli.replicate_same_server_id) ||
- buf[EVENT_TYPE_OFFSET] != FORMAT_DESCRIPTION_EVENT &&
- buf[EVENT_TYPE_OFFSET] != ROTATE_EVENT &&
- buf[EVENT_TYPE_OFFSET] != STOP_EVENT)
+ (buf[EVENT_TYPE_OFFSET] != FORMAT_DESCRIPTION_EVENT &&
+ buf[EVENT_TYPE_OFFSET] != ROTATE_EVENT &&
+ buf[EVENT_TYPE_OFFSET] != STOP_EVENT))
{
mi->master_log_pos+= inc_pos;
memcpy(rli->ign_master_log_name_end, mi->master_log_name, FN_REFLEN);
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index eb59600b360..e7f014d39a5 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -5181,7 +5181,7 @@ int lock_tables(THD *thd, TABLE_LIST *tables, uint count, bool *need_reopen)
if (thd->variables.binlog_format != BINLOG_FORMAT_ROW && tables &&
has_write_table_with_auto_increment(thd->lex->first_not_own_table()))
{
- thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_TWO_AUTOINC_COLUMNS);
+ thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_AUTOINC_COLUMNS);
thd->set_current_stmt_binlog_format_row_if_mixed();
}
}
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index e8a00974a56..527b84a795c 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -3536,7 +3536,7 @@ int THD::decide_logging_format(TABLE_LIST *tables)
{
DBUG_ENTER("THD::decide_logging_format");
DBUG_PRINT("info", ("query: %s", query()));
- DBUG_PRINT("info", ("variables.binlog_format: %ld",
+ DBUG_PRINT("info", ("variables.binlog_format: %u",
variables.binlog_format));
DBUG_PRINT("info", ("lex->get_stmt_unsafe_flags(): 0x%x",
lex->get_stmt_unsafe_flags()));
@@ -3677,7 +3677,7 @@ int THD::decide_logging_format(TABLE_LIST *tables)
lock history on the slave will be different from the master.
*/
if (mixed_engine ||
- trans_has_updated_trans_table(this) && !all_trans_engines)
+ (trans_has_updated_trans_table(this) && !all_trans_engines))
lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_NONTRANS_AFTER_TRANS);
DBUG_PRINT("info", ("flags_all_set: 0x%llx", flags_all_set));
@@ -3807,7 +3807,7 @@ int THD::decide_logging_format(TABLE_LIST *tables)
DBUG_PRINT("info", ("decision: no logging since "
"mysql_bin_log.is_open() = %d "
"and (options & OPTION_BIN_LOG) = 0x%llx "
- "and binlog_format = %ld "
+ "and binlog_format = %u "
"and binlog_filter->db_ok(db) = %d",
mysql_bin_log.is_open(),
(variables.option_bits & OPTION_BIN_LOG),
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 0d423ba85eb..6da734592dc 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -48,7 +48,7 @@ Query_tables_list::binlog_stmt_unsafe_errcode[BINLOG_STMT_UNSAFE_COUNT] =
ER_BINLOG_UNSAFE_LIMIT,
ER_BINLOG_UNSAFE_INSERT_DELAYED,
ER_BINLOG_UNSAFE_SYSTEM_TABLE,
- ER_BINLOG_UNSAFE_TWO_AUTOINC_COLUMNS,
+ ER_BINLOG_UNSAFE_AUTOINC_COLUMNS,
ER_BINLOG_UNSAFE_UDF,
ER_BINLOG_UNSAFE_SYSTEM_VARIABLE,
ER_BINLOG_UNSAFE_SYSTEM_FUNCTION,
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 7eb72bc5358..80cb1e0f210 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -1101,13 +1101,15 @@ public:
*/
BINLOG_STMT_UNSAFE_SYSTEM_TABLE,
/**
- Update of two autoincrement columns is unsafe. With one
- autoincrement column, we store the counter in the binlog so that
- slave can restore the correct value. But we can only store one
- such counter per statement, so updating more than one
- autoincrement column is not safe.
+ Inserting into an autoincrement column in a stored routine is unsafe.
+ Even with just one autoincrement column, if the routine is invoked more than
+ once slave is not guaranteed to execute the statement graph same way as
+ the master.
+ And since it's impossible to estimate how many times a routine can be invoked at
+ the query pre-execution phase (see lock_tables), the statement is marked
+ pessimistically unsafe.
*/
- BINLOG_STMT_UNSAFE_TWO_AUTOINC_COLUMNS,
+ BINLOG_STMT_UNSAFE_AUTOINC_COLUMNS,
/**
Using a UDF (user-defined function) is unsafe.
*/
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc
index 436e979df1e..510f9d8dc01 100644
--- a/sql/sql_repl.cc
+++ b/sql/sql_repl.cc
@@ -828,11 +828,11 @@ impossible position";
{
if (coord)
{
- DBUG_ASSERT(heartbeat_ts && heartbeat_period != LL(0));
+ DBUG_ASSERT(heartbeat_ts && heartbeat_period != 0);
set_timespec_nsec(*heartbeat_ts, heartbeat_period);
}
ret= mysql_bin_log.wait_for_update_bin_log(thd, heartbeat_ts);
- DBUG_ASSERT(ret == 0 || heartbeat_period != LL(0) && coord != NULL);
+ DBUG_ASSERT(ret == 0 || (heartbeat_period != 0 && coord != NULL));
if (ret == ETIMEDOUT || ret == ETIME)
{
#ifndef DBUG_OFF
@@ -1525,7 +1525,7 @@ bool change_master(THD* thd, Master_info* mi)
Relay log's IO_CACHE may not be inited, if rli->inited==0 (server was never
a slave before).
*/
- if (flush_master_info(mi, 0))
+ if (flush_master_info(mi, FALSE, FALSE))
{
my_error(ER_RELAY_LOG_INIT, MYF(0), "Failed to flush master info file");
ret= TRUE;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index bddfbb1bd0b..18954e0cf23 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -4392,7 +4392,7 @@ best_access_path(JOIN *join,
*/
if (table->quick_keys.is_set(key) &&
(const_part & ((1 << table->quick_key_parts[key])-1)) ==
- ((1 << table->quick_key_parts[key])-1) &&
+ (((key_part_map)1 << table->quick_key_parts[key])-1) &&
table->quick_n_ranges[key] == 1 &&
records > (double) table->quick_rows[key])
{
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index f323b99dfed..e623d1d5c45 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -6550,7 +6550,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
thd->clear_error();
Query_log_event qinfo(thd, thd->query(), thd->query_length(),
FALSE, TRUE, FALSE, 0);
- if (error= mysql_bin_log.write(&qinfo))
+ if ((error= mysql_bin_log.write(&qinfo)))
goto view_err_unlock;
}
my_ok(thd);
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 5e900b69aa3..0b0ca2e6215 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -9247,8 +9247,8 @@ table_factor:
lex->pop_context();
lex->nest_level--;
}
- else if ($3->select_lex &&
- $3->select_lex->master_unit()->is_union() || $5)
+ else if (($3->select_lex &&
+ $3->select_lex->master_unit()->is_union()) || $5)
{
/* simple nested joins cannot have aliases or unions */
my_parse_error(ER(ER_SYNTAX_ERROR));
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index fe3114c9d50..54e6fdb1d74 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -324,7 +324,7 @@ static bool binlog_direct_check(sys_var *self, THD *thd, set_var *var)
return true;
if (var->type == OPT_GLOBAL ||
(thd->variables.binlog_direct_non_trans_update ==
- var->save_result.ulonglong_value))
+ static_cast<my_bool>(var->save_result.ulonglong_value)))
return false;
return false;
@@ -2956,14 +2956,14 @@ static bool check_locale(sys_var *self, THD *thd, set_var *var)
static Sys_var_struct Sys_lc_messages(
"lc_messages", "Set the language used for the error messages",
SESSION_VAR(lc_messages), NO_CMD_LINE,
- offsetof(MY_LOCALE, name), DEFAULT(&my_default_lc_messages),
+ my_offsetof(MY_LOCALE, name), DEFAULT(&my_default_lc_messages),
NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_locale));
static Sys_var_struct Sys_lc_time_names(
"lc_time_names", "Set the language used for the month "
"names and the days of the week",
SESSION_VAR(lc_time_names), NO_CMD_LINE,
- offsetof(MY_LOCALE, name), DEFAULT(&my_default_lc_time_names),
+ my_offsetof(MY_LOCALE, name), DEFAULT(&my_default_lc_time_names),
NO_MUTEX_GUARD, IN_BINLOG, ON_CHECK(check_locale));
static Sys_var_tz Sys_time_zone(