summaryrefslogtreecommitdiff
path: root/myisam
diff options
context:
space:
mode:
authorunknown <ram@gw.mysql.r18.ru>2004-12-17 18:06:05 +0400
committerunknown <ram@gw.mysql.r18.ru>2004-12-17 18:06:05 +0400
commitd7285006cfcd93b13ec9c0f886ec542d7365fbfd (patch)
tree2e6c553f1097aea129caca8a5d200ff4f446a230 /myisam
parenteaec00b19b0dfe26bbe4297edfea04e277af27ed (diff)
downloadmariadb-git-d7285006cfcd93b13ec9c0f886ec542d7365fbfd.tar.gz
bit type
Diffstat (limited to 'myisam')
-rw-r--r--myisam/mi_key.c33
-rw-r--r--myisam/mi_open.c16
2 files changed, 45 insertions, 4 deletions
diff --git a/myisam/mi_key.c b/myisam/mi_key.c
index a775e0ba2d0..c1400033254 100644
--- a/myisam/mi_key.c
+++ b/myisam/mi_key.c
@@ -82,6 +82,19 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
length);
pos= (byte*) record+keyseg->start;
+ if (type == HA_KEYTYPE_BIT)
+ {
+ if (keyseg->bit_length)
+ {
+ uchar bits= get_rec_bits((uchar*) record + keyseg->bit_pos,
+ keyseg->bit_start, keyseg->bit_length);
+ *key++= bits;
+ length--;
+ }
+ memcpy((byte*) key, pos, length);
+ key+= length;
+ continue;
+ }
if (keyseg->flag & HA_SPACE_PACK)
{
end=pos+length;
@@ -333,6 +346,26 @@ static int _mi_put_key_in_record(register MI_INFO *info, uint keynr,
}
record[keyseg->null_pos]&= ~keyseg->null_bit;
}
+ if (keyseg->type == HA_KEYTYPE_BIT)
+ {
+ uint length= keyseg->length;
+
+ if (keyseg->bit_length)
+ {
+ uchar bits= *key++;
+ set_rec_bits(bits, record + keyseg->bit_pos, keyseg->bit_start,
+ keyseg->bit_length);
+ length--;
+ }
+ else
+ {
+ clr_rec_bits(record + keyseg->bit_pos, keyseg->bit_start,
+ keyseg->bit_length);
+ }
+ memcpy(record + keyseg->start, (byte*) key, length);
+ key+= length;
+ continue;
+ }
if (keyseg->flag & HA_SPACE_PACK)
{
uint length;
diff --git a/myisam/mi_open.c b/myisam/mi_open.c
index 562227d2f03..615e6bb5dd1 100644
--- a/myisam/mi_open.c
+++ b/myisam/mi_open.c
@@ -1049,12 +1049,13 @@ int mi_keyseg_write(File file, const HA_KEYSEG *keyseg)
*ptr++ =keyseg->null_bit;
*ptr++ =keyseg->bit_start;
*ptr++ =keyseg->bit_end;
- *ptr++ =0; /* Not used */
+ *ptr++= keyseg->bit_length;
mi_int2store(ptr,keyseg->flag); ptr+=2;
mi_int2store(ptr,keyseg->length); ptr+=2;
mi_int4store(ptr,keyseg->start); ptr+=4;
- mi_int4store(ptr,keyseg->null_pos); ptr+=4;
-
+ mi_int4store(ptr, keyseg->null_bit ? keyseg->null_pos : keyseg->bit_pos);
+ ptr+=4;
+
return my_write(file,(char*) buff, (uint) (ptr-buff), MYF(MY_NABP));
}
@@ -1066,12 +1067,19 @@ char *mi_keyseg_read(char *ptr, HA_KEYSEG *keyseg)
keyseg->null_bit = *ptr++;
keyseg->bit_start = *ptr++;
keyseg->bit_end = *ptr++;
- ptr++;
+ keyseg->bit_length = *ptr++;
keyseg->flag = mi_uint2korr(ptr); ptr +=2;
keyseg->length = mi_uint2korr(ptr); ptr +=2;
keyseg->start = mi_uint4korr(ptr); ptr +=4;
keyseg->null_pos = mi_uint4korr(ptr); ptr +=4;
keyseg->charset=0; /* Will be filled in later */
+ if (keyseg->null_bit)
+ keyseg->bit_pos= keyseg->null_pos + (keyseg->null_bit == 7);
+ else
+ {
+ keyseg->bit_pos= keyseg->null_pos;
+ keyseg->null_pos= 0;
+ }
return ptr;
}