Automatic merge
This commit is contained in:
commit
4ab7a33e1e
@ -54,6 +54,7 @@
|
||||
/* Internal temp table, used for temporary results */
|
||||
#define HA_OPEN_INTERNAL_TABLE 512
|
||||
#define HA_OPEN_MERGE_TABLE 1024
|
||||
#define HA_OPEN_FOR_STATUS 2048
|
||||
|
||||
/* The following is parameter to ha_rkey() how to use key */
|
||||
|
||||
|
40
mysql-test/r/myisam-big.result
Normal file
40
mysql-test/r/myisam-big.result
Normal file
@ -0,0 +1,40 @@
|
||||
drop table if exists t1,t2;
|
||||
create table t1 (id int, sometext varchar(100)) engine=myisam;
|
||||
insert into t1 values (1, "hello"),(2, "hello2"),(4, "hello3"),(4, "hello4");
|
||||
create table t2 like t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
select count(*) from t1;
|
||||
count(*)
|
||||
131072
|
||||
alter table t1 add index (id), add index(sometext), add index(sometext,id);
|
||||
alter table t1 disable keys;
|
||||
alter table t1 enable keys;
|
||||
drop table t1,t2;
|
64
mysql-test/t/myisam-big.test
Normal file
64
mysql-test/t/myisam-big.test
Normal file
@ -0,0 +1,64 @@
|
||||
#
|
||||
# Test bugs in the MyISAM code that require more space/time
|
||||
--source include/big_test.inc
|
||||
|
||||
# Initialise
|
||||
--disable_warnings
|
||||
drop table if exists t1,t2;
|
||||
--enable_warnings
|
||||
|
||||
#
|
||||
# BUG#925377:
|
||||
# Querying myisam table metadata while 'alter table..enable keys' is
|
||||
# running may corrupt the table
|
||||
#
|
||||
create table t1 (id int, sometext varchar(100)) engine=myisam;
|
||||
insert into t1 values (1, "hello"),(2, "hello2"),(4, "hello3"),(4, "hello4");
|
||||
create table t2 like t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t2 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
select count(*) from t1;
|
||||
connect (con2,localhost,root,,);
|
||||
connection con2;
|
||||
alter table t1 add index (id), add index(sometext), add index(sometext,id);
|
||||
alter table t1 disable keys;
|
||||
send alter table t1 enable keys;
|
||||
connection default;
|
||||
--sleep 1
|
||||
--disable_query_log
|
||||
--disable_result_log
|
||||
show table status like 't1';
|
||||
--enable_query_log
|
||||
--enable_result_log
|
||||
connection con2;
|
||||
reap;
|
||||
disconnect con2;
|
||||
connection default;
|
||||
drop table t1,t2;
|
@ -2985,7 +2985,9 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
|
||||
}
|
||||
|
||||
error= open_unireg_entry(thd, table, table_list, alias, key, key_length,
|
||||
mem_root, (flags & OPEN_VIEW_NO_PARSE));
|
||||
mem_root,
|
||||
(flags & (OPEN_VIEW_NO_PARSE |
|
||||
MYSQL_LOCK_IGNORE_FLUSH)));
|
||||
if (error > 0)
|
||||
{
|
||||
my_free((uchar*)table, MYF(0));
|
||||
@ -4074,8 +4076,11 @@ retry:
|
||||
HA_GET_INDEX | HA_TRY_READ_ONLY),
|
||||
READ_KEYINFO | COMPUTE_TYPES | EXTRA_RECORD |
|
||||
(flags & OPEN_VIEW_NO_PARSE),
|
||||
thd->open_options, entry, table_list,
|
||||
mem_root);
|
||||
thd->open_options |
|
||||
(thd->version == 0 &&
|
||||
(flags & MYSQL_LOCK_IGNORE_FLUSH) ?
|
||||
HA_OPEN_FOR_STATUS : 0),
|
||||
entry, table_list, mem_root);
|
||||
if (error)
|
||||
goto err;
|
||||
/* TODO: Don't free this */
|
||||
@ -4113,7 +4118,11 @@ retry:
|
||||
HA_TRY_READ_ONLY),
|
||||
(READ_KEYINFO | COMPUTE_TYPES |
|
||||
EXTRA_RECORD),
|
||||
thd->open_options, entry, FALSE)))
|
||||
thd->open_options |
|
||||
(thd->version == 0 &&
|
||||
(flags & MYSQL_LOCK_IGNORE_FLUSH) ?
|
||||
HA_OPEN_FOR_STATUS : 0),
|
||||
entry, FALSE)))
|
||||
{
|
||||
if (error == 7) // Table def changed
|
||||
{
|
||||
|
@ -368,7 +368,7 @@ static inline void _ma_bitmap_mark_file_changed(MARIA_SHARE *share,
|
||||
if (flush_translog && share->now_transactional)
|
||||
(void) translog_flush(share->state.logrec_file_id);
|
||||
|
||||
_ma_mark_file_changed(share);
|
||||
_ma_mark_file_changed_now(share);
|
||||
pthread_mutex_lock(&share->bitmap.bitmap_lock);
|
||||
/* purecov: end */
|
||||
}
|
||||
|
@ -186,7 +186,7 @@ my_bool _ma_check_table_is_closed(const char *name, const char *where)
|
||||
MARIA_SHARE *share= info->s;
|
||||
if (!strcmp(share->unique_file_name.str, filename))
|
||||
{
|
||||
if (share->last_version)
|
||||
if (share->last_version > 1)
|
||||
{
|
||||
fprintf(stderr,"Warning: Table: %s is open on %s\n", name,where);
|
||||
DBUG_PRINT("warning",("Table: %s is open on %s", name,where));
|
||||
|
@ -62,7 +62,8 @@ MARIA_HA *_ma_test_if_reopen(const char *filename)
|
||||
{
|
||||
MARIA_HA *info=(MARIA_HA*) pos->data;
|
||||
MARIA_SHARE *share= info->s;
|
||||
if (!strcmp(share->unique_file_name.str,filename) && share->last_version)
|
||||
if (!strcmp(share->unique_file_name.str,filename) &&
|
||||
share->last_version > 1)
|
||||
return info;
|
||||
}
|
||||
return 0;
|
||||
@ -840,7 +841,12 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
|
||||
share->base.key_parts=key_parts;
|
||||
share->base.all_key_parts=key_parts+unique_key_parts;
|
||||
if (!(share->last_version=share->state.version))
|
||||
share->last_version=1; /* Safety */
|
||||
share->last_version= 2; /* Safety */
|
||||
if (open_flags & HA_OPEN_FOR_STATUS)
|
||||
{
|
||||
share->last_version= 1; /* Not reusable version */
|
||||
share->options|= HA_OPTION_READ_ONLY_DATA;
|
||||
}
|
||||
share->rec_reflength=share->base.rec_reflength; /* May be changed */
|
||||
share->base.margin_key_file_length=(share->base.max_key_file_length -
|
||||
(keys ? MARIA_INDEX_BLOCK_MARGIN *
|
||||
|
@ -665,11 +665,13 @@ prototype_redo_exec_hook_dummy(INCOMPLETE_GROUP)
|
||||
prototype_redo_exec_hook(INCOMPLETE_LOG)
|
||||
{
|
||||
MARIA_HA *info;
|
||||
|
||||
if (skip_DDLs)
|
||||
{
|
||||
tprint(tracef, "we skip DDLs\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((info= get_MARIA_HA_from_REDO_record(rec)) == NULL)
|
||||
{
|
||||
/* no such table, don't need to warn */
|
||||
@ -1479,7 +1481,13 @@ end:
|
||||
if (error)
|
||||
{
|
||||
if (info != NULL)
|
||||
{
|
||||
/* let maria_close() mark the table properly closed */
|
||||
info->s->state.open_count= 1;
|
||||
info->s->global_changed= 1;
|
||||
info->s->changed= 1;
|
||||
maria_close(info);
|
||||
}
|
||||
if (error == -1)
|
||||
error= 0;
|
||||
}
|
||||
|
@ -643,7 +643,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||
NOTE: The filename is compared against unique_file_name of every
|
||||
open table. Hence we need a real path here.
|
||||
*/
|
||||
if (test_if_reopen(filename))
|
||||
if (test_if_reopen(filename, 1))
|
||||
{
|
||||
my_printf_error(0, "MyISAM table '%s' is in use "
|
||||
"(most likely by a MERGE table). Try FLUSH TABLES.",
|
||||
|
@ -183,7 +183,7 @@ my_bool check_table_is_closed(const char *name, const char *where)
|
||||
MYISAM_SHARE *share=info->s;
|
||||
if (!strcmp(share->unique_file_name,filename))
|
||||
{
|
||||
if (share->last_version)
|
||||
if (share->last_version > 1)
|
||||
{
|
||||
fprintf(stderr,"Warning: Table: %s is open on %s\n", name,where);
|
||||
DBUG_PRINT("warning",("Table: %s is open on %s", name,where));
|
||||
|
@ -52,7 +52,8 @@ if (pos > end_pos) \
|
||||
** In MySQL the server will handle version issues.
|
||||
******************************************************************************/
|
||||
|
||||
MI_INFO *test_if_reopen(char *filename)
|
||||
MI_INFO *test_if_reopen(char *filename,
|
||||
my_bool ignore_last_version __attribute__((unused)))
|
||||
{
|
||||
LIST *pos;
|
||||
|
||||
@ -61,8 +62,8 @@ MI_INFO *test_if_reopen(char *filename)
|
||||
MI_INFO *info=(MI_INFO*) pos->data;
|
||||
MYISAM_SHARE *share=info->s;
|
||||
DBUG_ASSERT(strcmp(share->unique_file_name,filename) ||
|
||||
share->last_version);
|
||||
if (!strcmp(share->unique_file_name,filename) && share->last_version)
|
||||
share->last_version > 1 || ignore_last_version);
|
||||
if (!strcmp(share->unique_file_name,filename) && share->last_version > 1)
|
||||
return info;
|
||||
}
|
||||
return 0;
|
||||
@ -109,7 +110,8 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&THR_LOCK_myisam);
|
||||
if (!(old_info=test_if_reopen(name_buff)))
|
||||
if (!(old_info=test_if_reopen(name_buff,
|
||||
test(open_flags & HA_OPEN_FOR_STATUS))))
|
||||
{
|
||||
share= &share_buff;
|
||||
bzero((uchar*) &share_buff,sizeof(share_buff));
|
||||
@ -511,7 +513,12 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
|
||||
share->base.key_parts=key_parts;
|
||||
share->base.all_key_parts=key_parts+unique_key_parts;
|
||||
if (!(share->last_version=share->state.version))
|
||||
share->last_version=1; /* Safety */
|
||||
share->last_version= 2; /* Safety */
|
||||
if (open_flags & HA_OPEN_FOR_STATUS)
|
||||
{
|
||||
share->last_version= 1; /* Not reusable version */
|
||||
share->options|= HA_OPTION_READ_ONLY_DATA;
|
||||
}
|
||||
share->rec_reflength=share->base.rec_reflength; /* May be changed */
|
||||
share->base.margin_key_file_length=(share->base.max_key_file_length -
|
||||
(keys ? MI_INDEX_BLOCK_MARGIN *
|
||||
|
@ -726,7 +726,7 @@ my_bool mi_check_status(void *param);
|
||||
void mi_fix_status(MI_INFO *org_table, MI_INFO *new_table);
|
||||
void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows);
|
||||
|
||||
extern MI_INFO *test_if_reopen(char *filename);
|
||||
extern MI_INFO *test_if_reopen(char *filename, my_bool ignore_last_version);
|
||||
my_bool check_table_is_closed(const char *name, const char *where);
|
||||
int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share, const char *orn_name,
|
||||
File file_to_dup);
|
||||
|
Loading…
x
Reference in New Issue
Block a user