diff options
author | unknown <andrey@lmy004.> | 2005-12-08 15:34:11 +0100 |
---|---|---|
committer | unknown <andrey@lmy004.> | 2005-12-08 15:34:11 +0100 |
commit | c1cb8db8cacf5f7e8f97457690a96da441a320a4 (patch) | |
tree | ad5c936acb2f58110092a44c624c0e30eb0941c2 /sql/event.cc | |
parent | faa8995e7a4b9504a7f02ef69761f5064f388127 (diff) | |
download | mariadb-git-c1cb8db8cacf5f7e8f97457690a96da441a320a4.tar.gz |
- last bits of unneeded error checking in sql_parse.cc thrown away
- fix a bug introduced with last commit ALTER EVENT a RENAME TO b; failed
- misc
sql/event.cc:
- rename evex_db_find_routine_aux() to evex_db_find_event_aux() (better name)
- change parameter order of db_update_event()
- last bits to handle errors as close as possible to the place they occur
- fix a bug introduced with last commit: first check for overwriting and event and then
check whether the original one exists
sql/event.h:
add a new error code returned by event_timed::compile() in case of
error
sql/event_priv.h:
rename
sql/event_timed.cc:
- function rename
- add a bit of doc
sql/share/errmsg.txt:
- extend an error message so it's more informative
- add a new error message
sql/sql_parse.cc:
refactor the cases for CREATE/ALTER/DROP event so use as much common
code as possible. last bits of error checking unneeded in sql_parse.cc
thrwon out.
Diffstat (limited to 'sql/event.cc')
-rw-r--r-- | sql/event.cc | 106 |
1 files changed, 62 insertions, 44 deletions
diff --git a/sql/event.cc b/sql/event.cc index 5e01dc1c72a..c1c56cb6cb4 100644 --- a/sql/event.cc +++ b/sql/event.cc @@ -192,23 +192,23 @@ TABLE *evex_open_event_table(THD *thd, enum thr_lock_type lock_type) Find row in open mysql.event table representing event SYNOPSIS - evex_db_find_routine_aux() + evex_db_find_event_aux() thd Thread context dbname Name of event's database rname Name of the event inside the db table TABLE object for open mysql.event table. RETURN VALUE - 0 - Routine found - SP_KEY_NOT_FOUND- No routine with given name + 0 - Routine found + EVEX_KEY_NOT_FOUND - No routine with given name */ int -evex_db_find_routine_aux(THD *thd, const LEX_STRING dbname, +evex_db_find_event_aux(THD *thd, const LEX_STRING dbname, const LEX_STRING ev_name, TABLE *table) { - byte key[MAX_KEY_LENGTH]; // db, name, optional key length type - DBUG_ENTER("evex_db_find_routine_aux"); + byte key[MAX_KEY_LENGTH]; + DBUG_ENTER("evex_db_find_event_aux"); DBUG_PRINT("enter", ("name: %.*s", ev_name.length, ev_name.str)); /* @@ -218,7 +218,8 @@ evex_db_find_routine_aux(THD *thd, const LEX_STRING dbname, 'db' and 'name' and the first key is the primary key over the same fields. */ - if (ev_name.length > table->field[1]->field_length) + if (dbname.length > table->field[EVEX_FIELD_DB]->field_length || + ev_name.length > table->field[EVEX_FIELD_NAME]->field_length) DBUG_RETURN(EVEX_KEY_NOT_FOUND); table->field[0]->store(dbname.str, dbname.length, &my_charset_bin); @@ -337,6 +338,9 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update) thd THD et event_timed object containing information for the event + Return value + 0 - OK + EVEX_GENERAL_ERROR - Failure DESCRIPTION Creates an event. Relies on evex_fill_row which is shared with db_update_event. The name of the event is inside "et". @@ -362,7 +366,7 @@ db_create_event(THD *thd, event_timed *et) } DBUG_PRINT("info", ("check existance of an event with the same name")); - if (!evex_db_find_routine_aux(thd, et->dbname, et->name, table)) + if (!evex_db_find_event_aux(thd, et->dbname, et->name, table)) { my_error(ER_EVENT_ALREADY_EXISTS, MYF(0), et->name.str); goto err; @@ -377,7 +381,6 @@ db_create_event(THD *thd, event_timed *et) restore_record(table, s->default_values); // Get default values for fields - if (et->name.length > table->field[EVEX_FIELD_NAME]->field_length) { my_error(ER_TOO_LONG_IDENT, MYF(0), et->name.str); @@ -392,28 +395,28 @@ db_create_event(THD *thd, event_timed *et) if (!(et->expression) && !(et->execute_at.year)) { DBUG_PRINT("error", ("neither expression nor execute_at are set!")); - my_error(ER_EVENT_NEITHER_M_EXPR_NOR_M_AT, MYF(0)); - + my_error(ER_EVENT_NEITHER_M_EXPR_NOR_M_AT, MYF(0)); goto err; } strxmov(definer, et->definer_user.str, "@", et->definer_host.str, NullS); - if (table->field[EVEX_FIELD_DEFINER]-> + if ((ret=table->field[EVEX_FIELD_DEFINER]-> store(definer, et->definer_user.length + 1 + et->definer_host.length, - system_charset_info)) + system_charset_info))) { - my_error(ER_EVENT_STORE_FAILED, MYF(0), et->name.str); + my_error(ER_EVENT_STORE_FAILED, MYF(0), et->name.str, ret); goto err; } ((Field_timestamp *)table->field[EVEX_FIELD_CREATED])->set_time(); + + // evex_fill_row() calls my_error() in case of error so no need to handle it here if ((ret= evex_fill_row(thd, table, et, false))) goto err; - ret= EVEX_OK; if (table->file->write_row(table->record[0])) { - my_error(ER_EVENT_STORE_FAILED, MYF(0), et->name.str); + my_error(ER_EVENT_STORE_FAILED, MYF(0), et->name.str, ret); goto err; } @@ -438,7 +441,7 @@ err: /* - Used to execute ALTER EVENT + Used to execute ALTER EVENT. Pendant to evex_update_event(). SYNOPSIS db_update_event() @@ -452,7 +455,7 @@ err: */ static int -db_update_event(THD *thd, sp_name *new_name, event_timed *et) +db_update_event(THD *thd, event_timed *et, sp_name *new_name) { TABLE *table; int ret= EVEX_OPEN_TABLE_FAILED; @@ -467,13 +470,27 @@ db_update_event(THD *thd, sp_name *new_name, event_timed *et) my_error(ER_EVENT_OPEN_TABLE_FAILED, MYF(0)); goto err; } - - if (EVEX_KEY_NOT_FOUND == evex_db_find_routine_aux(thd, et->dbname, et->name, + + // first look whether we overwrite + if (new_name && !evex_db_find_event_aux(thd, new_name->m_db, new_name->m_name, + table)) + { + my_error(ER_EVENT_ALREADY_EXISTS, MYF(0), new_name->m_name.str); + goto err; + } + /* + ...and then whether there is such an event. don't exchange the blocks + because you will get error 120 from table handler because new_name will + overwrite the key and SE will tell us that it cannot find the already found + row (copied into record[1] later + */ + if (EVEX_KEY_NOT_FOUND == evex_db_find_event_aux(thd, et->dbname, et->name, table)) { my_error(ER_EVENT_DOES_NOT_EXIST, MYF(0), et->name.str); goto err; } + store_record(table,record[1]); @@ -494,7 +511,7 @@ db_update_event(THD *thd, sp_name *new_name, event_timed *et) if ((ret= table->file->update_row(table->record[1], table->record[0]))) { - my_error(ER_EVENT_STORE_FAILED, MYF(0), et->name.str); + my_error(ER_EVENT_STORE_FAILED, MYF(0), et->name.str, ret); goto err; } @@ -545,7 +562,7 @@ db_find_event(THD *thd, sp_name *name, event_timed **ett, TABLE *tbl) goto done; } - if ((ret= evex_db_find_routine_aux(thd, name->m_db, name->m_name, table))) + if ((ret= evex_db_find_event_aux(thd, name->m_db, name->m_name, table))) { my_error(ER_EVENT_DOES_NOT_EXIST, MYF(0), name->m_name.str); goto done; @@ -816,20 +833,20 @@ done: */ int -evex_update_event(THD *thd, event_timed *et, sp_name *name) +evex_update_event(THD *thd, event_timed *et, sp_name *new_name) { int ret, i; bool need_second_pass= true; - sp_name *spn= 0; DBUG_ENTER("evex_update_event"); DBUG_PRINT("enter", ("name: %*s", et->name.length, et->name.str)); /* db_update_event() opens & closes the table to prevent - crash later in the code when loading and compiling the new definition + crash later in the code when loading and compiling the new definition. + Also on error conditions my_error() is called so no need to handle here */ - if ((ret= db_update_event(thd, name, et))) + if ((ret= db_update_event(thd, et, new_name))) goto done; VOID(pthread_mutex_lock(&LOCK_evex_running)); @@ -839,22 +856,20 @@ evex_update_event(THD *thd, event_timed *et, sp_name *name) VOID(pthread_mutex_lock(&LOCK_event_arrays)); evex_remove_from_cache(&et->dbname, &et->name, false); if (et->status == MYSQL_EVENT_ENABLED) - if (name) - ret= evex_load_and_compile_event(thd, name, false); + { + if (new_name) + ret= evex_load_and_compile_event(thd, new_name, false); else { - spn= new sp_name(et->dbname, et->name); - ret= evex_load_and_compile_event(thd, spn, false); - delete spn; + sp_name spn(et->dbname, et->name); + ret= evex_load_and_compile_event(thd, &spn, false); } + if (ret == EVEX_COMPILE_ERROR) + my_error(ER_EVENT_COMPILE_ERROR, MYF(0)); + } VOID(pthread_mutex_unlock(&LOCK_event_arrays)); VOID(pthread_mutex_unlock(&LOCK_evex_running)); - /* - It is possible that 2 (or 1) pass(es) won't find the event in memory. - The reason is that DISABLED events are not cached. - */ - done: DBUG_RETURN(ret); } @@ -885,7 +900,7 @@ evex_drop_event(THD *thd, event_timed *et, bool drop_if_exists) goto done; } - if (!(ret= evex_db_find_routine_aux(thd, et->dbname, et->name, table))) + if (!(ret= evex_db_find_event_aux(thd, et->dbname, et->name, table))) { if ((ret= table->file->delete_row(table->record[0]))) { @@ -893,15 +908,18 @@ evex_drop_event(THD *thd, event_timed *et, bool drop_if_exists) goto done; } } - else if (ret == SP_KEY_NOT_FOUND && drop_if_exists) - { - push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, + else if (ret == EVEX_KEY_NOT_FOUND) + { + if (drop_if_exists) + { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, ER_SP_DOES_NOT_EXIST, ER(ER_SP_DOES_NOT_EXIST), - "EVENT", et->name.str); - ret= 0; - goto done; - } else + "Event", et->name.str); + ret= 0; + } else + my_error(ER_EVENT_DOES_NOT_EXIST, MYF(0), et->name.str); goto done; + } VOID(pthread_mutex_lock(&LOCK_evex_running)); if (evex_is_running) |