Commit ed8ec2cf authored by unknown's avatar unknown

Code cleanups (done during review of new code)

Rename innodb_table_locks_old_behavior -> innodb_table_locks
Set innodb_table_locks to off by default to get same behaviour as in MySQL 4.0.20
(This means that Innodb ignore table locks by default, which makes it easier to combine MyISAM and InnoDB to simulate a transaction)


libmysql/libmysql.c:
  Use ulong instead of unsigned long
  Reuse _dig_vec()
myisam/myisampack.c:
  Simplify code
mysql-test/r/innodb-lock.result:
  new test case
mysql-test/t/innodb-lock.test:
  new test case
sql/ha_innodb.cc:
  Rename innodb_table_locks_old_behavior -> innodb_table_locks
sql/mysqld.cc:
  Rename innodb_table_locks_old_behavior -> innodb_table_locks
  Set this off by default to get same behaviour as in MySQL 4.0.20
sql/set_var.cc:
  Rename innodb_table_locks_old_behavior -> innodb_table_locks
sql/sql_class.h:
  Rename innodb_table_locks_old_behavior -> innodb_table_locks
parent 2428fb5c
...@@ -3170,20 +3170,18 @@ void my_net_local_init(NET *net) ...@@ -3170,20 +3170,18 @@ void my_net_local_init(NET *net)
encoded string, not including the terminating null character. encoded string, not including the terminating null character.
*/ */
unsigned long ulong mysql_hex_string(char *to, const char *from, ulong length)
mysql_hex_string(char *to, const char *from, unsigned long length)
{ {
char *to0= to; char *to0= to;
const char *end; const char *end;
static char hex[]= "0123456789ABCDEF";
for (end= from + length; from < end; from++) for (end= from + length; from < end; from++)
{ {
*to++= hex[((unsigned char) *from) >> 4]; *to++= _dig_vec[((unsigned char) *from) >> 4];
*to++= hex[((unsigned char) *from) & 0x0F]; *to++= _dig_vec[((unsigned char) *from) & 0x0F];
} }
*to= '\0'; *to= '\0';
return to-to0; return (ulong) (to-to0);
} }
/* /*
......
...@@ -418,14 +418,12 @@ static bool open_isam_files(PACK_MRG_INFO *mrg,char **names,uint count) ...@@ -418,14 +418,12 @@ static bool open_isam_files(PACK_MRG_INFO *mrg,char **names,uint count)
mrg->src_file_has_indexes_disabled= 0; mrg->src_file_has_indexes_disabled= 0;
for (i=0; i < count ; i++) for (i=0; i < count ; i++)
{ {
if ((mrg->file[i]=open_isam_file(names[i],O_RDONLY))) if (!(mrg->file[i]=open_isam_file(names[i],O_RDONLY)))
{
mrg->src_file_has_indexes_disabled |=
(mrg->file[i]->s->state.key_map !=
(1ULL << mrg->file[i]->s->base.keys) - 1);
}
else
goto error; goto error;
mrg->src_file_has_indexes_disabled|= ((mrg->file[i]->s->state.key_map !=
(((ulonglong) 1) <<
mrg->file[i]->s->base. keys) - 1));
} }
/* Check that files are identical */ /* Check that files are identical */
for (j=0 ; j < count-1 ; j++) for (j=0 ; j < count-1 ; j++)
......
drop table if exists t1; drop table if exists t1;
select @@innodb_table_locks;
@@innodb_table_locks
0
set @@innodb_table_locks=1;
create table t1 (id integer, x integer) engine=INNODB;
insert into t1 values(0, 0);
set autocommit=0;
SELECT * from t1 where id = 0 FOR UPDATE;
id x
0 0
set autocommit=0;
lock table t1 write;
update t1 set x=1 where id = 0;
select * from t1;
id x
0 1
commit;
update t1 set x=2 where id = 0;
commit;
unlock tables;
select * from t1;
id x
0 2
commit;
drop table t1;
set @@innodb_table_locks=0;
create table t1 (id integer, x integer) engine=INNODB; create table t1 (id integer, x integer) engine=INNODB;
insert into t1 values(0, 0); insert into t1 values(0, 0);
set autocommit=0; set autocommit=0;
......
...@@ -5,10 +5,54 @@ connect (con2,localhost,root,,); ...@@ -5,10 +5,54 @@ connect (con2,localhost,root,,);
drop table if exists t1; drop table if exists t1;
# #
# Testing of explicit table locks # Check and select innodb lock type
# #
select @@innodb_table_locks;
#
# Testing of explicit table locks with enforced table locks
#
set @@innodb_table_locks=1;
connection con1;
create table t1 (id integer, x integer) engine=INNODB;
insert into t1 values(0, 0);
set autocommit=0;
SELECT * from t1 where id = 0 FOR UPDATE;
connection con2;
set autocommit=0;
# The following statement should hang because con1 is locking the page
--send
lock table t1 write;
--sleep 2;
connection con1; connection con1;
update t1 set x=1 where id = 0;
select * from t1;
commit;
connection con2;
reap;
update t1 set x=2 where id = 0;
commit;
unlock tables;
connection con1;
select * from t1;
commit;
drop table t1;
#
# Try with old lock method (where LOCK TABLE is ignored)
#
set @@innodb_table_locks=0;
create table t1 (id integer, x integer) engine=INNODB; create table t1 (id integer, x integer) engine=INNODB;
insert into t1 values(0, 0); insert into t1 values(0, 0);
set autocommit=0; set autocommit=0;
......
...@@ -4694,7 +4694,7 @@ ha_innobase::external_lock( ...@@ -4694,7 +4694,7 @@ ha_innobase::external_lock(
if (prebuilt->select_lock_type != LOCK_NONE) { if (prebuilt->select_lock_type != LOCK_NONE) {
if (thd->in_lock_tables && if (thd->in_lock_tables &&
!thd->variables.innodb_table_locks_old_behavior) { thd->variables.innodb_table_locks) {
ulint error; ulint error;
error = row_lock_table_for_mysql(prebuilt); error = row_lock_table_for_mysql(prebuilt);
......
...@@ -3526,7 +3526,7 @@ enum options_mysqld { ...@@ -3526,7 +3526,7 @@ enum options_mysqld {
OPT_INNODB_FORCE_RECOVERY, OPT_INNODB_FORCE_RECOVERY,
OPT_INNODB_STATUS_FILE, OPT_INNODB_STATUS_FILE,
OPT_INNODB_MAX_DIRTY_PAGES_PCT, OPT_INNODB_MAX_DIRTY_PAGES_PCT,
OPT_INNODB_TABLE_LOCKS_OLD_BEHAVIOR, OPT_INNODB_TABLE_LOCKS,
OPT_BDB_CACHE_SIZE, OPT_BDB_CACHE_SIZE,
OPT_BDB_LOG_BUFFER_SIZE, OPT_BDB_LOG_BUFFER_SIZE,
OPT_BDB_MAX_LOCK, OPT_BDB_MAX_LOCK,
...@@ -3700,10 +3700,10 @@ struct my_option my_long_options[] = ...@@ -3700,10 +3700,10 @@ struct my_option my_long_options[] =
{"innodb_max_dirty_pages_pct", OPT_INNODB_MAX_DIRTY_PAGES_PCT, {"innodb_max_dirty_pages_pct", OPT_INNODB_MAX_DIRTY_PAGES_PCT,
"Percentage of dirty pages allowed in bufferpool", (gptr*) &srv_max_buf_pool_modified_pct, "Percentage of dirty pages allowed in bufferpool", (gptr*) &srv_max_buf_pool_modified_pct,
(gptr*) &srv_max_buf_pool_modified_pct, 0, GET_ULONG, REQUIRED_ARG, 90, 0, 100, 0, 0, 0}, (gptr*) &srv_max_buf_pool_modified_pct, 0, GET_ULONG, REQUIRED_ARG, 90, 0, 100, 0, 0, 0},
{"innodb_table_locks_old_behavior", OPT_INNODB_TABLE_LOCKS_OLD_BEHAVIOR, {"innodb_table_locks", OPT_INNODB_TABLE_LOCKS,
"Disable InnoDB locking in LOCK TABLES", "If Innodb should enforce LOCK TABLE",
(gptr*) &global_system_variables.innodb_table_locks_old_behavior, (gptr*) &global_system_variables.innodb_table_locks,
(gptr*) &global_system_variables.innodb_table_locks_old_behavior, (gptr*) &global_system_variables.innodb_table_locks,
0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0}, 0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0},
#endif /* End HAVE_INNOBASE_DB */ #endif /* End HAVE_INNOBASE_DB */
{"help", '?', "Display this help and exit", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, {"help", '?', "Display this help and exit", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
......
...@@ -263,8 +263,8 @@ sys_var_thd_ulong sys_net_wait_timeout("wait_timeout", ...@@ -263,8 +263,8 @@ sys_var_thd_ulong sys_net_wait_timeout("wait_timeout",
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
sys_var_long_ptr sys_innodb_max_dirty_pages_pct("innodb_max_dirty_pages_pct", sys_var_long_ptr sys_innodb_max_dirty_pages_pct("innodb_max_dirty_pages_pct",
&srv_max_buf_pool_modified_pct); &srv_max_buf_pool_modified_pct);
sys_var_thd_bool sys_innodb_table_locks_old_behavior("innodb_table_locks_old_behavior", sys_var_thd_bool sys_innodb_table_locks("innodb_table_locks",
&SV::innodb_table_locks_old_behavior); &SV::innodb_table_locks);
#endif #endif
...@@ -451,7 +451,7 @@ sys_var *sys_variables[]= ...@@ -451,7 +451,7 @@ sys_var *sys_variables[]=
&sys_os, &sys_os,
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
&sys_innodb_max_dirty_pages_pct, &sys_innodb_max_dirty_pages_pct,
&sys_innodb_table_locks_old_behavior, &sys_innodb_table_locks,
#endif #endif
&sys_unique_checks &sys_unique_checks
}; };
...@@ -523,7 +523,7 @@ struct show_var_st init_vars[]= { ...@@ -523,7 +523,7 @@ struct show_var_st init_vars[]= {
{"innodb_log_group_home_dir", (char*) &innobase_log_group_home_dir, SHOW_CHAR_PTR}, {"innodb_log_group_home_dir", (char*) &innobase_log_group_home_dir, SHOW_CHAR_PTR},
{"innodb_mirrored_log_groups", (char*) &innobase_mirrored_log_groups, SHOW_LONG}, {"innodb_mirrored_log_groups", (char*) &innobase_mirrored_log_groups, SHOW_LONG},
{sys_innodb_max_dirty_pages_pct.name, (char*) &sys_innodb_max_dirty_pages_pct, SHOW_SYS}, {sys_innodb_max_dirty_pages_pct.name, (char*) &sys_innodb_max_dirty_pages_pct, SHOW_SYS},
{sys_innodb_table_locks_old_behavior.name, (char*) &sys_innodb_table_locks_old_behavior, SHOW_SYS}, {sys_innodb_table_locks.name, (char*) &sys_innodb_table_locks, SHOW_SYS},
#endif #endif
{sys_interactive_timeout.name,(char*) &sys_interactive_timeout, SHOW_SYS}, {sys_interactive_timeout.name,(char*) &sys_interactive_timeout, SHOW_SYS},
{sys_join_buffer_size.name, (char*) &sys_join_buffer_size, SHOW_SYS}, {sys_join_buffer_size.name, (char*) &sys_join_buffer_size, SHOW_SYS},
......
...@@ -339,7 +339,7 @@ struct system_variables ...@@ -339,7 +339,7 @@ struct system_variables
my_bool new_mode; my_bool new_mode;
my_bool query_cache_wlock_invalidate; my_bool query_cache_wlock_invalidate;
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
my_bool innodb_table_locks_old_behavior; my_bool innodb_table_locks;
#endif /* HAVE_INNOBASE_DB */ #endif /* HAVE_INNOBASE_DB */
CONVERT *convert_set; CONVERT *convert_set;
......
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