30
30
set_if_smaller(char_length,length); \
33
static int _mi_put_key_in_record(MI_INFO *info,uint32_t keynr,unsigned char *record);
33
static int _mi_put_key_in_record(MI_INFO *info,uint keynr,uchar *record);
36
36
Make a intern key from a record
50
uint32_t _mi_make_key(register MI_INFO *info, uint32_t keynr, unsigned char *key,
51
const unsigned char *record, my_off_t filepos)
50
uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
51
const uchar *record, my_off_t filepos)
55
55
register HA_KEYSEG *keyseg;
56
my_bool is_ft= info->s->keyinfo[keynr].flag & HA_FULLTEXT;
58
59
for (keyseg=info->s->keyinfo[keynr].seg ; keyseg->type ;keyseg++)
60
61
enum ha_base_keytype type=(enum ha_base_keytype) keyseg->type;
61
uint32_t length=keyseg->length;
63
const CHARSET_INFO * const cs=keyseg->charset;
62
uint length=keyseg->length;
64
CHARSET_INFO *cs=keyseg->charset;
65
66
if (keyseg->null_bit)
72
73
*key++=1; /* Not NULL */
75
char_length= ((cs && cs->mbmaxlen > 1) ? length/cs->mbmaxlen :
76
char_length= ((!is_ft && cs && cs->mbmaxlen > 1) ? length/cs->mbmaxlen :
78
pos= (unsigned char*) record+keyseg->start;
79
pos= (uchar*) record+keyseg->start;
79
80
if (type == HA_KEYTYPE_BIT)
81
82
if (keyseg->bit_length)
83
unsigned char bits= get_rec_bits((unsigned char*) record + keyseg->bit_pos,
84
uchar bits= get_rec_bits((uchar*) record + keyseg->bit_pos,
84
85
keyseg->bit_start, keyseg->bit_length);
88
memcpy(key, pos, length);
89
memcpy((uchar*) key, pos, length);
100
unsigned char *end= pos + length;
101
uchar *end= pos + length;
101
102
while (pos < end && pos[0] == ' ')
103
104
length=(uint) (end-pos);
105
106
FIX_LENGTH(cs, pos, length, char_length);
106
107
store_key_length_inc(key,char_length);
107
memcpy(key, pos, char_length);
108
memcpy((uchar*) key,(uchar*) pos,(size_t) char_length);
108
109
key+=char_length;
111
112
if (keyseg->flag & HA_VAR_LENGTH_PART)
113
uint32_t pack_length= (keyseg->bit_start == 1 ? 1 : 2);
114
uint32_t tmp_length= (pack_length == 1 ? (uint) *(unsigned char*) pos :
114
uint pack_length= (keyseg->bit_start == 1 ? 1 : 2);
115
uint tmp_length= (pack_length == 1 ? (uint) *(uchar*) pos :
116
117
pos+= pack_length; /* Skip VARCHAR length */
117
118
set_if_smaller(length,tmp_length);
118
119
FIX_LENGTH(cs, pos, length, char_length);
119
120
store_key_length_inc(key,char_length);
120
memcpy(key, pos, char_length);
121
memcpy((uchar*) key,(uchar*) pos,(size_t) char_length);
121
122
key+= char_length;
124
125
else if (keyseg->flag & HA_BLOB_PART)
126
uint32_t tmp_length=_mi_calc_blob_length(keyseg->bit_start,pos);
127
memcpy(&pos, pos+keyseg->bit_start, sizeof(char*));
127
uint tmp_length=_mi_calc_blob_length(keyseg->bit_start,pos);
128
memcpy_fixed((uchar*) &pos,pos+keyseg->bit_start,sizeof(char*));
128
129
set_if_smaller(length,tmp_length);
129
130
FIX_LENGTH(cs, pos, length, char_length);
130
131
store_key_length_inc(key,char_length);
131
memcpy(key, pos, char_length);
132
memcpy((uchar*) key,(uchar*) pos,(size_t) char_length);
132
133
key+= char_length;
169
170
FIX_LENGTH(cs, pos, length, char_length);
170
memcpy(key, pos, char_length);
171
memcpy((uchar*) key, pos, char_length);
171
172
if (length > char_length)
172
173
cs->cset->fill(cs, (char*) key+char_length, length-char_length, ' ');
195
196
last_use_keyseg Store pointer to the keyseg after the last used one
198
uint32_t _mi_pack_key(register MI_INFO *info, uint32_t keynr, unsigned char *key, unsigned char *old,
199
uint _mi_pack_key(register MI_INFO *info, uint keynr, uchar *key, uchar *old,
199
200
key_part_map keypart_map, HA_KEYSEG **last_used_keyseg)
201
unsigned char *start_key=key;
202
uchar *start_key=key;
202
203
HA_KEYSEG *keyseg;
204
my_bool is_ft= info->s->keyinfo[keynr].flag & HA_FULLTEXT;
204
206
/* only key prefixes are supported */
205
207
assert(((keypart_map+1) & keypart_map) == 0);
208
210
old+= keyseg->length, keyseg++)
210
212
enum ha_base_keytype type= (enum ha_base_keytype) keyseg->type;
211
uint32_t length= keyseg->length;
212
uint32_t char_length;
214
const CHARSET_INFO * const cs=keyseg->charset;
213
uint length= keyseg->length;
216
CHARSET_INFO *cs=keyseg->charset;
215
217
keypart_map>>= 1;
216
218
if (keyseg->null_bit)
222
224
continue; /* Found NULL */
225
char_length= (cs && cs->mbmaxlen > 1) ? length/cs->mbmaxlen : length;
227
char_length= (!is_ft && cs && cs->mbmaxlen > 1) ? length/cs->mbmaxlen : length;
227
229
if (keyseg->flag & HA_SPACE_PACK)
229
unsigned char *end=pos+length;
231
uchar *end=pos+length;
230
232
if (type == HA_KEYTYPE_NUM)
232
234
while (pos < end && pos[0] == ' ')
240
242
length=(uint) (end-pos);
241
243
FIX_LENGTH(cs, pos, length, char_length);
242
244
store_key_length_inc(key,char_length);
243
memcpy(key, pos, char_length);
245
memcpy((uchar*) key,pos,(size_t) char_length);
244
246
key+= char_length;
247
249
else if (keyseg->flag & (HA_VAR_LENGTH_PART | HA_BLOB_PART))
249
251
/* Length of key-part used with mi_rkey() always 2 */
250
uint32_t tmp_length=uint2korr(pos);
252
uint tmp_length=uint2korr(pos);
252
254
set_if_smaller(length,tmp_length); /* Safety */
253
255
FIX_LENGTH(cs, pos, length, char_length);
254
256
store_key_length_inc(key,char_length);
255
257
old+=2; /* Skip length */
256
memcpy(key, pos, char_length);
258
memcpy((uchar*) key, pos,(size_t) char_length);
257
259
key+= char_length;
267
269
FIX_LENGTH(cs, pos, length, char_length);
268
memcpy(key, pos, char_length);
270
memcpy((uchar*) key, pos, char_length);
269
271
if (length > char_length)
270
272
cs->cset->fill(cs, (char*) key+char_length, length-char_length, ' ');
300
static int _mi_put_key_in_record(register MI_INFO *info, uint32_t keynr,
301
unsigned char *record)
302
static int _mi_put_key_in_record(register MI_INFO *info, uint keynr,
303
register unsigned char *key;
304
unsigned char *pos,*key_end;
305
307
register HA_KEYSEG *keyseg;
306
unsigned char *blob_ptr;
308
blob_ptr= (unsigned char*) info->lastkey2; /* Place to put blob parts */
309
key=(unsigned char*) info->lastkey; /* KEy that was read */
310
blob_ptr= (uchar*) info->lastkey2; /* Place to put blob parts */
311
key=(uchar*) info->lastkey; /* KEy that was read */
310
312
key_end=key+info->lastkey_length;
311
313
for (keyseg=info->s->keyinfo[keynr].seg ; keyseg->type ;keyseg++)
322
324
if (keyseg->type == HA_KEYTYPE_BIT)
324
uint32_t length= keyseg->length;
326
uint length= keyseg->length;
326
328
if (keyseg->bit_length)
328
unsigned char bits= *key++;
329
331
set_rec_bits(bits, record + keyseg->bit_pos, keyseg->bit_start,
330
332
keyseg->bit_length);
335
337
clr_rec_bits(record + keyseg->bit_pos, keyseg->bit_start,
336
338
keyseg->bit_length);
338
memcpy(record + keyseg->start, key, length);
340
memcpy(record + keyseg->start, (uchar*) key, length);
342
344
if (keyseg->flag & HA_SPACE_PACK)
345
347
get_key_length(length,key);
346
348
#ifdef CHECK_KEYS
347
349
if (length > keyseg->length || key+length > key_end)
350
352
pos= record+keyseg->start;
351
353
if (keyseg->type != (int) HA_KEYTYPE_NUM)
353
memcpy(pos, key, length);
355
memcpy(pos,key,(size_t) length);
354
356
keyseg->charset->cset->fill(keyseg->charset,
355
357
(char*) pos + length,
356
358
keyseg->length - length,
361
memset(pos, ' ', keyseg->length-length);
362
memcpy(pos+keyseg->length-length, key, length);
363
bfill(pos,keyseg->length-length,' ');
364
memcpy(pos+keyseg->length-length,key,(size_t) length);
376
378
/* Store key length */
377
379
if (keyseg->bit_start == 1)
378
*(unsigned char*) (record+keyseg->start)= (unsigned char) length;
380
*(uchar*) (record+keyseg->start)= (uchar) length;
380
382
int2store(record+keyseg->start, length);
381
383
/* And key data */
382
memcpy(record+keyseg->start + keyseg->bit_start, key, length);
384
memcpy(record+keyseg->start + keyseg->bit_start, (uchar*) key, length);
385
387
else if (keyseg->flag & HA_BLOB_PART)
388
390
get_key_length(length,key);
389
391
#ifdef CHECK_KEYS
390
392
if (length > keyseg->length || key+length > key_end)
393
395
memcpy(record+keyseg->start+keyseg->bit_start,
394
&blob_ptr,sizeof(char*));
396
(char*) &blob_ptr,sizeof(char*));
395
397
memcpy(blob_ptr,key,length);
396
398
blob_ptr+=length;
422
424
if (key+keyseg->length > key_end)
425
memcpy(record+keyseg->start, key, keyseg->length);
427
memcpy(record+keyseg->start,(uchar*) key,
428
(size_t) keyseg->length);
426
429
key+= keyseg->length;
436
439
/* Here when key reads are used */
438
int _mi_read_key_record(MI_INFO *info, my_off_t filepos, unsigned char *buf)
441
int _mi_read_key_record(MI_INFO *info, my_off_t filepos, uchar *buf)
440
443
fast_mi_writeinfo(info);
441
444
if (filepos != HA_OFFSET_ERROR)
474
477
2 Index condition is not satisfied, end the scan.
477
int mi_check_index_cond(register MI_INFO *info, uint32_t keynr, unsigned char *record)
480
int mi_check_index_cond(register MI_INFO *info, uint keynr, uchar *record)
479
482
if (_mi_put_key_in_record(info, keynr, record))
502
uint64_t retrieve_auto_increment(MI_INFO *info,const unsigned char *record)
505
uint64_t retrieve_auto_increment(MI_INFO *info,const uchar *record)
504
507
uint64_t value= 0; /* Store unsigned values here */
505
508
int64_t s_value= 0; /* Store signed values here */
506
509
HA_KEYSEG *keyseg= info->s->keyinfo[info->s->base.auto_key-1].seg;
507
const unsigned char *key= (unsigned char*) record + keyseg->start;
510
const uchar *key= (uchar*) record + keyseg->start;
509
512
switch (keyseg->type) {
510
513
case HA_KEYTYPE_INT8:
511
514
s_value= (int64_t) *(char*)key;
513
516
case HA_KEYTYPE_BINARY:
514
value=(uint64_t) *(unsigned char*) key;
517
value=(uint64_t) *(uchar*) key;
516
519
case HA_KEYTYPE_SHORT_INT:
517
520
s_value= (int64_t) sint2korr(key);