mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
Merge abarkov@bk-internal.mysql.com:/home/bk/mysql-5.1-kt
into mysql.com:/usr/home/bar/mysql-5.1.b20086
This commit is contained in:
@@ -92,3 +92,18 @@ DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t0_aux;
|
||||
DROP TABLE IF EXISTS t0_definition;
|
||||
DROP TABLE IF EXISTS t0_template;
|
||||
create table t1 (id varchar(64) primary key) engine=innodb
|
||||
partition by key(id) partitions 5;
|
||||
insert into t1 values ('a');
|
||||
insert into t1 values ('aa');
|
||||
insert into t1 values ('aaa');
|
||||
select * from t1 where id = 'a';
|
||||
id
|
||||
a
|
||||
select * from t1 where id = 'aa';
|
||||
id
|
||||
aa
|
||||
select * from t1 where id = 'aaa';
|
||||
id
|
||||
aaa
|
||||
drop table t1;
|
||||
|
||||
@@ -31,7 +31,7 @@ id select_type table partitions type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 p0,p1 ALL NULL NULL NULL NULL 3 Using where
|
||||
explain partitions select * from t2 where a=1 and b=1;
|
||||
id select_type table partitions type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t2 p0 ALL NULL NULL NULL NULL 3 Using where
|
||||
1 SIMPLE t2 p0 ALL NULL NULL NULL NULL 2 Using where
|
||||
create table t3 (
|
||||
a int
|
||||
)
|
||||
|
||||
@@ -66,3 +66,15 @@ DROP TABLE IF EXISTS t0_definition;
|
||||
DROP TABLE IF EXISTS t0_template;
|
||||
--enable_warnings
|
||||
|
||||
#
|
||||
# Bug#20086: Can't get data from key partitioned tables with VARCHAR key
|
||||
#
|
||||
create table t1 (id varchar(64) primary key) engine=innodb
|
||||
partition by key(id) partitions 5;
|
||||
insert into t1 values ('a');
|
||||
insert into t1 values ('aa');
|
||||
insert into t1 values ('aaa');
|
||||
select * from t1 where id = 'a';
|
||||
select * from t1 where id = 'aa';
|
||||
select * from t1 where id = 'aaa';
|
||||
drop table t1;
|
||||
|
||||
30
sql/field.cc
30
sql/field.cc
@@ -1243,6 +1243,21 @@ uint Field::offset()
|
||||
}
|
||||
|
||||
|
||||
void Field::hash(ulong *nr, ulong *nr2)
|
||||
{
|
||||
if (is_null())
|
||||
{
|
||||
*nr^= (*nr << 1) | 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
uint len= pack_length();
|
||||
CHARSET_INFO *cs= charset();
|
||||
cs->coll->hash_sort(cs, (uchar*) ptr, len, nr, nr2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Field::copy_from_tmp(int row_offset)
|
||||
{
|
||||
memcpy(ptr,ptr+row_offset,pack_length());
|
||||
@@ -6925,6 +6940,21 @@ uint Field_varstring::is_equal(create_field *new_field)
|
||||
}
|
||||
|
||||
|
||||
void Field_varstring::hash(ulong *nr, ulong *nr2)
|
||||
{
|
||||
if (is_null())
|
||||
{
|
||||
*nr^= (*nr << 1) | 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
uint len= length_bytes == 1 ? (uint) (uchar) *ptr : uint2korr(ptr);
|
||||
CHARSET_INFO *cs= charset();
|
||||
cs->coll->hash_sort(cs, (uchar*) ptr + length_bytes, len, nr, nr2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
** blob type
|
||||
** A blob is saved as a length and a pointer. The length is stored in the
|
||||
|
||||
@@ -351,6 +351,8 @@ public:
|
||||
return field_length / charset()->mbmaxlen;
|
||||
}
|
||||
|
||||
/* Hash value */
|
||||
virtual void hash(ulong *nr, ulong *nr2);
|
||||
friend bool reopen_table(THD *,struct st_table *,bool);
|
||||
friend int cre_myisam(my_string name, register TABLE *form, uint options,
|
||||
ulonglong auto_increment_value);
|
||||
@@ -1120,6 +1122,7 @@ public:
|
||||
char *new_ptr, uchar *new_null_ptr,
|
||||
uint new_null_bit);
|
||||
uint is_equal(create_field *new_field);
|
||||
void hash(ulong *nr, ulong *nr2);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -210,9 +210,13 @@ void key_restore(byte *to_record, byte *from_key, KEY *key_info,
|
||||
}
|
||||
else if (key_part->key_part_flag & HA_VAR_LENGTH_PART)
|
||||
{
|
||||
my_bitmap_map *old_map;
|
||||
key_length-= HA_KEY_BLOB_LENGTH;
|
||||
length= min(key_length, key_part->length);
|
||||
old_map= dbug_tmp_use_all_columns(key_part->field->table,
|
||||
key_part->field->table->write_set);
|
||||
key_part->field->set_key_image((char *) from_key, length);
|
||||
dbug_tmp_restore_column_map(key_part->field->table->write_set, old_map);
|
||||
from_key+= HA_KEY_BLOB_LENGTH;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -2103,26 +2103,15 @@ static inline longlong part_val_int(Item *item_expr)
|
||||
|
||||
static uint32 calculate_key_value(Field **field_array)
|
||||
{
|
||||
uint32 hashnr= 0;
|
||||
ulong nr1= 1;
|
||||
ulong nr2= 4;
|
||||
|
||||
do
|
||||
{
|
||||
Field *field= *field_array;
|
||||
if (field->is_null())
|
||||
{
|
||||
hashnr^= (hashnr << 1) | 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
uint len= field->pack_length();
|
||||
ulong nr1= 1;
|
||||
CHARSET_INFO *cs= field->charset();
|
||||
cs->coll->hash_sort(cs, (uchar*)field->ptr, len, &nr1, &nr2);
|
||||
hashnr^= (uint32)nr1;
|
||||
}
|
||||
field->hash(&nr1, &nr2);
|
||||
} while (*(++field_array));
|
||||
return hashnr;
|
||||
return (uint32) nr1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user