Commit bf4849e8 authored by unknown's avatar unknown

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


sql/mysql_priv.h:
  Auto merged
sql/mysqld.cc:
  Auto merged
sql/sql_table.cc:
  Auto merged
parents 69942b13 cee153b8
-- require r/have_debug.require
disable_query_log;
select instr(version(),convert('debug' using utf8))!=0;
enable_query_log;
instr(version(),convert('debug' using utf8))!=0;
1
\ No newline at end of file
--exit-info=2048
\ No newline at end of file
-- 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;
\ No newline at end of file
...@@ -171,6 +171,8 @@ extern CHARSET_INFO *national_charset_info, *table_alias_charset; ...@@ -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, ...@@ -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, ...@@ -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");
/* /*
...@@ -1917,6 +1918,13 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table, ...@@ -1917,6 +1918,13 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* 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);
else else
...@@ -1926,7 +1934,7 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table, ...@@ -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;
} }
} }
...@@ -1955,8 +1963,13 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table, ...@@ -1955,8 +1963,13 @@ 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, ...@@ -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, ...@@ -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 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table, ...@@ -2001,10 +2015,16 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table,
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;
} }
else
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), table_name); my_error(ER_TABLE_EXISTS_ERROR, MYF(0), table_name);
DBUG_RETURN(-1);
err:
pthread_mutex_lock(&LOCK_open);
unlock_table_name(thd, &src_tables_list);
pthread_mutex_unlock(&LOCK_open);
DBUG_RETURN(res);
} }
......
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