Commit b8847967 authored by unknown's avatar unknown

Merge sanja.is.com.ua:/home/bell/mysql/bk/mysql-4.0

into sanja.is.com.ua:/home/bell/mysql/bk/work-4.0

parents 43245198 ec8779e9
...@@ -1377,7 +1377,7 @@ trx_undo_prev_version_build( ...@@ -1377,7 +1377,7 @@ trx_undo_prev_version_build(
fields. Store the info to ext_vect: */ fields. Store the info to ext_vect: */
ext_vect = mem_alloc(sizeof(ulint) * rec_get_n_fields(rec)); ext_vect = mem_alloc(sizeof(ulint) * rec_get_n_fields(rec));
n_ext_vect = btr_push_update_extern_fields(ext_vect, rec, n_ext_vect = btr_push_update_extern_fields(ext_vect, rec,
update); update);
entry = row_rec_to_index_entry(ROW_COPY_DATA, index, rec, entry = row_rec_to_index_entry(ROW_COPY_DATA, index, rec,
heap); heap);
......
...@@ -3168,22 +3168,23 @@ void my_net_local_init(NET *net) ...@@ -3168,22 +3168,23 @@ void my_net_local_init(NET *net)
null byte. When mysql_hex_string() returns, the contents of "to" will null byte. When mysql_hex_string() returns, the contents of "to" will
be a null-terminated string. The return value is the length of the be a null-terminated string. The return value is the length of the
encoded string, not including the terminating null character. encoded string, not including the terminating null character.
The return value does not contain any leading 0x or a leading X' and
trailing '. The caller must supply whichever of those is desired.
*/ */
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++)
......
select @@innodb_table_locks;
@@innodb_table_locks
1
drop table if exists t1; drop table if exists t1;
set @@innodb_table_locks=1;
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;
...@@ -20,3 +24,33 @@ id x ...@@ -20,3 +24,33 @@ id x
0 2 0 2
commit; commit;
drop table t1; drop table t1;
set @@innodb_table_locks=0;
create table t1 (id integer primary key, x integer) engine=INNODB;
insert into t1 values(0, 0),(1,1),(2,2);
commit;
SELECT * from t1 where id = 0 FOR UPDATE;
id x
0 0
set autocommit=0;
set @@innodb_table_locks=0;
lock table t1 write;
update t1 set x=10 where id = 2;
SELECT * from t1 where id = 2;
id x
2 2
UPDATE t1 set x=3 where id = 2;
commit;
SELECT * from t1;
id x
0 0
1 1
2 3
commit;
unlock tables;
commit;
select * from t1;
id x
0 0
1 1
2 10
drop table t1;
-- source include/have_innodb.inc -- source include/have_innodb.inc
#
# Check and select innodb lock type
#
select @@innodb_table_locks;
#
# Testing of explicit table locks with enforced table locks
#
connect (con1,localhost,root,,); connect (con1,localhost,root,,);
connect (con2,localhost,root,,); connect (con2,localhost,root,,);
drop table if exists t1; drop table if exists t1;
# #
# Testing of explicit table locks # Testing of explicit table locks with enforced table locks
# #
set @@innodb_table_locks=1;
connection con1; connection con1;
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);
...@@ -38,3 +50,46 @@ select * from t1; ...@@ -38,3 +50,46 @@ select * from t1;
commit; commit;
drop table t1; drop table t1;
#
# Try with old lock method (where LOCK TABLE is ignored by InnoDB)
#
set @@innodb_table_locks=0;
create table t1 (id integer primary key, x integer) engine=INNODB;
insert into t1 values(0, 0),(1,1),(2,2);
commit;
SELECT * from t1 where id = 0 FOR UPDATE;
connection con2;
set autocommit=0;
set @@innodb_table_locks=0;
# The following statement should work becase innodb doesn't check table locks
lock table t1 write;
connection con1;
# This will be locked by MySQL
--send
update t1 set x=10 where id = 2;
--sleep 2
connection con2;
# Note that we will get a deadlock if we try to select any rows marked
# for update by con1 !
SELECT * from t1 where id = 2;
UPDATE t1 set x=3 where id = 2;
commit;
SELECT * from t1;
commit;
unlock tables;
connection con1;
reap;
commit;
select * from t1;
drop table t1;
...@@ -552,8 +552,14 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type) ...@@ -552,8 +552,14 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type)
!lock->write_wait.data && !lock->write_wait.data &&
lock->write.data->type == TL_WRITE_ALLOW_WRITE)) lock->write.data->type == TL_WRITE_ALLOW_WRITE))
{ {
/* We have already got a write lock or all locks are /*
TL_WRITE_ALLOW_WRITE */ We have already got a write lock or all locks are
TL_WRITE_ALLOW_WRITE
*/
DBUG_PRINT("info", ("write_wait.data: 0x%lx old_type: %d",
(ulong) lock->write_wait.data,
lock->write.data->type));
(*lock->write.last)=data; /* Add to running fifo */ (*lock->write.last)=data; /* Add to running fifo */
data->prev=lock->write.last; data->prev=lock->write.last;
lock->write.last= &data->next; lock->write.last= &data->next;
...@@ -568,6 +574,8 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type) ...@@ -568,6 +574,8 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type)
} }
else else
{ {
DBUG_PRINT("info", ("write_wait.data: 0x%lx",
(ulong) lock->write_wait.data));
if (!lock->write_wait.data) if (!lock->write_wait.data)
{ /* no scheduled write locks */ { /* no scheduled write locks */
if (lock_type == TL_WRITE_CONCURRENT_INSERT && if (lock_type == TL_WRITE_CONCURRENT_INSERT &&
......
...@@ -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,11 +3700,11 @@ struct my_option my_long_options[] = ...@@ -3700,11 +3700,11 @@ 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, 1, 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,
0, 0, 0, 0, 0}, 0, 0, 0, 0, 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},
......
...@@ -826,6 +826,7 @@ TABLE *open_table(THD *thd,const char *db,const char *table_name, ...@@ -826,6 +826,7 @@ TABLE *open_table(THD *thd,const char *db,const char *table_name,
DBUG_RETURN(0); DBUG_RETURN(0);
} }
table->query_id=thd->query_id; table->query_id=thd->query_id;
DBUG_PRINT("info",("Using temporary table"));
goto reset; goto reset;
} }
} }
...@@ -840,6 +841,7 @@ TABLE *open_table(THD *thd,const char *db,const char *table_name, ...@@ -840,6 +841,7 @@ TABLE *open_table(THD *thd,const char *db,const char *table_name,
table->query_id != thd->query_id) table->query_id != thd->query_id)
{ {
table->query_id=thd->query_id; table->query_id=thd->query_id;
DBUG_PRINT("info",("Using locked table"));
goto reset; goto reset;
} }
} }
......
...@@ -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