Commit c0ca163d authored by unknown's avatar unknown

Merge bk-internal.mysql.com:/home/bk/mysql-5.0

into  chilla.local:/home/mydev/mysql-5.0-axmrg

parents d5e094d7 e9c2c8ba
...@@ -251,11 +251,12 @@ static int check_k_link(MI_CHECK *param, register MI_INFO *info, uint nr) ...@@ -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) ...@@ -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);
/* 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); 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, ...@@ -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)); /* Key blocks must lay within the key file length entirely. */
mi_check_print_error(param,"Wrong pagepointer: %s at page: %s", if (page + keyinfo->block_length > info->state->key_file_length)
llstr(page,llbuff),llstr(page,llbuff2)); {
/* purecov: begin tested */
if (page+info->s->blocksize > max_length) /* 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, ...@@ -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 */
} }
......
...@@ -1029,9 +1029,11 @@ ulong _mi_rec_unpack(register MI_INFO *info, register byte *to, byte *from, ...@@ -1029,9 +1029,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*));
......
This diff is collapsed.
...@@ -1815,6 +1815,34 @@ engine = federated ...@@ -1815,6 +1815,34 @@ engine = federated
connection='mysql://root@127.0.0.1:SLAVE_PORT/federated/test'; connection='mysql://root@127.0.0.1:SLAVE_PORT/federated/test';
drop table federated.test1, federated.test2; drop table federated.test1, federated.test2;
drop table federated.test; drop table federated.test;
set names utf8;
create table federated.t1 (a varchar(64)) DEFAULT CHARSET=utf8;
insert into federated.t1 values (0x6DC3A56E6164);
select hex(a) from federated.t1;
hex(a)
6DC3A56E6164
create table federated.t1 (a varchar(64))
ENGINE=FEDERATED
connection='mysql://root@127.0.0.1:SLAVE_PORT/federated/t1'
DEFAULT CHARSET=utf8;
set names utf8;
select hex(a) from federated.t1;
hex(a)
6DC3A56E6164
insert into federated.t1 values (0xC3A4C3B6C3BCC39F);
insert into federated.t1 values (0xD18DD184D184D0B5D0BAD182D0B8D0B2D0BDD183D18E);
select hex(a) from federated.t1;
hex(a)
6DC3A56E6164
C3A4C3B6C3BCC39F
D18DD184D184D0B5D0BAD182D0B8D0B2D0BDD183D18E
select hex(a) from federated.t1;
hex(a)
6DC3A56E6164
C3A4C3B6C3BCC39F
D18DD184D184D0B5D0BAD182D0B8D0B2D0BDD183D18E
drop table federated.t1;
drop table federated.t1;
DROP TABLE IF EXISTS federated.t1; DROP TABLE IF EXISTS federated.t1;
DROP DATABASE IF EXISTS federated; DROP DATABASE IF EXISTS federated;
DROP TABLE IF EXISTS federated.t1; DROP TABLE IF EXISTS federated.t1;
......
...@@ -1544,4 +1544,36 @@ drop table federated.test1, federated.test2; ...@@ -1544,4 +1544,36 @@ drop table federated.test1, federated.test2;
connection slave; connection slave;
drop table federated.test; drop table federated.test;
#
# BUG# 17044 Federated Storage Engine not UTF8 clean
#
connection slave;
set names utf8;
create table federated.t1 (a varchar(64)) DEFAULT CHARSET=utf8;
insert into federated.t1 values (0x6DC3A56E6164);
select hex(a) from federated.t1;
connection master;
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval create table federated.t1 (a varchar(64))
ENGINE=FEDERATED
connection='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1'
DEFAULT CHARSET=utf8;
set names utf8;
select hex(a) from federated.t1;
insert into federated.t1 values (0xC3A4C3B6C3BCC39F);
insert into federated.t1 values (0xD18DD184D184D0B5D0BAD182D0B8D0B2D0BDD183D18E);
select hex(a) from federated.t1;
connection slave;
select hex(a) from federated.t1;
connection master;
drop table federated.t1;
connection slave;
drop table federated.t1;
source include/federated_cleanup.inc; source include/federated_cleanup.inc;
...@@ -1434,6 +1434,16 @@ int ha_federated::open(const char *name, int mode, uint test_if_locked) ...@@ -1434,6 +1434,16 @@ int ha_federated::open(const char *name, int mode, uint test_if_locked)
/* Connect to foreign database mysql_real_connect() */ /* Connect to foreign database mysql_real_connect() */
mysql= mysql_init(0); mysql= mysql_init(0);
/*
BUG# 17044 Federated Storage Engine is not UTF8 clean
Add set names to whatever charset the table is at open
of table
*/
/* this sets the csname like 'set names utf8' */
mysql_options(mysql,MYSQL_SET_CHARSET_NAME,
this->table->s->table_charset->csname);
if (!mysql || !mysql_real_connect(mysql, if (!mysql || !mysql_real_connect(mysql,
share->hostname, share->hostname,
share->username, share->username,
...@@ -1450,6 +1460,7 @@ int ha_federated::open(const char *name, int mode, uint test_if_locked) ...@@ -1450,6 +1460,7 @@ int ha_federated::open(const char *name, int mode, uint test_if_locked)
API silently reconnect. For future versions, we will need more logic to API silently reconnect. For future versions, we will need more logic to
deal with transactions deal with transactions
*/ */
mysql->reconnect= 1; mysql->reconnect= 1;
ref_length= (table->s->primary_key != MAX_KEY ? ref_length= (table->s->primary_key != MAX_KEY ?
......
...@@ -1745,8 +1745,6 @@ void kill_delayed_threads(void) ...@@ -1745,8 +1745,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)
{ {
...@@ -1765,7 +1763,6 @@ void kill_delayed_threads(void) ...@@ -1765,7 +1763,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
} }
......
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