mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
post-commit merge
mysql-test/lib/init_db.sql: Auto merged scripts/mysql_create_system_tables.sh: Auto merged scripts/mysql_fix_privilege_tables.sql: Auto merged sql/event.cc: Auto merged sql/event.h: Auto merged sql/event_executor.cc: Auto merged sql/event_priv.h: Auto merged sql/event_timed.cc: Auto merged sql/mysqld.cc: Auto merged sql/sql_lex.h: Auto merged sql/sql_parse.cc: Auto merged sql/sql_yacc.yy: Auto merged mysql-test/r/events.result: manual merge mysql-test/r/system_mysql_db.result: manual merge mysql-test/t/events.test: manual merge
This commit is contained in:
63
sql/event.cc
63
sql/event.cc
@ -77,7 +77,7 @@ evex_queue_init(EVEX_QUEUE_TYPE *queue)
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
|
||||
int sortcmp_lex_string(LEX_STRING s, LEX_STRING t, CHARSET_INFO *cs)
|
||||
{
|
||||
return cs->coll->strnncollsp(cs, (unsigned char *) s.str,s.length,
|
||||
@ -182,7 +182,9 @@ evex_open_event_table(THD *thd, enum thr_lock_type lock_type, TABLE **table)
|
||||
|
||||
int
|
||||
evex_db_find_event_aux(THD *thd, const LEX_STRING dbname,
|
||||
const LEX_STRING ev_name, TABLE *table)
|
||||
const LEX_STRING ev_name,
|
||||
const LEX_STRING user_name,
|
||||
TABLE *table)
|
||||
{
|
||||
byte key[MAX_KEY_LENGTH];
|
||||
DBUG_ENTER("evex_db_find_event_aux");
|
||||
@ -196,11 +198,17 @@ evex_db_find_event_aux(THD *thd, const LEX_STRING dbname,
|
||||
same fields.
|
||||
*/
|
||||
if (dbname.length > table->field[EVEX_FIELD_DB]->field_length ||
|
||||
ev_name.length > table->field[EVEX_FIELD_NAME]->field_length)
|
||||
ev_name.length > table->field[EVEX_FIELD_NAME]->field_length ||
|
||||
user_name.length > table->field[EVEX_FIELD_DEFINER]->field_length)
|
||||
|
||||
DBUG_RETURN(EVEX_KEY_NOT_FOUND);
|
||||
|
||||
table->field[0]->store(dbname.str, dbname.length, &my_charset_bin);
|
||||
table->field[1]->store(ev_name.str, ev_name.length, &my_charset_bin);
|
||||
table->field[EVEX_FIELD_DB]->store(dbname.str, dbname.length, &my_charset_bin);
|
||||
table->field[EVEX_FIELD_NAME]->store(ev_name.str, ev_name.length,
|
||||
&my_charset_bin);
|
||||
table->field[EVEX_FIELD_DEFINER]->store(user_name.str, user_name.length,
|
||||
&my_charset_bin);
|
||||
|
||||
key_copy(key, table->record[0], table->key_info, table->key_info->key_length);
|
||||
|
||||
if (table->file->index_read_idx(table->record[0], 0, key,
|
||||
@ -290,10 +298,15 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update)
|
||||
from 1. Thus +1 offset is needed!
|
||||
*/
|
||||
table->field[EVEX_FIELD_TRANSIENT_INTERVAL]->store((longlong)et->interval+1);
|
||||
|
||||
table->field[EVEX_FIELD_EXECUTE_AT]->set_null();
|
||||
}
|
||||
else if (et->execute_at.year)
|
||||
{
|
||||
// fix_fields already called in init_execute_at
|
||||
table->field[EVEX_FIELD_INTERVAL_EXPR]->set_null();
|
||||
table->field[EVEX_FIELD_TRANSIENT_INTERVAL]->set_null();
|
||||
|
||||
table->field[EVEX_FIELD_EXECUTE_AT]->set_notnull();
|
||||
table->field[EVEX_FIELD_EXECUTE_AT]->store_time(&et->execute_at,
|
||||
MYSQL_TIMESTAMP_DATETIME);
|
||||
@ -358,9 +371,9 @@ db_create_event(THD *thd, event_timed *et, my_bool create_if_not,
|
||||
my_error(ER_EVENT_OPEN_TABLE_FAILED, MYF(0));
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
||||
DBUG_PRINT("info", ("check existance of an event with the same name"));
|
||||
if (!evex_db_find_event_aux(thd, et->dbname, et->name, table))
|
||||
if (!evex_db_find_event_aux(thd, et->dbname, et->name, et->definer, table))
|
||||
{
|
||||
if (create_if_not)
|
||||
{
|
||||
@ -410,10 +423,9 @@ db_create_event(THD *thd, event_timed *et, my_bool create_if_not,
|
||||
goto err;
|
||||
}
|
||||
|
||||
strxmov(definer, et->definer_user.str, "@", et->definer_host.str, NullS);
|
||||
if ((ret=table->field[EVEX_FIELD_DEFINER]->
|
||||
store(definer, et->definer_user.length + 1 + et->definer_host.length,
|
||||
system_charset_info)))
|
||||
if ((ret=table->field[EVEX_FIELD_DEFINER]->store(et->definer.str,
|
||||
et->definer.length,
|
||||
system_charset_info)))
|
||||
{
|
||||
my_error(ER_EVENT_STORE_FAILED, MYF(0), et->name.str, ret);
|
||||
goto err;
|
||||
@ -476,7 +488,9 @@ db_update_event(THD *thd, event_timed *et, sp_name *new_name)
|
||||
TABLE *table;
|
||||
int ret= EVEX_OPEN_TABLE_FAILED;
|
||||
DBUG_ENTER("db_update_event");
|
||||
DBUG_PRINT("enter", ("dbname: %.*s", et->dbname.length, et->dbname.str));
|
||||
DBUG_PRINT("enter", ("name: %.*s", et->name.length, et->name.str));
|
||||
DBUG_PRINT("enter", ("user: %.*s", et->name.length, et->name.str));
|
||||
if (new_name)
|
||||
DBUG_PRINT("enter", ("rename to: %.*s", new_name->m_name.length,
|
||||
new_name->m_name.str));
|
||||
@ -497,7 +511,8 @@ db_update_event(THD *thd, event_timed *et, sp_name *new_name)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!evex_db_find_event_aux(thd, new_name->m_db, new_name->m_name, table))
|
||||
if (!evex_db_find_event_aux(thd, new_name->m_db, new_name->m_name,
|
||||
et->definer, table))
|
||||
{
|
||||
my_error(ER_EVENT_ALREADY_EXISTS, MYF(0), new_name->m_name.str);
|
||||
goto err;
|
||||
@ -510,7 +525,7 @@ db_update_event(THD *thd, event_timed *et, sp_name *new_name)
|
||||
row (copied into record[1] later
|
||||
*/
|
||||
if (EVEX_KEY_NOT_FOUND == evex_db_find_event_aux(thd, et->dbname, et->name,
|
||||
table))
|
||||
et->definer, table))
|
||||
{
|
||||
my_error(ER_EVENT_DOES_NOT_EXIST, MYF(0), et->name.str);
|
||||
goto err;
|
||||
@ -559,6 +574,7 @@ err:
|
||||
db_find_event()
|
||||
thd THD
|
||||
name the name of the event to find
|
||||
definer who owns the event
|
||||
ett event's data if event is found
|
||||
tbl TABLE object to use when not NULL
|
||||
|
||||
@ -568,11 +584,11 @@ err:
|
||||
*/
|
||||
|
||||
static int
|
||||
db_find_event(THD *thd, sp_name *name, event_timed **ett, TABLE *tbl)
|
||||
db_find_event(THD *thd, sp_name *name, LEX_STRING definer, event_timed **ett,
|
||||
TABLE *tbl)
|
||||
{
|
||||
TABLE *table;
|
||||
int ret;
|
||||
const char *definer;
|
||||
char *ptr;
|
||||
event_timed *et;
|
||||
DBUG_ENTER("db_find_event");
|
||||
@ -587,7 +603,8 @@ db_find_event(THD *thd, sp_name *name, event_timed **ett, TABLE *tbl)
|
||||
goto done;
|
||||
}
|
||||
|
||||
if ((ret= evex_db_find_event_aux(thd, name->m_db, name->m_name, table)))
|
||||
if ((ret= evex_db_find_event_aux(thd, name->m_db, name->m_name, definer,
|
||||
table)))
|
||||
{
|
||||
my_error(ER_EVENT_DOES_NOT_EXIST, MYF(0), name->m_name.str);
|
||||
goto done;
|
||||
@ -628,6 +645,7 @@ done:
|
||||
evex_load_and_compile_event()
|
||||
thd THD
|
||||
spn the name of the event to alter
|
||||
definer who is the owner
|
||||
use_lock whether to obtain a lock on LOCK_event_arrays or not
|
||||
|
||||
RETURN VALUE
|
||||
@ -637,7 +655,8 @@ done:
|
||||
*/
|
||||
|
||||
static int
|
||||
evex_load_and_compile_event(THD * thd, sp_name *spn, bool use_lock)
|
||||
evex_load_and_compile_event(THD * thd, sp_name *spn, LEX_STRING definer,
|
||||
bool use_lock)
|
||||
{
|
||||
int ret= 0;
|
||||
MEM_ROOT *tmp_mem_root;
|
||||
@ -652,7 +671,7 @@ evex_load_and_compile_event(THD * thd, sp_name *spn, bool use_lock)
|
||||
|
||||
thd->reset_n_backup_open_tables_state(&backup);
|
||||
// no need to use my_error() here because db_find_event() has done it
|
||||
if ((ret= db_find_event(thd, spn, &ett, NULL)))
|
||||
if ((ret= db_find_event(thd, spn, definer, &ett, NULL)))
|
||||
goto done;
|
||||
|
||||
thd->restore_backup_open_tables_state(&backup);
|
||||
@ -773,7 +792,7 @@ evex_create_event(THD *thd, event_timed *et, uint create_options,
|
||||
if (evex_is_running && et->status == MYSQL_EVENT_ENABLED)
|
||||
{
|
||||
sp_name spn(et->dbname, et->name);
|
||||
ret= evex_load_and_compile_event(thd, &spn, true);
|
||||
ret= evex_load_and_compile_event(thd, &spn, et->definer, true);
|
||||
}
|
||||
VOID(pthread_mutex_unlock(&LOCK_evex_running));
|
||||
|
||||
@ -826,11 +845,11 @@ evex_update_event(THD *thd, event_timed *et, sp_name *new_name,
|
||||
if (et->status == MYSQL_EVENT_ENABLED)
|
||||
{
|
||||
if (new_name)
|
||||
ret= evex_load_and_compile_event(thd, new_name, false);
|
||||
ret= evex_load_and_compile_event(thd, new_name, et->definer, false);
|
||||
else
|
||||
{
|
||||
sp_name spn(et->dbname, et->name);
|
||||
ret= evex_load_and_compile_event(thd, &spn, false);
|
||||
ret= evex_load_and_compile_event(thd, &spn, et->definer, false);
|
||||
}
|
||||
if (ret == EVEX_COMPILE_ERROR)
|
||||
my_error(ER_EVENT_COMPILE_ERROR, MYF(0));
|
||||
@ -868,7 +887,7 @@ evex_drop_event(THD *thd, event_timed *et, bool drop_if_exists,
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!(ret= evex_db_find_event_aux(thd, et->dbname, et->name, table)))
|
||||
if (!(ret= evex_db_find_event_aux(thd, et->dbname,et->name,et->definer,table)))
|
||||
{
|
||||
if ((ret= table->file->ha_delete_row(table->record[0])))
|
||||
{
|
||||
|
Reference in New Issue
Block a user