diff options
author | unknown <guilhem@mysql.com> | 2003-03-06 22:46:24 +0100 |
---|---|---|
committer | unknown <guilhem@mysql.com> | 2003-03-06 22:46:24 +0100 |
commit | 65b62bd474012ef77988fc4fb06e41fadc625b7b (patch) | |
tree | 7762bbf550120c78c74bc360bf1ccedfe78c895a /sql/sql_insert.cc | |
parent | 92e6a9fcf23a192c925d9e78a2551f16c20d85d2 (diff) | |
download | mariadb-git-65b62bd474012ef77988fc4fb06e41fadc625b7b.tar.gz |
Fix so that INSERT DELAYED cares about SQL_LOG_BIN=0 (bug #104)
Diffstat (limited to 'sql/sql_insert.cc')
-rw-r--r-- | sql/sql_insert.cc | 39 |
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) |