1
0
mirror of https://github.com/MariaDB/server.git synced 2026-10-23 18:49:29 +03:00
Files
mariadb/sql/event_parse_data.h
Dmitry Shulga 0c40227d1a MDEV-30645: CREATE TRIGGER FOR { STARTUP | SHUTDOWN }
This patch add support of system triggers fired on server start up
and shutdown. On start up triggers can be associated only with AFTER
event time, on shutdown triggers associated with BEFORE event time.
Several triggers can be created to be run on the same time/event type.

Core implementation
- Extended the sql grammar to support creation of system triggers
  on startup/shutdown
- System triggers metadata is stored in the table mysql.event
- Events and system triggers share the same name space since both are stored
  in the table mysql.event declared with the PRIMARY KEY (`db`,`name`).
  In result, attempt to create an event with the same name as existent
  trigger and vice versa results in failure with the new error
  ER_TRG_EVENT_CONFLICTS_NAME
- Since system triggers metadata is stored in the mysql.event table,
  the table mysql.event is now opened on handling the DROP TRIGGER
  statement
- In case server is started against old version of mysql.event table
  that missing columns required for support of system triggers, system trigger
  feature is disabled
- System triggers are loaded from the table mysql.event right before
  their execution
- System triggers can be created only by users with the SUPER privilege
- Added the option --sys_triggers for mysqldump to dump system triggers.
  The option is turned off by default. In case this option is on, mysqldump
  first dump the table 'mysql' unconditionally, regardless whether
  it was listed in the option --ignore-database
2026-10-19 16:06:49 +07:00

139 lines
3.0 KiB
C++

/*
Copyright (c) 2008, 2011, Oracle and/or its affiliates.
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
#ifndef _EVENT_PARSE_DATA_H_
#define _EVENT_PARSE_DATA_H_
#include "sql_alloc.h"
class Item;
class THD;
class sp_name;
#define EVEX_GET_FIELD_FAILED -2
#define EVEX_BAD_PARAMS -5
#define EVEX_MICROSECOND_UNSUP -6
#define EVEX_MAX_INTERVAL_VALUE 1000000000L
class Event_parse_data : public Sql_alloc
{
public:
/*
ENABLED = feature can function normally (is turned on)
SLAVESIDE_DISABLED = feature is turned off on slave
DISABLED = feature is turned off
*/
enum enum_status
{
ENABLED = 1,
DISABLED,
SLAVESIDE_DISABLED
};
enum enum_on_completion
{
/*
On CREATE EVENT, DROP is the DEFAULT as per the docs.
On ALTER EVENT, "no change" is the DEFAULT.
*/
ON_COMPLETION_DEFAULT = 0,
ON_COMPLETION_DROP,
ON_COMPLETION_PRESERVE
};
enum enum_kind
{
SCHEDULE_EVENT= 0x01, SYS_TRG_ON_STARTUP= 0x02, SYS_TRG_ON_SHUTDOWN= 0x04,
SYS_TRG_ON_LOGON= 0x08, SYS_TRG_ON_LOGOFF= 0x10, SYS_TRG_ON_DDL= 0x20
};
int on_completion;
int status;
bool status_changed;
uint32 originator;
/*
do_not_create will be set if STARTS time is in the past and
on_completion == ON_COMPLETION_DROP.
*/
bool do_not_create;
bool body_changed;
LEX_CSTRING dbname;
LEX_CSTRING name;
LEX_CSTRING definer;// combination of user and host
LEX_CSTRING comment;
Item* item_starts;
Item* item_ends;
Item* item_execute_at;
my_time_t starts;
my_time_t ends;
my_time_t execute_at;
bool starts_null;
bool ends_null;
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);
bool
check_dates(THD *thd, int previous_on_completion);
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 check_originator_id(THD *thd);
void operator=(Event_parse_data &);
};
#endif