Commit 851d07a5 authored by Timothy Smith's avatar Timothy Smith

Auto-merge from upstream 5.1-bugteam

parents 84cf1d65 d4b81e11
...@@ -40,15 +40,13 @@ static uint verbose = 0, opt_mysql_port=0; ...@@ -40,15 +40,13 @@ static uint verbose = 0, opt_mysql_port=0;
static int my_end_arg; static int my_end_arg;
static char * opt_mysql_unix_port = 0; static char * opt_mysql_unix_port = 0;
static char *opt_password = 0, *current_user = 0, static char *opt_password = 0, *current_user = 0,
*default_charset = (char *)MYSQL_DEFAULT_CHARSET_NAME, *default_charset= 0, *current_host= 0;
*current_host = 0;
static int first_error = 0; static int first_error = 0;
DYNAMIC_ARRAY tables4repair; DYNAMIC_ARRAY tables4repair;
#ifdef HAVE_SMEM #ifdef HAVE_SMEM
static char *shared_memory_base_name=0; static char *shared_memory_base_name=0;
#endif #endif
static uint opt_protocol=0; static uint opt_protocol=0;
static CHARSET_INFO *charset_info= &my_charset_latin1;
enum operations { DO_CHECK, DO_REPAIR, DO_ANALYZE, DO_OPTIMIZE, DO_UPGRADE }; enum operations { DO_CHECK, DO_REPAIR, DO_ANALYZE, DO_OPTIMIZE, DO_UPGRADE };
...@@ -282,12 +280,10 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), ...@@ -282,12 +280,10 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
break; break;
case OPT_FIX_DB_NAMES: case OPT_FIX_DB_NAMES:
what_to_do= DO_UPGRADE; what_to_do= DO_UPGRADE;
default_charset= (char*) "utf8";
opt_databases= 1; opt_databases= 1;
break; break;
case OPT_FIX_TABLE_NAMES: case OPT_FIX_TABLE_NAMES:
what_to_do= DO_UPGRADE; what_to_do= DO_UPGRADE;
default_charset= (char*) "utf8";
break; break;
case 'p': case 'p':
if (argument) if (argument)
...@@ -367,11 +363,20 @@ static int get_options(int *argc, char ***argv) ...@@ -367,11 +363,20 @@ static int get_options(int *argc, char ***argv)
what_to_do = DO_CHECK; what_to_do = DO_CHECK;
} }
/* TODO: This variable is not yet used */ /*
if (strcmp(default_charset, charset_info->csname) && If there's no --default-character-set option given with
!(charset_info= get_charset_by_csname(default_charset, --fix-table-name or --fix-db-name set the default character set to "utf8".
MY_CS_PRIMARY, MYF(MY_WME)))) */
exit(1); if (!default_charset && (opt_fix_db_names || opt_fix_table_names))
{
default_charset= (char*) "utf8";
}
if (default_charset && !get_charset_by_csname(default_charset, MY_CS_PRIMARY,
MYF(MY_WME)))
{
printf("Unsupported character set: %s\n", default_charset);
return 1;
}
if (*argc > 0 && opt_alldbs) if (*argc > 0 && opt_alldbs)
{ {
printf("You should give only options, no arguments at all, with option\n"); printf("You should give only options, no arguments at all, with option\n");
...@@ -779,6 +784,8 @@ static int dbConnect(char *host, char *user, char *passwd) ...@@ -779,6 +784,8 @@ static int dbConnect(char *host, char *user, char *passwd)
if (shared_memory_base_name) if (shared_memory_base_name)
mysql_options(&mysql_connection,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name); mysql_options(&mysql_connection,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name);
#endif #endif
if (default_charset)
mysql_options(&mysql_connection, MYSQL_SET_CHARSET_NAME, default_charset);
if (!(sock = mysql_real_connect(&mysql_connection, host, user, passwd, if (!(sock = mysql_real_connect(&mysql_connection, host, user, passwd,
NULL, opt_mysql_port, opt_mysql_unix_port, 0))) NULL, opt_mysql_port, opt_mysql_unix_port, 0)))
{ {
......
...@@ -28,3 +28,5 @@ enable_warnings; ...@@ -28,3 +28,5 @@ enable_warnings;
insert into t1 values (1); insert into t1 values (1);
drop table tt1, t1; drop table tt1, t1;
source include/show_binlog_events.inc; source include/show_binlog_events.inc;
FLUSH STATUS;
...@@ -145,6 +145,23 @@ select * from t3 order by a; ...@@ -145,6 +145,23 @@ select * from t3 order by a;
connection master; connection master;
drop table t1,t2,t3; drop table t1,t2,t3;
sync_slave_with_master;
#
# BUG#41986 Replication slave does not pick up proper AUTO_INCREMENT value for Innodb tables
#
connection master;
set auto_increment_increment=1;
set auto_increment_offset=1;
CREATE TABLE t1 (id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=innodb;
INSERT INTO t1 VALUES (NULL), (NULL), (NULL);
show create table t1;
sync_slave_with_master;
show create table t1;
connection master;
drop table t1;
# End cleanup # End cleanup
sync_slave_with_master; sync_slave_with_master;
########## include/check_events_off.inc ####################################
# #
# Purpose: #
# Wait till we can expect that we have no event activity till the scheduler is #
# switched on again. #
# = There will be no modifications of user tables by existing events #
# except they use "INSERT DELAYED" or the server system variable #
# "concurrent_inserts" is not switched off. #
# Only some storage engines support concurrent_inserts" or "INSERT DELAYED". #
# #
# Creation: #
# 2008-12-19 mleich Implement this check needed for bug fixes in tests #
# #
################################################################################
# 1. Check that the server system variable shows the state needed
if (`SELECT @@global.event_scheduler <> 'OFF'`)
{
--echo # Error: We expect here that the event scheduler is switched off.
SELECT @@global.event_scheduler;
--echo # Thinkable reasons:
--echo # 1. SET GLOBAL event_scheduler = OFF had not the expected effect.
--echo # 2. Use of the current routine (include/check_events_off.inc)
--echo # within the wrong situation
--die
}
# 2. Wait till we have no event_scheduler session within the processlist
--source include/no_running_event_scheduler.inc
# 3. Wait till we have no event executor sessions within the processlist
--source include/no_running_events.inc
########## include/no_running_event_scheduler.inc ##########################
# #
# Wait till the event scheduler disappeared from processlist. #
# #
# The characteristics of the event_scheduler entry within the processlist is #
# user = 'event_scheduler' and command = 'Daemon'. I am not 100% sure if #
# ther is no short phase with command <> 'Daemon'. #
# A query with WHERE user = 'event_scheduler' only will also catch events in #
# startup phase. This is no problem since this phase is very short. #
# #
# A wait_timeout of >= 3 seconds was within experiments sufficient even on a #
# testing box with heavy parallel load. Therefore 5 seconds should be enough. #
# #
# Creation: #
# 2008-12-19 mleich Implement this check needed for test bug fixes #
# #
################################################################################
let $wait_timeout= 5;
let $wait_condition=
SELECT COUNT(*) = 0 FROM information_schema.processlist
WHERE user = 'event_scheduler';
--source include/wait_condition.inc
########## include/no_running_events.inc ###################################
# #
# Wait till all event executors have finished their work. #
# #
# Different event executors share the characteristics that their entry within #
# processlist contains command = 'Connect'. #
# Of course the corresponding query will also catch other connections being #
# within the connect phase. This is no problem since the connect phase is #
# usually very short. #
# #
# A wait_timeout of >= 3 seconds was during experiments in case of "simple" #
# SQL commands sufficient even on a testing box with heavy parallel load. #
# "simple" = no sleeps, no long running commands, no waiting for lock ... #
# We use here the default of 30 seconds because this wastes some time only in #
# case of unexpected situations. #
# #
# Creation: #
# 2008-12-19 mleich Implement this check needed for test bug fixes #
# #
################################################################################
let $wait_condition=
SELECT COUNT(*) = 0 FROM information_schema.processlist
WHERE command = 'Connect';
--source include/wait_condition.inc
############# include/running_event_scheduler.inc ##########################
# #
# Wait till the event scheduler reached its final state within the processlist.#
# #
# The characteristics of the event_scheduler entry within the processlist is #
# user = 'event_scheduler' and command = 'Daemon'. I am not 100% sure if #
# ther is no short phase with command <> 'Daemon'. #
# A query with WHERE user = 'event_scheduler' only will also catch events in #
# startup phase. #
# #
# Creation: #
# 2008-12-19 mleich Implement this check needed for test bug fixes #
# #
################################################################################
# 1. Check that the server system variable shows the state needed
if (`SELECT @@global.event_scheduler <> 'ON'`)
{
--echo # Error: We expect here that the event scheduler is switched on.
SELECT @@global.event_scheduler;
--echo # Thinkable reasons:
--echo # 1. SET GLOBAL event_scheduler = ON had not the expected effect.
--echo # 2. Use of the current routine (include/running_event_scheduler.inc)
--echo # within the wrong situation
--die
}
let $wait_condition=
SELECT COUNT(*) = 1 FROM information_schema.processlist
WHERE user = 'event_scheduler' AND command = 'Daemon';
--source include/wait_condition.inc
...@@ -3,6 +3,8 @@ drop database if exists mysqltest_db1; ...@@ -3,6 +3,8 @@ drop database if exists mysqltest_db1;
drop database if exists mysqltest_db2; drop database if exists mysqltest_db2;
create database events_test; create database events_test;
use events_test; use events_test;
set @concurrent_insert= @@global.concurrent_insert;
set @@global.concurrent_insert = 0;
select * from information_schema.global_variables where variable_name like 'event_scheduler'; select * from information_schema.global_variables where variable_name like 'event_scheduler';
VARIABLE_NAME VARIABLE_VALUE VARIABLE_NAME VARIABLE_VALUE
EVENT_SCHEDULER ON EVENT_SCHEDULER ON
...@@ -60,7 +62,7 @@ select get_lock('test_bug16407', 60); ...@@ -60,7 +62,7 @@ select get_lock('test_bug16407', 60);
end| end|
"Now if everything is fine the event has compiled and is locked" "Now if everything is fine the event has compiled and is locked"
select /*1*/ user, host, db, info from information_schema.processlist select /*1*/ user, host, db, info from information_schema.processlist
where info = 'select get_lock(\'test_bug16407\', 60)'; where state = 'User lock' and info = 'select get_lock(\'test_bug16407\', 60)';
user host db info user host db info
root localhost events_test select get_lock('test_bug16407', 60) root localhost events_test select get_lock('test_bug16407', 60)
select release_lock('test_bug16407'); select release_lock('test_bug16407');
...@@ -84,7 +86,7 @@ get_lock('ee_16407_2', 60) ...@@ -84,7 +86,7 @@ get_lock('ee_16407_2', 60)
set global event_scheduler= 1; set global event_scheduler= 1;
"Another sql_mode test" "Another sql_mode test"
set sql_mode="traditional"; set sql_mode="traditional";
create table events_smode_test(ev_name char(10), a date) engine=myisam; create table events_smode_test(ev_name char(10), a date);
"This should never insert something" "This should never insert something"
create event ee_16407_2 on schedule every 60 second do create event ee_16407_2 on schedule every 60 second do
begin begin
...@@ -92,7 +94,7 @@ select get_lock('ee_16407_2', 60) /*ee_16407_2*/; ...@@ -92,7 +94,7 @@ select get_lock('ee_16407_2', 60) /*ee_16407_2*/;
select release_lock('ee_16407_2'); select release_lock('ee_16407_2');
insert into events_test.events_smode_test values('ee_16407_2','1980-19-02'); insert into events_test.events_smode_test values('ee_16407_2','1980-19-02');
end| end|
insert into events_smode_test values ('test','1980-19-02')| insert into events_test.events_smode_test values ('test','1980-19-02')|
ERROR 22007: Incorrect date value: '1980-19-02' for column 'a' at row 1 ERROR 22007: Incorrect date value: '1980-19-02' for column 'a' at row 1
"This is ok" "This is ok"
create event ee_16407_3 on schedule every 60 second do create event ee_16407_3 on schedule every 60 second do
...@@ -116,7 +118,7 @@ events_test ee_16407_2 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ ...@@ -116,7 +118,7 @@ events_test ee_16407_2 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_
events_test ee_16407_3 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER events_test ee_16407_3 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER
events_test ee_16407_4 events_test ee_16407_4
select /*2*/ user, host, db, info from information_schema.processlist select /*2*/ user, host, db, info from information_schema.processlist
where info = 'select get_lock(\'ee_16407_2\', 60)'; where state = 'User lock' and info = 'select get_lock(\'ee_16407_2\', 60)';
user host db info user host db info
root localhost events_test select get_lock('ee_16407_2', 60) root localhost events_test select get_lock('ee_16407_2', 60)
root localhost events_test select get_lock('ee_16407_2', 60) root localhost events_test select get_lock('ee_16407_2', 60)
...@@ -125,10 +127,10 @@ select release_lock('ee_16407_2'); ...@@ -125,10 +127,10 @@ select release_lock('ee_16407_2');
release_lock('ee_16407_2') release_lock('ee_16407_2')
1 1
select /*3*/ user, host, db, info from information_schema.processlist select /*3*/ user, host, db, info from information_schema.processlist
where info = 'select get_lock(\'ee_16407_2\', 60)'; where state = 'User lock' and info = 'select get_lock(\'ee_16407_2\', 60)';
user host db info user host db info
set global event_scheduler= off; set global event_scheduler= off;
select * from events_smode_test order by ev_name, a; select * from events_test.events_smode_test order by ev_name, a;
ev_name a ev_name a
ee_16407_3 1980-02-19 ee_16407_3 1980-02-19
ee_16407_3 1980-02-29 ee_16407_3 1980-02-29
...@@ -143,7 +145,7 @@ drop event ee_16407_2; ...@@ -143,7 +145,7 @@ drop event ee_16407_2;
drop event ee_16407_3; drop event ee_16407_3;
drop event ee_16407_4; drop event ee_16407_4;
"And now one last test regarding sql_mode and call of SP from an event" "And now one last test regarding sql_mode and call of SP from an event"
delete from events_smode_test; delete from events_test.events_smode_test;
set sql_mode='ansi'; set sql_mode='ansi';
select get_lock('ee_16407_5', 60); select get_lock('ee_16407_5', 60);
get_lock('ee_16407_5', 60) get_lock('ee_16407_5', 60)
...@@ -166,10 +168,8 @@ call events_test.ee_16407_6_pendant(); ...@@ -166,10 +168,8 @@ call events_test.ee_16407_6_pendant();
end| end|
"Should have 2 locked processes" "Should have 2 locked processes"
select /*4*/ user, host, db, info from information_schema.processlist select /*4*/ user, host, db, info from information_schema.processlist
where (command!='Daemon' || user='event_scheduler') and (info is null or info not like '%processlist%') where state = 'User lock' and info = 'select get_lock(\'ee_16407_5\', 60)';
order by info;
user host db info user host db info
event_scheduler localhost NULL NULL
root localhost events_test select get_lock('ee_16407_5', 60) root localhost events_test select get_lock('ee_16407_5', 60)
root localhost events_test select get_lock('ee_16407_5', 60) root localhost events_test select get_lock('ee_16407_5', 60)
select release_lock('ee_16407_5'); select release_lock('ee_16407_5');
...@@ -177,11 +177,9 @@ release_lock('ee_16407_5') ...@@ -177,11 +177,9 @@ release_lock('ee_16407_5')
1 1
"Should have 0 processes locked" "Should have 0 processes locked"
select /*5*/ user, host, db, info from information_schema.processlist select /*5*/ user, host, db, info from information_schema.processlist
where (command!='Daemon' || user='event_scheduler') and (info is null or info not like '%processlist%') where state = 'User lock' and info = 'select get_lock(\'ee_16407_5\', 60)';
order by info;
user host db info user host db info
event_scheduler localhost NULL NULL select * from events_test.events_smode_test order by ev_name, a;
select * from events_smode_test order by ev_name, a;
ev_name a ev_name a
ee_16407_6 2004-02-29 ee_16407_6 2004-02-29
"And here we check one more time before we drop the events" "And here we check one more time before we drop the events"
...@@ -740,3 +738,4 @@ name ...@@ -740,3 +738,4 @@ name
drop event e1; drop event e1;
DROP DATABASE events_test; DROP DATABASE events_test;
SET GLOBAL event_scheduler = 'ON'; SET GLOBAL event_scheduler = 'ON';
SET @@global.concurrent_insert = @concurrent_insert;
CREATE TABLE t1(a INT, b INT NOT NULL, PRIMARY KEY (a)) ENGINE=innodb
DEFAULT CHARSET=latin1;
INSERT INTO t1 VALUES (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7);
START TRANSACTION;
SELECT * FROM t1 WHERE b=3 LIMIT 1 FOR UPDATE;
a b
3 3
START TRANSACTION;
UPDATE t1 SET b=b+12 WHERE a > 2 ORDER BY a;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
ROLLBACK;
START TRANSACTION;
SELECT * FROM t1 WHERE b=3 LIMIT 1 FOR UPDATE;
a b
3 3
START TRANSACTION;
UPDATE t1 SET b=10 WHERE a > 1 ORDER BY a;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
SELECT * FROM t1 WHERE b = 10;
a b
DROP TABLE t1;
SET @old_general_log= @@global.general_log;
SET @old_general_log_file= @@global.general_log_file;
SET @old_slow_query_log= @@global.slow_query_log;
SET @old_slow_query_log_file= @@global.slow_query_log_file;
set global general_log= OFF; set global general_log= OFF;
truncate table mysql.general_log; truncate table mysql.general_log;
truncate table mysql.slow_log; truncate table mysql.slow_log;
...@@ -33,20 +37,26 @@ general_log ON ...@@ -33,20 +37,26 @@ general_log ON
log ON log ON
log_slow_queries OFF log_slow_queries OFF
slow_query_log OFF slow_query_log OFF
set session long_query_time=1; # Establish connection con1 (user=root)
select sleep(2); # Switch to connection con1
sleep(2) set @long_query_time = <long_query_time>;
set session long_query_time = @long_query_time;
select sleep(@long_query_time + 1);
sleep(@long_query_time + 1)
0 0
select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%'; select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%';
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text
# Switch to connection default
set global slow_query_log= ON; set global slow_query_log= ON;
set session long_query_time=1; # Switch to connection con1
select sleep(2); set session long_query_time = @long_query_time;
sleep(2) select sleep(@long_query_time + 1);
sleep(@long_query_time + 1)
0 0
select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%'; select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%';
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text 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) TIMESTAMP USER_HOST QUERY_TIME 00:00:00 1 0 test 0 0 1 select sleep(@long_query_time + 1)
# Switch to connection default
show global variables show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log'; Variable_name = 'general_log' or Variable_name = 'slow_query_log';
...@@ -92,8 +102,8 @@ slow_query_log_file # ...@@ -92,8 +102,8 @@ slow_query_log_file #
show variables like 'log_output'; show variables like 'log_output';
Variable_name Value Variable_name Value
log_output FILE,TABLE log_output FILE,TABLE
set global general_log_file='/not exiting path/log.master'; set global general_log_file='/not existing path/log.master';
ERROR 42000: Variable 'general_log_file' can't be set to the value of '/not exiting path/log.master' ERROR 42000: Variable 'general_log_file' can't be set to the value of '/not existing path/log.master'
set global general_log_file='MYSQLTEST_VARDIR'; set global general_log_file='MYSQLTEST_VARDIR';
ERROR 42000: Variable 'general_log_file' can't be set to the value of 'MYSQLTEST_VARDIR' ERROR 42000: Variable 'general_log_file' can't be set to the value of 'MYSQLTEST_VARDIR'
set global general_log_file=''; set global general_log_file='';
...@@ -153,8 +163,10 @@ select * from mysql.general_log; ...@@ -153,8 +163,10 @@ select * from mysql.general_log;
event_time user_host thread_id server_id command_type argument event_time user_host thread_id server_id command_type argument
TIMESTAMP USER_HOST # 1 Query drop table t1 TIMESTAMP USER_HOST # 1 Query drop table t1
TIMESTAMP USER_HOST # 1 Query select * from mysql.general_log TIMESTAMP USER_HOST # 1 Query select * from mysql.general_log
SET @old_general_log_state = @@global.general_log; SET @@global.general_log = @old_general_log;
SET @old_slow_log_state = @@global.slow_query_log; SET @@global.general_log_file = @old_general_log_file;
SET @@global.slow_query_log = @old_slow_query_log;
SET @@global.slow_query_log_file = @old_slow_query_log_file;
SET GLOBAL general_log = ON; SET GLOBAL general_log = ON;
SET GLOBAL slow_query_log = ON; SET GLOBAL slow_query_log = ON;
FLUSH TABLES WITH READ LOCK; FLUSH TABLES WITH READ LOCK;
...@@ -173,10 +185,9 @@ SET GLOBAL READ_ONLY = ON; ...@@ -173,10 +185,9 @@ SET GLOBAL READ_ONLY = ON;
SET GLOBAL general_log = ON; SET GLOBAL general_log = ON;
SET GLOBAL slow_query_log = ON; SET GLOBAL slow_query_log = ON;
SET GLOBAL READ_ONLY = OFF; SET GLOBAL READ_ONLY = OFF;
SET GLOBAL general_log = @old_general_log_state; SET GLOBAL general_log = @old_general_log;
SET GLOBAL slow_query_log = @old_slow_log_state; SET GLOBAL slow_query_log = @old_slow_query_log;
SET @old_general_log_state = @@global.general_log; SET GLOBAL general_log = ON;
SET @old_slow_log_state = @@global.slow_query_log;
SHOW VARIABLES LIKE 'general_log'; SHOW VARIABLES LIKE 'general_log';
Variable_name Value Variable_name Value
general_log ON general_log ON
...@@ -239,29 +250,24 @@ log_slow_queries ON ...@@ -239,29 +250,24 @@ log_slow_queries ON
SELECT @@slow_query_log, @@log_slow_queries; SELECT @@slow_query_log, @@log_slow_queries;
@@slow_query_log @@log_slow_queries @@slow_query_log @@log_slow_queries
1 1 1 1
SET GLOBAL general_log = @old_general_log_state; SET GLOBAL general_log = @old_general_log;
SET GLOBAL slow_query_log = @old_slow_log_state; SET GLOBAL slow_query_log = @old_slow_query_log;
set @old_general_log_file= @@global.general_log_file; SET GLOBAL general_log_file= CONCAT('/not existing path/log.maste', 'r');
set @old_slow_query_log_file= @@global.slow_query_log_file; ERROR 42000: Variable 'general_log_file' can't be set to the value of '/not existing path/log.master'
set global general_log_file= concat('/not exiting path/log.maste', 'r'); SET GLOBAL general_log_file= NULL;
ERROR 42000: Variable 'general_log_file' can't be set to the value of '/not exiting path/log.master'
set global general_log_file= NULL;
ERROR 42000: Variable 'general_log_file' can't be set to the value of 'NULL' ERROR 42000: Variable 'general_log_file' can't be set to the value of 'NULL'
set global slow_query_log_file= concat('/not exiting path/log.maste', 'r'); SET GLOBAL slow_query_log_file= CONCAT('/not existing path/log.maste', 'r');
ERROR 42000: Variable 'slow_query_log_file' can't be set to the value of '/not exiting path/log.master' ERROR 42000: Variable 'slow_query_log_file' can't be set to the value of '/not existing path/log.master'
set global slow_query_log_file= NULL; SET GLOBAL slow_query_log_file= NULL;
ERROR 42000: Variable 'slow_query_log_file' can't be set to the value of 'NULL' ERROR 42000: Variable 'slow_query_log_file' can't be set to the value of 'NULL'
set global general_log_file= @old_general_log_file; SET GLOBAL general_log_file= @old_general_log_file;
set global slow_query_log_file= @old_slow_query_log_file; SET GLOBAL slow_query_log_file= @old_slow_query_log_file;
# -- # --
# -- Bug#32748: Inconsistent handling of assignments to # -- Bug#32748: Inconsistent handling of assignments to
# -- general_log_file/slow_query_log_file. # -- general_log_file/slow_query_log_file.
# -- # --
SET @general_log_file_saved = @@global.general_log_file;
SET @slow_query_log_file_saved = @@global.slow_query_log_file;
SET GLOBAL general_log_file = 'bug32748.query.log'; SET GLOBAL general_log_file = 'bug32748.query.log';
SET GLOBAL slow_query_log_file = 'bug32748.slow.log'; SET GLOBAL slow_query_log_file = 'bug32748.slow.log';
...@@ -270,8 +276,8 @@ Variable_name Value ...@@ -270,8 +276,8 @@ Variable_name Value
general_log_file bug32748.query.log general_log_file bug32748.query.log
slow_query_log_file bug32748.slow.log slow_query_log_file bug32748.slow.log
SET GLOBAL general_log_file = @general_log_file_saved; SET GLOBAL general_log_file = @old_general_log_file;
SET GLOBAL slow_query_log_file = @slow_query_log_file_saved; SET GLOBAL slow_query_log_file = @old_slow_query_log_file;
# -- End of Bug#32748. # -- End of Bug#32748.
deprecated: deprecated:
...@@ -298,4 +304,13 @@ SET GLOBAL general_log_file = @my_glf; ...@@ -298,4 +304,13 @@ SET GLOBAL general_log_file = @my_glf;
SET GLOBAL slow_query_log_file = @my_sqlf; SET GLOBAL slow_query_log_file = @my_sqlf;
SET GLOBAL general_log = DEFAULT; SET GLOBAL general_log = DEFAULT;
SET GLOBAL slow_query_log = DEFAULT; SET GLOBAL slow_query_log = DEFAULT;
SET @@global.general_log = @old_general_log;
SET @@global.general_log_file = @old_general_log_file;
SET @@global.slow_query_log = @old_slow_query_log;
SET @@global.slow_query_log_file = @old_slow_query_log_file;
End of 5.1 tests End of 5.1 tests
# Close connection con1
SET global general_log = @old_general_log;
SET global general_log_file = @old_general_log_file;
SET global slow_query_log = @old_slow_query_log;
SET global slow_query_log_file = @old_slow_query_log_file;
...@@ -130,3 +130,58 @@ v1 ...@@ -130,3 +130,58 @@ v1
v-1 v-1
drop view v1, `v-1`; drop view v1, `v-1`;
drop table t1; drop table t1;
SET NAMES utf8;
CREATE TABLE `#mysql50#@` (a INT);
SHOW TABLES;
Tables_in_test
#mysql50#@
SET NAMES DEFAULT;
mysqlcheck --fix-table-names --databases test
SET NAMES utf8;
SHOW TABLES;
Tables_in_test
@
DROP TABLE `@`;
CREATE TABLE `я` (a INT);
SET NAMES DEFAULT;
mysqlcheck --default-character-set="latin1" --databases test
test.?
Error : Table 'test.?' doesn't exist
error : Corrupt
mysqlcheck --default-character-set="utf8" --databases test
test.я OK
SET NAMES utf8;
DROP TABLE `я`;
SET NAMES DEFAULT;
CREATE DATABASE `#mysql50#a@b`;
USE `#mysql50#a@b`;
CREATE TABLE `#mysql50#c@d` (a INT);
CREATE TABLE t1 (a INT);
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_SCHEMA="#mysql50#a@b" ORDER BY trigger_name;
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION
NULL #mysql50#a@b tr1 INSERT NULL #mysql50#a@b #mysql50#c@d 0 NULL SET NEW.a = 10 * NEW.a ROW BEFORE NULL NULL OLD NEW NULL root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
NULL #mysql50#a@b tr2 INSERT NULL #mysql50#a@b t1 0 NULL SET NEW.a = 100 * NEW.a ROW BEFORE NULL NULL OLD NEW NULL root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
Warnings:
Warning 1603 Triggers for table `#mysql50#a@b`.`#mysql50#c@d` have no creation context
Warning 1603 Triggers for table `#mysql50#a@b`.`t1` have no creation context
mysqlcheck --fix-db-names --fix-table-names --all-databases
USE `a@b`;
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_SCHEMA="a@b" ORDER BY trigger_name;
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION
NULL a@b tr1 INSERT NULL a@b c@d 0 NULL SET NEW.a = 10 * NEW.a ROW BEFORE NULL NULL OLD NEW NULL root@localhost utf8 utf8_general_ci latin1_swedish_ci
NULL a@b tr2 INSERT NULL a@b t1 0 NULL SET NEW.a = 100 * NEW.a ROW BEFORE NULL NULL OLD NEW NULL root@localhost utf8 utf8_general_ci latin1_swedish_ci
INSERT INTO `c@d` VALUES (2), (1);
SELECT * FROM `c@d`;
a
20
10
INSERT INTO t1 VALUES (3), (5);
SELECT * FROM t1;
a
300
500
DROP DATABASE `a@b`;
USE test;
End of 5.1 tests
...@@ -65,12 +65,15 @@ CREATE TABLE t1(AFIELD INT); ...@@ -65,12 +65,15 @@ CREATE TABLE t1(AFIELD INT);
INSERT INTO t1 VALUES(1); INSERT INTO t1 VALUES(1);
CREATE TABLE t2(GMT VARCHAR(32)); CREATE TABLE t2(GMT VARCHAR(32));
INSERT INTO t2 VALUES('GMT-0800'); INSERT INTO t2 VALUES('GMT-0800');
SELECT DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT)) FROM t1, t2 GROUP BY t1.AFIELD; SELECT DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ', t2.GMT))
DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT)) FROM t1, t2 GROUP BY t1.AFIELD;
DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ', t2.GMT))
Wed, 06 March 2002 10:11:12 GMT-0800 Wed, 06 March 2002 10:11:12 GMT-0800
INSERT INTO t1 VALUES(1); INSERT INTO t1 VALUES(1);
SELECT DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT)), DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT)) FROM t1,t2 GROUP BY t1.AFIELD; SELECT DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ', t2.GMT)),
DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT)) DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT)) DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ', t2.GMT))
FROM t1,t2 GROUP BY t1.AFIELD;
DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ', t2.GMT)) DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ', t2.GMT))
Wed, 06 March 2002 10:11:12 GMT-0800 Wed, 06 March 2002 10:11:12 GMT-0800 Wed, 06 March 2002 10:11:12 GMT-0800 Wed, 06 March 2002 10:11:12 GMT-0800
drop table t1,t2; drop table t1,t2;
CREATE TABLE t1 (f1 time default NULL, f2 time default NULL); CREATE TABLE t1 (f1 time default NULL, f2 time default NULL);
...@@ -155,7 +158,7 @@ str_to_date( '', a ) ...@@ -155,7 +158,7 @@ str_to_date( '', a )
0000-00-00 00:00:00 0000-00-00 00:00:00
NULL NULL
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a DATE, b int, PRIMARY KEY (a,b)); CREATE TABLE t1 (a DATE, b INT, PRIMARY KEY (a,b));
INSERT INTO t1 VALUES (DATE(NOW()), 1); INSERT INTO t1 VALUES (DATE(NOW()), 1);
SELECT COUNT(*) FROM t1 WHERE a = NOW(); SELECT COUNT(*) FROM t1 WHERE a = NOW();
COUNT(*) COUNT(*)
......
...@@ -33,6 +33,7 @@ master-bin.000001 # Query # # use `test`; insert into t1 values (1) ...@@ -33,6 +33,7 @@ master-bin.000001 # Query # # use `test`; insert into t1 values (1)
master-bin.000001 # Query # # drop database if exists mysqltest1 master-bin.000001 # Query # # drop database if exists mysqltest1
master-bin.000001 # Query # # use `test`; insert into t1 values (1) master-bin.000001 # Query # # use `test`; insert into t1 values (1)
master-bin.000001 # Query # # use `test`; drop table tt1, t1 master-bin.000001 # Query # # use `test`; drop table tt1, t1
FLUSH STATUS;
set binlog_format=mixed; set binlog_format=mixed;
reset master; reset master;
create database testing_1; create database testing_1;
...@@ -68,6 +69,7 @@ master-bin.000001 # Query # # use `test`; insert into t1 values (1) ...@@ -68,6 +69,7 @@ master-bin.000001 # Query # # use `test`; insert into t1 values (1)
master-bin.000001 # Query # # drop database if exists mysqltest1 master-bin.000001 # Query # # drop database if exists mysqltest1
master-bin.000001 # Query # # use `test`; insert into t1 values (1) master-bin.000001 # Query # # use `test`; insert into t1 values (1)
master-bin.000001 # Query # # use `test`; drop table tt1, t1 master-bin.000001 # Query # # use `test`; drop table tt1, t1
FLUSH STATUS;
set binlog_format=row; set binlog_format=row;
reset master; reset master;
create database testing_1; create database testing_1;
...@@ -108,6 +110,7 @@ master-bin.000001 # Table_map # # table_id: # (test.t1) ...@@ -108,6 +110,7 @@ master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Query # # use `test`; COMMIT master-bin.000001 # Query # # use `test`; COMMIT
master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */ master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */
FLUSH STATUS;
show databases; show databases;
Database Database
information_schema information_schema
......
# suite/funcs_1/t/is_collation_character_set_applicability.test # suite/funcs_1/t/is_coll_char_set_appl.test
# #
# Check the layout of information_schema.collation_character_set_applicability # Check the layout of information_schema.collation_character_set_applicability
# and some functionality realted tests. # and some functionality related tests.
# #
# Author: # Author:
# 2008-01-23 mleich WL#4203 Reorganize and fix the data dictionary tests of # 2008-01-23 mleich WL#4203 Reorganize and fix the data dictionary tests of
......
...@@ -227,3 +227,20 @@ select * from t3 order by a; ...@@ -227,3 +227,20 @@ select * from t3 order by a;
a a
127 127
drop table t1,t2,t3; drop table t1,t2,t3;
set auto_increment_increment=1;
set auto_increment_offset=1;
CREATE TABLE t1 (id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=innodb;
INSERT INTO t1 VALUES (NULL), (NULL), (NULL);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
drop table t1;
#### t/events_bugs.test #### t/events_bugs.test
# #
# Last change: # Last change:
# 2008-10-16 mleich # 2009-01-08 mleich
# - Fix for # - Fix for
# Bug#39848 events_bugs fails sporadically on pushbuild # Bug#41111 events_bugs fails sporadically on pushbuild
# (missing rows in table event_log) # - Avoid effects of
# Bug#39863 events_bugs fails sporadically on pushbuild (extra processes # Bug#41925 Warning 1366 Incorrect string value: ... for column processlist.info
# in I_S.PROCESSLIST) #
# Bug#39978 main.events_bugs does not clean up # Please set $
# Bug#39569 events_bugs fails sporadically on pushbuild (should have let $fixed_bug41925= 0;
# failed with errno 1539) #
# - Minor improvements of formatting # Dear maintainer of this test. Please do NOT remove the next big comment.
# # The tests for events were quite unstable over a significant time because the
# # effects of events in general and their representation within the processlist
# Outcome of some experiments (mleich): # were partially not known. Therefore I had to make excessive experiments.
# 1. SET GLOBAL event_scheduler = 'ON'; # The comment with the outcome of these experiments will be moved into a README
# Immediate observation of the processlist. # file as soon as the tests for events get their own testsuite.
# Effects: #
# 1. There is no guarantee to find immediate the user 'event_scheduler' # Outcome of some experiments (mleich, mysql-5.1 2008-12):
# within information_schema.processlist. # --------------------------------------------------------
# 2. Some states of the user 'event_scheduler' found in PROCESSLIST: # 0. Most time used setup:
# High parallel I/O load
# set global event_scheduler= off;
# sleep 3;
# use events_test;
# create event e_16407 on schedule every 2 second do
# begin
# select 'FIRST COMMAND', sleep(0.5);
# select 'SECOND COMMAND';
# end|
# set global event_scheduler= on;
# Start observation of the processlist
#
#
# 1. SET GLOBAL event_scheduler = 'ON' and immediate observation of the processlist.
# 1.1 Effects around event scheduler:
# 1.1.1 First phase (very short)
# No user 'event_scheduler' within information_schema.processlist.
# 1.1.2 Second phase observed (independend of probably existing events and very short) was
# USER HOST DB COMMAND TIME STATE INFO # USER HOST DB COMMAND TIME STATE INFO
# event_scheduler localhost NULL Daemon 0 Waiting on empty queue NULL
# event_scheduler localhost NULL Daemon 0 Initialized NULL # event_scheduler localhost NULL Daemon 0 Initialized NULL
# 1.1.3 Third phase observed:
# 1.1.3.1 Case we do not have existing events (rather long)
# USER HOST DB COMMAND TIME STATE INFO
# event_scheduler localhost NULL Daemon 0 Waiting on empty queue NULL
# 1.1.3.2 Case there exists already an event
# 1.1.3.2.1 Event executor is not visible in processlist but comes up soon
# USER HOST DB COMMAND TIME STATE INFO
# event_scheduler localhost NULL Daemon 0 NULL
# or
# event_scheduler localhost NULL Daemon 0 NULL NULL
# 1.1.3.2.2 A bit later, at least one event executor is or was visible in processlist
# The states mentioned in 3.2.1 or a bit later
# USER HOST DB COMMAND TIME STATE INFO
# event_scheduler localhost NULL Daemon 0 Waiting for next activation NULL
# 1.2 Effects around event executor:
# Typical processlist content:
# USER evtest1 -- Definer of event
# DB events_test -- DB during time of event creation (use DB is not allowed in events)
# COMMAND Connect
# STATE NULL
# INFO SET @evname = 'ev_sched_1823' -- Part of the event code
#
# State before "User sleep select 'FIRST COMMAND', sleep(0.5);"
# ID USER HOST DB COMMAND TIME STATE INFO
# 7 event_scheduler localhost NULL Connect 0 NULL NULL
# !! The user is not the event creator and the DB is different. !!
# !! This means that we must get later a change of the identity. !!
# or
# USER HOST DB COMMAND TIME STATE INFO
# root localhost events_test Connect 0 checking permissions
# or
# USER HOST DB COMMAND TIME STATE INFO
# root localhost events_test Connect 0 checking permissions CREATE PROCEDURE ....
# or
# USER HOST DB COMMAND TIME STATE INFO
# root localhost events_test Connect 0 NULL select 'FIRST COMMAND', sleep(0.5)
# or
# USER HOST DB COMMAND TIME STATE INFO
# root localhost events_test Connect 0 checking permissions select 'FIRST COMMAND'...
# or
# USER HOST DB COMMAND TIME STATE INFO
# root localhost events_test Connect 0 Opening table select 'FIRST COMMAND', sleep(0.5)
# or
# USER HOST DB COMMAND TIME STATE INFO
# root localhost events_test Connect 0 Locked select 'FIRST COMMAND', sleep(0.5)
# or
# USER HOST DB COMMAND TIME STATE INFO
# root localhost events_test Connect 0 executing select 'FIRST COMMAND', sleep(0.5)
#
# State "User sleep select 'FIRST COMMAND', sleep(0.5);" reached
# USER HOST DB COMMAND TIME STATE INFO
# root localhost events_test Connect 0 User sleep select 'FIRST COMMAND', sleep(0.5)
#
# State at end (! It looks like a slow CREATE PROC !) of event code execution was sometimes
# USER HOST DB COMMAND TIME STATE INFO
# root localhost events_test Connect 0 logging slow query CREATE PROCEDURE `e_16407`...
#
# State after running some event code was sometimes
# USER HOST DB COMMAND TIME STATE INFO
# root localhost events_test Connect 0 logging slow query select 'SECOND COMMAND'
#
# State somewhere (I guess just before the event executor disappears)
# USER HOST DB COMMAND TIME STATE INFO
# Event thread fin <empty> events_test Connect 0 Clearing NULL
#
#
# 2. SET GLOBAL event_scheduler = 'OFF'; # 2. SET GLOBAL event_scheduler = 'OFF';
# Immediate observation of the processlist. # Immediate observation of the processlist.
# Effects: # Effects:
# 1. I never found the user 'event_scheduler' within the processlist. # 1. I never found the user 'event_scheduler' within the processlist.
# 2. Events just during execution could be found within the processlist # 2. Events just during execution could be found within the processlist
# = It does not look like "SET GLOBAL event_scheduler = 'OFF'" stops them. # = It does not look like "SET GLOBAL event_scheduler = 'OFF'" stops them.
# 3. An event gets executed # ==> Everything mentioned in 1.2 above could be observed.
# USER evtest1 (Definer of event) #
# DB events_test (DB during time of event creation) # Several subtests were weak because they showed random result set differences after issuing
# COMMAND Connect # "SET GLOBAL EVENT_SCHEDULER= off;".
# STATE NULL # 1. Reason one: There were already event executors
# INFO SET @evname = 'ev_sched_1823' (Part of the event code) # Fix: Wait till there is no event executor active ==> no session WHERE
# - command IN ('Connect')
# There must be no parallel session being just in "Connect" phase!
# or
# - user = <who created the maybe current running events>
# There must be no parallel session of this person.
# or user = 'event_scheduler' with command = 'Connect'
# The session which will soon change its identity to event creator.
#
# 2. Reason two: If an event modifies a MyISAM table than a delayed visibilty of changes
# might occur (concurrent_inserts=on or delayed inserts ...).
# #
# Can't test with embedded server that doesn't support grants # Can't test with embedded server that doesn't support grants
...@@ -47,6 +140,10 @@ drop database if exists mysqltest_db2; ...@@ -47,6 +140,10 @@ drop database if exists mysqltest_db2;
--enable_warnings --enable_warnings
create database events_test; create database events_test;
use events_test; use events_test;
# We use MyISAM tables and must avoid effects (visibility of changes might be
# delayed) caused by concurrent_insert on (default).
set @concurrent_insert= @@global.concurrent_insert;
set @@global.concurrent_insert = 0;
# #
# START: Bug #31332 --event-scheduler option misbehaving # START: Bug #31332 --event-scheduler option misbehaving
...@@ -56,8 +153,11 @@ use events_test; ...@@ -56,8 +153,11 @@ use events_test;
# option with no argument in events_bugs-master.opt turns the scheduler on. # option with no argument in events_bugs-master.opt turns the scheduler on.
select * from information_schema.global_variables where variable_name like 'event_scheduler'; select * from information_schema.global_variables where variable_name like 'event_scheduler';
# Check that the event_scheduler is really running
--source include/running_event_scheduler.inc
SET GLOBAL event_scheduler = 'OFF'; SET GLOBAL event_scheduler = 'OFF';
--source include/check_events_off.inc
# #
# END: Bug #31332 # END: Bug #31332
...@@ -132,8 +232,10 @@ create event e_55 on schedule every 10 hour starts 10000101000000 do drop table ...@@ -132,8 +232,10 @@ create event e_55 on schedule every 10 hour starts 10000101000000 do drop table
# Start - 16407: Events: Changes in sql_mode won't be taken into account # Start - 16407: Events: Changes in sql_mode won't be taken into account
# #
set global event_scheduler=off; set global event_scheduler=off;
--source include/check_events_off.inc
delete from mysql.event; delete from mysql.event;
set global event_scheduler= on; set global event_scheduler= on;
--source include/running_event_scheduler.inc
set @old_sql_mode:=@@sql_mode; set @old_sql_mode:=@@sql_mode;
set sql_mode=ansi; set sql_mode=ansi;
select get_lock('test_bug16407', 60); select get_lock('test_bug16407', 60);
...@@ -148,13 +250,13 @@ delimiter ;| ...@@ -148,13 +250,13 @@ delimiter ;|
# We wait till one event runs and hangs when trying to get the user lock. # We wait till one event runs and hangs when trying to get the user lock.
let $wait_condition= let $wait_condition=
select count(*) > 0 from information_schema.processlist select count(*) > 0 from information_schema.processlist
where info = 'select get_lock(\'test_bug16407\', 60)'; where state = 'User lock' and info = 'select get_lock(\'test_bug16407\', 60)';
--source include/wait_condition.inc --source include/wait_condition.inc
--echo "Now if everything is fine the event has compiled and is locked" --echo "Now if everything is fine the event has compiled and is locked"
# Expect to see one session in events_test waiting for the user lock. # Expect to see one session in events_test waiting for the user lock.
select /*1*/ user, host, db, info from information_schema.processlist select /*1*/ user, host, db, info from information_schema.processlist
where info = 'select get_lock(\'test_bug16407\', 60)'; where state = 'User lock' and info = 'select get_lock(\'test_bug16407\', 60)';
select release_lock('test_bug16407'); select release_lock('test_bug16407');
# Try to avoid # Try to avoid
# Bug#39863 events_bugs fails sporadically on pushbuild (extra processes in I_S.PROCESSLIST) # Bug#39863 events_bugs fails sporadically on pushbuild (extra processes in I_S.PROCESSLIST)
...@@ -162,23 +264,27 @@ select release_lock('test_bug16407'); ...@@ -162,23 +264,27 @@ select release_lock('test_bug16407');
# Bug#32782 User lock hash fails to find lock # Bug#32782 User lock hash fails to find lock
# "various issues related to missing or incorrect return results # "various issues related to missing or incorrect return results
# from release_lock()." # from release_lock()."
# Therefore we check here if the event executing session disappeared or # Therefore we check here if the event executor is no more locked or
# we waited >= 5 seconds for this to happen. # we waited >= 5 seconds for this to happen.
let $wait_timeout= 5; let $wait_timeout= 5;
let $wait_condition= let $wait_condition=
select count(*) = 0 from information_schema.processlist select count(*) = 0 from information_schema.processlist
where info = 'select get_lock(\'test_bug16407\', 60)'; where state = 'User lock' and info = 'select get_lock(\'test_bug16407\', 60)';
--source include/wait_condition.inc --source include/wait_condition.inc
if (!`$wait_condition`) if (!`$wait_condition`)
{ {
--echo ERROR: There must be no session with info = 'select get_lock('test_bug16407', 60) within the processlist. --echo ERROR: There must be no session with
--echo state = 'User lock' and info = 'select get_lock('test_bug16407', 60)
--echo within the processlist.
--echo We probably hit Bug#32782 User lock hash fails to find lock --echo We probably hit Bug#32782 User lock hash fails to find lock
eval select * from information_schema.processlist; SELECT * FROM information_schema.processlist;
--echo Abort --echo Abort
exit; exit;
} }
set global event_scheduler= off; set global event_scheduler= off;
# Wait till the event scheduler and all event executors have finished their work.
--source include/check_events_off.inc
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name; select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
--echo "Let's check whether we change the sql_mode on ALTER EVENT" --echo "Let's check whether we change the sql_mode on ALTER EVENT"
...@@ -191,9 +297,10 @@ set sql_mode="ansi"; ...@@ -191,9 +297,10 @@ set sql_mode="ansi";
select get_lock('ee_16407_2', 60); select get_lock('ee_16407_2', 60);
set global event_scheduler= 1; set global event_scheduler= 1;
--source include/running_event_scheduler.inc
--echo "Another sql_mode test" --echo "Another sql_mode test"
set sql_mode="traditional"; set sql_mode="traditional";
create table events_smode_test(ev_name char(10), a date) engine=myisam; create table events_smode_test(ev_name char(10), a date);
--echo "This should never insert something" --echo "This should never insert something"
delimiter |; delimiter |;
create event ee_16407_2 on schedule every 60 second do create event ee_16407_2 on schedule every 60 second do
...@@ -203,7 +310,7 @@ begin ...@@ -203,7 +310,7 @@ begin
insert into events_test.events_smode_test values('ee_16407_2','1980-19-02'); insert into events_test.events_smode_test values('ee_16407_2','1980-19-02');
end| end|
--error ER_TRUNCATED_WRONG_VALUE --error ER_TRUNCATED_WRONG_VALUE
insert into events_smode_test values ('test','1980-19-02')| insert into events_test.events_smode_test values ('test','1980-19-02')|
--echo "This is ok" --echo "This is ok"
create event ee_16407_3 on schedule every 60 second do create event ee_16407_3 on schedule every 60 second do
begin begin
...@@ -223,13 +330,20 @@ end| ...@@ -223,13 +330,20 @@ end|
delimiter ;| delimiter ;|
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name; select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
# We wait till we have three event executors waiting for the removal of the lock.
let $wait_condition= let $wait_condition=
select count(*) = 3 from information_schema.processlist select count(*) = 3 from information_schema.processlist
where info = 'select get_lock(\'ee_16407_2\', 60)'; where state = 'User lock' and info = 'select get_lock(\'ee_16407_2\', 60)';
--source include/wait_condition.inc --source include/wait_condition.inc
# There is an extreme low risk that an additional event execution is just coming
# up because
# - the events have to be started every 60 seconds.
# - we are just after event creation + waiting for seeing 3 locked
# We expect to see three event executors in state 'User lock'.
select /*2*/ user, host, db, info from information_schema.processlist select /*2*/ user, host, db, info from information_schema.processlist
where info = 'select get_lock(\'ee_16407_2\', 60)'; where state = 'User lock' and info = 'select get_lock(\'ee_16407_2\', 60)';
select release_lock('ee_16407_2'); select release_lock('ee_16407_2');
# Try to avoid # Try to avoid
...@@ -244,13 +358,37 @@ let $wait_timeout= 5; ...@@ -244,13 +358,37 @@ let $wait_timeout= 5;
let $wait_condition= let $wait_condition=
select count(*) = 0 select count(*) = 0
from information_schema.processlist from information_schema.processlist
where info = 'select get_lock(\'ee_16407_2\', 60)'; where state = 'User lock' and info = 'select get_lock(\'ee_16407_2\', 60)';
--source include/wait_condition.inc --source include/wait_condition.inc
if (!`$wait_condition`)
{
--echo ERROR: There must be no session with
--echo state = 'User lock' and info = 'select get_lock('test_bug16407_2', 60)
--echo within the processlist.
--echo We probably hit Bug#32782 User lock hash fails to find lock
SELECT * FROM information_schema.processlist;
--echo Abort
exit;
}
# We expect to see no event executors in state 'User lock'.
if(!$fixed_bug41925)
{
--disable_warnings
}
select /*3*/ user, host, db, info from information_schema.processlist select /*3*/ user, host, db, info from information_schema.processlist
where info = 'select get_lock(\'ee_16407_2\', 60)'; where state = 'User lock' and info = 'select get_lock(\'ee_16407_2\', 60)';
if(!$fixed_bug41925)
{
--enable_warnings
}
set global event_scheduler= off; set global event_scheduler= off;
select * from events_smode_test order by ev_name, a; # Wait till the event scheduler and all event executors have finished their work.
# Without this the next queries will give unstable results.
--source include/check_events_off.inc
select * from events_test.events_smode_test order by ev_name, a;
--echo "OK, last check before we drop them" --echo "OK, last check before we drop them"
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name; select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
drop event ee_16407_2; drop event ee_16407_2;
...@@ -259,11 +397,12 @@ drop event ee_16407_4; ...@@ -259,11 +397,12 @@ drop event ee_16407_4;
--echo "And now one last test regarding sql_mode and call of SP from an event" --echo "And now one last test regarding sql_mode and call of SP from an event"
delete from events_smode_test; delete from events_test.events_smode_test;
set sql_mode='ansi'; set sql_mode='ansi';
select get_lock('ee_16407_5', 60); select get_lock('ee_16407_5', 60);
set global event_scheduler= on; set global event_scheduler= on;
--source include/running_event_scheduler.inc
set sql_mode='traditional'; set sql_mode='traditional';
delimiter |; delimiter |;
...@@ -286,34 +425,46 @@ delimiter ;| ...@@ -286,34 +425,46 @@ delimiter ;|
let $wait_condition= let $wait_condition=
select count(*) = 2 from information_schema.processlist select count(*) = 2 from information_schema.processlist
where info = 'select get_lock(\'ee_16407_5\', 60)'; where state = 'User lock' and info = 'select get_lock(\'ee_16407_5\', 60)';
--source include/wait_condition.inc --source include/wait_condition.inc
--echo "Should have 2 locked processes" --echo "Should have 2 locked processes"
select /*4*/ user, host, db, info from information_schema.processlist select /*4*/ user, host, db, info from information_schema.processlist
where (command!='Daemon' || user='event_scheduler') and (info is null or info not like '%processlist%') where state = 'User lock' and info = 'select get_lock(\'ee_16407_5\', 60)';
order by info;
select release_lock('ee_16407_5'); select release_lock('ee_16407_5');
let $wait_condition= let $wait_condition=
select count(*) = 1 and user = 'event_scheduler' and info is null select count(*) = 0 from information_schema.processlist
from information_schema.processlist where state = 'User lock' and info = 'select get_lock(\'ee_16407_5\', 60)';
where (command!='Daemon' || user='event_scheduler')
and (info is null or info not like '%processlist%');
--source include/wait_condition.inc --source include/wait_condition.inc
--echo "Should have 0 processes locked" --echo "Should have 0 processes locked"
if(!$fixed_bug41925)
{
--disable_warnings
}
select /*5*/ user, host, db, info from information_schema.processlist select /*5*/ user, host, db, info from information_schema.processlist
where (command!='Daemon' || user='event_scheduler') and (info is null or info not like '%processlist%') where state = 'User lock' and info = 'select get_lock(\'ee_16407_5\', 60)';
order by info; if(!$fixed_bug41925)
select * from events_smode_test order by ev_name, a; {
--enable_warnings
}
# Wait till all event executors have finished their work, so that we can be sure
# that their changes to events_smode_test are done.
--source include/no_running_events.inc
select * from events_test.events_smode_test order by ev_name, a;
--echo "And here we check one more time before we drop the events" --echo "And here we check one more time before we drop the events"
select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name; select event_schema, event_name, sql_mode from information_schema.events order by event_schema, event_name;
drop event ee_16407_5; drop event ee_16407_5;
drop event ee_16407_6; drop event ee_16407_6;
drop procedure ee_16407_5_pendant; drop procedure ee_16407_5_pendant;
drop procedure ee_16407_6_pendant; drop procedure ee_16407_6_pendant;
set global event_scheduler= off; set global event_scheduler= off;
--source include/check_events_off.inc
drop table events_smode_test; drop table events_smode_test;
set sql_mode=@old_sql_mode; set sql_mode=@old_sql_mode;
# #
...@@ -324,6 +475,7 @@ set sql_mode=@old_sql_mode; ...@@ -324,6 +475,7 @@ set sql_mode=@old_sql_mode;
# START - 18897: Events: unauthorized action possible with alter event rename # START - 18897: Events: unauthorized action possible with alter event rename
# #
set global event_scheduler=off; set global event_scheduler=off;
--source include/check_events_off.inc
--disable_warnings --disable_warnings
delete from mysql.user where User like 'mysqltest_%'; delete from mysql.user where User like 'mysqltest_%';
delete from mysql.db where User like 'mysqltest_%'; delete from mysql.db where User like 'mysqltest_%';
...@@ -409,6 +561,7 @@ create function f22830 () returns int return 5; ...@@ -409,6 +561,7 @@ create function f22830 () returns int return 5;
select get_lock('ee_22830', 60); select get_lock('ee_22830', 60);
set global event_scheduler=on; set global event_scheduler=on;
--source include/running_event_scheduler.inc
delimiter |; delimiter |;
create procedure p22830_wait() create procedure p22830_wait()
...@@ -456,6 +609,7 @@ let $wait_condition= ...@@ -456,6 +609,7 @@ let $wait_condition=
--source include/wait_condition.inc --source include/wait_condition.inc
set global event_scheduler=off; set global event_scheduler=off;
--source include/check_events_off.inc
select event_name, event_definition, interval_value, interval_field from information_schema.events order by event_name; select event_name, event_definition, interval_value, interval_field from information_schema.events order by event_name;
drop procedure p22830_wait; drop procedure p22830_wait;
drop function f22830; drop function f22830;
...@@ -537,6 +691,7 @@ DROP USER mysqltest_u1@localhost; ...@@ -537,6 +691,7 @@ DROP USER mysqltest_u1@localhost;
# For the actual tests of time zones please see events_time_zone.test # For the actual tests of time zones please see events_time_zone.test
# #
SET GLOBAL EVENT_SCHEDULER= OFF; SET GLOBAL EVENT_SCHEDULER= OFF;
--source include/check_events_off.inc
SET @save_time_zone= @@TIME_ZONE; SET @save_time_zone= @@TIME_ZONE;
#---------------------------------------------------------------------- #----------------------------------------------------------------------
...@@ -749,6 +904,7 @@ let $engine=MyISAM; ...@@ -749,6 +904,7 @@ let $engine=MyISAM;
USE test; USE test;
SHOW GRANTS FOR CURRENT_USER; SHOW GRANTS FOR CURRENT_USER;
SET GLOBAL event_scheduler = ON; SET GLOBAL event_scheduler = ON;
--source include/running_event_scheduler.inc
eval eval
CREATE TABLE events_test.event_log CREATE TABLE events_test.event_log
(id int KEY AUTO_INCREMENT, ev_nm char(40), ev_cnt int, ev_tm timestamp) (id int KEY AUTO_INCREMENT, ev_nm char(40), ev_cnt int, ev_tm timestamp)
...@@ -817,12 +973,14 @@ disconnect e1; ...@@ -817,12 +973,14 @@ disconnect e1;
DROP EVENT events_test.ev_sched_1823; DROP EVENT events_test.ev_sched_1823;
DROP TABLE events_test.event_log; DROP TABLE events_test.event_log;
SET GLOBAL event_scheduler = OFF; SET GLOBAL event_scheduler = OFF;
--source include/check_events_off.inc
# #
# Bug#28641 CREATE EVENT with '2038.01.18 03:00:00' let server crash. # Bug#28641 CREATE EVENT with '2038.01.18 03:00:00' let server crash.
# #
SET GLOBAL event_scheduler= ON; SET GLOBAL event_scheduler= ON;
--source include/running_event_scheduler.inc
DELIMITER |; DELIMITER |;
CREATE EVENT bug28641 ON SCHEDULE AT '2038.01.18 03:00:00' CREATE EVENT bug28641 ON SCHEDULE AT '2038.01.18 03:00:00'
DO BEGIN DO BEGIN
...@@ -831,6 +989,7 @@ END;| ...@@ -831,6 +989,7 @@ END;|
DELIMITER ;| DELIMITER ;|
SET GLOBAL event_scheduler= OFF; SET GLOBAL event_scheduler= OFF;
--source include/check_events_off.inc
DROP EVENT bug28641; DROP EVENT bug28641;
########################################################################### ###########################################################################
...@@ -955,6 +1114,7 @@ SET GLOBAL READ_ONLY = 1; ...@@ -955,6 +1114,7 @@ SET GLOBAL READ_ONLY = 1;
--echo --echo
SET GLOBAL EVENT_SCHEDULER = ON; SET GLOBAL EVENT_SCHEDULER = ON;
--source include/running_event_scheduler.inc
--echo --echo
...@@ -980,6 +1140,7 @@ let $wait_condition = ...@@ -980,6 +1140,7 @@ let $wait_condition =
--echo --echo
SET GLOBAL EVENT_SCHEDULER = OFF; SET GLOBAL EVENT_SCHEDULER = OFF;
--source include/check_events_off.inc
--echo --echo
...@@ -1056,14 +1217,15 @@ drop event e1; ...@@ -1056,14 +1217,15 @@ drop event e1;
# #
########################################################################### ###########################################################################
let $wait_condition= # Ensure that all event executors have finished their work and cannot harm
select count(*) = 0 from information_schema.processlist # the next test.
where db='events_test' and command = 'Connect' and user=current_user(); --source include/no_running_events.inc
--source include/wait_condition.inc
DROP DATABASE events_test; DROP DATABASE events_test;
# Restore the original state (option with no argument in events_bugs-master.opt # Restore the original state (option with no argument in events_bugs-master.opt
# turns the scheduler on). # turns the scheduler on).
SET GLOBAL event_scheduler = 'ON'; SET GLOBAL event_scheduler = 'ON';
--source include/running_event_scheduler.inc
SET @@global.concurrent_insert = @concurrent_insert;
# THIS MUST BE THE LAST LINE in this file. # THIS MUST BE THE LAST LINE in this file.
...@@ -16,7 +16,6 @@ CREATE TABLE bug38231 (a INT); ...@@ -16,7 +16,6 @@ CREATE TABLE bug38231 (a INT);
-- connect (con1,localhost,root,,) -- connect (con1,localhost,root,,)
-- connect (con2,localhost,root,,) -- connect (con2,localhost,root,,)
-- connect (con3,localhost,root,,)
-- connection con1 -- connection con1
SET autocommit=0; SET autocommit=0;
...@@ -27,11 +26,6 @@ SET autocommit=0; ...@@ -27,11 +26,6 @@ SET autocommit=0;
-- send -- send
LOCK TABLE bug38231 WRITE; LOCK TABLE bug38231 WRITE;
-- connection con3
SET autocommit=0;
-- send
LOCK TABLE bug38231 WRITE;
-- connection default -- connection default
-- send -- send
TRUNCATE TABLE bug38231; TRUNCATE TABLE bug38231;
...@@ -39,6 +33,7 @@ TRUNCATE TABLE bug38231; ...@@ -39,6 +33,7 @@ TRUNCATE TABLE bug38231;
-- connection con1 -- connection con1
# give time to TRUNCATE and others to be executed; without sleep, sometimes # give time to TRUNCATE and others to be executed; without sleep, sometimes
# UNLOCK executes before TRUNCATE # UNLOCK executes before TRUNCATE
# TODO: Replace with wait_condition once possible under embedded server.
-- sleep 0.2 -- sleep 0.2
# this crashes the server if the bug is present # this crashes the server if the bug is present
UNLOCK TABLES; UNLOCK TABLES;
...@@ -46,16 +41,13 @@ UNLOCK TABLES; ...@@ -46,16 +41,13 @@ UNLOCK TABLES;
# clean up # clean up
-- connection con2 -- connection con2
UNLOCK TABLES; -- reap
-- connection con3
UNLOCK TABLES; UNLOCK TABLES;
-- connection default -- connection default
-- reap
-- disconnect con1 -- disconnect con1
-- disconnect con2 -- disconnect con2
-- disconnect con3
# test that TRUNCATE works with with row-level locks # test that TRUNCATE works with with row-level locks
......
--innodb_lock_wait_timeout=1 --innodb_rollback_on_timeout=1
-- source include/have_innodb.inc
#
# Bug #41453: Assertion `m_status == DA_ERROR' failed in
# Diagnostics_area::sql_errno
#
CREATE TABLE t1(a INT, b INT NOT NULL, PRIMARY KEY (a)) ENGINE=innodb
DEFAULT CHARSET=latin1;
INSERT INTO t1 VALUES (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7);
CONNECT (con1,localhost,root,,);
CONNECT (con2,localhost,root,,);
CONNECTION con1;
START TRANSACTION;
SELECT * FROM t1 WHERE b=3 LIMIT 1 FOR UPDATE;
CONNECTION con2;
START TRANSACTION;
--error ER_LOCK_WAIT_TIMEOUT
UPDATE t1 SET b=b+12 WHERE a > 2 ORDER BY a;
ROLLBACK;
CONNECTION con1;
START TRANSACTION;
SELECT * FROM t1 WHERE b=3 LIMIT 1 FOR UPDATE;
CONNECTION con2;
START TRANSACTION;
--error ER_LOCK_WAIT_TIMEOUT
UPDATE t1 SET b=10 WHERE a > 1 ORDER BY a;
SELECT * FROM t1 WHERE b = 10;
CONNECTION default;
DISCONNECT con1;
DISCONNECT con2;
DROP TABLE t1;
-- source include/not_embedded.inc ### t/log_state.test ###
#
# This test suffers from server
# Bug#38124 "general_log_file" variable silently unset when using expression
# In short:
# SET GLOBAL general_log_file = @<whatever>
# SET GLOBAL slow_query_log = @<whatever>
# cause that the value of these server system variables is set to default
# instead of the assigned values. There comes no error message or warning.
# If this bug is fixed please
# 1. try this test with "let $fixed_bug38124 = 0;"
# 2. remove all workarounds if 1. was successful.
let $fixed_bug38124 = 0;
--source include/not_embedded.inc
--source include/have_csv.inc --source include/have_csv.inc
# Several subtests modify global variables. Save the initial values only here,
# but reset to the initial values per subtest.
SET @old_general_log= @@global.general_log;
SET @old_general_log_file= @@global.general_log_file;
SET @old_slow_query_log= @@global.slow_query_log;
SET @old_slow_query_log_file= @@global.slow_query_log_file;
--disable_ps_protocol --disable_ps_protocol
set global general_log= OFF; set global general_log= OFF;
truncate table mysql.general_log; truncate table mysql.general_log;
...@@ -23,20 +45,32 @@ show global variables ...@@ -23,20 +45,32 @@ show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
Variable_name = 'general_log' or Variable_name = 'slow_query_log'; Variable_name = 'general_log' or Variable_name = 'slow_query_log';
--echo # Establish connection con1 (user=root)
connect (con1,localhost,root,,); connect (con1,localhost,root,,);
--echo # Switch to connection con1
connection con1; connection con1;
set session long_query_time=1; # Please increase @long_query_time if the corresponding selects show an
select sleep(2); # additional unexpected entry like
# start_time ... sql_text
# TIMESTAMP ... set session long_query_time=...
# (Bug#40377 sporadic pushbuild failure in log_state: result mismatch)
--replace_result 2 <long_query_time>
set @long_query_time = 2;
set session long_query_time = @long_query_time;
select sleep(@long_query_time + 1);
--replace_column 1 TIMESTAMP 2 USER_HOST 3 QUERY_TIME --replace_column 1 TIMESTAMP 2 USER_HOST 3 QUERY_TIME
select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%'; select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%';
--echo # Switch to connection default
connection default; connection default;
set global slow_query_log= ON; set global slow_query_log= ON;
--echo # Switch to connection con1
connection con1; connection con1;
set session long_query_time=1; set session long_query_time = @long_query_time;
select sleep(2); select sleep(@long_query_time + 1);
--replace_column 1 TIMESTAMP 2 USER_HOST 3 QUERY_TIME --replace_column 1 TIMESTAMP 2 USER_HOST 3 QUERY_TIME
select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%'; select * from mysql.slow_log where sql_text NOT LIKE '%slow_log%';
--echo # Switch to connection default
connection default; connection default;
show global variables show global variables
where Variable_name = 'log' or Variable_name = 'log_slow_queries' or where Variable_name = 'log' or Variable_name = 'log_slow_queries' or
...@@ -71,16 +105,16 @@ show variables like 'slow_query_log_file'; ...@@ -71,16 +105,16 @@ show variables like 'slow_query_log_file';
show variables like 'log_output'; show variables like 'log_output';
# Can't set general_log_file to a non existing file # Can't set general_log_file to a non existing file
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set global general_log_file='/not exiting path/log.master'; set global general_log_file='/not existing path/log.master';
# Can't set general_log_file to a directory # Can't set general_log_file to a directory
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
eval set global general_log_file='$MYSQLTEST_VARDIR'; eval set global general_log_file='$MYSQLTEST_VARDIR';
# Can't set general_log_file to empty string # Can't set general_log_file to empty string
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set global general_log_file=''; set global general_log_file='';
--replace_column 2 # --replace_column 2 #
...@@ -126,17 +160,30 @@ drop table t1; ...@@ -126,17 +160,30 @@ drop table t1;
--replace_column 1 TIMESTAMP 2 USER_HOST 3 # --replace_column 1 TIMESTAMP 2 USER_HOST 3 #
select * from mysql.general_log; select * from mysql.general_log;
# Reset to initial values
SET @@global.general_log = @old_general_log;
SET @@global.general_log_file = @old_general_log_file;
SET @@global.slow_query_log = @old_slow_query_log;
SET @@global.slow_query_log_file = @old_slow_query_log_file;
if(!$fixed_bug38124)
{
--disable_query_log
let $my_var = `SELECT @old_general_log_file`;
eval SET @@global.general_log_file = '$my_var';
let $my_var = `SELECT @old_slow_query_log_file`;
eval SET @@global.slow_query_log_file = '$my_var';
--enable_query_log
}
###########################################################################
# #
# Bug#29129 (Resetting general_log while the GLOBAL READ LOCK is set causes # Bug#29129 (Resetting general_log while the GLOBAL READ LOCK is set causes
# a deadlock) # a deadlock)
#
# save state
SET @old_general_log_state = @@global.general_log;
SET @old_slow_log_state = @@global.slow_query_log;
# Test ON->OFF transition under a GLOBAL READ LOCK # Test ON->OFF transition under a GLOBAL READ LOCK
SET GLOBAL general_log = ON; SET GLOBAL general_log = ON;
SET GLOBAL slow_query_log = ON; SET GLOBAL slow_query_log = ON;
...@@ -148,7 +195,6 @@ SET GLOBAL slow_query_log = OFF; ...@@ -148,7 +195,6 @@ SET GLOBAL slow_query_log = OFF;
UNLOCK TABLES; UNLOCK TABLES;
# Test OFF->ON transition under a GLOBAL READ LOCK # Test OFF->ON transition under a GLOBAL READ LOCK
FLUSH TABLES WITH READ LOCK; FLUSH TABLES WITH READ LOCK;
SET GLOBAL general_log = ON; SET GLOBAL general_log = ON;
...@@ -157,7 +203,6 @@ SET GLOBAL slow_query_log = ON; ...@@ -157,7 +203,6 @@ SET GLOBAL slow_query_log = ON;
UNLOCK TABLES; UNLOCK TABLES;
# Test ON->OFF transition under a GLOBAL READ_ONLY # Test ON->OFF transition under a GLOBAL READ_ONLY
SET GLOBAL READ_ONLY = ON; SET GLOBAL READ_ONLY = ON;
SET GLOBAL general_log = OFF; SET GLOBAL general_log = OFF;
...@@ -166,7 +211,6 @@ SET GLOBAL slow_query_log = OFF; ...@@ -166,7 +211,6 @@ SET GLOBAL slow_query_log = OFF;
SET GLOBAL READ_ONLY = OFF; SET GLOBAL READ_ONLY = OFF;
# Test OFF->ON transition under a GLOBAL READ_ONLY # Test OFF->ON transition under a GLOBAL READ_ONLY
SET GLOBAL READ_ONLY = ON; SET GLOBAL READ_ONLY = ON;
SET GLOBAL general_log = ON; SET GLOBAL general_log = ON;
...@@ -174,17 +218,18 @@ SET GLOBAL slow_query_log = ON; ...@@ -174,17 +218,18 @@ SET GLOBAL slow_query_log = ON;
SET GLOBAL READ_ONLY = OFF; SET GLOBAL READ_ONLY = OFF;
# Restore state # Reset to initial values
SET GLOBAL general_log = @old_general_log;
SET GLOBAL slow_query_log = @old_slow_query_log;
SET GLOBAL general_log = @old_general_log_state; ###########################################################################
SET GLOBAL slow_query_log = @old_slow_log_state;
# #
# Bug #29131: SHOW VARIABLES reports variable 'log' but SET doesn't recognize it # Bug#29131: SHOW VARIABLES reports variable 'log' but SET doesn't recognize it
# #
SET @old_general_log_state = @@global.general_log; SET GLOBAL general_log = ON;
SET @old_slow_log_state = @@global.slow_query_log;
SHOW VARIABLES LIKE 'general_log'; SHOW VARIABLES LIKE 'general_log';
SHOW VARIABLES LIKE 'log'; SHOW VARIABLES LIKE 'log';
...@@ -210,26 +255,38 @@ SHOW VARIABLES LIKE 'slow_query_log'; ...@@ -210,26 +255,38 @@ SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'log_slow_queries'; SHOW VARIABLES LIKE 'log_slow_queries';
SELECT @@slow_query_log, @@log_slow_queries; SELECT @@slow_query_log, @@log_slow_queries;
SET GLOBAL general_log = @old_general_log_state; SET GLOBAL general_log = @old_general_log;
SET GLOBAL slow_query_log = @old_slow_log_state; SET GLOBAL slow_query_log = @old_slow_query_log;
###########################################################################
# #
# Bug #31604: server crash when setting slow_query_log_file/general_log_file # Bug#31604: server crash when setting slow_query_log_file/general_log_file
# #
set @old_general_log_file= @@global.general_log_file;
set @old_slow_query_log_file= @@global.slow_query_log_file;
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set global general_log_file= concat('/not exiting path/log.maste', 'r'); SET GLOBAL general_log_file= CONCAT('/not existing path/log.maste', 'r');
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set global general_log_file= NULL; SET GLOBAL general_log_file= NULL;
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set global slow_query_log_file= concat('/not exiting path/log.maste', 'r'); SET GLOBAL slow_query_log_file= CONCAT('/not existing path/log.maste', 'r');
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set global slow_query_log_file= NULL; SET GLOBAL slow_query_log_file= NULL;
# Reset to initial values in case a setting above was successful.
SET GLOBAL general_log_file= @old_general_log_file;
SET GLOBAL slow_query_log_file= @old_slow_query_log_file;
if(!$fixed_bug38124)
{
--disable_query_log
let $my_var = `SELECT @old_general_log_file`;
eval SET @@global.general_log_file = '$my_var';
let $my_var = `SELECT @old_slow_query_log_file`;
eval SET @@global.slow_query_log_file = '$my_var';
--enable_query_log
}
set global general_log_file= @old_general_log_file;
set global slow_query_log_file= @old_slow_query_log_file;
########################################################################### ###########################################################################
...@@ -239,10 +296,6 @@ set global slow_query_log_file= @old_slow_query_log_file; ...@@ -239,10 +296,6 @@ set global slow_query_log_file= @old_slow_query_log_file;
--echo # -- general_log_file/slow_query_log_file. --echo # -- general_log_file/slow_query_log_file.
--echo # -- --echo # --
--echo
SET @general_log_file_saved = @@global.general_log_file;
SET @slow_query_log_file_saved = @@global.slow_query_log_file;
--echo --echo
SET GLOBAL general_log_file = 'bug32748.query.log'; SET GLOBAL general_log_file = 'bug32748.query.log';
SET GLOBAL slow_query_log_file = 'bug32748.slow.log'; SET GLOBAL slow_query_log_file = 'bug32748.slow.log';
...@@ -250,27 +303,37 @@ SET GLOBAL slow_query_log_file = 'bug32748.slow.log'; ...@@ -250,27 +303,37 @@ SET GLOBAL slow_query_log_file = 'bug32748.slow.log';
--echo --echo
SHOW VARIABLES LIKE '%log_file'; SHOW VARIABLES LIKE '%log_file';
# Reset to initial values
--echo --echo
SET GLOBAL general_log_file = @general_log_file_saved; SET GLOBAL general_log_file = @old_general_log_file;
SET GLOBAL slow_query_log_file = @slow_query_log_file_saved; SET GLOBAL slow_query_log_file = @old_slow_query_log_file;
if(!$fixed_bug38124)
{
--disable_query_log
let $my_var = `SELECT @old_general_log_file`;
eval SET @@global.general_log_file = '$my_var';
let $my_var = `SELECT @old_slow_query_log_file`;
eval SET @@global.slow_query_log_file = '$my_var';
--enable_query_log
}
--echo --echo
--echo # -- End of Bug#32748. --echo # -- End of Bug#32748.
###########################################################################
###########################################################################
## WL#4403 - deprecate @log and @slow_log_queries variables # WL#4403 - deprecate @log and @slow_log_queries variables
## these are all deprecated -- show for command-line as well! # These server system variables are all deprecated
# -- show for command-line as well!
--echo deprecated: --echo deprecated:
SET GLOBAL log = 0; SET GLOBAL log = 0;
SET GLOBAL log_slow_queries = 0; SET GLOBAL log_slow_queries = 0;
SET GLOBAL log = DEFAULT; SET GLOBAL log = DEFAULT;
SET GLOBAL log_slow_queries = DEFAULT; SET GLOBAL log_slow_queries = DEFAULT;
## these are NOT deprecated # These server system variables are NOT deprecated.
--echo not deprecated: --echo not deprecated:
SELECT @@global.general_log_file INTO @my_glf; SELECT @@global.general_log_file INTO @my_glf;
SELECT @@global.slow_query_log_file INTO @my_sqlf; SELECT @@global.slow_query_log_file INTO @my_sqlf;
...@@ -283,6 +346,20 @@ SET GLOBAL slow_query_log_file = @my_sqlf; ...@@ -283,6 +346,20 @@ SET GLOBAL slow_query_log_file = @my_sqlf;
SET GLOBAL general_log = DEFAULT; SET GLOBAL general_log = DEFAULT;
SET GLOBAL slow_query_log = DEFAULT; SET GLOBAL slow_query_log = DEFAULT;
## Reset to initial values
SET @@global.general_log = @old_general_log;
SET @@global.general_log_file = @old_general_log_file;
SET @@global.slow_query_log = @old_slow_query_log;
SET @@global.slow_query_log_file = @old_slow_query_log_file;
if(!$fixed_bug38124)
{
--disable_query_log
let $my_var = `SELECT @old_general_log_file`;
eval SET @@global.general_log_file = '$my_var';
let $my_var = `SELECT @old_slow_query_log_file`;
eval SET @@global.slow_query_log_file = '$my_var';
--enable_query_log
}
--echo End of 5.1 tests --echo End of 5.1 tests
...@@ -290,10 +367,27 @@ SET GLOBAL slow_query_log = DEFAULT; ...@@ -290,10 +367,27 @@ SET GLOBAL slow_query_log = DEFAULT;
--enable_ps_protocol --enable_ps_protocol
# #
# Cleanup (must be done last to avoid delayed 'Quit' message in general log) # Cleanup
# #
# Disconnect must be done last to avoid delayed 'Quit' message in general log
--echo # Close connection con1
disconnect con1; disconnect con1;
# Reset global system variables to initial values if forgotten somewhere above.
SET global general_log = @old_general_log;
SET global general_log_file = @old_general_log_file;
SET global slow_query_log = @old_slow_query_log;
SET global slow_query_log_file = @old_slow_query_log_file;
if(!$fixed_bug38124)
{
--disable_query_log
let $my_var = `SELECT @old_general_log_file`;
eval SET @@global.general_log_file = '$my_var';
let $my_var = `SELECT @old_slow_query_log_file`;
eval SET @@global.slow_query_log_file = '$my_var';
--enable_query_log
}
# Remove the log files that was created in the "default location" # Remove the log files that was created in the "default location"
# i.e var/run # i.e var/run
--remove_file $MYSQLTEST_VARDIR/run/master.log --remove_file $MYSQLTEST_VARDIR/run/master.log
--remove_file $MYSQLTEST_VARDIR/tmp/log.master
...@@ -112,3 +112,76 @@ show tables; ...@@ -112,3 +112,76 @@ show tables;
show tables; show tables;
drop view v1, `v-1`; drop view v1, `v-1`;
drop table t1; drop table t1;
#
# Bug #33094: Error in upgrading from 5.0 to 5.1 when table contains triggers
# Bug #41385: Crash when attempting to repair a #mysql50# upgraded table with
# triggers
#
SET NAMES utf8;
CREATE TABLE `#mysql50#@` (a INT);
SHOW TABLES;
SET NAMES DEFAULT;
--echo mysqlcheck --fix-table-names --databases test
--exec $MYSQL_CHECK --fix-table-names --databases test
SET NAMES utf8;
SHOW TABLES;
DROP TABLE `@`;
CREATE TABLE `я` (a INT);
SET NAMES DEFAULT;
--echo mysqlcheck --default-character-set="latin1" --databases test
--exec $MYSQL_CHECK --default-character-set="latin1" --databases test
--echo mysqlcheck --default-character-set="utf8" --databases test
--exec $MYSQL_CHECK --default-character-set="utf8" --databases test
SET NAMES utf8;
DROP TABLE `я`;
SET NAMES DEFAULT;
CREATE DATABASE `#mysql50#a@b`;
USE `#mysql50#a@b`;
CREATE TABLE `#mysql50#c@d` (a INT);
CREATE TABLE t1 (a INT);
# Create 5.0 like triggers
--write_file $MYSQLTEST_VARDIR/master-data/a@b/c@d.TRG
TYPE=TRIGGERS
triggers='CREATE DEFINER=`root`@`localhost` TRIGGER tr1 BEFORE INSERT ON `c@d` FOR EACH ROW SET NEW.a = 10 * NEW.a'
sql_modes=0
definers='root@localhost'
EOF
--write_file $MYSQLTEST_VARDIR/master-data/a@b/tr1.TRN
TYPE=TRIGGERNAME
trigger_table=c@d
EOF
--write_file $MYSQLTEST_VARDIR/master-data/a@b/t1.TRG
TYPE=TRIGGERS
triggers='CREATE DEFINER=`root`@`localhost` TRIGGER tr2 BEFORE INSERT ON `a@b`.t1 FOR EACH ROW SET NEW.a = 100 * NEW.a'
sql_modes=0
definers='root@localhost'
EOF
--write_file $MYSQLTEST_VARDIR/master-data/a@b/tr2.TRN
TYPE=TRIGGERNAME
trigger_table=t1
EOF
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_SCHEMA="#mysql50#a@b" ORDER BY trigger_name;
--echo mysqlcheck --fix-db-names --fix-table-names --all-databases
--exec $MYSQL_CHECK --fix-db-names --fix-table-names --all-databases
USE `a@b`;
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_SCHEMA="a@b" ORDER BY trigger_name;
INSERT INTO `c@d` VALUES (2), (1);
SELECT * FROM `c@d`;
INSERT INTO t1 VALUES (3), (5);
SELECT * FROM t1;
DROP DATABASE `a@b`;
USE test;
--echo End of 5.1 tests
...@@ -75,9 +75,12 @@ CREATE TABLE t1(AFIELD INT); ...@@ -75,9 +75,12 @@ CREATE TABLE t1(AFIELD INT);
INSERT INTO t1 VALUES(1); INSERT INTO t1 VALUES(1);
CREATE TABLE t2(GMT VARCHAR(32)); CREATE TABLE t2(GMT VARCHAR(32));
INSERT INTO t2 VALUES('GMT-0800'); INSERT INTO t2 VALUES('GMT-0800');
SELECT DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT)) FROM t1, t2 GROUP BY t1.AFIELD; SELECT DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ', t2.GMT))
FROM t1, t2 GROUP BY t1.AFIELD;
INSERT INTO t1 VALUES(1); INSERT INTO t1 VALUES(1);
SELECT DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT)), DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ' , t2.GMT)) FROM t1,t2 GROUP BY t1.AFIELD; SELECT DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ', t2.GMT)),
DATE_FORMAT("2002-03-06 10:11:12", CONCAT('%a, %d %M %Y %H:%i:%s ', t2.GMT))
FROM t1,t2 GROUP BY t1.AFIELD;
drop table t1,t2; drop table t1,t2;
# #
...@@ -90,7 +93,7 @@ SELECT DATE_FORMAT(f1, "%l.%i %p") , DATE_FORMAT(f2, "%l.%i %p") FROM t1; ...@@ -90,7 +93,7 @@ SELECT DATE_FORMAT(f1, "%l.%i %p") , DATE_FORMAT(f2, "%l.%i %p") FROM t1;
DROP TABLE t1; DROP TABLE t1;
# #
# Bug 4937: different date -> string conversion when using SELECT ... UNION # Bug#4937: different date -> string conversion when using SELECT ... UNION
# and INSERT ... SELECT ... UNION # and INSERT ... SELECT ... UNION
# #
...@@ -141,7 +144,7 @@ select * from t1; ...@@ -141,7 +144,7 @@ select * from t1;
drop table t1; drop table t1;
# #
# Bug #30942: select str_to_date from derived table returns varying results # Bug#30942: select str_to_date from derived table returns varying results
# #
CREATE TABLE t1 ( CREATE TABLE t1 (
a INT a INT
...@@ -155,10 +158,22 @@ DROP TABLE t1; ...@@ -155,10 +158,22 @@ DROP TABLE t1;
# #
# Bug #31221: Optimizer incorrectly identifies impossible WHERE clause # Bug#31221: Optimizer incorrectly identifies impossible WHERE clause
# #
CREATE TABLE t1 (a DATE, b int, PRIMARY KEY (a,b)); CREATE TABLE t1 (a DATE, b INT, PRIMARY KEY (a,b));
## The current sub test could fail (difference to expected result) if we
## have just reached midnight.
## (Bug#41776 type_date.test may fail if run around midnight)
## Therefore we sleep a bit if we are too close to midnight.
## The complete test itself needs in average less than 1 second.
## Therefore a time_distance to midnight of 5 seconds should be sufficient.
if (`SELECT CURTIME() > SEC_TO_TIME(24 * 3600 - 5)`)
{
# We are here when CURTIME() is between '23:59:56' and '23:59:59'.
# So a sleep time of 5 seconds brings us between '00:00:01' and '00:00:04'.
--real_sleep 5
}
INSERT INTO t1 VALUES (DATE(NOW()), 1); INSERT INTO t1 VALUES (DATE(NOW()), 1);
SELECT COUNT(*) FROM t1 WHERE a = NOW(); SELECT COUNT(*) FROM t1 WHERE a = NOW();
EXPLAIN SELECT COUNT(*) FROM t1 WHERE a = NOW(); EXPLAIN SELECT COUNT(*) FROM t1 WHERE a = NOW();
...@@ -174,7 +189,7 @@ EXPLAIN SELECT COUNT(*) FROM t1 WHERE a = NOW(); ...@@ -174,7 +189,7 @@ EXPLAIN SELECT COUNT(*) FROM t1 WHERE a = NOW();
DROP TABLE t1; DROP TABLE t1;
# #
# Bug #28687: Search fails on '0000-00-00' date after sql_mode change # Bug#28687: Search fails on '0000-00-00' date after sql_mode change
# #
CREATE TABLE t1 (a DATE); CREATE TABLE t1 (a DATE);
......
...@@ -562,10 +562,7 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select, ...@@ -562,10 +562,7 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select,
if (quick_select) if (quick_select)
{ {
if ((error= select->quick->get_next())) if ((error= select->quick->get_next()))
{
error= HA_ERR_END_OF_FILE;
break; break;
}
file->position(sort_form->record[0]); file->position(sort_form->record[0]);
DBUG_EXECUTE_IF("debug_filesort", dbug_print_record(sort_form, TRUE);); DBUG_EXECUTE_IF("debug_filesort", dbug_print_record(sort_form, TRUE););
} }
......
...@@ -8129,6 +8129,9 @@ Write_rows_log_event::do_before_row_operations(const Slave_reporting_capability ...@@ -8129,6 +8129,9 @@ Write_rows_log_event::do_before_row_operations(const Slave_reporting_capability
analyze if explicit data is provided for slave's TIMESTAMP columns). analyze if explicit data is provided for slave's TIMESTAMP columns).
*/ */
m_table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET; m_table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
/* Honor next number column if present */
m_table->next_number_field= m_table->found_next_number_field;
return error; return error;
} }
...@@ -8137,6 +8140,7 @@ Write_rows_log_event::do_after_row_operations(const Slave_reporting_capability * ...@@ -8137,6 +8140,7 @@ Write_rows_log_event::do_after_row_operations(const Slave_reporting_capability *
int error) int error)
{ {
int local_error= 0; int local_error= 0;
m_table->next_number_field=0;
if (bit_is_set(slave_exec_mode, SLAVE_EXEC_MODE_IDEMPOTENT) == 1 || if (bit_is_set(slave_exec_mode, SLAVE_EXEC_MODE_IDEMPOTENT) == 1 ||
m_table->s->db_type()->db_type == DB_TYPE_NDBCLUSTER) m_table->s->db_type()->db_type == DB_TYPE_NDBCLUSTER)
{ {
......
...@@ -2230,6 +2230,7 @@ uint strconvert(CHARSET_INFO *from_cs, const char *from, ...@@ -2230,6 +2230,7 @@ uint strconvert(CHARSET_INFO *from_cs, const char *from,
CHARSET_INFO *to_cs, char *to, uint to_length, uint *errors); CHARSET_INFO *to_cs, char *to, uint to_length, uint *errors);
uint filename_to_tablename(const char *from, char *to, uint to_length); uint filename_to_tablename(const char *from, char *to, uint to_length);
uint tablename_to_filename(const char *from, char *to, uint to_length); uint tablename_to_filename(const char *from, char *to, uint to_length);
uint check_n_cut_mysql50_prefix(const char *from, char *to, uint to_length);
#endif /* MYSQL_SERVER || INNODB_COMPATIBILITY_HOOKS */ #endif /* MYSQL_SERVER || INNODB_COMPATIBILITY_HOOKS */
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
uint build_table_filename(char *buff, size_t bufflen, const char *db, uint build_table_filename(char *buff, size_t bufflen, const char *db,
......
...@@ -552,8 +552,8 @@ int PROFILING::fill_statistics_info(THD *thd, TABLE_LIST *tables, Item *cond) ...@@ -552,8 +552,8 @@ int PROFILING::fill_statistics_info(THD *thd, TABLE_LIST *tables, Item *cond)
The order of these fields is set by the query_profile_statistics_info The order of these fields is set by the query_profile_statistics_info
array. array.
*/ */
table->field[0]->store((ulonglong) query->profiling_query_id); table->field[0]->store((ulonglong) query->profiling_query_id, TRUE);
table->field[1]->store((ulonglong) seq); /* the step in the sequence */ table->field[1]->store((ulonglong) seq, TRUE); /* the step in the sequence */
/* /*
This entry, n, has a point in time, T(n), and a status phrase, S(n). This entry, n, has a point in time, T(n), and a status phrase, S(n).
The status phrase S(n) describes the period of time that begins at The status phrase S(n) describes the period of time that begins at
......
...@@ -114,6 +114,30 @@ uint filename_to_tablename(const char *from, char *to, uint to_length) ...@@ -114,6 +114,30 @@ uint filename_to_tablename(const char *from, char *to, uint to_length)
} }
/**
Check if given string begins with "#mysql50#" prefix, cut it if so.
@param from string to check and cut
@param to[out] buffer for result string
@param to_length its size
@retval
0 no prefix found
@retval
non-0 result string length
*/
uint check_n_cut_mysql50_prefix(const char *from, char *to, uint to_length)
{
if (from[0] == '#' &&
!strncmp(from, MYSQL50_TABLE_NAME_PREFIX,
MYSQL50_TABLE_NAME_PREFIX_LENGTH))
return (uint) (strmake(to, from + MYSQL50_TABLE_NAME_PREFIX_LENGTH,
to_length - 1) - to);
return 0;
}
/* /*
Translate a table name to a file name (WL #1324). Translate a table name to a file name (WL #1324).
...@@ -133,11 +157,8 @@ uint tablename_to_filename(const char *from, char *to, uint to_length) ...@@ -133,11 +157,8 @@ uint tablename_to_filename(const char *from, char *to, uint to_length)
DBUG_ENTER("tablename_to_filename"); DBUG_ENTER("tablename_to_filename");
DBUG_PRINT("enter", ("from '%s'", from)); DBUG_PRINT("enter", ("from '%s'", from));
if (from[0] == '#' && !strncmp(from, MYSQL50_TABLE_NAME_PREFIX, if ((length= check_n_cut_mysql50_prefix(from, to, to_length)))
MYSQL50_TABLE_NAME_PREFIX_LENGTH)) DBUG_RETURN(length);
DBUG_RETURN((uint) (strmake(to, from+MYSQL50_TABLE_NAME_PREFIX_LENGTH,
to_length-1) -
(from + MYSQL50_TABLE_NAME_PREFIX_LENGTH)));
length= strconvert(system_charset_info, from, length= strconvert(system_charset_info, from,
&my_charset_filename, to, to_length, &errors); &my_charset_filename, to, to_length, &errors);
if (check_if_legal_tablename(to) && if (check_if_legal_tablename(to) &&
......
...@@ -1368,15 +1368,27 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db, ...@@ -1368,15 +1368,27 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db,
if (triggers->on_table_names_list.push_back(on_table_name, &table->mem_root)) if (triggers->on_table_names_list.push_back(on_table_name, &table->mem_root))
goto err_with_lex_cleanup; goto err_with_lex_cleanup;
#ifndef DBUG_OFF
/* /*
Let us check that we correctly update trigger definitions when we Let us check that we correctly update trigger definitions when we
rename tables with triggers. rename tables with triggers.
In special cases like "RENAME TABLE `#mysql50#somename` TO `somename`"
or "ALTER DATABASE `#mysql50#somename` UPGRADE DATA DIRECTORY NAME"
we might be given table or database name with "#mysql50#" prefix (and
trigger's definiton contains un-prefixed version of the same name).
To remove this prefix we use check_n_cut_mysql50_prefix().
*/ */
DBUG_ASSERT(!my_strcasecmp(table_alias_charset, lex.query_tables->db, db) &&
!my_strcasecmp(table_alias_charset, lex.query_tables->table_name,
table_name));
char fname[NAME_LEN + 1];
DBUG_ASSERT((!my_strcasecmp(table_alias_charset, lex.query_tables->db, db) ||
(check_n_cut_mysql50_prefix(db, fname, sizeof(fname)) &&
!my_strcasecmp(table_alias_charset, lex.query_tables->db, fname))) &&
(!my_strcasecmp(table_alias_charset, lex.query_tables->table_name,
table_name) ||
(check_n_cut_mysql50_prefix(table_name, fname, sizeof(fname)) &&
!my_strcasecmp(table_alias_charset, lex.query_tables->table_name, fname))));
#endif
if (names_only) if (names_only)
{ {
lex_end(&lex); lex_end(&lex);
...@@ -1692,7 +1704,8 @@ bool Table_triggers_list::drop_all_triggers(THD *thd, char *db, char *name) ...@@ -1692,7 +1704,8 @@ bool Table_triggers_list::drop_all_triggers(THD *thd, char *db, char *name)
(change name of table in triggers' definitions). (change name of table in triggers' definitions).
@param thd Thread context @param thd Thread context
@param db_name Database of subject table @param old_db_name Old database of subject table
@param new_db_name New database of subject table
@param old_table_name Old subject table's name @param old_table_name Old subject table's name
@param new_table_name New subject table's name @param new_table_name New subject table's name
...@@ -1704,7 +1717,8 @@ bool Table_triggers_list::drop_all_triggers(THD *thd, char *db, char *name) ...@@ -1704,7 +1717,8 @@ bool Table_triggers_list::drop_all_triggers(THD *thd, char *db, char *name)
bool bool
Table_triggers_list::change_table_name_in_triggers(THD *thd, Table_triggers_list::change_table_name_in_triggers(THD *thd,
const char *db_name, const char *old_db_name,
const char *new_db_name,
LEX_STRING *old_table_name, LEX_STRING *old_table_name,
LEX_STRING *new_table_name) LEX_STRING *new_table_name)
{ {
...@@ -1757,11 +1771,11 @@ Table_triggers_list::change_table_name_in_triggers(THD *thd, ...@@ -1757,11 +1771,11 @@ Table_triggers_list::change_table_name_in_triggers(THD *thd,
if (thd->is_fatal_error) if (thd->is_fatal_error)
return TRUE; /* OOM */ return TRUE; /* OOM */
if (save_trigger_file(this, db_name, new_table_name->str)) if (save_trigger_file(this, new_db_name, new_table_name->str))
return TRUE; return TRUE;
if (rm_trigger_file(path_buff, db_name, old_table_name->str)) if (rm_trigger_file(path_buff, old_db_name, old_table_name->str))
{ {
(void) rm_trigger_file(path_buff, db_name, new_table_name->str); (void) rm_trigger_file(path_buff, new_db_name, new_table_name->str);
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
...@@ -1772,7 +1786,8 @@ Table_triggers_list::change_table_name_in_triggers(THD *thd, ...@@ -1772,7 +1786,8 @@ Table_triggers_list::change_table_name_in_triggers(THD *thd,
Iterate though Table_triggers_list::names_list list and update Iterate though Table_triggers_list::names_list list and update
.TRN files after renaming triggers' subject table. .TRN files after renaming triggers' subject table.
@param db_name Database of subject table @param old_db_name Old database of subject table
@param new_db_name New database of subject table
@param new_table_name New subject table's name @param new_table_name New subject table's name
@param stopper Pointer to Table_triggers_list::names_list at @param stopper Pointer to Table_triggers_list::names_list at
which we should stop updating. which we should stop updating.
...@@ -1785,7 +1800,8 @@ Table_triggers_list::change_table_name_in_triggers(THD *thd, ...@@ -1785,7 +1800,8 @@ Table_triggers_list::change_table_name_in_triggers(THD *thd,
*/ */
LEX_STRING* LEX_STRING*
Table_triggers_list::change_table_name_in_trignames(const char *db_name, Table_triggers_list::change_table_name_in_trignames(const char *old_db_name,
const char *new_db_name,
LEX_STRING *new_table_name, LEX_STRING *new_table_name,
LEX_STRING *stopper) LEX_STRING *stopper)
{ {
...@@ -1798,7 +1814,7 @@ Table_triggers_list::change_table_name_in_trignames(const char *db_name, ...@@ -1798,7 +1814,7 @@ Table_triggers_list::change_table_name_in_trignames(const char *db_name,
while ((trigger= it_name++) != stopper) while ((trigger= it_name++) != stopper)
{ {
trigname_file.length= build_table_filename(trigname_buff, FN_REFLEN-1, trigname_file.length= build_table_filename(trigname_buff, FN_REFLEN-1,
db_name, trigger->str, new_db_name, trigger->str,
TRN_EXT, 0); TRN_EXT, 0);
trigname_file.str= trigname_buff; trigname_file.str= trigname_buff;
...@@ -1807,6 +1823,16 @@ Table_triggers_list::change_table_name_in_trignames(const char *db_name, ...@@ -1807,6 +1823,16 @@ Table_triggers_list::change_table_name_in_trignames(const char *db_name,
if (sql_create_definition_file(NULL, &trigname_file, &trigname_file_type, if (sql_create_definition_file(NULL, &trigname_file, &trigname_file_type,
(uchar*)&trigname, trigname_file_parameters)) (uchar*)&trigname, trigname_file_parameters))
return trigger; return trigger;
/* Remove stale .TRN file in case of database upgrade */
if (old_db_name)
{
if (rm_trigname_file(trigname_buff, old_db_name, trigger->str))
{
(void) rm_trigname_file(trigname_buff, new_db_name, trigger->str);
return trigger;
}
}
} }
return 0; return 0;
...@@ -1840,6 +1866,7 @@ bool Table_triggers_list::change_table_name(THD *thd, const char *db, ...@@ -1840,6 +1866,7 @@ bool Table_triggers_list::change_table_name(THD *thd, const char *db,
{ {
TABLE table; TABLE table;
bool result= 0; bool result= 0;
bool upgrading50to51= FALSE;
LEX_STRING *err_trigname; LEX_STRING *err_trigname;
DBUG_ENTER("change_table_name"); DBUG_ENTER("change_table_name");
...@@ -1877,14 +1904,27 @@ bool Table_triggers_list::change_table_name(THD *thd, const char *db, ...@@ -1877,14 +1904,27 @@ bool Table_triggers_list::change_table_name(THD *thd, const char *db,
moving table with them between two schemas raises too many questions. moving table with them between two schemas raises too many questions.
(E.g. what should happen if in new schema we already have trigger (E.g. what should happen if in new schema we already have trigger
with same name ?). with same name ?).
In case of "ALTER DATABASE `#mysql50#db1` UPGRADE DATA DIRECTORY NAME"
we will be given table name with "#mysql50#" prefix
To remove this prefix we use check_n_cut_mysql50_prefix().
*/ */
if (my_strcasecmp(table_alias_charset, db, new_db)) if (my_strcasecmp(table_alias_charset, db, new_db))
{
char dbname[NAME_LEN + 1];
if (check_n_cut_mysql50_prefix(db, dbname, sizeof(dbname)) &&
!my_strcasecmp(table_alias_charset, dbname, new_db))
{
upgrading50to51= TRUE;
}
else
{ {
my_error(ER_TRG_IN_WRONG_SCHEMA, MYF(0)); my_error(ER_TRG_IN_WRONG_SCHEMA, MYF(0));
result= 1; result= 1;
goto end; goto end;
} }
if (table.triggers->change_table_name_in_triggers(thd, db, }
if (table.triggers->change_table_name_in_triggers(thd, db, new_db,
&old_table_name, &old_table_name,
&new_table_name)) &new_table_name))
{ {
...@@ -1892,7 +1932,8 @@ bool Table_triggers_list::change_table_name(THD *thd, const char *db, ...@@ -1892,7 +1932,8 @@ bool Table_triggers_list::change_table_name(THD *thd, const char *db,
goto end; goto end;
} }
if ((err_trigname= table.triggers->change_table_name_in_trignames( if ((err_trigname= table.triggers->change_table_name_in_trignames(
db, &new_table_name, 0))) upgrading50to51 ? db : NULL,
new_db, &new_table_name, 0)))
{ {
/* /*
If we were unable to update one of .TRN files properly we will If we were unable to update one of .TRN files properly we will
...@@ -1900,16 +1941,17 @@ bool Table_triggers_list::change_table_name(THD *thd, const char *db, ...@@ -1900,16 +1941,17 @@ bool Table_triggers_list::change_table_name(THD *thd, const char *db,
We assume that we will be able to undo our changes without errors We assume that we will be able to undo our changes without errors
(we can't do much if there will be an error anyway). (we can't do much if there will be an error anyway).
*/ */
(void) table.triggers->change_table_name_in_trignames(db, (void) table.triggers->change_table_name_in_trignames(
&old_table_name, upgrading50to51 ? new_db : NULL, db,
err_trigname); &old_table_name, err_trigname);
(void) table.triggers->change_table_name_in_triggers(thd, db, (void) table.triggers->change_table_name_in_triggers(
&new_table_name, thd, db, new_db,
&old_table_name); &new_table_name, &old_table_name);
result= 1; result= 1;
goto end; goto end;
} }
} }
end: end:
delete table.triggers; delete table.triggers;
free_root(&table.mem_root, MYF(0)); free_root(&table.mem_root, MYF(0));
......
...@@ -146,11 +146,13 @@ class Table_triggers_list: public Sql_alloc ...@@ -146,11 +146,13 @@ class Table_triggers_list: public Sql_alloc
private: private:
bool prepare_record1_accessors(TABLE *table); bool prepare_record1_accessors(TABLE *table);
LEX_STRING* change_table_name_in_trignames(const char *db_name, LEX_STRING* change_table_name_in_trignames(const char *old_db_name,
const char *new_db_name,
LEX_STRING *new_table_name, LEX_STRING *new_table_name,
LEX_STRING *stopper); LEX_STRING *stopper);
bool change_table_name_in_triggers(THD *thd, bool change_table_name_in_triggers(THD *thd,
const char *db_name, const char *old_db_name,
const char *new_db_name,
LEX_STRING *old_table_name, LEX_STRING *old_table_name,
LEX_STRING *new_table_name); LEX_STRING *new_table_name);
}; };
......
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