mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
fa1d637e89
when there are no up-to-date system tables to support it: - initialize the scheduler before reporting "Ready for connections". This ensures that warnings, if any, are printed before "Ready for connections", and this message is not mangled. - do not abort the scheduler if there are no system tables - check the tables once at start up, remember the status and disable the scheduler if the tables are not up to date. If one attempts to use the scheduler with bad tables, issue an error message. - clean up the behaviour of the module under LOCK TABLES and pre-locking mode - make sure implicit commit of Events DDL works as expected. - add more tests Collateral clean ups in the events code. This patch fixes Bug#23631 Events: SHOW VARIABLES doesn't work when mysql.event is damaged mysql-test/r/events.result: Update results. mysql-test/r/events_bugs.result: Update results. mysql-test/r/events_restart_phase1.result: Update results. mysql-test/r/events_restart_phase2.result: Update results. mysql-test/r/events_restart_phase3.result: Update results. mysql-test/r/events_scheduling.result: Update results. mysql-test/r/events_time_zone.result: Update results. mysql-test/t/events.test: Add new tests for tampering with mysql.event and some more tests for sub-statements, LOCK TABLES mode and pre-locking. mysql-test/t/events_bugs.test: Move the non-concurrent part of test for Bug 16420 to this file. mysql-test/t/events_restart_phase1.test: Rewrite events_restart_* tests to take into account that now we check mysql.event table only once, at server startup. mysql-test/t/events_restart_phase2.test: Rewrite events_restart_* tests to take into account that now we check mysql.event table only once, at server startup. mysql-test/t/events_restart_phase3.test: Rewrite events_restart_* tests to take into account that now we check mysql.event table only once, at server startup. mysql-test/t/events_scheduling.test: Add more coverage for event_scheduler global variable. mysql-test/t/events_time_zone.test: Move the non-concurrent part of the tests for Bug 16420 to events_bugs.test sql/event_data_objects.cc: Move update_timing_fields functionality to Event_db_repository. Make loading of events from a table record more robust to tampering with the table - now we do not check mysql.event on every table open. sql/event_data_objects.h: Cleanup. sql/event_db_repository.cc: Now Event_db_repository is responsible for table I/O only. All the logic of events DDL is handled outside, in Events class please refer to the added test coverage to see how this change affected the behavior of Event Scheduler. Dependency on sp_head.h and sp.h removed. Make this module robust to tweaks with mysql.event table. Move check_system_tables from events.cc to this file sql/event_db_repository.h: Cleanup declarations (remove unused ones, change return type to bool from int). sql/event_queue.cc: Update to adapt to the new start up scheme of the Event Scheduler. sql/event_queue.h: Cleanup declarations. sql/event_scheduler.cc: Make all the error messages uniform: [SEVERITY] Event Scheduler: [user][schema.event] message Using append_identifier for error logging was an overkill - we may need it only if the system character set may have NUL (null character) as part of a valid identifier, this is currently never the case, whereas additional quoting did not look nice in the log. sql/event_scheduler.h: Cleanup the headers. sql/events.cc: Use a different start up procedure of Event Scheduler: - at start up, try to check the system tables first. If they are not up-to-date, disable the scheduler. - try to load all the active events. In case of a load error, abort start up. - do not parse an event on start up. Parsing only gives some information about event validity, but far not all. Consolidate the business logic of Events DDL in this module. Now opt_event_scheduler may change after start up and thus is protected by LOCK_event_metadata mutex. sql/events.h: Use all-static-data-members approach to implement Singleton pattern. sql/mysqld.cc: New invocation scheme of Events. Move some logic to events.cc. Initialize the scheduler before reporting "Ready for connections". sql/set_var.cc: Clean up sys_var_thd_sql_mode::symbolic_mode_representation to work with a LEX_STRING. Move more logic related to @@events_scheduler global variable to Events module. sql/set_var.h: Update declarations. sql/share/errmsg.txt: If someone tampered with mysql.event table after the server has started we no longer give him/her a complete report what was actually broken. Do not send the user to look at the error log in such case, as there is nothing there (check_table_intact is not executed). sql/sp_head.cc: Update to a new declaration of sys_var_thd_sql_mode::symbolic_mode_representation sql/sql_db.cc: New invocation scheme of Events module. sql/sql_parse.cc: Move more logic to Events module. Make sure that we are consistent in the way access rights are checked for Events DDL: always after committing the current transaction and checking the system tables. sql/sql_show.cc: Update to the new declarations of sys_var_thd_sql_mode::symbolic_mode_representation sql/sql_test.cc: New invocation scheme of events. sql/table.cc: mysql.event is a system table. Update check_table_intact to be concurrent, more verbose, and less smart. sql/table.h: Add a helper method. mysql-test/r/events_trans.result: New BitKeeper file ``mysql-test/r/events_trans.result'' mysql-test/t/events_trans.test: New BitKeeper file ``mysql-test/t/events_trans.test'': test cases for Event Scheduler that require a transactional storage engine.
293 lines
5.2 KiB
C++
293 lines
5.2 KiB
C++
#ifndef _EVENT_DATA_OBJECTS_H_
|
|
#define _EVENT_DATA_OBJECTS_H_
|
|
/* Copyright (C) 2004-2006 MySQL AB
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
|
|
#define EVEX_GET_FIELD_FAILED -2
|
|
#define EVEX_COMPILE_ERROR -3
|
|
#define EVEX_BAD_PARAMS -5
|
|
#define EVEX_MICROSECOND_UNSUP -6
|
|
|
|
|
|
class sp_head;
|
|
class Sql_alloc;
|
|
|
|
|
|
class Event_queue_element_for_exec
|
|
{
|
|
public:
|
|
Event_queue_element_for_exec(){};
|
|
~Event_queue_element_for_exec();
|
|
|
|
bool
|
|
init(LEX_STRING dbname, LEX_STRING name);
|
|
|
|
LEX_STRING dbname;
|
|
LEX_STRING name;
|
|
bool dropped;
|
|
THD *thd;
|
|
|
|
private:
|
|
/* Prevent use of these */
|
|
Event_queue_element_for_exec(const Event_queue_element_for_exec &);
|
|
void operator=(Event_queue_element_for_exec &);
|
|
};
|
|
|
|
|
|
class Event_basic
|
|
{
|
|
protected:
|
|
MEM_ROOT mem_root;
|
|
|
|
public:
|
|
LEX_STRING dbname;
|
|
LEX_STRING name;
|
|
LEX_STRING definer;// combination of user and host
|
|
|
|
Time_zone *time_zone;
|
|
|
|
Event_basic();
|
|
virtual ~Event_basic();
|
|
|
|
virtual int
|
|
load_from_row(THD *thd, TABLE *table) = 0;
|
|
|
|
protected:
|
|
bool
|
|
load_string_fields(Field **fields, ...);
|
|
|
|
bool
|
|
load_time_zone(THD *thd, const LEX_STRING tz_name);
|
|
};
|
|
|
|
|
|
|
|
class Event_queue_element : public Event_basic
|
|
{
|
|
protected:
|
|
bool status_changed;
|
|
bool last_executed_changed;
|
|
|
|
public:
|
|
enum enum_status
|
|
{
|
|
ENABLED = 1,
|
|
DISABLED
|
|
};
|
|
|
|
enum enum_on_completion
|
|
{
|
|
ON_COMPLETION_DROP = 1,
|
|
ON_COMPLETION_PRESERVE
|
|
};
|
|
|
|
enum enum_on_completion on_completion;
|
|
enum enum_status status;
|
|
|
|
my_time_t last_executed;
|
|
my_time_t execute_at;
|
|
my_time_t starts;
|
|
my_time_t ends;
|
|
my_bool starts_null;
|
|
my_bool ends_null;
|
|
my_bool execute_at_null;
|
|
|
|
longlong expression;
|
|
interval_type interval;
|
|
|
|
bool dropped;
|
|
|
|
uint execution_count;
|
|
|
|
Event_queue_element();
|
|
virtual ~Event_queue_element();
|
|
|
|
virtual int
|
|
load_from_row(THD *thd, TABLE *table);
|
|
|
|
bool
|
|
compute_next_execution_time();
|
|
|
|
void
|
|
mark_last_executed(THD *thd);
|
|
|
|
bool
|
|
update_timing_fields(THD *thd);
|
|
};
|
|
|
|
|
|
class Event_timed : public Event_queue_element
|
|
{
|
|
Event_timed(const Event_timed &); /* Prevent use of these */
|
|
void operator=(Event_timed &);
|
|
|
|
public:
|
|
LEX_STRING body;
|
|
|
|
LEX_STRING definer_user;
|
|
LEX_STRING definer_host;
|
|
|
|
LEX_STRING comment;
|
|
|
|
ulonglong created;
|
|
ulonglong modified;
|
|
|
|
ulong sql_mode;
|
|
|
|
Event_timed();
|
|
virtual ~Event_timed();
|
|
|
|
void
|
|
init();
|
|
|
|
virtual int
|
|
load_from_row(THD *thd, TABLE *table);
|
|
|
|
int
|
|
get_create_event(THD *thd, String *buf);
|
|
};
|
|
|
|
|
|
class Event_job_data : public Event_basic
|
|
{
|
|
public:
|
|
sp_head *sphead;
|
|
|
|
LEX_STRING body;
|
|
LEX_STRING definer_user;
|
|
LEX_STRING definer_host;
|
|
|
|
ulong sql_mode;
|
|
|
|
Event_job_data();
|
|
virtual ~Event_job_data();
|
|
|
|
virtual int
|
|
load_from_row(THD *thd, TABLE *table);
|
|
|
|
int
|
|
execute(THD *thd);
|
|
|
|
int
|
|
compile(THD *thd, MEM_ROOT *mem_root);
|
|
private:
|
|
int
|
|
get_fake_create_event(String *buf);
|
|
|
|
Event_job_data(const Event_job_data &); /* Prevent use of these */
|
|
void operator=(Event_job_data &);
|
|
};
|
|
|
|
|
|
class Event_parse_data : public Sql_alloc
|
|
{
|
|
public:
|
|
enum enum_status
|
|
{
|
|
ENABLED = 1,
|
|
DISABLED
|
|
};
|
|
|
|
enum enum_on_completion
|
|
{
|
|
ON_COMPLETION_DROP = 1,
|
|
ON_COMPLETION_PRESERVE
|
|
};
|
|
enum enum_on_completion on_completion;
|
|
enum enum_status status;
|
|
/*
|
|
do_not_create will be set if STARTS time is in the past and
|
|
on_completion == ON_COMPLETION_DROP.
|
|
*/
|
|
bool do_not_create;
|
|
|
|
const char *body_begin;
|
|
|
|
LEX_STRING dbname;
|
|
LEX_STRING name;
|
|
LEX_STRING definer;// combination of user and host
|
|
LEX_STRING body;
|
|
LEX_STRING comment;
|
|
|
|
Item* item_starts;
|
|
Item* item_ends;
|
|
Item* item_execute_at;
|
|
|
|
my_time_t starts;
|
|
my_time_t ends;
|
|
my_time_t execute_at;
|
|
my_bool starts_null;
|
|
my_bool ends_null;
|
|
my_bool execute_at_null;
|
|
|
|
sp_name *identifier;
|
|
Item* item_expression;
|
|
longlong expression;
|
|
interval_type interval;
|
|
|
|
static Event_parse_data *
|
|
new_instance(THD *thd);
|
|
|
|
bool
|
|
check_parse_data(THD *thd);
|
|
|
|
void
|
|
init_body(THD *thd);
|
|
|
|
private:
|
|
|
|
void
|
|
init_definer(THD *thd);
|
|
|
|
void
|
|
init_name(THD *thd, sp_name *spn);
|
|
|
|
int
|
|
init_execute_at(THD *thd);
|
|
|
|
int
|
|
init_interval(THD *thd);
|
|
|
|
int
|
|
init_starts(THD *thd);
|
|
|
|
int
|
|
init_ends(THD *thd);
|
|
|
|
Event_parse_data();
|
|
~Event_parse_data();
|
|
|
|
void
|
|
report_bad_value(const char *item_name, Item *bad_item);
|
|
|
|
void
|
|
check_if_in_the_past(THD *thd, my_time_t ltime_utc);
|
|
|
|
Event_parse_data(const Event_parse_data &); /* Prevent use of these */
|
|
void operator=(Event_parse_data &);
|
|
};
|
|
|
|
|
|
/* Compares only the schema part of the identifier */
|
|
bool
|
|
event_basic_db_equal(LEX_STRING db, Event_basic *et);
|
|
|
|
/* Compares the whole identifier*/
|
|
bool
|
|
event_basic_identifier_equal(LEX_STRING db, LEX_STRING name, Event_basic *b);
|
|
|
|
|
|
#endif /* _EVENT_DATA_OBJECTS_H_ */
|