summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgluh@gluh.mysql.r18.ru <>2003-08-29 11:24:33 +0500
committergluh@gluh.mysql.r18.ru <>2003-08-29 11:24:33 +0500
commit144d0efaaa9fd4c4c9ee27528ce28d2cdfad4b00 (patch)
tree0ed185fad7123e02807f237f4137683921b60b23
parent6cad89775b4ed78c02c2fa9f3e49181f63b7fb65 (diff)
parente4951147cf6fbea62612fe2fee90c1dcc1d14ec6 (diff)
downloadmariadb-git-144d0efaaa9fd4c4c9ee27528ce28d2cdfad4b00.tar.gz
Merge sgluhov@bk-internal.mysql.com:/home/bk/mysql-4.1
into gluh.mysql.r18.ru:/home/gluh/mysql-4.1.fix
-rw-r--r--mysql-test/r/drop.result10
-rw-r--r--mysql-test/r/innodb.result12
-rw-r--r--mysql-test/t/drop.test10
-rw-r--r--mysql-test/t/innodb.test15
-rw-r--r--sql/handler.cc3
-rw-r--r--sql/sql_table.cc11
6 files changed, 57 insertions, 4 deletions
diff --git a/mysql-test/r/drop.result b/mysql-test/r/drop.result
index 367b28e9bf7..3748af1b8f9 100644
--- a/mysql-test/r/drop.result
+++ b/mysql-test/r/drop.result
@@ -44,3 +44,13 @@ mysql
test
drop database mysqltest;
ERROR HY000: Can't drop database 'mysqltest'; database doesn't exist
+drop table t1;
+flush tables with read lock;
+create table t1(n int);
+ERROR HY000: Can't execute the query because you have a conflicting read lock
+unlock tables;
+create table t1(n int);
+show tables;
+Tables_in_test
+t1
+drop table t1;
diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result
index 8592393fd42..36bc1c814e4 100644
--- a/mysql-test/r/innodb.result
+++ b/mysql-test/r/innodb.result
@@ -251,6 +251,18 @@ n
6
rollback;
drop table t1;
+create table t1 (n int not null primary key) type=innodb;
+start transaction;
+insert into t1 values (4);
+flush tables with read lock;
+commit;
+ERROR HY000: Can't execute the query because you have a conflicting read lock
+unlock tables;
+commit;
+select * from t1;
+n
+4
+drop table t1;
create table t1 ( id int NOT NULL PRIMARY KEY, nom varchar(64)) type=innodb;
begin;
insert into t1 values(1,'hamdouni');
diff --git a/mysql-test/t/drop.test b/mysql-test/t/drop.test
index a55cbb45fd9..43329a849f8 100644
--- a/mysql-test/t/drop.test
+++ b/mysql-test/t/drop.test
@@ -43,3 +43,13 @@ drop database mysqltest;
show databases;
--error 1008
drop database mysqltest;
+
+# test create table and FLUSH TABLES WITH READ LOCK
+drop table t1;
+flush tables with read lock;
+--error 1223;
+create table t1(n int);
+unlock tables;
+create table t1(n int);
+show tables;
+drop table t1;
diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test
index 6e7eb0ea06f..870fc8cc2b0 100644
--- a/mysql-test/t/innodb.test
+++ b/mysql-test/t/innodb.test
@@ -134,6 +134,21 @@ rollback;
drop table t1;
#
+# Test for commit and FLUSH TABLES WITH READ LOCK
+#
+
+create table t1 (n int not null primary key) type=innodb;
+start transaction;
+insert into t1 values (4);
+flush tables with read lock;
+--error 1223;
+commit;
+unlock tables;
+commit;
+select * from t1;
+drop table t1;
+
+#
# Testing transactions
#
diff --git a/sql/handler.cc b/sql/handler.cc
index b4d370491bb..851e73f15d2 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -359,7 +359,10 @@ int ha_commit_trans(THD *thd, THD_TRANS* trans)
if (trans == &thd->transaction.all && mysql_bin_log.is_open() &&
my_b_tell(&thd->transaction.trans_log))
{
+ if (wait_if_global_read_lock(thd, 0))
+ DBUG_RETURN(1);
mysql_bin_log.write(thd, &thd->transaction.trans_log);
+ start_waiting_global_read_lock(thd);
reinit_io_cache(&thd->transaction.trans_log,
WRITE_CACHE, (my_off_t) 0, 0, 1);
thd->transaction.trans_log.end_of_file= max_binlog_cache_size;
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 37f8d0d7f4f..006cec7000f 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -899,16 +899,18 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name);
DBUG_RETURN(-1);
}
+ if (wait_if_global_read_lock(thd, 0))
+ DBUG_RETURN(error);
VOID(pthread_mutex_lock(&LOCK_open));
if (!tmp_table && !(create_info->options & HA_LEX_CREATE_TMP_TABLE))
{
if (!access(path,F_OK))
{
- VOID(pthread_mutex_unlock(&LOCK_open));
if (create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS)
- DBUG_RETURN(0);
- my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name);
- DBUG_RETURN(-1);
+ error= 0;
+ else
+ my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name);
+ goto end;
}
}
@@ -946,6 +948,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
error=0;
end:
VOID(pthread_mutex_unlock(&LOCK_open));
+ start_waiting_global_read_lock(thd);
thd->proc_info="After create";
DBUG_RETURN(error);
}