Commit 2d48a1f2 authored by unknown's avatar unknown

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

into  mysql.com:/home/cps/mysql/trees/5.1-runtime-new


sql/handler.h:
  Auto merged
sql/mysql_priv.h:
  Auto merged
sql/sp.cc:
  Auto merged
sql/sql_acl.cc:
  Auto merged
sql/sql_show.cc:
  Auto merged
sql/share/errmsg.txt:
  Auto merged
sql/sql_table.cc:
  Auto merged
mysql-test/r/sp.result:
  manual merge
mysql-test/t/sp.test:
  manual merge
storage/csv/ha_tina.cc:
  manual merge
storage/myisam/ha_myisam.cc:
  manual merge
parents 5529b7fb ac4b6623
......@@ -38,52 +38,37 @@ drop event event2;
create event event2 on schedule every 2 second starts now() ends date_add(now(), interval 5 hour) comment "some" DO begin end;
drop event event2;
CREATE EVENT event_starts_test ON SCHEDULE EVERY 10 SECOND COMMENT "" DO SELECT 1;
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost RECURRING NULL 10 SECOND # # ENABLED
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
starts IS NULL ends IS NULL comment
0 1
SELECT interval_field, interval_value, body FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
interval_field interval_value body
SECOND 10 SELECT 1
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
execute_at IS NULL starts IS NULL ends IS NULL comment
1 0 1
ALTER EVENT event_starts_test ON SCHEDULE AT '2020-02-02 20:00:02';
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost ONE TIME 2020-02-02 17:00:02 NULL NULL # # ENABLED
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
starts IS NULL ends IS NULL comment
1 1
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
execute_at IS NULL starts IS NULL ends IS NULL comment
0 1 1
ALTER EVENT event_starts_test COMMENT "non-empty comment";
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost ONE TIME 2020-02-02 17:00:02 NULL NULL # # ENABLED
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
starts IS NULL ends IS NULL comment
1 1 non-empty comment
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
execute_at IS NULL starts IS NULL ends IS NULL comment
0 1 1 non-empty comment
ALTER EVENT event_starts_test COMMENT "";
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost ONE TIME 2020-02-02 17:00:02 NULL NULL # # ENABLED
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
starts IS NULL ends IS NULL comment
1 1
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
execute_at IS NULL starts IS NULL ends IS NULL comment
0 1 1
DROP EVENT event_starts_test;
CREATE EVENT event_starts_test ON SCHEDULE EVERY 20 SECOND STARTS '2020-02-02 20:00:02' ENDS '2022-02-02 20:00:02' DO SELECT 2;
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost RECURRING NULL 20 SECOND # # ENABLED
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
starts IS NULL ends IS NULL comment
0 0
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
execute_at IS NULL starts IS NULL ends IS NULL comment
1 0 0
ALTER EVENT event_starts_test COMMENT "non-empty comment";
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost RECURRING NULL 20 SECOND # # ENABLED
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
starts IS NULL ends IS NULL comment
0 0 non-empty comment
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
execute_at IS NULL starts IS NULL ends IS NULL comment
1 0 0 non-empty comment
ALTER EVENT event_starts_test COMMENT "";
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost RECURRING NULL 20 SECOND # # ENABLED
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
execute_at IS NULL starts IS NULL ends IS NULL comment
1 0 0
DROP EVENT event_starts_test;
create table test_nested(a int);
create event e_43 on schedule every 1 second do set @a = 5;
......
......@@ -213,4 +213,17 @@ create event e_53 on schedule every 5 second starts (select s1 from ttx) do drop
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select s1 from ttx) do drop table t' at line 1
create event e_53 on schedule every 5 second ends (select s1 from ttx) do drop table t;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select s1 from ttx) do drop table t' at line 1
drop event if exists e_16;
drop procedure if exists p_16;
create event e_16 on schedule every 1 second do set @a=5;
create procedure p_16 () alter event e_16 on schedule every @a second;
set @a = null;
call p_16();
ERROR HY000: Incorrect INTERVAL value: 'NULL'
call p_16();
ERROR HY000: Incorrect INTERVAL value: 'NULL'
set @a= 6;
call p_16();
drop procedure p_16;
drop event e_16;
drop database events_test;
SHOW VARIABLES LIKE 'event%';
Variable_name Value
event_scheduler DISABLED
SELECT @@global.event_scheduler;
@@global.event_scheduler
DISABLED
SET GLOBAL event_scheduler=on;
ERROR HY000: The MySQL server is running with the --event-scheduler=DISABLED option so it cannot execute this statement
SET GLOBAL event_scheduler=off;
ERROR HY000: The MySQL server is running with the --event-scheduler=DISABLED option so it cannot execute this statement
SET GLOBAL event_scheduler=0;
ERROR HY000: The MySQL server is running with the --event-scheduler=DISABLED option so it cannot execute this statement
SET GLOBAL event_scheduler=1;
ERROR HY000: The MySQL server is running with the --event-scheduler=DISABLED option so it cannot execute this statement
SET GLOBAL event_scheduler=2;
ERROR 42000: Variable 'event_scheduler' can't be set to the value of '2'
SET GLOBAL event_scheduler=SUSPEND;
ERROR 42000: Variable 'event_scheduler' can't be set to the value of 'SUSPEND'
SET GLOBAL event_scheduler=SUSPENDED;
ERROR 42000: Variable 'event_scheduler' can't be set to the value of 'SUSPENDED'
SET GLOBAL event_scheduler=disabled;
ERROR 42000: Variable 'event_scheduler' can't be set to the value of 'disabled'
......@@ -73,16 +73,16 @@ select * from mysql.slow_log;
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text
TIMESTAMP USER_HOST QUERY_TIME 00:00:00 1 0 test 0 0 1 select sleep(2)
alter table mysql.general_log engine=myisam;
ERROR HY000: You can't alter a log table if logging is enabled
ERROR HY000: You cannot 'ALTER' a log table if logging is enabled
alter table mysql.slow_log engine=myisam;
ERROR HY000: You can't alter a log table if logging is enabled
ERROR HY000: You cannot 'ALTER' a log table if logging is enabled
drop table mysql.general_log;
ERROR HY000: Cannot drop log table if log is enabled
ERROR HY000: You cannot 'DROP' a log table if logging is enabled
drop table mysql.slow_log;
ERROR HY000: Cannot drop log table if log is enabled
ERROR HY000: You cannot 'DROP' a log table if logging is enabled
set global general_log='OFF';
alter table mysql.slow_log engine=myisam;
ERROR HY000: You can't alter a log table if logging is enabled
ERROR HY000: You cannot 'ALTER' a log table if logging is enabled
set global slow_query_log='OFF';
show create table mysql.general_log;
Table Create Table
......@@ -173,13 +173,13 @@ unlock tables;
set global general_log='OFF';
set global slow_query_log='OFF';
alter table mysql.slow_log engine=ndb;
ERROR HY000: One can use only CSV and MyISAM engines for the log tables
ERROR HY000: This storage engine cannot be used for log tables"
alter table mysql.slow_log engine=innodb;
ERROR HY000: One can use only CSV and MyISAM engines for the log tables
ERROR HY000: This storage engine cannot be used for log tables"
alter table mysql.slow_log engine=archive;
ERROR HY000: One can use only CSV and MyISAM engines for the log tables
ERROR HY000: This storage engine cannot be used for log tables"
alter table mysql.slow_log engine=blackhole;
ERROR HY000: One can use only CSV and MyISAM engines for the log tables
ERROR HY000: This storage engine cannot be used for log tables"
drop table mysql.slow_log;
drop table mysql.general_log;
drop table mysql.general_log;
......
......@@ -5379,6 +5379,14 @@ Procedure sql_mode Create Procedure
bug21416 CREATE DEFINER=`root`@`localhost` PROCEDURE `bug21416`()
show create procedure bug21416
drop procedure bug21416|
DROP PROCEDURE IF EXISTS bug21414|
CREATE PROCEDURE bug21414() SELECT 1|
FLUSH TABLES WITH READ LOCK|
DROP PROCEDURE bug21414|
ERROR HY000: Can't execute the query because you have a conflicting read lock
UNLOCK TABLES|
The following should succeed.
DROP PROCEDURE bug21414|
CREATE TABLE t3 (
Member_ID varchar(15) NOT NULL,
PRIMARY KEY (Member_ID)
......
......@@ -49,35 +49,26 @@ drop event event2;
create event event2 on schedule every 2 second starts now() ends date_add(now(), interval 5 hour) comment "some" DO begin end;
drop event event2;
#
# BUG #16537 (Events: mysql.event.starts is null)
#
CREATE EVENT event_starts_test ON SCHEDULE EVERY 10 SECOND COMMENT "" DO SELECT 1;
--replace_column 8 # 9 #
SHOW EVENTS;
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
SELECT interval_field, interval_value, body FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
ALTER EVENT event_starts_test ON SCHEDULE AT '2020-02-02 20:00:02';
--replace_column 8 # 9 #
SHOW EVENTS;
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
ALTER EVENT event_starts_test COMMENT "non-empty comment";
--replace_column 8 # 9 #
SHOW EVENTS;
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
ALTER EVENT event_starts_test COMMENT "";
--replace_column 8 # 9 #
SHOW EVENTS;
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
DROP EVENT event_starts_test;
CREATE EVENT event_starts_test ON SCHEDULE EVERY 20 SECOND STARTS '2020-02-02 20:00:02' ENDS '2022-02-02 20:00:02' DO SELECT 2;
--replace_column 8 # 9 #
SHOW EVENTS;
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
ALTER EVENT event_starts_test COMMENT "non-empty comment";
--replace_column 8 # 9 #
SHOW EVENTS;
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
ALTER EVENT event_starts_test COMMENT "";
--replace_column 8 # 9 #
SHOW EVENTS;
SELECT execute_at IS NULL, starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
DROP EVENT event_starts_test;
#
#
......
......@@ -234,4 +234,23 @@ create event e_53 on schedule every 5 second ends (select s1 from ttx) do drop t
# END - BUG#16394: Events: Crash if schedule contains SELECT
#
#
# START - BUG#22397: Events: crash with procedure which alters events
#
--disable_warnings
drop event if exists e_16;
drop procedure if exists p_16;
--enable_warnings
create event e_16 on schedule every 1 second do set @a=5;
create procedure p_16 () alter event e_16 on schedule every @a second;
set @a = null;
--error ER_WRONG_VALUE
call p_16();
--error ER_WRONG_VALUE
call p_16();
set @a= 6;
call p_16();
drop procedure p_16;
drop event e_16;
drop database events_test;
SHOW VARIABLES LIKE 'event%';
Variable_name Value
event_scheduler DISABLED
SELECT @@global.event_scheduler;
@@global.event_scheduler
DISABLED
SET GLOBAL event_scheduler=on;
ERROR HY000: The MySQL server is running with the --event-scheduler=DISABLED option so it cannot execute this statement
SET GLOBAL event_scheduler=off;
ERROR HY000: The MySQL server is running with the --event-scheduler=DISABLED option so it cannot execute this statement
SET GLOBAL event_scheduler=0;
ERROR HY000: The MySQL server is running with the --event-scheduler=DISABLED option so it cannot execute this statement
SET GLOBAL event_scheduler=1;
ERROR HY000: The MySQL server is running with the --event-scheduler=DISABLED option so it cannot execute this statement
SET GLOBAL event_scheduler=2;
ERROR 42000: Variable 'event_scheduler' can't be set to the value of '2'
SET GLOBAL event_scheduler=SUSPEND;
ERROR 42000: Variable 'event_scheduler' can't be set to the value of 'SUSPEND'
SET GLOBAL event_scheduler=SUSPENDED;
ERROR 42000: Variable 'event_scheduler' can't be set to the value of 'SUSPENDED'
SET GLOBAL event_scheduler=disabled;
ERROR 42000: Variable 'event_scheduler' can't be set to the value of 'disabled'
SHOW VARIABLES LIKE 'event%';
Variable_name Value
event_scheduler DISABLED
SELECT @@global.event_scheduler;
@@global.event_scheduler
DISABLED
SET GLOBAL event_scheduler=on;
ERROR HY000: The MySQL server is running with the --event-scheduler=DISABLED option so it cannot execute this statement
SET GLOBAL event_scheduler=off;
ERROR HY000: The MySQL server is running with the --event-scheduler=DISABLED option so it cannot execute this statement
SET GLOBAL event_scheduler=0;
ERROR HY000: The MySQL server is running with the --event-scheduler=DISABLED option so it cannot execute this statement
SET GLOBAL event_scheduler=1;
ERROR HY000: The MySQL server is running with the --event-scheduler=DISABLED option so it cannot execute this statement
SET GLOBAL event_scheduler=2;
ERROR 42000: Variable 'event_scheduler' can't be set to the value of '2'
SET GLOBAL event_scheduler=SUSPEND;
ERROR 42000: Variable 'event_scheduler' can't be set to the value of 'SUSPEND'
SET GLOBAL event_scheduler=SUSPENDED;
ERROR 42000: Variable 'event_scheduler' can't be set to the value of 'SUSPENDED'
SET GLOBAL event_scheduler=disabled;
ERROR 42000: Variable 'event_scheduler' can't be set to the value of 'disabled'
......@@ -178,21 +178,21 @@ select * from mysql.slow_log;
# check that appropriate error messages are given when one attempts to alter
# or drop a log tables, while corresponding logs are enabled
--error ER_CANT_ALTER_LOG_TABLE
--error ER_BAD_LOG_STATEMENT
alter table mysql.general_log engine=myisam;
--error ER_CANT_ALTER_LOG_TABLE
--error ER_BAD_LOG_STATEMENT
alter table mysql.slow_log engine=myisam;
--error ER_CANT_DROP_LOG_TABLE
--error ER_BAD_LOG_STATEMENT
drop table mysql.general_log;
--error ER_CANT_DROP_LOG_TABLE
--error ER_BAD_LOG_STATEMENT
drop table mysql.slow_log;
# check that one can alter log tables to MyISAM
set global general_log='OFF';
# cannot convert another log table
--error ER_CANT_ALTER_LOG_TABLE
--error ER_BAD_LOG_STATEMENT
alter table mysql.slow_log engine=myisam;
# alter both tables
......@@ -252,13 +252,13 @@ set global general_log='OFF';
set global slow_query_log='OFF';
# check that alter table doesn't work for other engines
--error ER_BAD_LOG_ENGINE
--error ER_UNSUPORTED_LOG_ENGINE
alter table mysql.slow_log engine=ndb;
--error ER_BAD_LOG_ENGINE
--error ER_UNSUPORTED_LOG_ENGINE
alter table mysql.slow_log engine=innodb;
--error ER_BAD_LOG_ENGINE
--error ER_UNSUPORTED_LOG_ENGINE
alter table mysql.slow_log engine=archive;
--error ER_BAD_LOG_ENGINE
--error ER_UNSUPORTED_LOG_ENGINE
alter table mysql.slow_log engine=blackhole;
drop table mysql.slow_log;
......
#
# Basic stored PROCEDURE tests
#
# Please keep this file free of --error cases and other
# things that will not run in a single debugged mysqld
# process (e.g. master-slave things).
#
# Test cases for bugs are added at the end. See template there.
#
# Tests that require --error go into sp-error.test
# Some tests that require --error go into sp-error.test
# Tests that require inndb go into sp_trans.test
# Tests that check privilege and security issues go to sp-security.test.
# Tests that require multiple connections, except security/privilege tests,
......@@ -6295,6 +6291,25 @@ create procedure bug21416() show create procedure bug21416|
call bug21416()|
drop procedure bug21416|
#
# BUG#21414: SP: Procedure undroppable, to some extent
#
--disable_warnings
DROP PROCEDURE IF EXISTS bug21414|
--enable_warnings
CREATE PROCEDURE bug21414() SELECT 1|
FLUSH TABLES WITH READ LOCK|
--error ER_CANT_UPDATE_WITH_READLOCK
DROP PROCEDURE bug21414|
UNLOCK TABLES|
--echo The following should succeed.
DROP PROCEDURE bug21414|
#
# BUG#21493: Crash on the second call of a procedure containing
# a select statement that uses an IN aggregating subquery
......@@ -6363,6 +6378,8 @@ DROP FUNCTION bug21493|
DROP TABLE t3,t4|
--echo End of 5.0 tests
#
# BUG#NNNN: New bug synopsis
#
......
......@@ -146,20 +146,35 @@ void Guardian_thread::process_instance(Instance *instance,
if (instance->is_running())
{
/* clear status fields */
current_node->restart_counter= 0;
current_node->crash_moment= 0;
current_node->state= STARTED;
/* The instance can be contacted on it's port */
/* If STARTING also check that pidfile has been created */
if (current_node->state == STARTING &&
current_node->instance->options.get_pid() == 0)
{
/* Pid file not created yet, don't go to STARTED state yet */
}
else
{
/* clear status fields */
log_info("guardian: instance %s is running, set state to STARTED",
instance->options.instance_name);
current_node->restart_counter= 0;
current_node->crash_moment= 0;
current_node->state= STARTED;
}
}
else
{
switch (current_node->state) {
case NOT_STARTED:
instance->start();
current_node->last_checked= current_time;
log_info("guardian: starting instance %s",
instance->options.instance_name);
/* NOTE, set state to STARTING _before_ start() is called */
current_node->state= STARTING;
instance->start();
current_node->last_checked= current_time;
break;
case STARTED: /* fallthrough */
case STARTING: /* let the instance start or crash */
......
......@@ -611,18 +611,19 @@ void Instance::kill_instance(int signum)
/* if there are no pid, everything seems to be fine */
if ((pid= options.get_pid()) != 0) /* get pid from pidfile */
{
/*
If we cannot kill mysqld, then it has propably crashed.
Let us try to remove staled pidfile and return successfully
as mysqld is probably stopped.
*/
if (!kill(pid, signum))
options.unlink_pidfile();
else if (signum == SIGKILL) /* really killed instance with SIGKILL */
log_error("The instance %s is being stopped forsibly. Normally \
it should not happed. Probably the instance has been \
hanging. You should also check your IM setup",
options.instance_name);
if (kill(pid, signum) == 0)
{
/* Kill suceeded */
if (signum == SIGKILL) /* really killed instance with SIGKILL */
{
log_error("The instance %s is being stopped forcibly. Normally" \
"it should not happen. Probably the instance has been" \
"hanging. You should also check your IM setup",
options.instance_name);
/* After sucessful hard kill the pidfile need to be removed */
options.unlink_pidfile();
}
}
}
return;
}
......
......@@ -406,7 +406,8 @@ pid_t Instance_options::get_pid()
{
pid_t pid;
fscanf(pid_file_stream, "%i", &pid);
if (fscanf(pid_file_stream, "%i", &pid) != 1)
pid= -1;
my_fclose(pid_file_stream, MYF(0));
return pid;
}
......
......@@ -353,7 +353,7 @@ Event_parse_data::init_interval(THD *thd)
DBUG_RETURN(0);
wrong_value:
report_bad_value("INTERVAL", item_execute_at);
report_bad_value("INTERVAL", item_expression);
DBUG_RETURN(ER_WRONG_VALUE);
}
......
......@@ -55,7 +55,7 @@ class Events
{
EVENTS_OFF= 0,
EVENTS_ON= 1,
EVENTS_DISABLED= 5
EVENTS_DISABLED= 4
};
static enum_opt_event_scheduler opt_event_scheduler;
......
......@@ -690,6 +690,7 @@ struct handlerton
#define HTON_FLUSH_AFTER_RENAME (1 << 4)
#define HTON_NOT_USER_SELECTABLE (1 << 5)
#define HTON_TEMPORARY_NOT_SUPPORTED (1 << 6) //Having temporary tables not supported
#define HTON_SUPPORT_LOG_TABLES (1 << 7) //Engine supports log tables
typedef struct st_thd_trans
{
......
......@@ -1558,7 +1558,6 @@ extern my_bool opt_log_queries_not_using_indexes;
extern bool opt_disable_networking, opt_skip_show_db;
extern my_bool opt_character_set_client_handshake;
extern bool volatile abort_loop, shutdown_in_progress, grant_option;
extern bool mysql_proc_table_exists;
extern uint volatile thread_count, thread_running, global_read_lock;
extern my_bool opt_sql_bin_update, opt_safe_user_create, opt_no_mix_types;
extern my_bool opt_safe_show_db, opt_local_infile, opt_myisam_use_mmap;
......
......@@ -5972,12 +5972,6 @@ ER_RBR_NOT_AVAILABLE
ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA
eng "Triggers can not be created on system tables"
ger "Trigger knnen nicht auf Systemtabellen erzeugt werden"
ER_CANT_ALTER_LOG_TABLE
eng "You can't alter a log table if logging is enabled"
ER_BAD_LOG_ENGINE
eng "One can use only CSV and MyISAM engines for the log tables"
ER_CANT_DROP_LOG_TABLE
eng "Cannot drop log table if log is enabled"
ER_EVENT_RECURSIVITY_FORBIDDEN
eng "Recursivity of EVENT DDL statements is forbidden when body is present"
ER_EVENTS_DB_ERROR
......@@ -5992,3 +5986,8 @@ ER_HOSTNAME
eng "host name"
ER_WRONG_STRING_LENGTH
eng "String '%-.70s' is too long for %s (should be no longer than %d)"
ER_UNSUPORTED_LOG_ENGINE
eng "This storage engine cannot be used for log tables""
ER_BAD_LOG_STATEMENT
eng "You cannot '%s' a log table if logging is enabled"
......@@ -65,8 +65,6 @@ enum
MYSQL_PROC_FIELD_COUNT
};
bool mysql_proc_table_exists= 1;
/* Tells what SP_DEFAULT_ACCESS should be mapped to */
#define SP_DEFAULT_ACCESS_MAPPING SP_CONTAINS_SQL
......@@ -118,13 +116,6 @@ TABLE *open_proc_table_for_read(THD *thd, Open_tables_state *backup)
bool not_used;
DBUG_ENTER("open_proc_table");
/*
Speed up things if mysql.proc doesn't exists. mysql_proc_table_exists
is set when we create or read stored procedure or on flush privileges.
*/
if (!mysql_proc_table_exists)
DBUG_RETURN(0);
thd->reset_n_backup_open_tables_state(backup);
bzero((char*) &tables, sizeof(tables));
......@@ -134,7 +125,6 @@ TABLE *open_proc_table_for_read(THD *thd, Open_tables_state *backup)
MYSQL_LOCK_IGNORE_FLUSH)))
{
thd->restore_backup_open_tables_state(backup);
mysql_proc_table_exists= 0;
DBUG_RETURN(0);
}
table->use_all_columns();
......@@ -186,15 +176,6 @@ static TABLE *open_proc_table_for_update(THD *thd)
if (table)
table->use_all_columns();
/*
Under explicit LOCK TABLES or in prelocked mode we should not
say that mysql.proc table does not exist if we are unable to
open and lock it for writing since this condition may be
transient.
*/
if (!(thd->locked_tables || thd->prelocked_mode) || table)
mysql_proc_table_exists= test(table);
DBUG_RETURN(table);
}
......@@ -1610,14 +1591,6 @@ sp_cache_routines_and_add_tables_aux(THD *thd, LEX *lex,
case SP_KEY_NOT_FOUND:
ret= SP_OK;
break;
case SP_OPEN_TABLE_FAILED:
/*
Force it to attempt opening it again on subsequent calls;
otherwise we will get one error message the first time, and
then ER_SP_PROC_TABLE_CORRUPT (below) on subsequent tries.
*/
mysql_proc_table_exists= 1;
/* Fall through */
default:
/*
Any error when loading an existing routine is either some problem
......
......@@ -317,7 +317,6 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
DBUG_ENTER("acl_load");
grant_version++; /* Privileges updated */
mysql_proc_table_exists= 1; // Assume mysql.proc exists
acl_cache->clear(1); // Clear locked hostname cache
......
......@@ -4211,8 +4211,6 @@ static interval_type get_real_interval_type(interval_type i_type)
return INTERVAL_SECOND;
}
extern LEX_STRING interval_type_to_name[];
/*
Loads an event from mysql.event and copies it's data to a row of
......
......@@ -1628,7 +1628,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
(!my_strcasecmp(system_charset_info, table->table_name, "slow_log")
&& opt_slow_log && logger.is_slow_log_table_enabled())))
{
my_error(ER_CANT_DROP_LOG_TABLE, MYF(0));
my_error(ER_BAD_LOG_STATEMENT, MYF(0), "DROP");
DBUG_RETURN(1);
}
}
......@@ -5179,7 +5179,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
(table_kind == SLOW_LOG && opt_slow_log &&
logger.is_slow_log_table_enabled()))
{
my_error(ER_CANT_ALTER_LOG_TABLE, MYF(0));
my_error(ER_BAD_LOG_STATEMENT, MYF(0), "ALTER");
DBUG_RETURN(TRUE);
}
......@@ -5187,10 +5187,9 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
if ((table_kind == GENERAL_LOG || table_kind == SLOW_LOG) &&
(lex_create_info->used_fields & HA_CREATE_USED_ENGINE) &&
(!lex_create_info->db_type || /* unknown engine */
!(lex_create_info->db_type->db_type == DB_TYPE_MYISAM ||
lex_create_info->db_type->db_type == DB_TYPE_CSV_DB)))
!(lex_create_info->db_type->flags & HTON_SUPPORT_LOG_TABLES)))
{
my_error(ER_BAD_LOG_ENGINE, MYF(0));
my_error(ER_UNSUPORTED_LOG_ENGINE, MYF(0));
DBUG_RETURN(TRUE);
}
}
......
......@@ -161,7 +161,7 @@ static int tina_init_func(void *p)
tina_hton->db_type= DB_TYPE_CSV_DB;
tina_hton->create= tina_create_handler;
tina_hton->panic= tina_end;
tina_hton->flags= HTON_CAN_RECREATE;
tina_hton->flags= HTON_CAN_RECREATE | HTON_SUPPORT_LOG_TABLES;
}
return 0;
}
......
......@@ -1796,7 +1796,7 @@ static int myisam_init(void *p)
myisam_hton->db_type=DB_TYPE_MYISAM;
myisam_hton->create=myisam_create_handler;
myisam_hton->panic=mi_panic;
myisam_hton->flags=HTON_CAN_RECREATE;
myisam_hton->flags= HTON_CAN_RECREATE | HTON_SUPPORT_LOG_TABLES;
return 0;
}
......
......@@ -167,13 +167,13 @@ int mi_write(MI_INFO *info, byte *record)
/*
Update status of the table. We need to do so after each row write
for the log tables, as we want the new row to become visible to
other threads as soon as possible. We lock mutex here to follow
pthread memory visibility rules.
other threads as soon as possible. We don't lock mutex here
(as it is required by pthread memory visibility rules) as (1) it's
not critical to use outdated share->is_log_table value (2) locking
mutex here for every write is too expensive.
*/
pthread_mutex_lock(&share->intern_lock);
if (share->is_log_table)
mi_update_status((void*) info);
pthread_mutex_unlock(&share->intern_lock);
allow_break(); /* Allow SIGHUP & SIGINT */
DBUG_RETURN(0);
......
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