mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge MySQL 5.1.41 into MariaDB trunk, including a number of after-merge fixes.
Also merge charset patch.
This commit is contained in:
@@ -589,7 +589,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
Name_resolution_context *context;
|
||||
Name_resolution_context_state ctx_state;
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
char *query= thd->query;
|
||||
char *query= thd->query();
|
||||
/*
|
||||
log_on is about delayed inserts only.
|
||||
By default, both logs are enabled (this won't cause problems if the server
|
||||
@@ -826,7 +826,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
if (lock_type == TL_WRITE_DELAYED)
|
||||
{
|
||||
LEX_STRING const st_query = { query, thd->query_length };
|
||||
LEX_STRING const st_query = { query, thd->query_length() };
|
||||
error=write_delayed(thd, table, duplic, st_query, ignore, log_on);
|
||||
query=0;
|
||||
}
|
||||
@@ -919,7 +919,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
*/
|
||||
DBUG_ASSERT(thd->killed != THD::KILL_BAD_DATA || error > 0);
|
||||
if (thd->binlog_query(THD::ROW_QUERY_TYPE,
|
||||
thd->query, thd->query_length,
|
||||
thd->query(), thd->query_length(),
|
||||
transactional_table, FALSE,
|
||||
errcode))
|
||||
{
|
||||
@@ -1791,7 +1791,7 @@ public:
|
||||
pthread_cond_destroy(&cond);
|
||||
pthread_cond_destroy(&cond_client);
|
||||
thd.unlink(); // Must be unlinked under lock
|
||||
x_free(thd.query);
|
||||
x_free(thd.query());
|
||||
thd.security_ctx->user= thd.security_ctx->host=0;
|
||||
thread_count--;
|
||||
delayed_insert_threads--;
|
||||
@@ -1937,7 +1937,7 @@ bool delayed_get_table(THD *thd, TABLE_LIST *table_list)
|
||||
pthread_mutex_unlock(&LOCK_thread_count);
|
||||
di->thd.set_db(table_list->db, (uint) strlen(table_list->db));
|
||||
di->thd.set_query(my_strdup(table_list->table_name, MYF(MY_WME)), 0);
|
||||
if (di->thd.db == NULL || di->thd.query == NULL)
|
||||
if (di->thd.db == NULL || di->thd.query() == NULL)
|
||||
{
|
||||
/* The error is reported */
|
||||
delete di;
|
||||
@@ -1946,7 +1946,7 @@ bool delayed_get_table(THD *thd, TABLE_LIST *table_list)
|
||||
}
|
||||
di->table_list= *table_list; // Needed to open table
|
||||
/* Replace volatile strings with local copies */
|
||||
di->table_list.alias= di->table_list.table_name= di->thd.query;
|
||||
di->table_list.alias= di->table_list.table_name= di->thd.query();
|
||||
di->table_list.db= di->thd.db;
|
||||
di->lock();
|
||||
pthread_mutex_lock(&di->mutex);
|
||||
@@ -2304,44 +2304,9 @@ void kill_delayed_threads(void)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Create a new delayed insert thread
|
||||
*/
|
||||
|
||||
pthread_handler_t handle_delayed_insert(void *arg)
|
||||
static void handle_delayed_insert_impl(THD *thd, Delayed_insert *di)
|
||||
{
|
||||
Delayed_insert *di=(Delayed_insert*) arg;
|
||||
THD *thd= &di->thd;
|
||||
|
||||
pthread_detach_this_thread();
|
||||
/* Add thread to THD list so that's it's visible in 'show processlist' */
|
||||
pthread_mutex_lock(&LOCK_thread_count);
|
||||
thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;
|
||||
thd->set_current_time();
|
||||
threads.append(thd);
|
||||
thd->killed=abort_loop ? THD::KILL_CONNECTION : THD::NOT_KILLED;
|
||||
pthread_mutex_unlock(&LOCK_thread_count);
|
||||
|
||||
/*
|
||||
Wait until the client runs into pthread_cond_wait(),
|
||||
where we free it after the table is opened and di linked in the list.
|
||||
If we did not wait here, the client might detect the opened table
|
||||
before it is linked to the list. It would release LOCK_delayed_create
|
||||
and allow another thread to create another handler for the same table,
|
||||
since it does not find one in the list.
|
||||
*/
|
||||
pthread_mutex_lock(&di->mutex);
|
||||
#if !defined( __WIN__) /* Win32 calls this in pthread_create */
|
||||
if (my_thread_init())
|
||||
{
|
||||
/* Can't use my_error since store_globals has not yet been called */
|
||||
thd->main_da.set_error_status(thd, ER_OUT_OF_RESOURCES,
|
||||
ER(ER_OUT_OF_RESOURCES));
|
||||
goto end;
|
||||
}
|
||||
#endif
|
||||
|
||||
DBUG_ENTER("handle_delayed_insert");
|
||||
DBUG_ENTER("handle_delayed_insert_impl");
|
||||
thd->thread_stack= (char*) &thd;
|
||||
if (init_thr_lock() || thd->store_globals())
|
||||
{
|
||||
@@ -2530,6 +2495,49 @@ err:
|
||||
*/
|
||||
ha_autocommit_or_rollback(thd, 1);
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Create a new delayed insert thread
|
||||
*/
|
||||
|
||||
pthread_handler_t handle_delayed_insert(void *arg)
|
||||
{
|
||||
Delayed_insert *di=(Delayed_insert*) arg;
|
||||
THD *thd= &di->thd;
|
||||
|
||||
pthread_detach_this_thread();
|
||||
/* Add thread to THD list so that's it's visible in 'show processlist' */
|
||||
pthread_mutex_lock(&LOCK_thread_count);
|
||||
thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;
|
||||
thd->set_current_time();
|
||||
threads.append(thd);
|
||||
thd->killed=abort_loop ? THD::KILL_CONNECTION : THD::NOT_KILLED;
|
||||
pthread_mutex_unlock(&LOCK_thread_count);
|
||||
|
||||
/*
|
||||
Wait until the client runs into pthread_cond_wait(),
|
||||
where we free it after the table is opened and di linked in the list.
|
||||
If we did not wait here, the client might detect the opened table
|
||||
before it is linked to the list. It would release LOCK_delayed_create
|
||||
and allow another thread to create another handler for the same table,
|
||||
since it does not find one in the list.
|
||||
*/
|
||||
pthread_mutex_lock(&di->mutex);
|
||||
#if !defined( __WIN__) /* Win32 calls this in pthread_create */
|
||||
if (my_thread_init())
|
||||
{
|
||||
/* Can't use my_error since store_globals has not yet been called */
|
||||
thd->main_da.set_error_status(thd, ER_OUT_OF_RESOURCES,
|
||||
ER(ER_OUT_OF_RESOURCES));
|
||||
goto end;
|
||||
}
|
||||
#endif
|
||||
|
||||
handle_delayed_insert_impl(thd, di);
|
||||
|
||||
#ifndef __WIN__
|
||||
end:
|
||||
#endif
|
||||
@@ -2554,7 +2562,8 @@ end:
|
||||
|
||||
my_thread_end();
|
||||
pthread_exit(0);
|
||||
DBUG_RETURN(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -3271,7 +3280,7 @@ bool select_insert::send_eof()
|
||||
else
|
||||
errcode= query_error_code(thd, killed_status == THD::NOT_KILLED);
|
||||
thd->binlog_query(THD::ROW_QUERY_TYPE,
|
||||
thd->query, thd->query_length,
|
||||
thd->query(), thd->query_length(),
|
||||
trans_table, FALSE, errcode);
|
||||
}
|
||||
table->file->ha_release_auto_increment();
|
||||
@@ -3341,7 +3350,8 @@ void select_insert::abort() {
|
||||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED);
|
||||
thd->binlog_query(THD::ROW_QUERY_TYPE, thd->query, thd->query_length,
|
||||
thd->binlog_query(THD::ROW_QUERY_TYPE, thd->query(),
|
||||
thd->query_length(),
|
||||
transactional_table, FALSE, errcode);
|
||||
}
|
||||
if (!thd->current_stmt_binlog_row_based && !can_rollback_data())
|
||||
@@ -3635,7 +3645,7 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
|
||||
DBUG_EXECUTE_IF("sleep_create_select_before_check_if_exists", my_sleep(6000000););
|
||||
|
||||
if (!(create_info->options & HA_LEX_CREATE_TMP_TABLE) &&
|
||||
create_table->table->db_stat)
|
||||
(create_table->table && create_table->table->db_stat))
|
||||
{
|
||||
/* Table already exists and was open at open_and_lock_tables() stage. */
|
||||
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
|
||||
|
Reference in New Issue
Block a user