Commit d62346a4 authored by tomas@whalegate.ndb.mysql.com's avatar tomas@whalegate.ndb.mysql.com

Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.1

into  whalegate.ndb.mysql.com:/home/tomas/mysql-5.1-single-user
parents fa23f7e0 1de28a11
# Can't test with embedded server that doesn't support grants # Can't test with embedded server that doesn't support grants
-- source include/not_embedded.inc -- source include/not_embedded.inc
-- source include/not_valgrind.inc
CREATE DATABASE IF NOT EXISTS events_test; CREATE DATABASE IF NOT EXISTS events_test;
USE events_test; USE events_test;
......
...@@ -154,8 +154,6 @@ deinit_event_thread(THD *thd) ...@@ -154,8 +154,6 @@ deinit_event_thread(THD *thd)
thread_running--; thread_running--;
delete thd; delete thd;
pthread_mutex_unlock(&LOCK_thread_count); pthread_mutex_unlock(&LOCK_thread_count);
my_thread_end();
} }
...@@ -231,8 +229,7 @@ event_scheduler_thread(void *arg) ...@@ -231,8 +229,7 @@ event_scheduler_thread(void *arg)
if (!res) if (!res)
scheduler->run(thd); scheduler->run(thd);
deinit_event_thread(thd); my_thread_end();
pthread_exit(0);
DBUG_RETURN(0); // Against gcc warnings DBUG_RETURN(0); // Against gcc warnings
} }
...@@ -260,6 +257,7 @@ event_worker_thread(void *arg) ...@@ -260,6 +257,7 @@ event_worker_thread(void *arg)
Event_worker_thread worker_thread; Event_worker_thread worker_thread;
worker_thread.run(thd, event); worker_thread.run(thd, event);
my_thread_end();
return 0; // Can't return anything here return 0; // Can't return anything here
} }
...@@ -494,12 +492,14 @@ Event_scheduler::run(THD *thd) ...@@ -494,12 +492,14 @@ Event_scheduler::run(THD *thd)
} }
DBUG_PRINT("info", ("state=%s", scheduler_states_names[state].str)); DBUG_PRINT("info", ("state=%s", scheduler_states_names[state].str));
} }
LOCK_DATA(); LOCK_DATA();
DBUG_PRINT("info", ("Signalling back to the stopper COND_state")); deinit_event_thread(thd);
scheduler_thd= NULL;
state= INITIALIZED; state= INITIALIZED;
DBUG_PRINT("info", ("Signalling back to the stopper COND_state"));
pthread_cond_signal(&COND_state); pthread_cond_signal(&COND_state);
UNLOCK_DATA(); UNLOCK_DATA();
sql_print_information("Event Scheduler: Stopped");
DBUG_RETURN(res); DBUG_RETURN(res);
} }
...@@ -651,17 +651,7 @@ Event_scheduler::stop() ...@@ -651,17 +651,7 @@ Event_scheduler::stop()
COND_STATE_WAIT(thd, NULL, "Waiting scheduler to stop"); COND_STATE_WAIT(thd, NULL, "Waiting scheduler to stop");
} while (state == STOPPING); } while (state == STOPPING);
DBUG_PRINT("info", ("Scheduler thread has cleaned up. Set state to INIT")); DBUG_PRINT("info", ("Scheduler thread has cleaned up. Set state to INIT"));
/* sql_print_information("Event Scheduler: Stopped");
The rationale behind setting it to NULL here but not destructing it
beforehand is because the THD will be deinited in event_scheduler_thread().
It's more clear when the post_init and the deinit is done in one function.
Here we just mark that the scheduler doesn't have a THD anymore. Though for
milliseconds the old thread could exist we can't use it anymore. When we
unlock the mutex in this function a little later the state will be
INITIALIZED. Therefore, a connection thread could enter the critical section
and will create a new THD object.
*/
scheduler_thd= NULL;
end: end:
UNLOCK_DATA(); UNLOCK_DATA();
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
......
...@@ -733,14 +733,18 @@ nlist_err: ...@@ -733,14 +733,18 @@ nlist_err:
/* /*
parse parameters parse parameters
SYNOPSIS SYNOPSIS
File_parser::parse() File_parser::parse()
base base address for parameter writing (structure like base base address for parameter writing (structure like
TABLE) TABLE)
mem_root MEM_ROOT for parameters allocation mem_root MEM_ROOT for parameters allocation
parameters parameters description parameters parameters description
required number of required parameters in above list required number of parameters in the above list. If the file
contains more parameters than "required", they will
be ignored. If the file contains less parameters
then "required", non-existing parameters will
remain their values.
hook hook called for unknown keys hook hook called for unknown keys
hook_data some data specific for the hook hook_data some data specific for the hook
...@@ -923,6 +927,13 @@ list_err: ...@@ -923,6 +927,13 @@ list_err:
} }
} }
} }
/*
NOTE: if we read less than "required" parameters, it is still Ok.
Probably, we've just read the file of the previous version, which
contains less parameters.
*/
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }
......
...@@ -992,6 +992,12 @@ sp_head::execute(THD *thd) ...@@ -992,6 +992,12 @@ sp_head::execute(THD *thd)
m_first_instance->m_last_cached_sp == this) || m_first_instance->m_last_cached_sp == this) ||
(m_recursion_level + 1 == m_next_cached_sp->m_recursion_level)); (m_recursion_level + 1 == m_next_cached_sp->m_recursion_level));
/*
NOTE: The SQL Standard does not specify the context that should be
preserved for stored routines. However, at SAP/Walldorf meeting it was
decided that current database should be preserved.
*/
if (m_db.length && if (m_db.length &&
(err_status= sp_use_new_db(thd, m_db, &old_db, 0, &dbchanged))) (err_status= sp_use_new_db(thd, m_db, &old_db, 0, &dbchanged)))
goto done; goto done;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment