mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge 4.1 into 5.0
This commit is contained in:
@ -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, int log_on);
|
||||
char *query, uint query_length, bool 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,9 +38,6 @@ 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
|
||||
Updates table->time_stamp to point to timestamp field or 0, depending on
|
||||
@ -114,8 +111,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
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 log_on= (thd->options & OPTION_BIN_LOG) || (!(thd->master_access & SUPER_ACL));
|
||||
bool transactional_table, log_delayed, bulk_insert;
|
||||
uint value_count;
|
||||
ulong counter = 1;
|
||||
@ -127,17 +123,9 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
char *query=thd->query;
|
||||
thr_lock_type lock_type = table_list->lock_type;
|
||||
TABLE_LIST *insert_table_list= (TABLE_LIST*)
|
||||
thd->lex.select_lex.table_list.first;
|
||||
thd->lex->select_lex.table_list.first;
|
||||
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
|
||||
@ -178,7 +166,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
res= open_and_lock_tables(thd, table_list);
|
||||
if (res)
|
||||
DBUG_RETURN(-1);
|
||||
fix_tables_pointers(thd->lex.all_selects_list);
|
||||
fix_tables_pointers(thd->lex->all_selects_list);
|
||||
|
||||
table= table_list->table;
|
||||
thd->proc_info="init";
|
||||
@ -362,7 +350,6 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
log_delayed= (transactional_table || table->tmp_table);
|
||||
if ((info.copied || info.deleted) && (error <= 0 || !transactional_table))
|
||||
{
|
||||
mysql_update_log.write(thd, thd->query, thd->query_length);
|
||||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
Query_log_event qinfo(thd, thd->query, thd->query_length,
|
||||
@ -412,14 +399,14 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
(ulong) info.deleted, (ulong) thd->cuted_fields);
|
||||
::send_ok(thd,info.copied+info.deleted,(ulonglong)id,buff);
|
||||
}
|
||||
free_underlaid_joins(thd, &thd->lex.select_lex);
|
||||
free_underlaid_joins(thd, &thd->lex->select_lex);
|
||||
table->insert_values=0;
|
||||
DBUG_RETURN(0);
|
||||
|
||||
abort:
|
||||
if (lock_type == TL_WRITE_DELAYED)
|
||||
end_delayed_insert(thd);
|
||||
free_underlaid_joins(thd, &thd->lex.select_lex);
|
||||
free_underlaid_joins(thd, &thd->lex->select_lex);
|
||||
table->insert_values=0;
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
@ -588,13 +575,12 @@ public:
|
||||
char *record,*query;
|
||||
enum_duplicates dup;
|
||||
time_t start_time;
|
||||
bool query_start_used,last_insert_id_used,insert_id_used;
|
||||
int log_query;
|
||||
bool query_start_used,last_insert_id_used,insert_id_used, log_query;
|
||||
ulonglong last_insert_id;
|
||||
ulong time_stamp;
|
||||
uint query_length;
|
||||
|
||||
delayed_row(enum_duplicates dup_arg, int log_query_arg)
|
||||
delayed_row(enum_duplicates dup_arg, bool log_query_arg)
|
||||
:record(0),query(0),dup(dup_arg),log_query(log_query_arg) {}
|
||||
~delayed_row()
|
||||
{
|
||||
@ -900,7 +886,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, int log_on)
|
||||
char *query, uint query_length, bool log_on)
|
||||
{
|
||||
delayed_row *row=0;
|
||||
delayed_insert *di=thd->di;
|
||||
@ -980,7 +966,7 @@ void kill_delayed_threads(void)
|
||||
{
|
||||
/* Ensure that the thread doesn't kill itself while we are looking at it */
|
||||
pthread_mutex_lock(&tmp->mutex);
|
||||
tmp->thd.killed=1;
|
||||
tmp->thd.killed= THD::KILL_CONNECTION;
|
||||
if (tmp->thd.mysys_var)
|
||||
{
|
||||
pthread_mutex_lock(&tmp->thd.mysys_var->mutex);
|
||||
@ -1019,7 +1005,7 @@ extern "C" pthread_handler_decl(handle_delayed_insert,arg)
|
||||
thd->thread_id=thread_id++;
|
||||
thd->end_time();
|
||||
threads.append(thd);
|
||||
thd->killed=abort_loop;
|
||||
thd->killed=abort_loop ? THD::KILL_CONNECTION : THD::NOT_KILLED;
|
||||
pthread_mutex_unlock(&LOCK_thread_count);
|
||||
|
||||
pthread_mutex_lock(&di->mutex);
|
||||
@ -1072,7 +1058,7 @@ extern "C" pthread_handler_decl(handle_delayed_insert,arg)
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (thd->killed)
|
||||
if (thd->killed == THD::KILL_CONNECTION)
|
||||
{
|
||||
uint lock_count;
|
||||
/*
|
||||
@ -1120,7 +1106,7 @@ extern "C" pthread_handler_decl(handle_delayed_insert,arg)
|
||||
break;
|
||||
if (error == ETIME || error == ETIMEDOUT)
|
||||
{
|
||||
thd->killed=1;
|
||||
thd->killed= THD::KILL_CONNECTION;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1139,7 +1125,7 @@ extern "C" pthread_handler_decl(handle_delayed_insert,arg)
|
||||
/* request for new delayed insert */
|
||||
if (!(thd->lock=mysql_lock_tables(thd,&di->table,1)))
|
||||
{
|
||||
di->dead=thd->killed=1; // Fatal error
|
||||
di->dead=thd->killed= THD::KILL_CONNECTION; // Fatal error
|
||||
}
|
||||
pthread_cond_broadcast(&di->cond_client);
|
||||
}
|
||||
@ -1147,7 +1133,7 @@ extern "C" pthread_handler_decl(handle_delayed_insert,arg)
|
||||
{
|
||||
if (di->handle_inserts())
|
||||
{
|
||||
di->dead=thd->killed=1; // Some fatal error
|
||||
di->dead=thd->killed=THD::KILL_CONNECTION; // Some fatal error
|
||||
}
|
||||
}
|
||||
di->status=0;
|
||||
@ -1174,7 +1160,7 @@ end:
|
||||
|
||||
close_thread_tables(thd); // Free the table
|
||||
di->table=0;
|
||||
di->dead=thd->killed=1; // If error
|
||||
di->dead=thd->killed= THD::KILL_CONNECTION; // If error
|
||||
pthread_cond_broadcast(&di->cond_client); // Safety
|
||||
pthread_mutex_unlock(&di->mutex);
|
||||
|
||||
@ -1243,7 +1229,7 @@ bool delayed_insert::handle_inserts(void)
|
||||
max_rows=delayed_insert_limit;
|
||||
if (thd.killed || table->version != refresh_version)
|
||||
{
|
||||
thd.killed=1;
|
||||
thd.killed= THD::KILL_CONNECTION;
|
||||
max_rows= ~0; // Do as much as possible
|
||||
}
|
||||
|
||||
@ -1287,15 +1273,10 @@ bool delayed_insert::handle_inserts(void)
|
||||
using_ignore=0;
|
||||
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
|
||||
}
|
||||
if (row->query)
|
||||
if (row->query && row->log_query && 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)
|
||||
free_delayed_insert_blobs(table);
|
||||
@ -1441,7 +1422,6 @@ void select_insert::send_error(uint errcode,const char *err)
|
||||
{
|
||||
if (last_insert_id)
|
||||
thd->insert_id(last_insert_id); // For binary log
|
||||
mysql_update_log.write(thd,thd->query,thd->query_length);
|
||||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
Query_log_event qinfo(thd, thd->query, thd->query_length,
|
||||
@ -1473,7 +1453,6 @@ bool select_insert::send_eof()
|
||||
if (last_insert_id)
|
||||
thd->insert_id(last_insert_id); // For binary log
|
||||
/* Write to binlog before commiting transaction */
|
||||
mysql_update_log.write(thd,thd->query,thd->query_length);
|
||||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
Query_log_event qinfo(thd, thd->query, thd->query_length,
|
||||
|
Reference in New Issue
Block a user