Commit 38013489 authored by guilhem@mysql.com's avatar guilhem@mysql.com

Merge gbichot@213.136.52.20:/home/bk/mysql-4.1

into mysql.com:/home/mysql_src/mysql-4.1
parents d1622a94 8066c2ce
...@@ -7,6 +7,12 @@ start slave; ...@@ -7,6 +7,12 @@ start slave;
reset master; reset master;
SET @@session.pseudo_thread_id=100; SET @@session.pseudo_thread_id=100;
ERROR HY000: Access denied. You need the SUPER privilege for this operation ERROR HY000: Access denied. You need the SUPER privilege for this operation
SET @@session.sql_log_bin=0;
ERROR HY000: Access denied. You need the SUPER privilege for this operation
SET @@session.pseudo_thread_id=100;
SET @@session.pseudo_thread_id=connection_id();
SET @@session.sql_log_bin=0;
SET @@session.sql_log_bin=1;
drop table if exists t1,t2; drop table if exists t1,t2;
create table t1(f int); create table t1(f int);
create table t2(f int); create table t2(f int);
......
...@@ -30,7 +30,17 @@ connect (con3,localhost,zedjzlcsjhd,,); ...@@ -30,7 +30,17 @@ connect (con3,localhost,zedjzlcsjhd,,);
connection con3; connection con3;
--error 1227 --error 1227
SET @@session.pseudo_thread_id=100; SET @@session.pseudo_thread_id=100;
# While we are here we also test that SQL_LOG_BIN can't be set
--error 1227
SET @@session.sql_log_bin=0;
# Now as root, to be sure it works
connection con2;
SET @@session.pseudo_thread_id=100;
SET @@session.pseudo_thread_id=connection_id();
SET @@session.sql_log_bin=0;
SET @@session.sql_log_bin=1;
connection con3;
let $VERSION=`select version()`; let $VERSION=`select version()`;
--disable_warnings --disable_warnings
......
...@@ -486,7 +486,7 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans) ...@@ -486,7 +486,7 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans)
operation_done=1; operation_done=1;
} }
#endif #endif
if (trans == &thd->transaction.all) if ((trans == &thd->transaction.all) && mysql_bin_log.is_open())
{ {
/* /*
Update the binary log with a BEGIN/ROLLBACK block if we have cached some Update the binary log with a BEGIN/ROLLBACK block if we have cached some
...@@ -494,7 +494,6 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans) ...@@ -494,7 +494,6 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans)
be rare (updating a non-transactional table inside a transaction...). be rare (updating a non-transactional table inside a transaction...).
*/ */
if (unlikely((thd->options & OPTION_STATUS_NO_TRANS_UPDATE) && if (unlikely((thd->options & OPTION_STATUS_NO_TRANS_UPDATE) &&
mysql_bin_log.is_open() &&
my_b_tell(&thd->transaction.trans_log))) my_b_tell(&thd->transaction.trans_log)))
mysql_bin_log.write(thd, &thd->transaction.trans_log, 0); mysql_bin_log.write(thd, &thd->transaction.trans_log, 0);
/* Flushed or not, empty the binlog cache */ /* Flushed or not, empty the binlog cache */
...@@ -559,7 +558,7 @@ int ha_rollback_to_savepoint(THD *thd, char *savepoint_name) ...@@ -559,7 +558,7 @@ int ha_rollback_to_savepoint(THD *thd, char *savepoint_name)
my_error(ER_ERROR_DURING_ROLLBACK, MYF(0), error); my_error(ER_ERROR_DURING_ROLLBACK, MYF(0), error);
error=1; error=1;
} }
else else if (mysql_bin_log.is_open())
{ {
/* /*
Write ROLLBACK TO SAVEPOINT to the binlog cache if we have updated some Write ROLLBACK TO SAVEPOINT to the binlog cache if we have updated some
...@@ -567,7 +566,6 @@ int ha_rollback_to_savepoint(THD *thd, char *savepoint_name) ...@@ -567,7 +566,6 @@ int ha_rollback_to_savepoint(THD *thd, char *savepoint_name)
from the SAVEPOINT command. from the SAVEPOINT command.
*/ */
if (unlikely((thd->options & OPTION_STATUS_NO_TRANS_UPDATE) && if (unlikely((thd->options & OPTION_STATUS_NO_TRANS_UPDATE) &&
mysql_bin_log.is_open() &&
my_b_tell(&thd->transaction.trans_log))) my_b_tell(&thd->transaction.trans_log)))
{ {
Query_log_event qinfo(thd, thd->query, thd->query_length, TRUE); Query_log_event qinfo(thd, thd->query, thd->query_length, TRUE);
...@@ -596,23 +594,26 @@ Return value: always 0, that is, succeeds always ...@@ -596,23 +594,26 @@ Return value: always 0, that is, succeeds always
int ha_savepoint(THD *thd, char *savepoint_name) int ha_savepoint(THD *thd, char *savepoint_name)
{ {
my_off_t binlog_cache_pos=0;
int error=0; int error=0;
DBUG_ENTER("ha_savepoint"); DBUG_ENTER("ha_savepoint");
#ifdef USING_TRANSACTIONS #ifdef USING_TRANSACTIONS
if (opt_using_transactions) if (opt_using_transactions)
{ {
binlog_cache_pos=my_b_tell(&thd->transaction.trans_log); /* Write it to the binary log (see comments of ha_rollback_to_savepoint) */
#ifdef HAVE_INNOBASE_DB
innobase_savepoint(thd,savepoint_name, binlog_cache_pos);
#endif
/* Write it to the binary log (see comments of ha_rollback_to_savepoint). */
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
#ifdef HAVE_INNOBASE_DB
innobase_savepoint(thd,savepoint_name,
my_b_tell(&thd->transaction.trans_log));
#endif
Query_log_event qinfo(thd, thd->query, thd->query_length, TRUE); Query_log_event qinfo(thd, thd->query, thd->query_length, TRUE);
if (mysql_bin_log.write(&qinfo)) if (mysql_bin_log.write(&qinfo))
error= 1; error= 1;
} }
#ifdef HAVE_INNOBASE_DB
else
innobase_savepoint(thd,savepoint_name,0);
#endif
} }
#endif /* USING_TRANSACTIONS */ #endif /* USING_TRANSACTIONS */
DBUG_RETURN(error); DBUG_RETURN(error);
......
...@@ -1208,8 +1208,7 @@ bool MYSQL_LOG::write(Log_event* event_info) ...@@ -1208,8 +1208,7 @@ bool MYSQL_LOG::write(Log_event* event_info)
"do the involved tables match (to be implemented) "do the involved tables match (to be implemented)
binlog_[wild_]{do|ignore}_table?" (WL#1049)" binlog_[wild_]{do|ignore}_table?" (WL#1049)"
*/ */
if ((thd && !(thd->options & OPTION_BIN_LOG) && if ((thd && !(thd->options & OPTION_BIN_LOG)) ||
(thd->master_access & SUPER_ACL)) ||
(local_db && !db_ok(local_db, binlog_do_db, binlog_ignore_db))) (local_db && !db_ok(local_db, binlog_do_db, binlog_ignore_db)))
{ {
VOID(pthread_mutex_unlock(&LOCK_log)); VOID(pthread_mutex_unlock(&LOCK_log));
...@@ -1556,11 +1555,7 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length, ...@@ -1556,11 +1555,7 @@ bool MYSQL_LOG::write(THD *thd,const char *query, uint query_length,
int tmp_errno=0; int tmp_errno=0;
char buff[80],*end; char buff[80],*end;
end=buff; end=buff;
if (!(thd->options & OPTION_UPDATE_LOG) if (!(thd->options & OPTION_UPDATE_LOG))
#ifndef NO_EMBEDDED_ACCESS_CHECKS
&& (thd->master_access & SUPER_ACL)
#endif
)
{ {
VOID(pthread_mutex_unlock(&LOCK_log)); VOID(pthread_mutex_unlock(&LOCK_log));
return 0; return 0;
......
...@@ -2284,6 +2284,13 @@ static bool set_option_autocommit(THD *thd, set_var *var) ...@@ -2284,6 +2284,13 @@ static bool set_option_autocommit(THD *thd, set_var *var)
static bool set_log_update(THD *thd, set_var *var) static bool set_log_update(THD *thd, set_var *var)
{ {
#ifndef NO_EMBEDDED_ACCESS_CHECKS
if (!(thd->master_access & SUPER_ACL))
{
my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), "SUPER");
return 1;
}
#endif
if (opt_sql_bin_update) if (opt_sql_bin_update)
((sys_var_thd_bit*) var->var)->bit_flag|= (OPTION_BIN_LOG | ((sys_var_thd_bit*) var->var)->bit_flag|= (OPTION_BIN_LOG |
OPTION_UPDATE_LOG); OPTION_UPDATE_LOG);
......
...@@ -169,7 +169,11 @@ THD::THD():user_time(0), current_statement(0), is_fatal_error(0), ...@@ -169,7 +169,11 @@ THD::THD():user_time(0), current_statement(0), is_fatal_error(0),
tablespace_op=FALSE; tablespace_op=FALSE;
#ifdef USING_TRANSACTIONS #ifdef USING_TRANSACTIONS
bzero((char*) &transaction,sizeof(transaction)); bzero((char*) &transaction,sizeof(transaction));
if (opt_using_transactions) /*
Binlog is always open (if needed) before a THD is created (including
bootstrap).
*/
if (opt_using_transactions && mysql_bin_log.is_open())
{ {
if (open_cached_file(&transaction.trans_log, if (open_cached_file(&transaction.trans_log,
mysql_tmpdir, LOG_PREFIX, binlog_cache_size, mysql_tmpdir, LOG_PREFIX, binlog_cache_size,
......
...@@ -684,7 +684,7 @@ class THD :public ilink, ...@@ -684,7 +684,7 @@ class THD :public ilink,
delayed_insert *di; delayed_insert *di;
my_bool tablespace_op; /* This is TRUE in DISCARD/IMPORT TABLESPACE */ my_bool tablespace_op; /* This is TRUE in DISCARD/IMPORT TABLESPACE */
struct st_transactions { struct st_transactions {
IO_CACHE trans_log; IO_CACHE trans_log; // Inited ONLY if binlog is open !
THD_TRANS all; // Trans since BEGIN WORK THD_TRANS all; // Trans since BEGIN WORK
THD_TRANS stmt; // Trans for current statement THD_TRANS stmt; // Trans for current statement
uint bdb_lock_count; uint bdb_lock_count;
......
...@@ -134,15 +134,10 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, ...@@ -134,15 +134,10 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
thd->lex->select_lex.table_list.first; thd->lex->select_lex.table_list.first;
DBUG_ENTER("mysql_insert"); DBUG_ENTER("mysql_insert");
#ifndef NO_EMBEDDED_ACCESS_CHECKS if (!(thd->options & OPTION_UPDATE_LOG))
if (thd->master_access & SUPER_ACL) log_on&= ~(int) DELAYED_LOG_UPDATE;
#endif if (!(thd->options & OPTION_BIN_LOG))
{ log_on&= ~(int) DELAYED_LOG_BIN;
if (!(thd->options & OPTION_UPDATE_LOG))
log_on&= ~(int) DELAYED_LOG_UPDATE;
if (!(thd->options & OPTION_BIN_LOG))
log_on&= ~(int) DELAYED_LOG_BIN;
}
/* /*
in safe mode or with skip-new change delayed insert to be regular in safe mode or with skip-new change delayed insert to be regular
if we are told to replace duplicates, the insert cannot be concurrent if we are told to replace duplicates, the insert cannot be concurrent
......
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