Commit 5630f073 authored by unknown's avatar unknown

Merge bk-internal:/home/bk/mysql-5.0

into serg.mylan:/usr/home/serg/Abk/mysql-5.0


sql/sql_parse.cc:
  Auto merged
sql/sql_yacc.yy:
  Auto merged
parents 923b76f8 70d8ae01
...@@ -37,3 +37,18 @@ show create database test; ...@@ -37,3 +37,18 @@ show create database test;
Database Create Database Database Create Database
test CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */ test CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */
drop table t1; drop table t1;
create table t1 (a int) engine=innodb;
reset master;
set autocommit=0;
insert t1 values (1);
flush tables with read lock;
show master status;
File Position Binlog_Do_DB Binlog_Ignore_DB
master-bin.000001 98
commit;
show master status;
File Position Binlog_Do_DB Binlog_Ignore_DB
master-bin.000001 98
unlock tables;
drop table t1;
set autocommit=1;
...@@ -76,3 +76,24 @@ select * from t1; ...@@ -76,3 +76,24 @@ select * from t1;
show create database test; show create database test;
drop table t1; drop table t1;
# FLUSH TABLES WITH READ LOCK should block writes to binlog too
connection con1;
create table t1 (a int) engine=innodb;
reset master;
set autocommit=0;
insert t1 values (1);
connection con2;
flush tables with read lock;
show master status;
connection con1;
send commit;
connection con2;
sleep 1;
show master status;
unlock tables;
connection con1;
reap;
drop table t1;
set autocommit=1;
...@@ -587,6 +587,11 @@ int ha_commit_trans(THD *thd, bool all) ...@@ -587,6 +587,11 @@ int ha_commit_trans(THD *thd, bool all)
#ifdef USING_TRANSACTIONS #ifdef USING_TRANSACTIONS
if (trans->nht) if (trans->nht)
{ {
if (is_real_trans && wait_if_global_read_lock(thd, 0, 0))
{
ha_rollback_trans(thd, all);
DBUG_RETURN(1);
}
DBUG_EXECUTE_IF("crash_commit_before", abort();); DBUG_EXECUTE_IF("crash_commit_before", abort(););
if (!trans->no_2pc && trans->nht > 1) if (!trans->no_2pc && trans->nht > 1)
{ {
...@@ -596,7 +601,7 @@ int ha_commit_trans(THD *thd, bool all) ...@@ -596,7 +601,7 @@ int ha_commit_trans(THD *thd, bool all)
if ((err= (*(*ht)->prepare)(thd, all))) if ((err= (*(*ht)->prepare)(thd, all)))
{ {
my_error(ER_ERROR_DURING_COMMIT, MYF(0), err); my_error(ER_ERROR_DURING_COMMIT, MYF(0), err);
error=1; error= 1;
} }
statistic_increment(thd->status_var.ha_prepare_count,&LOCK_status); statistic_increment(thd->status_var.ha_prepare_count,&LOCK_status);
} }
...@@ -605,7 +610,8 @@ int ha_commit_trans(THD *thd, bool all) ...@@ -605,7 +610,8 @@ int ha_commit_trans(THD *thd, bool all)
(error= !(cookie= tc_log->log(thd, xid))))) (error= !(cookie= tc_log->log(thd, xid)))))
{ {
ha_rollback_trans(thd, all); ha_rollback_trans(thd, all);
return 1; error= 1;
goto end;
} }
DBUG_EXECUTE_IF("crash_commit_after_log", abort();); DBUG_EXECUTE_IF("crash_commit_after_log", abort(););
} }
...@@ -614,11 +620,18 @@ int ha_commit_trans(THD *thd, bool all) ...@@ -614,11 +620,18 @@ int ha_commit_trans(THD *thd, bool all)
if (cookie) if (cookie)
tc_log->unlog(cookie, xid); tc_log->unlog(cookie, xid);
DBUG_EXECUTE_IF("crash_commit_after", abort();); DBUG_EXECUTE_IF("crash_commit_after", abort(););
end:
if (is_real_trans)
start_waiting_global_read_lock(thd);
} }
#endif /* USING_TRANSACTIONS */ #endif /* USING_TRANSACTIONS */
DBUG_RETURN(error); DBUG_RETURN(error);
} }
/*
NOTE - this function does not care about global read lock.
A caller should.
*/
int ha_commit_one_phase(THD *thd, bool all) int ha_commit_one_phase(THD *thd, bool all)
{ {
int error=0; int error=0;
...@@ -629,18 +642,6 @@ int ha_commit_one_phase(THD *thd, bool all) ...@@ -629,18 +642,6 @@ int ha_commit_one_phase(THD *thd, bool all)
#ifdef USING_TRANSACTIONS #ifdef USING_TRANSACTIONS
if (trans->nht) if (trans->nht)
{ {
bool need_start_waiters= 0;
if (is_real_trans)
{
if ((error= wait_if_global_read_lock(thd, 0, 0)))
{
my_error(ER_ERROR_DURING_COMMIT, MYF(0), error);
error= 1;
}
else
need_start_waiters= 1;
}
for (ht=trans->ht; *ht; ht++) for (ht=trans->ht; *ht; ht++)
{ {
int err; int err;
...@@ -665,8 +666,6 @@ int ha_commit_one_phase(THD *thd, bool all) ...@@ -665,8 +666,6 @@ int ha_commit_one_phase(THD *thd, bool all)
thd->variables.tx_isolation=thd->session_tx_isolation; thd->variables.tx_isolation=thd->session_tx_isolation;
thd->transaction.cleanup(); thd->transaction.cleanup();
} }
if (need_start_waiters)
start_waiting_global_read_lock(thd);
} }
#endif /* USING_TRANSACTIONS */ #endif /* USING_TRANSACTIONS */
DBUG_RETURN(error); DBUG_RETURN(error);
......
...@@ -206,6 +206,7 @@ THD::THD() ...@@ -206,6 +206,7 @@ THD::THD()
net.vio=0; net.vio=0;
#endif #endif
net.last_error[0]=0; // If error on boot net.last_error[0]=0; // If error on boot
net.query_cache_query=0; // If error on boot
ull=0; ull=0;
system_thread= cleanup_done= abort_on_warning= no_warnings_for_error= 0; system_thread= cleanup_done= abort_on_warning= no_warnings_for_error= 0;
peer_port= 0; // For SHOW PROCESSLIST peer_port= 0; // For SHOW PROCESSLIST
......
...@@ -4427,11 +4427,20 @@ unsent_create_error: ...@@ -4427,11 +4427,20 @@ unsent_create_error:
} }
else else
if (thd->transaction.xa_state == XA_PREPARED && thd->lex->xa_opt == XA_NONE) if (thd->transaction.xa_state == XA_PREPARED && thd->lex->xa_opt == XA_NONE)
{
if (wait_if_global_read_lock(thd, 0, 0))
{
ha_rollback(thd);
my_error(ER_XAER_RMERR, MYF(0));
}
else
{ {
if (ha_commit_one_phase(thd, 1)) if (ha_commit_one_phase(thd, 1))
my_error(ER_XAER_RMERR, MYF(0)); my_error(ER_XAER_RMERR, MYF(0));
else else
send_ok(thd); send_ok(thd);
start_waiting_global_read_lock(thd);
}
} }
else else
{ {
......
...@@ -7367,8 +7367,8 @@ keyword: ...@@ -7367,8 +7367,8 @@ keyword:
| TIMESTAMP_ADD {} | TIMESTAMP_ADD {}
| TIMESTAMP_DIFF {} | TIMESTAMP_DIFF {}
| TIME_SYM {} | TIME_SYM {}
| TYPE_SYM {}
| TYPES_SYM {} | TYPES_SYM {}
| TYPE_SYM {}
| UDF_RETURNS_SYM {} | UDF_RETURNS_SYM {}
| FUNCTION_SYM {} | FUNCTION_SYM {}
| UNCOMMITTED_SYM {} | UNCOMMITTED_SYM {}
......
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