summaryrefslogtreecommitdiff
path: root/sql/sql_insert.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_insert.cc')
-rw-r--r--sql/sql_insert.cc39
1 files changed, 28 insertions, 11 deletions
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 32071e5b083..785696d0fb8 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -23,7 +23,7 @@
static int check_null_fields(THD *thd,TABLE *entry);
static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list);
static int write_delayed(THD *thd,TABLE *table, enum_duplicates dup,
- char *query, uint query_length, bool log_on);
+ char *query, uint query_length, int log_on);
static void end_delayed_insert(THD *thd);
extern "C" pthread_handler_decl(handle_delayed_insert,arg);
static void unlink_blobs(register TABLE *table);
@@ -38,6 +38,8 @@ static void unlink_blobs(register TABLE *table);
#define my_safe_afree(ptr, size, min_length) if (size > min_length) my_free(ptr,MYF(0))
#endif
+#define DELAYED_LOG_UPDATE 1
+#define DELAYED_LOG_BIN 2
/*
Check if insert fields are correct
@@ -103,8 +105,13 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
List<List_item> &values_list,enum_duplicates duplic)
{
int error;
- bool log_on= ((thd->options & OPTION_UPDATE_LOG) ||
- !(thd->master_access & SUPER_ACL));
+ /*
+ log_on is about delayed inserts only.
+ By default, both logs are enabled (this won't cause problems if the server
+ runs without --log-update or --log-bin).
+ */
+ int log_on= DELAYED_LOG_UPDATE | DELAYED_LOG_BIN ;
+
bool transactional_table, log_delayed, bulk_insert;
uint value_count;
ulong counter = 1;
@@ -117,6 +124,14 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
thr_lock_type lock_type = table_list->lock_type;
DBUG_ENTER("mysql_insert");
+ if (thd->master_access & SUPER_ACL)
+ {
+ if (!(thd->options & OPTION_UPDATE_LOG))
+ log_on &= ~(int) DELAYED_LOG_UPDATE ;
+ if (!(thd->options & OPTION_BIN_LOG))
+ log_on &= ~(int) DELAYED_LOG_BIN ;
+ }
+
/*
in safe mode or with skip-new change delayed insert to be regular
if we are told to replace duplicates, the insert cannot be concurrent
@@ -494,12 +509,13 @@ public:
char *record,*query;
enum_duplicates dup;
time_t start_time;
- bool query_start_used,last_insert_id_used,insert_id_used,log_query;
+ bool query_start_used,last_insert_id_used,insert_id_used;
+ int log_query;
ulonglong last_insert_id;
ulong time_stamp;
uint query_length;
- delayed_row(enum_duplicates dup_arg, bool log_query_arg)
+ delayed_row(enum_duplicates dup_arg, int log_query_arg)
:record(0),query(0),dup(dup_arg),log_query(log_query_arg) {}
~delayed_row()
{
@@ -802,7 +818,7 @@ TABLE *delayed_insert::get_local_table(THD* client_thd)
/* Put a question in queue */
static int write_delayed(THD *thd,TABLE *table,enum_duplicates duplic,
- char *query, uint query_length, bool log_on)
+ char *query, uint query_length, int log_on)
{
delayed_row *row=0;
delayed_insert *di=thd->di;
@@ -1189,13 +1205,14 @@ bool delayed_insert::handle_inserts(void)
using_ignore=0;
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
}
- if (row->query && row->log_query)
+ if (row->query)
{
- mysql_update_log.write(&thd,row->query, row->query_length);
- if (using_bin_log)
+ if (row->log_query & DELAYED_LOG_UPDATE)
+ mysql_update_log.write(&thd,row->query, row->query_length);
+ if (row->log_query & DELAYED_LOG_BIN && using_bin_log)
{
- Query_log_event qinfo(&thd, row->query, row->query_length,0);
- mysql_bin_log.write(&qinfo);
+ Query_log_event qinfo(&thd, row->query, row->query_length,0);
+ mysql_bin_log.write(&qinfo);
}
}
if (table->blob_fields)