mirror of
https://github.com/MariaDB/server.git
synced 2025-07-21 21:22:27 +03:00
Merge bk-internal.mysql.com:/home/bk/mysql-5.1
into chilla.local:/home/mydev/mysql-5.1-axmrg BitKeeper/deleted/.del-CMakeLists.txt~1: Auto merged BitKeeper/deleted/.del-make_win_bin_dist: Auto merged configure.in: Auto merged include/mysql.h: Auto merged libmysqld/lib_sql.cc: Auto merged sql/sql_insert.cc: Auto merged sql/sql_plugin.cc: Auto merged
This commit is contained in:
@ -1757,4 +1757,49 @@ create table t1 (a int not null, key key_block_size=1024 (a));
|
|||||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=1024 (a))' at line 1
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=1024 (a))' at line 1
|
||||||
create table t1 (a int not null, key `a` key_block_size=1024 (a));
|
create table t1 (a int not null, key `a` key_block_size=1024 (a));
|
||||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key_block_size=1024 (a))' at line 1
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key_block_size=1024 (a))' at line 1
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
c1 INT,
|
||||||
|
c2 VARCHAR(300),
|
||||||
|
KEY (c1) KEY_BLOCK_SIZE 1024,
|
||||||
|
KEY (c2) KEY_BLOCK_SIZE 8192
|
||||||
|
);
|
||||||
|
INSERT INTO t1 VALUES (10, REPEAT('a', CEIL(RAND(10) * 300))),
|
||||||
|
(11, REPEAT('b', CEIL(RAND() * 300))),
|
||||||
|
(12, REPEAT('c', CEIL(RAND() * 300))),
|
||||||
|
(13, REPEAT('d', CEIL(RAND() * 300))),
|
||||||
|
(14, REPEAT('e', CEIL(RAND() * 300))),
|
||||||
|
(15, REPEAT('f', CEIL(RAND() * 300))),
|
||||||
|
(16, REPEAT('g', CEIL(RAND() * 300))),
|
||||||
|
(17, REPEAT('h', CEIL(RAND() * 300))),
|
||||||
|
(18, REPEAT('i', CEIL(RAND() * 300))),
|
||||||
|
(19, REPEAT('j', CEIL(RAND() * 300))),
|
||||||
|
(20, REPEAT('k', CEIL(RAND() * 300))),
|
||||||
|
(21, REPEAT('l', CEIL(RAND() * 300))),
|
||||||
|
(22, REPEAT('m', CEIL(RAND() * 300))),
|
||||||
|
(23, REPEAT('n', CEIL(RAND() * 300))),
|
||||||
|
(24, REPEAT('o', CEIL(RAND() * 300))),
|
||||||
|
(25, REPEAT('p', CEIL(RAND() * 300))),
|
||||||
|
(26, REPEAT('q', CEIL(RAND() * 300))),
|
||||||
|
(27, REPEAT('r', CEIL(RAND() * 300))),
|
||||||
|
(28, REPEAT('s', CEIL(RAND() * 300))),
|
||||||
|
(29, REPEAT('t', CEIL(RAND() * 300))),
|
||||||
|
(30, REPEAT('u', CEIL(RAND() * 300))),
|
||||||
|
(31, REPEAT('v', CEIL(RAND() * 300))),
|
||||||
|
(32, REPEAT('w', CEIL(RAND() * 300))),
|
||||||
|
(33, REPEAT('x', CEIL(RAND() * 300))),
|
||||||
|
(34, REPEAT('y', CEIL(RAND() * 300))),
|
||||||
|
(35, REPEAT('z', CEIL(RAND() * 300)));
|
||||||
|
INSERT INTO t1 SELECT * FROM t1;
|
||||||
|
INSERT INTO t1 SELECT * FROM t1;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
REPAIR TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 repair status OK
|
||||||
|
DELETE FROM t1 WHERE c1 >= 10;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
DROP TABLE t1;
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
@ -1054,4 +1054,47 @@ create table t1 (a int not null, key key_block_size=1024 (a));
|
|||||||
--error 1064
|
--error 1064
|
||||||
create table t1 (a int not null, key `a` key_block_size=1024 (a));
|
create table t1 (a int not null, key `a` key_block_size=1024 (a));
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#22119 - Changing MI_KEY_BLOCK_LENGTH makes a wrong myisamchk
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
c1 INT,
|
||||||
|
c2 VARCHAR(300),
|
||||||
|
KEY (c1) KEY_BLOCK_SIZE 1024,
|
||||||
|
KEY (c2) KEY_BLOCK_SIZE 8192
|
||||||
|
);
|
||||||
|
INSERT INTO t1 VALUES (10, REPEAT('a', CEIL(RAND(10) * 300))),
|
||||||
|
(11, REPEAT('b', CEIL(RAND() * 300))),
|
||||||
|
(12, REPEAT('c', CEIL(RAND() * 300))),
|
||||||
|
(13, REPEAT('d', CEIL(RAND() * 300))),
|
||||||
|
(14, REPEAT('e', CEIL(RAND() * 300))),
|
||||||
|
(15, REPEAT('f', CEIL(RAND() * 300))),
|
||||||
|
(16, REPEAT('g', CEIL(RAND() * 300))),
|
||||||
|
(17, REPEAT('h', CEIL(RAND() * 300))),
|
||||||
|
(18, REPEAT('i', CEIL(RAND() * 300))),
|
||||||
|
(19, REPEAT('j', CEIL(RAND() * 300))),
|
||||||
|
(20, REPEAT('k', CEIL(RAND() * 300))),
|
||||||
|
(21, REPEAT('l', CEIL(RAND() * 300))),
|
||||||
|
(22, REPEAT('m', CEIL(RAND() * 300))),
|
||||||
|
(23, REPEAT('n', CEIL(RAND() * 300))),
|
||||||
|
(24, REPEAT('o', CEIL(RAND() * 300))),
|
||||||
|
(25, REPEAT('p', CEIL(RAND() * 300))),
|
||||||
|
(26, REPEAT('q', CEIL(RAND() * 300))),
|
||||||
|
(27, REPEAT('r', CEIL(RAND() * 300))),
|
||||||
|
(28, REPEAT('s', CEIL(RAND() * 300))),
|
||||||
|
(29, REPEAT('t', CEIL(RAND() * 300))),
|
||||||
|
(30, REPEAT('u', CEIL(RAND() * 300))),
|
||||||
|
(31, REPEAT('v', CEIL(RAND() * 300))),
|
||||||
|
(32, REPEAT('w', CEIL(RAND() * 300))),
|
||||||
|
(33, REPEAT('x', CEIL(RAND() * 300))),
|
||||||
|
(34, REPEAT('y', CEIL(RAND() * 300))),
|
||||||
|
(35, REPEAT('z', CEIL(RAND() * 300)));
|
||||||
|
INSERT INTO t1 SELECT * FROM t1;
|
||||||
|
INSERT INTO t1 SELECT * FROM t1;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
REPAIR TABLE t1;
|
||||||
|
DELETE FROM t1 WHERE c1 >= 10;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
@ -1808,8 +1808,6 @@ void kill_delayed_threads(void)
|
|||||||
delayed_insert *tmp;
|
delayed_insert *tmp;
|
||||||
while ((tmp=it++))
|
while ((tmp=it++))
|
||||||
{
|
{
|
||||||
/* Ensure that the thread doesn't kill itself while we are looking at it */
|
|
||||||
pthread_mutex_lock(&tmp->mutex);
|
|
||||||
tmp->thd.killed= THD::KILL_CONNECTION;
|
tmp->thd.killed= THD::KILL_CONNECTION;
|
||||||
if (tmp->thd.mysys_var)
|
if (tmp->thd.mysys_var)
|
||||||
{
|
{
|
||||||
@ -1828,7 +1826,6 @@ void kill_delayed_threads(void)
|
|||||||
}
|
}
|
||||||
pthread_mutex_unlock(&tmp->thd.mysys_var->mutex);
|
pthread_mutex_unlock(&tmp->thd.mysys_var->mutex);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&tmp->mutex);
|
|
||||||
}
|
}
|
||||||
VOID(pthread_mutex_unlock(&LOCK_delayed_insert)); // For unlink from list
|
VOID(pthread_mutex_unlock(&LOCK_delayed_insert)); // For unlink from list
|
||||||
}
|
}
|
||||||
|
@ -944,29 +944,28 @@ my_bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func,
|
|||||||
state_mask= ~state_mask; // do it only once
|
state_mask= ~state_mask; // do it only once
|
||||||
|
|
||||||
rw_rdlock(&THR_LOCK_plugin);
|
rw_rdlock(&THR_LOCK_plugin);
|
||||||
|
total= type == MYSQL_ANY_PLUGIN ? plugin_array.elements
|
||||||
|
: plugin_hash[type].records;
|
||||||
|
/*
|
||||||
|
Do the alloca out here in case we do have a working alloca:
|
||||||
|
leaving the nested stack frame invalidates alloca allocation.
|
||||||
|
*/
|
||||||
|
plugins=(struct st_plugin_int **)my_alloca(total*sizeof(*plugins));
|
||||||
if (type == MYSQL_ANY_PLUGIN)
|
if (type == MYSQL_ANY_PLUGIN)
|
||||||
{
|
{
|
||||||
total=plugin_array.elements;
|
|
||||||
plugins=(struct st_plugin_int **)my_alloca(total*sizeof(*plugins));
|
|
||||||
for (idx= 0; idx < total; idx++)
|
for (idx= 0; idx < total; idx++)
|
||||||
{
|
{
|
||||||
plugin= dynamic_element(&plugin_array, idx, struct st_plugin_int *);
|
plugin= dynamic_element(&plugin_array, idx, struct st_plugin_int *);
|
||||||
if (plugin->state & state_mask)
|
plugins[idx]= !(plugin->state & state_mask) ? plugin : NULL;
|
||||||
continue;
|
|
||||||
plugins[idx]= plugin;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HASH *hash= &plugin_hash[type];
|
HASH *hash= plugin_hash + type;
|
||||||
total=hash->records;
|
|
||||||
plugins=(struct st_plugin_int **)my_alloca(total*sizeof(*plugins));
|
|
||||||
for (idx= 0; idx < total; idx++)
|
for (idx= 0; idx < total; idx++)
|
||||||
{
|
{
|
||||||
plugin= (struct st_plugin_int *) hash_element(hash, idx);
|
plugin= (struct st_plugin_int *) hash_element(hash, idx);
|
||||||
if (plugin->state & state_mask)
|
plugins[idx]= !(plugin->state & state_mask) ? plugin : NULL;
|
||||||
continue;
|
|
||||||
plugins[idx]= plugin;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rw_unlock(&THR_LOCK_plugin);
|
rw_unlock(&THR_LOCK_plugin);
|
||||||
|
@ -251,11 +251,12 @@ static int check_k_link(MI_CHECK *param, register MI_INFO *info, uint nr)
|
|||||||
my_off_t next_link;
|
my_off_t next_link;
|
||||||
uint block_size=(nr+1)*MI_MIN_KEY_BLOCK_LENGTH;
|
uint block_size=(nr+1)*MI_MIN_KEY_BLOCK_LENGTH;
|
||||||
ha_rows records;
|
ha_rows records;
|
||||||
char llbuff[21],*buff;
|
char llbuff[21], llbuff2[21], *buff;
|
||||||
DBUG_ENTER("check_k_link");
|
DBUG_ENTER("check_k_link");
|
||||||
|
DBUG_PRINT("enter", ("block_size: %u", block_size));
|
||||||
|
|
||||||
if (param->testflag & T_VERBOSE)
|
if (param->testflag & T_VERBOSE)
|
||||||
printf("block_size %4d:",block_size);
|
printf("block_size %4u:", block_size); /* purecov: tested */
|
||||||
|
|
||||||
next_link=info->s->state.key_del[nr];
|
next_link=info->s->state.key_del[nr];
|
||||||
records= (ha_rows) (info->state->key_file_length / block_size);
|
records= (ha_rows) (info->state->key_file_length / block_size);
|
||||||
@ -265,14 +266,46 @@ static int check_k_link(MI_CHECK *param, register MI_INFO *info, uint nr)
|
|||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
if (param->testflag & T_VERBOSE)
|
if (param->testflag & T_VERBOSE)
|
||||||
printf("%16s",llstr(next_link,llbuff));
|
printf("%16s",llstr(next_link,llbuff));
|
||||||
if (next_link > info->state->key_file_length ||
|
|
||||||
next_link & (info->s->blocksize-1))
|
/* Key blocks must lay within the key file length entirely. */
|
||||||
|
if (next_link + block_size > info->state->key_file_length)
|
||||||
|
{
|
||||||
|
/* purecov: begin tested */
|
||||||
|
mi_check_print_error(param, "Invalid key block position: %s "
|
||||||
|
"key block size: %u file_length: %s",
|
||||||
|
llstr(next_link, llbuff), block_size,
|
||||||
|
llstr(info->state->key_file_length, llbuff2));
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
/* purecov: end */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Key blocks must be aligned at MI_MIN_KEY_BLOCK_LENGTH. */
|
||||||
|
if (next_link & (MI_MIN_KEY_BLOCK_LENGTH - 1))
|
||||||
|
{
|
||||||
|
/* purecov: begin tested */
|
||||||
|
mi_check_print_error(param, "Mis-aligned key block: %s "
|
||||||
|
"minimum key block length: %u",
|
||||||
|
llstr(next_link, llbuff), MI_MIN_KEY_BLOCK_LENGTH);
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
/* purecov: end */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Read the key block with MI_MIN_KEY_BLOCK_LENGTH to find next link.
|
||||||
|
If the key cache block size is smaller than block_size, we can so
|
||||||
|
avoid unecessary eviction of cache block.
|
||||||
|
*/
|
||||||
if (!(buff=key_cache_read(info->s->key_cache,
|
if (!(buff=key_cache_read(info->s->key_cache,
|
||||||
info->s->kfile, next_link, DFLT_INIT_HITS,
|
info->s->kfile, next_link, DFLT_INIT_HITS,
|
||||||
(byte*) info->buff,
|
(byte*) info->buff, MI_MIN_KEY_BLOCK_LENGTH,
|
||||||
myisam_block_size, block_size, 1)))
|
MI_MIN_KEY_BLOCK_LENGTH, 1)))
|
||||||
|
{
|
||||||
|
/* purecov: begin tested */
|
||||||
|
mi_check_print_error(param, "key cache read error for block: %s",
|
||||||
|
llstr(next_link,llbuff));
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
/* purecov: end */
|
||||||
|
}
|
||||||
next_link=mi_sizekorr(buff);
|
next_link=mi_sizekorr(buff);
|
||||||
records--;
|
records--;
|
||||||
param->key_file_blocks+=block_size;
|
param->key_file_blocks+=block_size;
|
||||||
@ -556,17 +589,37 @@ static int chk_index_down(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
|
|||||||
ha_checksum *key_checksum, uint level)
|
ha_checksum *key_checksum, uint level)
|
||||||
{
|
{
|
||||||
char llbuff[22],llbuff2[22];
|
char llbuff[22],llbuff2[22];
|
||||||
if (page > info->state->key_file_length || (page & (info->s->blocksize -1)))
|
DBUG_ENTER("chk_index_down");
|
||||||
{
|
|
||||||
my_off_t max_length=my_seek(info->s->kfile,0L,MY_SEEK_END,MYF(0));
|
|
||||||
mi_check_print_error(param,"Wrong pagepointer: %s at page: %s",
|
|
||||||
llstr(page,llbuff),llstr(page,llbuff2));
|
|
||||||
|
|
||||||
if (page+info->s->blocksize > max_length)
|
/* Key blocks must lay within the key file length entirely. */
|
||||||
|
if (page + keyinfo->block_length > info->state->key_file_length)
|
||||||
|
{
|
||||||
|
/* purecov: begin tested */
|
||||||
|
/* Give it a chance to fit in the real file size. */
|
||||||
|
my_off_t max_length= my_seek(info->s->kfile, 0L, MY_SEEK_END, MYF(0));
|
||||||
|
mi_check_print_error(param, "Invalid key block position: %s "
|
||||||
|
"key block size: %u file_length: %s",
|
||||||
|
llstr(page, llbuff), keyinfo->block_length,
|
||||||
|
llstr(info->state->key_file_length, llbuff2));
|
||||||
|
if (page + keyinfo->block_length > max_length)
|
||||||
goto err;
|
goto err;
|
||||||
info->state->key_file_length=(max_length &
|
/* Fix the remebered key file length. */
|
||||||
~ (my_off_t) (info->s->blocksize-1));
|
info->state->key_file_length= (max_length &
|
||||||
|
~ (my_off_t) (keyinfo->block_length - 1));
|
||||||
|
/* purecov: end */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Key blocks must be aligned at MI_MIN_KEY_BLOCK_LENGTH. */
|
||||||
|
if (page & (MI_MIN_KEY_BLOCK_LENGTH - 1))
|
||||||
|
{
|
||||||
|
/* purecov: begin tested */
|
||||||
|
mi_check_print_error(param, "Mis-aligned key block: %s "
|
||||||
|
"minimum key block length: %u",
|
||||||
|
llstr(page, llbuff), MI_MIN_KEY_BLOCK_LENGTH);
|
||||||
|
goto err;
|
||||||
|
/* purecov: end */
|
||||||
|
}
|
||||||
|
|
||||||
if (!_mi_fetch_keypage(info,keyinfo,page, DFLT_INIT_HITS,buff,0))
|
if (!_mi_fetch_keypage(info,keyinfo,page, DFLT_INIT_HITS,buff,0))
|
||||||
{
|
{
|
||||||
mi_check_print_error(param,"Can't read key from filepos: %s",
|
mi_check_print_error(param,"Can't read key from filepos: %s",
|
||||||
@ -577,9 +630,12 @@ static int chk_index_down(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
|
|||||||
if (chk_index(param,info,keyinfo,page,buff,keys,key_checksum,level))
|
if (chk_index(param,info,keyinfo,page,buff,keys,key_checksum,level))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
return 0;
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
|
/* purecov: begin tested */
|
||||||
err:
|
err:
|
||||||
return 1;
|
DBUG_RETURN(1);
|
||||||
|
/* purecov: end */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1203,9 +1203,11 @@ ulong _mi_rec_unpack(register MI_INFO *info, register byte *to, byte *from,
|
|||||||
{
|
{
|
||||||
uint size_length=rec_length- mi_portable_sizeof_char_ptr;
|
uint size_length=rec_length- mi_portable_sizeof_char_ptr;
|
||||||
ulong blob_length=_mi_calc_blob_length(size_length,from);
|
ulong blob_length=_mi_calc_blob_length(size_length,from);
|
||||||
if ((ulong) (from_end-from) - size_length < blob_length ||
|
ulong from_left= (ulong) (from_end - from);
|
||||||
min_pack_length > (uint) (from_end -(from+size_length+blob_length)))
|
if (from_left < size_length ||
|
||||||
goto err;
|
from_left - size_length < blob_length ||
|
||||||
|
from_left - size_length - blob_length < min_pack_length)
|
||||||
|
goto err;
|
||||||
memcpy((byte*) to,(byte*) from,(size_t) size_length);
|
memcpy((byte*) to,(byte*) from,(size_t) size_length);
|
||||||
from+=size_length;
|
from+=size_length;
|
||||||
memcpy_fixed((byte*) to+size_length,(byte*) &from,sizeof(char*));
|
memcpy_fixed((byte*) to+size_length,(byte*) &from,sizeof(char*));
|
||||||
|
Reference in New Issue
Block a user