mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 02:51:44 +01:00
Merge eagle.mysql.r18.ru:/home/vva/work/mysql.orig/clear/mysql-4.1
into eagle.mysql.r18.ru:/home/vva/work/BUG_2385/mysql-4.1
This commit is contained in:
commit
5f2d73ed96
7 changed files with 88 additions and 12 deletions
4
mysql-test/include/have_debug.inc
Normal file
4
mysql-test/include/have_debug.inc
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
-- require r/have_debug.require
|
||||||
|
disable_query_log;
|
||||||
|
select instr(version(),convert('debug' using utf8))!=0;
|
||||||
|
enable_query_log;
|
2
mysql-test/r/have_debug.require
Normal file
2
mysql-test/r/have_debug.require
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
instr(version(),convert('debug' using utf8))!=0;
|
||||||
|
1
|
1
mysql-test/t/synchronization-master.opt
Normal file
1
mysql-test/t/synchronization-master.opt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
--exit-info=2048
|
45
mysql-test/t/synchronization.test
Normal file
45
mysql-test/t/synchronization.test
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
-- source include/have_crypt.inc
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test for Bug #2385 CREATE TABLE LIKE lacks locking on source and destination table
|
||||||
|
#
|
||||||
|
|
||||||
|
connect (con_to_sleep,localhost,lock_controller,,);
|
||||||
|
connect (con_to_harm_sleeper,localhost,root,,);
|
||||||
|
|
||||||
|
# locking of source:
|
||||||
|
connection con_to_sleep;
|
||||||
|
CREATE TABLE t1 (a int);
|
||||||
|
send CREATE TABLE t2 LIKE t1;
|
||||||
|
|
||||||
|
connection con_to_harm_sleeper;
|
||||||
|
sleep 1;
|
||||||
|
ALTER TABLE t1 add key(a);
|
||||||
|
|
||||||
|
connection con_to_sleep;
|
||||||
|
sleep 4;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
drop table t1, t2;
|
||||||
|
|
||||||
|
# locking of destination:
|
||||||
|
connection con_to_sleep;
|
||||||
|
CREATE TABLE t1 (a int);
|
||||||
|
send CREATE TABLE t2 LIKE t1;
|
||||||
|
|
||||||
|
connection con_to_harm_sleeper;
|
||||||
|
sleep 1;
|
||||||
|
CREATE TABLE t2 (b int);
|
||||||
|
disable_query_log;
|
||||||
|
select "-----------" as "let's take a look at result of create .. like : ";
|
||||||
|
enable_query_log;
|
||||||
|
|
||||||
|
connection con_to_sleep;
|
||||||
|
sleep 1;
|
||||||
|
--error 1
|
||||||
|
reap;
|
||||||
|
disable_query_log;
|
||||||
|
select "" as "-----------";
|
||||||
|
enable_query_log;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
|
||||||
|
drop table t1, t2;
|
|
@ -171,6 +171,8 @@ extern CHARSET_INFO *national_charset_info, *table_alias_charset;
|
||||||
#define TEST_CORE_ON_SIGNAL 256 /* Give core if signal */
|
#define TEST_CORE_ON_SIGNAL 256 /* Give core if signal */
|
||||||
#define TEST_NO_STACKTRACE 512
|
#define TEST_NO_STACKTRACE 512
|
||||||
#define TEST_SIGINT 1024 /* Allow sigint on threads */
|
#define TEST_SIGINT 1024 /* Allow sigint on threads */
|
||||||
|
#define TEST_SYNCHRONIZATION 2048 /* get server to do sleep in some
|
||||||
|
places */
|
||||||
|
|
||||||
/* options for select set by the yacc parser (stored in lex->options) */
|
/* options for select set by the yacc parser (stored in lex->options) */
|
||||||
#define SELECT_DISTINCT (1L << 0)
|
#define SELECT_DISTINCT (1L << 0)
|
||||||
|
|
|
@ -2108,8 +2108,10 @@ static int init_common_variables(const char *conf_file_name, int argc,
|
||||||
if (*(MYSQL_SERVER_SUFFIX))
|
if (*(MYSQL_SERVER_SUFFIX))
|
||||||
strxmov(strend(server_version),MYSQL_SERVER_SUFFIX,"-debug",NullS);
|
strxmov(strend(server_version),MYSQL_SERVER_SUFFIX,"-debug",NullS);
|
||||||
else
|
else
|
||||||
#endif
|
strmov(strend(server_version),"--debug");
|
||||||
|
#else
|
||||||
strmov(strend(server_version),MYSQL_SERVER_SUFFIX);
|
strmov(strend(server_version),MYSQL_SERVER_SUFFIX);
|
||||||
|
#endif
|
||||||
|
|
||||||
load_defaults(conf_file_name, groups, &argc, &argv);
|
load_defaults(conf_file_name, groups, &argc, &argv);
|
||||||
defaults_argv=argv;
|
defaults_argv=argv;
|
||||||
|
|
|
@ -1902,7 +1902,8 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
||||||
char *table_name= table->real_name;
|
char *table_name= table->real_name;
|
||||||
char *src_db= thd->db;
|
char *src_db= thd->db;
|
||||||
char *src_table= table_ident->table.str;
|
char *src_table= table_ident->table.str;
|
||||||
int err;
|
int err, res= -1;
|
||||||
|
TABLE_LIST src_tables_list;
|
||||||
DBUG_ENTER("mysql_create_like_table");
|
DBUG_ENTER("mysql_create_like_table");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1916,6 +1917,13 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
||||||
my_error(ER_WRONG_TABLE_NAME, MYF(0), src_table);
|
my_error(ER_WRONG_TABLE_NAME, MYF(0), src_table);
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
src_tables_list.db= table_ident->db.str ? table_ident->db.str : thd->db;
|
||||||
|
src_tables_list.real_name= table_ident->table.str;
|
||||||
|
src_tables_list.next= 0;
|
||||||
|
|
||||||
|
if (lock_and_wait_for_table_name(thd, &src_tables_list))
|
||||||
|
goto err;
|
||||||
|
|
||||||
if ((tmp_table= find_temporary_table(thd, src_db, src_table)))
|
if ((tmp_table= find_temporary_table(thd, src_db, src_table)))
|
||||||
strxmov(src_path, (*tmp_table)->path, reg_ext, NullS);
|
strxmov(src_path, (*tmp_table)->path, reg_ext, NullS);
|
||||||
|
@ -1926,7 +1934,7 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
||||||
if (access(src_path, F_OK))
|
if (access(src_path, F_OK))
|
||||||
{
|
{
|
||||||
my_error(ER_BAD_TABLE_ERROR, MYF(0), src_table);
|
my_error(ER_BAD_TABLE_ERROR, MYF(0), src_table);
|
||||||
DBUG_RETURN(-1);
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1954,9 +1962,14 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Create a new table by copying from source table
|
Create a new table by copying from source table
|
||||||
*/
|
*/
|
||||||
if (my_copy(src_path, dst_path, MYF(MY_WME)))
|
#ifndef DBUG_OFF
|
||||||
DBUG_RETURN(-1);
|
// The code stated below is for test synchronization.test Bug #2385
|
||||||
|
if (test_flags & TEST_SYNCHRONIZATION)
|
||||||
|
sleep(3);
|
||||||
|
#endif
|
||||||
|
if (my_copy(src_path, dst_path, MYF(MY_WME|MY_DONT_OVERWRITE_FILE)))
|
||||||
|
goto err;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
As mysql_truncate don't work on a new table at this stage of
|
As mysql_truncate don't work on a new table at this stage of
|
||||||
|
@ -1972,14 +1985,14 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
||||||
{
|
{
|
||||||
(void) rm_temporary_table(create_info->db_type,
|
(void) rm_temporary_table(create_info->db_type,
|
||||||
dst_path); /* purecov: inspected */
|
dst_path); /* purecov: inspected */
|
||||||
DBUG_RETURN(-1); /* purecov: inspected */
|
goto err; /* purecov: inspected */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (err)
|
else if (err)
|
||||||
{
|
{
|
||||||
(void) quick_rm_table(create_info->db_type, db,
|
(void) quick_rm_table(create_info->db_type, db,
|
||||||
table_name); /* purecov: inspected */
|
table_name); /* purecov: inspected */
|
||||||
DBUG_RETURN(-1); /* purecov: inspected */
|
goto err; /* purecov: inspected */
|
||||||
}
|
}
|
||||||
|
|
||||||
// Must be written before unlock
|
// Must be written before unlock
|
||||||
|
@ -1992,7 +2005,8 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
||||||
HA_LEX_CREATE_TMP_TABLE));
|
HA_LEX_CREATE_TMP_TABLE));
|
||||||
mysql_bin_log.write(&qinfo);
|
mysql_bin_log.write(&qinfo);
|
||||||
}
|
}
|
||||||
DBUG_RETURN(0);
|
res= 0;
|
||||||
|
goto err;
|
||||||
|
|
||||||
table_exists:
|
table_exists:
|
||||||
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
|
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
|
||||||
|
@ -2001,10 +2015,16 @@ table_exists:
|
||||||
sprintf(warn_buff,ER(ER_TABLE_EXISTS_ERROR),table_name);
|
sprintf(warn_buff,ER(ER_TABLE_EXISTS_ERROR),table_name);
|
||||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||||
ER_TABLE_EXISTS_ERROR,warn_buff);
|
ER_TABLE_EXISTS_ERROR,warn_buff);
|
||||||
DBUG_RETURN(0);
|
res= 0;
|
||||||
}
|
}
|
||||||
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), table_name);
|
else
|
||||||
DBUG_RETURN(-1);
|
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), table_name);
|
||||||
|
|
||||||
|
err:
|
||||||
|
pthread_mutex_lock(&LOCK_open);
|
||||||
|
unlock_table_name(thd, &src_tables_list);
|
||||||
|
pthread_mutex_unlock(&LOCK_open);
|
||||||
|
DBUG_RETURN(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue