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;
57
DBUG_ENTER("_mi_make_key");
58
60
for (keyseg=info->s->keyinfo[keynr].seg ; keyseg->type ;keyseg++)
60
62
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;
63
uint length=keyseg->length;
65
CHARSET_INFO *cs=keyseg->charset;
65
67
if (keyseg->null_bit)
72
74
*key++=1; /* Not NULL */
75
char_length= ((cs && cs->mbmaxlen > 1) ? length/cs->mbmaxlen :
77
char_length= ((!is_ft && cs && cs->mbmaxlen > 1) ? length/cs->mbmaxlen :
78
pos= (unsigned char*) record+keyseg->start;
80
pos= (uchar*) record+keyseg->start;
79
81
if (type == HA_KEYTYPE_BIT)
81
83
if (keyseg->bit_length)
83
unsigned char bits= get_rec_bits((unsigned char*) record + keyseg->bit_pos,
85
uchar bits= get_rec_bits((uchar*) record + keyseg->bit_pos,
84
86
keyseg->bit_start, keyseg->bit_length);
88
memcpy(key, pos, length);
90
memcpy((uchar*) key, pos, length);
100
unsigned char *end= pos + length;
102
uchar *end= pos + length;
101
103
while (pos < end && pos[0] == ' ')
103
105
length=(uint) (end-pos);
105
107
FIX_LENGTH(cs, pos, length, char_length);
106
108
store_key_length_inc(key,char_length);
107
memcpy(key, pos, char_length);
109
memcpy((uchar*) key,(uchar*) pos,(size_t) char_length);
108
110
key+=char_length;
111
113
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 :
115
uint pack_length= (keyseg->bit_start == 1 ? 1 : 2);
116
uint tmp_length= (pack_length == 1 ? (uint) *(uchar*) pos :
116
118
pos+= pack_length; /* Skip VARCHAR length */
117
119
set_if_smaller(length,tmp_length);
118
120
FIX_LENGTH(cs, pos, length, char_length);
119
121
store_key_length_inc(key,char_length);
120
memcpy(key, pos, char_length);
122
memcpy((uchar*) key,(uchar*) pos,(size_t) char_length);
121
123
key+= char_length;
124
126
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*));
128
uint tmp_length=_mi_calc_blob_length(keyseg->bit_start,pos);
129
memcpy_fixed((uchar*) &pos,pos+keyseg->bit_start,sizeof(char*));
128
130
set_if_smaller(length,tmp_length);
129
131
FIX_LENGTH(cs, pos, length, char_length);
130
132
store_key_length_inc(key,char_length);
131
memcpy(key, pos, char_length);
133
memcpy((uchar*) key,(uchar*) pos,(size_t) char_length);
132
134
key+= char_length;
169
171
FIX_LENGTH(cs, pos, length, char_length);
170
memcpy(key, pos, char_length);
172
memcpy((uchar*) key, pos, char_length);
171
173
if (length > char_length)
172
174
cs->cset->fill(cs, (char*) key+char_length, length-char_length, ' ');
175
177
_mi_dpointer(info,key,filepos);
176
return((uint) (key-start)); /* Return keylength */
178
DBUG_PRINT("exit",("keynr: %d",keynr));
179
DBUG_DUMP("key",(uchar*) start,(uint) (key-start)+keyseg->length);
181
_mi_print_key(DBUG_FILE,info->s->keyinfo[keynr].seg,start,
182
(uint) (key-start)););
183
DBUG_RETURN((uint) (key-start)); /* Return keylength */
177
184
} /* _mi_make_key */
195
202
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,
205
uint _mi_pack_key(register MI_INFO *info, uint keynr, uchar *key, uchar *old,
199
206
key_part_map keypart_map, HA_KEYSEG **last_used_keyseg)
201
unsigned char *start_key=key;
208
uchar *start_key=key;
202
209
HA_KEYSEG *keyseg;
210
my_bool is_ft= info->s->keyinfo[keynr].flag & HA_FULLTEXT;
211
DBUG_ENTER("_mi_pack_key");
204
213
/* only key prefixes are supported */
205
assert(((keypart_map+1) & keypart_map) == 0);
214
DBUG_ASSERT(((keypart_map+1) & keypart_map) == 0);
207
216
for (keyseg= info->s->keyinfo[keynr].seg ; keyseg->type && keypart_map;
208
217
old+= keyseg->length, keyseg++)
210
219
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;
220
uint length= keyseg->length;
223
CHARSET_INFO *cs=keyseg->charset;
215
224
keypart_map>>= 1;
216
225
if (keyseg->null_bit)
222
231
continue; /* Found NULL */
225
char_length= (cs && cs->mbmaxlen > 1) ? length/cs->mbmaxlen : length;
234
char_length= (!is_ft && cs && cs->mbmaxlen > 1) ? length/cs->mbmaxlen : length;
227
236
if (keyseg->flag & HA_SPACE_PACK)
229
unsigned char *end=pos+length;
238
uchar *end=pos+length;
230
239
if (type == HA_KEYTYPE_NUM)
232
241
while (pos < end && pos[0] == ' ')
240
249
length=(uint) (end-pos);
241
250
FIX_LENGTH(cs, pos, length, char_length);
242
251
store_key_length_inc(key,char_length);
243
memcpy(key, pos, char_length);
252
memcpy((uchar*) key,pos,(size_t) char_length);
244
253
key+= char_length;
247
256
else if (keyseg->flag & (HA_VAR_LENGTH_PART | HA_BLOB_PART))
249
258
/* Length of key-part used with mi_rkey() always 2 */
250
uint32_t tmp_length=uint2korr(pos);
259
uint tmp_length=uint2korr(pos);
252
261
set_if_smaller(length,tmp_length); /* Safety */
253
262
FIX_LENGTH(cs, pos, length, char_length);
254
263
store_key_length_inc(key,char_length);
255
264
old+=2; /* Skip length */
256
memcpy(key, pos, char_length);
265
memcpy((uchar*) key, pos,(size_t) char_length);
257
266
key+= char_length;
267
276
FIX_LENGTH(cs, pos, length, char_length);
268
memcpy(key, pos, char_length);
277
memcpy((uchar*) key, pos, char_length);
269
278
if (length > char_length)
270
279
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)
309
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
314
register HA_KEYSEG *keyseg;
306
unsigned char *blob_ptr;
316
DBUG_ENTER("_mi_put_key_in_record");
308
blob_ptr= (unsigned char*) info->lastkey2; /* Place to put blob parts */
309
key=(unsigned char*) info->lastkey; /* KEy that was read */
318
blob_ptr= (uchar*) info->lastkey2; /* Place to put blob parts */
319
key=(uchar*) info->lastkey; /* KEy that was read */
310
320
key_end=key+info->lastkey_length;
311
321
for (keyseg=info->s->keyinfo[keynr].seg ; keyseg->type ;keyseg++)
322
332
if (keyseg->type == HA_KEYTYPE_BIT)
324
uint32_t length= keyseg->length;
334
uint length= keyseg->length;
326
336
if (keyseg->bit_length)
328
unsigned char bits= *key++;
329
339
set_rec_bits(bits, record + keyseg->bit_pos, keyseg->bit_start,
330
340
keyseg->bit_length);
335
345
clr_rec_bits(record + keyseg->bit_pos, keyseg->bit_start,
336
346
keyseg->bit_length);
338
memcpy(record + keyseg->start, key, length);
348
memcpy(record + keyseg->start, (uchar*) key, length);
342
352
if (keyseg->flag & HA_SPACE_PACK)
345
355
get_key_length(length,key);
346
356
#ifdef CHECK_KEYS
347
357
if (length > keyseg->length || key+length > key_end)
350
360
pos= record+keyseg->start;
351
361
if (keyseg->type != (int) HA_KEYTYPE_NUM)
353
memcpy(pos, key, length);
363
memcpy(pos,key,(size_t) length);
354
364
keyseg->charset->cset->fill(keyseg->charset,
355
365
(char*) pos + length,
356
366
keyseg->length - length,
361
memset(pos, ' ', keyseg->length-length);
362
memcpy(pos+keyseg->length-length, key, length);
371
bfill(pos,keyseg->length-length,' ');
372
memcpy(pos+keyseg->length-length,key,(size_t) length);
376
386
/* Store key length */
377
387
if (keyseg->bit_start == 1)
378
*(unsigned char*) (record+keyseg->start)= (unsigned char) length;
388
*(uchar*) (record+keyseg->start)= (uchar) length;
380
390
int2store(record+keyseg->start, length);
381
391
/* And key data */
382
memcpy(record+keyseg->start + keyseg->bit_start, key, length);
392
memcpy(record+keyseg->start + keyseg->bit_start, (uchar*) key, length);
385
395
else if (keyseg->flag & HA_BLOB_PART)
388
398
get_key_length(length,key);
389
399
#ifdef CHECK_KEYS
390
400
if (length > keyseg->length || key+length > key_end)
393
403
memcpy(record+keyseg->start+keyseg->bit_start,
394
&blob_ptr,sizeof(char*));
404
(char*) &blob_ptr,sizeof(char*));
395
405
memcpy(blob_ptr,key,length);
396
406
blob_ptr+=length;
422
432
if (key+keyseg->length > key_end)
425
memcpy(record+keyseg->start, key, keyseg->length);
435
memcpy(record+keyseg->start,(uchar*) key,
436
(size_t) keyseg->length);
426
437
key+= keyseg->length;
432
return(1); /* Crashed row */
443
DBUG_RETURN(1); /* Crashed row */
433
444
} /* _mi_put_key_in_record */
436
447
/* Here when key reads are used */
438
int _mi_read_key_record(MI_INFO *info, my_off_t filepos, unsigned char *buf)
449
int _mi_read_key_record(MI_INFO *info, my_off_t filepos, uchar *buf)
440
451
fast_mi_writeinfo(info);
441
452
if (filepos != HA_OFFSET_ERROR)
474
485
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)
488
int mi_check_index_cond(register MI_INFO *info, uint keynr, uchar *record)
479
490
if (_mi_put_key_in_record(info, keynr, record))
502
uint64_t retrieve_auto_increment(MI_INFO *info,const unsigned char *record)
513
uint64_t retrieve_auto_increment(MI_INFO *info,const uchar *record)
504
515
uint64_t value= 0; /* Store unsigned values here */
505
516
int64_t s_value= 0; /* Store signed values here */
506
517
HA_KEYSEG *keyseg= info->s->keyinfo[info->s->base.auto_key-1].seg;
507
const unsigned char *key= (unsigned char*) record + keyseg->start;
518
const uchar *key= (uchar*) record + keyseg->start;
509
520
switch (keyseg->type) {
510
521
case HA_KEYTYPE_INT8:
511
522
s_value= (int64_t) *(char*)key;
513
524
case HA_KEYTYPE_BINARY:
514
value=(uint64_t) *(unsigned char*) key;
525
value=(uint64_t) *(uchar*) key;
516
527
case HA_KEYTYPE_SHORT_INT:
517
528
s_value= (int64_t) sint2korr(key);