28
30
if (length > char_length) \
29
31
char_length= my_charpos(cs, pos, pos+length, char_length); \
30
set_if_smaller(char_length,length); \
32
drizzled::set_if_smaller(char_length,length); \
33
static int _mi_put_key_in_record(MI_INFO *info,uint keynr,uchar *record);
35
static int _mi_put_key_in_record(MI_INFO *info,uint32_t keynr,unsigned char *record);
36
38
Make a intern key from a record
50
uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
51
const uchar *record, my_off_t filepos)
52
uint32_t _mi_make_key(register MI_INFO *info, uint32_t keynr, unsigned char *key,
53
const unsigned char *record, drizzled::internal::my_off_t filepos)
55
57
register HA_KEYSEG *keyseg;
58
60
for (keyseg=info->s->keyinfo[keynr].seg ; keyseg->type ;keyseg++)
60
enum ha_base_keytype type=(enum ha_base_keytype) keyseg->type;
61
uint length=keyseg->length;
63
const CHARSET_INFO * const cs=keyseg->charset;
62
enum drizzled::ha_base_keytype type=(enum drizzled::ha_base_keytype) keyseg->type;
63
uint32_t length=keyseg->length;
65
const drizzled::CHARSET_INFO * const cs=keyseg->charset;
65
67
if (keyseg->null_bit)
75
77
char_length= ((cs && cs->mbmaxlen > 1) ? length/cs->mbmaxlen :
78
pos= (uchar*) record+keyseg->start;
79
if (type == HA_KEYTYPE_BIT)
81
if (keyseg->bit_length)
83
uchar bits= get_rec_bits((uchar*) record + keyseg->bit_pos,
84
keyseg->bit_start, keyseg->bit_length);
88
memcpy(key, pos, length);
80
pos= (unsigned char*) record+keyseg->start;
92
82
if (keyseg->flag & HA_SPACE_PACK)
94
if (type != HA_KEYTYPE_NUM)
96
length= cs->cset->lengthsp(cs, (char*) pos, length);
100
uchar *end= pos + length;
101
while (pos < end && pos[0] == ' ')
103
length=(uint) (end-pos);
84
length= cs->cset->lengthsp(cs, (char*) pos, length);
105
86
FIX_LENGTH(cs, pos, length, char_length);
106
87
store_key_length_inc(key,char_length);
107
88
memcpy(key, pos, char_length);
111
92
if (keyseg->flag & HA_VAR_LENGTH_PART)
113
uint pack_length= (keyseg->bit_start == 1 ? 1 : 2);
114
uint tmp_length= (pack_length == 1 ? (uint) *(uchar*) pos :
94
uint32_t pack_length= (keyseg->bit_start == 1 ? 1 : 2);
95
uint32_t tmp_length= (pack_length == 1 ? (uint) *(unsigned char*) pos :
116
97
pos+= pack_length; /* Skip VARCHAR length */
117
set_if_smaller(length,tmp_length);
98
drizzled::set_if_smaller(length,tmp_length);
118
99
FIX_LENGTH(cs, pos, length, char_length);
119
100
store_key_length_inc(key,char_length);
120
101
memcpy(key, pos, char_length);
124
105
else if (keyseg->flag & HA_BLOB_PART)
126
uint tmp_length=_mi_calc_blob_length(keyseg->bit_start,pos);
107
uint32_t tmp_length=_mi_calc_blob_length(keyseg->bit_start,pos);
127
108
memcpy(&pos, pos+keyseg->bit_start, sizeof(char*));
128
set_if_smaller(length,tmp_length);
109
drizzled::set_if_smaller(length,tmp_length);
129
110
FIX_LENGTH(cs, pos, length, char_length);
130
111
store_key_length_inc(key,char_length);
131
112
memcpy(key, pos, char_length);
135
116
else if (keyseg->flag & HA_SWAP_KEY)
136
117
{ /* Numerical column */
138
if (type == HA_KEYTYPE_FLOAT)
144
/* Replace NAN with zero */
145
memset(key, 0, length);
150
else if (type == HA_KEYTYPE_DOUBLE)
118
if (type == drizzled::HA_KEYTYPE_DOUBLE)
153
121
float8get(nr,pos);
195
162
last_use_keyseg Store pointer to the keyseg after the last used one
198
uint _mi_pack_key(register MI_INFO *info, uint keynr, uchar *key, uchar *old,
199
key_part_map keypart_map, HA_KEYSEG **last_used_keyseg)
165
uint32_t _mi_pack_key(register MI_INFO *info, uint32_t keynr, unsigned char *key, unsigned char *old,
166
drizzled::key_part_map keypart_map, HA_KEYSEG **last_used_keyseg)
201
uchar *start_key=key;
168
unsigned char *start_key=key;
202
169
HA_KEYSEG *keyseg;
204
171
/* only key prefixes are supported */
207
174
for (keyseg= info->s->keyinfo[keynr].seg ; keyseg->type && keypart_map;
208
175
old+= keyseg->length, keyseg++)
210
enum ha_base_keytype type= (enum ha_base_keytype) keyseg->type;
211
uint length= keyseg->length;
214
const CHARSET_INFO * const cs=keyseg->charset;
177
enum drizzled::ha_base_keytype type= (enum drizzled::ha_base_keytype) keyseg->type;
178
uint32_t length= keyseg->length;
179
uint32_t char_length;
181
const drizzled::CHARSET_INFO * const cs=keyseg->charset;
215
182
keypart_map>>= 1;
216
183
if (keyseg->null_bit)
227
194
if (keyseg->flag & HA_SPACE_PACK)
229
uchar *end=pos+length;
230
if (type == HA_KEYTYPE_NUM)
232
while (pos < end && pos[0] == ' ')
235
else if (type != HA_KEYTYPE_BINARY)
196
unsigned char *end=pos+length;
198
if (type != drizzled::HA_KEYTYPE_BINARY)
237
200
while (end > pos && end[-1] == ' ')
247
210
else if (keyseg->flag & (HA_VAR_LENGTH_PART | HA_BLOB_PART))
249
212
/* Length of key-part used with mi_rkey() always 2 */
250
uint tmp_length=uint2korr(pos);
213
uint32_t tmp_length=uint2korr(pos);
252
set_if_smaller(length,tmp_length); /* Safety */
215
drizzled::set_if_smaller(length,tmp_length); /* Safety */
253
216
FIX_LENGTH(cs, pos, length, char_length);
254
217
store_key_length_inc(key,char_length);
255
218
old+=2; /* Skip length */
300
static int _mi_put_key_in_record(register MI_INFO *info, uint keynr,
263
static int _mi_put_key_in_record(register MI_INFO *info, uint32_t keynr,
264
unsigned char *record)
266
register unsigned char *key;
267
unsigned char *pos,*key_end;
305
268
register HA_KEYSEG *keyseg;
269
unsigned char *blob_ptr;
308
blob_ptr= (uchar*) info->lastkey2; /* Place to put blob parts */
309
key=(uchar*) info->lastkey; /* KEy that was read */
271
blob_ptr= (unsigned char*) info->lastkey2; /* Place to put blob parts */
272
key=(unsigned char*) info->lastkey; /* KEy that was read */
310
273
key_end=key+info->lastkey_length;
311
274
for (keyseg=info->s->keyinfo[keynr].seg ; keyseg->type ;keyseg++)
320
283
record[keyseg->null_pos]&= ~keyseg->null_bit;
322
if (keyseg->type == HA_KEYTYPE_BIT)
324
uint length= keyseg->length;
326
if (keyseg->bit_length)
329
set_rec_bits(bits, record + keyseg->bit_pos, keyseg->bit_start,
335
clr_rec_bits(record + keyseg->bit_pos, keyseg->bit_start,
338
memcpy(record + keyseg->start, key, length);
342
286
if (keyseg->flag & HA_SPACE_PACK)
345
289
get_key_length(length,key);
346
290
#ifdef CHECK_KEYS
347
291
if (length > keyseg->length || key+length > key_end)
350
294
pos= record+keyseg->start;
351
if (keyseg->type != (int) HA_KEYTYPE_NUM)
353
memcpy(pos, key, length);
354
keyseg->charset->cset->fill(keyseg->charset,
355
(char*) pos + length,
356
keyseg->length - length,
361
memset(pos, ' ', keyseg->length-length);
362
memcpy(pos+keyseg->length-length, key, length);
296
memcpy(pos, key, length);
297
keyseg->charset->cset->fill(keyseg->charset,
298
(char*) pos + length,
299
keyseg->length - length,
368
305
if (keyseg->flag & HA_VAR_LENGTH_PART)
371
308
get_key_length(length,key);
372
309
#ifdef CHECK_KEYS
373
310
if (length > keyseg->length || key+length > key_end)
376
313
/* Store key length */
377
314
if (keyseg->bit_start == 1)
378
*(uchar*) (record+keyseg->start)= (uchar) length;
315
*(unsigned char*) (record+keyseg->start)= (unsigned char) length;
380
317
int2store(record+keyseg->start, length);
381
318
/* And key data */
405
342
else if (keyseg->flag & HA_SWAP_KEY)
407
uchar *to= record+keyseg->start+keyseg->length;
408
uchar *end= key+keyseg->length;
344
unsigned char *to= record+keyseg->start+keyseg->length;
345
unsigned char *end= key+keyseg->length;
409
346
#ifdef CHECK_KEYS
410
347
if (end > key_end)
436
373
/* Here when key reads are used */
438
int _mi_read_key_record(MI_INFO *info, my_off_t filepos, uchar *buf)
375
int _mi_read_key_record(MI_INFO *info, drizzled::internal::my_off_t filepos, unsigned char *buf)
440
377
fast_mi_writeinfo(info);
441
378
if (filepos != HA_OFFSET_ERROR)
445
382
if (_mi_put_key_in_record(info,(uint) info->lastinx,buf))
447
384
mi_print_error(info->s, HA_ERR_CRASHED);
448
my_errno=HA_ERR_CRASHED;
385
errno=HA_ERR_CRASHED;
451
388
info->update|= HA_STATE_AKTIV; /* We should find a record */
454
my_errno=HA_ERR_WRONG_INDEX;
391
errno=HA_ERR_WRONG_INDEX;
456
393
return(-1); /* Wrong data to read */
464
401
mi_check_index_cond()
465
402
info MyISAM handler
466
403
keynr Index we're running a scan on
467
record Record buffer to use (it is assumed that index check function
404
record Record buffer to use (it is assumed that index check function
468
405
will look for column values there)
472
409
0 Index condition is not satisfied, continue scanning
473
410
1 Index condition is satisfied
474
2 Index condition is not satisfied, end the scan.
411
2 Index condition is not satisfied, end the scan.
477
int mi_check_index_cond(register MI_INFO *info, uint keynr, uchar *record)
414
int mi_check_index_cond(register MI_INFO *info, uint32_t keynr, unsigned char *record)
479
416
if (_mi_put_key_in_record(info, keynr, record))
481
418
mi_print_error(info->s, HA_ERR_CRASHED);
482
my_errno=HA_ERR_CRASHED;
419
errno=HA_ERR_CRASHED;
485
422
return info->index_cond_func(info->index_cond_func_arg);
502
uint64_t retrieve_auto_increment(MI_INFO *info,const uchar *record)
439
uint64_t retrieve_auto_increment(MI_INFO *info,const unsigned char *record)
504
441
uint64_t value= 0; /* Store unsigned values here */
505
442
int64_t s_value= 0; /* Store signed values here */
506
443
HA_KEYSEG *keyseg= info->s->keyinfo[info->s->base.auto_key-1].seg;
507
const uchar *key= (uchar*) record + keyseg->start;
444
const unsigned char *key= (unsigned char*) record + keyseg->start;
509
446
switch (keyseg->type) {
510
case HA_KEYTYPE_INT8:
511
s_value= (int64_t) *(char*)key;
513
case HA_KEYTYPE_BINARY:
514
value=(uint64_t) *(uchar*) key;
516
case HA_KEYTYPE_SHORT_INT:
517
s_value= (int64_t) sint2korr(key);
519
case HA_KEYTYPE_USHORT_INT:
520
value=(uint64_t) uint2korr(key);
522
case HA_KEYTYPE_LONG_INT:
447
case drizzled::HA_KEYTYPE_BINARY:
448
value=(uint64_t) *(unsigned char*) key;
450
case drizzled::HA_KEYTYPE_LONG_INT:
523
451
s_value= (int64_t) sint4korr(key);
525
case HA_KEYTYPE_ULONG_INT:
453
case drizzled::HA_KEYTYPE_ULONG_INT:
526
454
value=(uint64_t) uint4korr(key);
528
case HA_KEYTYPE_INT24:
529
s_value= (int64_t) sint3korr(key);
531
case HA_KEYTYPE_UINT24:
456
case drizzled::HA_KEYTYPE_UINT24:
532
457
value=(uint64_t) uint3korr(key);
534
case HA_KEYTYPE_FLOAT: /* This shouldn't be used */
538
/* Ignore negative values */
539
value = (f_1 < (float) 0.0) ? 0 : (uint64_t) f_1;
542
case HA_KEYTYPE_DOUBLE: /* This shouldn't be used */
459
case drizzled::HA_KEYTYPE_DOUBLE: /* This shouldn't be used */
545
462
float8get(f_1,key);
547
464
value = (f_1 < 0.0) ? 0 : (uint64_t) f_1;
550
case HA_KEYTYPE_LONGLONG:
467
case drizzled::HA_KEYTYPE_LONGLONG:
551
468
s_value= sint8korr(key);
553
case HA_KEYTYPE_ULONGLONG:
470
case drizzled::HA_KEYTYPE_ULONGLONG:
554
471
value= uint8korr(key);