53
53
HP_KEYDEF *keyinfo= info->s->keydef + inx;
54
54
TREE *rb_tree = &keyinfo->rb_tree;
55
55
heap_rb_param custom_arg;
56
DBUG_ENTER("hp_rb_records_in_range");
57
58
info->lastinx= inx;
58
59
custom_arg.keyseg= keyinfo->seg;
59
60
custom_arg.search_flag= SEARCH_FIND | SEARCH_SAME;
62
custom_arg.key_length= hp_rb_pack_key(keyinfo, (unsigned char*) info->recbuf,
63
(unsigned char*) min_key->key,
63
custom_arg.key_length= hp_rb_pack_key(keyinfo, (uchar*) info->recbuf,
64
(uchar*) min_key->key,
64
65
min_key->keypart_map);
65
66
start_pos= tree_record_pos(rb_tree, info->recbuf, min_key->flag,
75
custom_arg.key_length= hp_rb_pack_key(keyinfo, (unsigned char*) info->recbuf,
76
(unsigned char*) max_key->key,
76
custom_arg.key_length= hp_rb_pack_key(keyinfo, (uchar*) info->recbuf,
77
(uchar*) max_key->key,
77
78
max_key->keypart_map);
78
79
end_pos= tree_record_pos(rb_tree, info->recbuf, max_key->flag,
83
84
end_pos= rb_tree->elements_in_tree + (ha_rows)1;
87
DBUG_PRINT("info",("start_pos: %lu end_pos: %lu", (ulong) start_pos,
86
89
if (start_pos == HA_POS_ERROR || end_pos == HA_POS_ERROR)
88
return(end_pos < start_pos ? (ha_rows) 0 :
90
DBUG_RETURN(HA_POS_ERROR);
91
DBUG_RETURN(end_pos < start_pos ? (ha_rows) 0 :
89
92
(end_pos == start_pos ? (ha_rows) 1 : end_pos - start_pos));
94
97
/* Sets info->current_ptr to found record */
95
98
/* next_flag: Search=0, next=1, prev =2, same =3 */
97
unsigned char *hp_search(HP_INFO *info, HP_KEYDEF *keyinfo, const unsigned char *key,
100
uchar *hp_search(HP_INFO *info, HP_KEYDEF *keyinfo, const uchar *key,
100
103
register HASH_INFO *pos,*prev_ptr;
102
uint32_t old_nextflag;
103
106
HP_SHARE *share=info->s;
107
DBUG_ENTER("hp_search");
104
108
old_nextflag=nextflag;
116
120
switch (nextflag) {
117
121
case 0: /* Search after key */
122
DBUG_PRINT("exit", ("found key at 0x%lx", (long) pos->ptr_to_rec));
118
123
info->current_hash_ptr=pos;
119
return(info->current_ptr= pos->ptr_to_rec);
124
DBUG_RETURN(info->current_ptr= pos->ptr_to_rec);
120
125
case 1: /* Search next */
121
126
if (pos->ptr_to_rec == info->current_ptr)
127
132
my_errno=HA_ERR_KEY_NOT_FOUND; /* If gpos == 0 */
128
133
info->current_hash_ptr=prev_ptr;
129
return(info->current_ptr=prev_ptr ? prev_ptr->ptr_to_rec : 0);
134
DBUG_RETURN(info->current_ptr=prev_ptr ? prev_ptr->ptr_to_rec : 0);
131
136
prev_ptr=pos; /* Prev. record found */
155
160
/* Do a previous from end */
156
161
info->current_hash_ptr=prev_ptr;
157
return(info->current_ptr=prev_ptr ? prev_ptr->ptr_to_rec : 0);
162
DBUG_RETURN(info->current_ptr=prev_ptr ? prev_ptr->ptr_to_rec : 0);
160
165
if (old_nextflag && nextflag)
161
166
my_errno=HA_ERR_RECORD_CHANGED; /* Didn't find old record */
167
DBUG_PRINT("exit",("Error: %d",my_errno));
162
168
info->current_hash_ptr=0;
163
return((info->current_ptr= 0));
169
DBUG_RETURN((info->current_ptr= 0));
169
175
since last read !
172
unsigned char *hp_search_next(HP_INFO *info, HP_KEYDEF *keyinfo, const unsigned char *key,
178
uchar *hp_search_next(HP_INFO *info, HP_KEYDEF *keyinfo, const uchar *key,
181
DBUG_ENTER("hp_search_next");
175
183
while ((pos= pos->next_key))
177
185
if (! hp_key_cmp(keyinfo, pos->ptr_to_rec, key))
179
187
info->current_hash_ptr=pos;
180
return (info->current_ptr= pos->ptr_to_rec);
188
DBUG_RETURN (info->current_ptr= pos->ptr_to_rec);
183
191
my_errno=HA_ERR_KEY_NOT_FOUND;
192
DBUG_PRINT("exit",("Error: %d",my_errno));
184
193
info->current_hash_ptr=0;
185
return ((info->current_ptr= 0));
194
DBUG_RETURN ((info->current_ptr= 0));
199
208
Array index, in [0..maxlength)
202
uint32_t hp_mask(uint32_t hashnr, uint32_t buffmax, uint32_t maxlength)
211
ulong hp_mask(ulong hashnr, ulong buffmax, ulong maxlength)
204
213
if ((hashnr & (buffmax-1)) < maxlength) return (hashnr & (buffmax-1));
205
214
return (hashnr & ((buffmax >> 1) -1));
230
239
/* Calc hashvalue for a key */
232
uint32_t hp_hashnr(register HP_KEYDEF *keydef, register const unsigned char *key)
241
ulong hp_hashnr(register HP_KEYDEF *keydef, register const uchar *key)
235
uint32_t nr=1, nr2=4;
236
245
HA_KEYSEG *seg,*endseg;
238
247
for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++)
240
unsigned char *pos=(unsigned char*) key;
249
uchar *pos=(uchar*) key;
241
250
key+=seg->length;
242
251
if (seg->null_bit)
255
264
if (seg->type == HA_KEYTYPE_TEXT)
257
const CHARSET_INFO * const cs= seg->charset;
258
uint32_t length= seg->length;
266
CHARSET_INFO *cs= seg->charset;
267
uint length= seg->length;
259
268
if (cs->mbmaxlen > 1)
261
uint32_t char_length;
262
271
char_length= my_charpos(cs, pos, pos + length, length/cs->mbmaxlen);
263
272
set_if_smaller(length, char_length);
267
276
else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */
269
const CHARSET_INFO * const cs= seg->charset;
270
uint32_t pack_length= 2; /* Key packing is constant */
271
uint32_t length= uint2korr(pos);
278
CHARSET_INFO *cs= seg->charset;
279
uint pack_length= 2; /* Key packing is constant */
280
uint length= uint2korr(pos);
272
281
if (cs->mbmaxlen > 1)
274
uint32_t char_length;
275
284
char_length= my_charpos(cs, pos +pack_length,
276
285
pos +pack_length + length,
277
286
seg->length/cs->mbmaxlen);
285
for (; pos < (unsigned char*) key ; pos++)
294
for (; pos < (uchar*) key ; pos++)
287
nr^=(uint32_t) ((((uint) nr & 63)+nr2)*((uint) *pos)) + (nr << 8);
296
nr^=(ulong) ((((uint) nr & 63)+nr2)*((uint) *pos)) + (nr << 8);
292
return((uint32_t) nr);
301
DBUG_PRINT("exit", ("hash: 0x%lx", nr));
295
305
/* Calc hashvalue for a key in a record */
297
uint32_t hp_rec_hashnr(register HP_KEYDEF *keydef, register const unsigned char *rec)
307
ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const uchar *rec)
299
uint32_t nr=1, nr2=4;
300
310
HA_KEYSEG *seg,*endseg;
302
312
for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++)
304
unsigned char *pos=(unsigned char*) rec+seg->start,*end=pos+seg->length;
314
uchar *pos=(uchar*) rec+seg->start,*end=pos+seg->length;
305
315
if (seg->null_bit)
307
317
if (rec[seg->null_pos] & seg->null_bit)
313
323
if (seg->type == HA_KEYTYPE_TEXT)
315
const CHARSET_INFO * const cs= seg->charset;
316
uint32_t char_length= seg->length;
325
CHARSET_INFO *cs= seg->charset;
326
uint char_length= seg->length;
317
327
if (cs->mbmaxlen > 1)
319
329
char_length= my_charpos(cs, pos, pos + char_length,
325
335
else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */
327
const CHARSET_INFO * const cs= seg->charset;
328
uint32_t pack_length= seg->bit_start;
329
uint32_t length= (pack_length == 1 ? (uint) *(unsigned char*) pos : uint2korr(pos));
337
CHARSET_INFO *cs= seg->charset;
338
uint pack_length= seg->bit_start;
339
uint length= (pack_length == 1 ? (uint) *(uchar*) pos : uint2korr(pos));
330
340
if (cs->mbmaxlen > 1)
332
uint32_t char_length;
333
343
char_length= my_charpos(cs, pos + pack_length,
334
344
pos + pack_length + length,
335
345
seg->length/cs->mbmaxlen);
342
352
for (; pos < end ; pos++)
344
nr^=(uint32_t) ((((uint) nr & 63)+nr2)*((uint) *pos))+ (nr << 8);
354
nr^=(ulong) ((((uint) nr & 63)+nr2)*((uint) *pos))+ (nr << 8);
359
DBUG_PRINT("exit", ("hash: 0x%lx", nr));
366
377
* far, and works well on both numbers and strings.
369
uint32_t hp_hashnr(register HP_KEYDEF *keydef, register const unsigned char *key)
380
ulong hp_hashnr(register HP_KEYDEF *keydef, register const uchar *key)
372
383
Note, if a key consists of a combination of numeric and
374
385
Making text columns work with NEW_HASH_FUNCTION
375
386
needs also changes in strings/ctype-xxx.c.
377
uint32_t nr= 1, nr2= 4;
378
389
HA_KEYSEG *seg,*endseg;
380
391
for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++)
382
unsigned char *pos=(unsigned char*) key;
393
uchar *pos=(uchar*) key;
383
394
key+=seg->length;
384
395
if (seg->null_bit)
397
408
if (seg->type == HA_KEYTYPE_TEXT)
399
seg->charset->coll->hash_sort(seg->charset, pos, ((unsigned char*)key)-pos,
410
seg->charset->coll->hash_sort(seg->charset, pos, ((uchar*)key)-pos,
402
413
else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */
404
uint32_t pack_length= 2; /* Key packing is constant */
405
uint32_t length= uint2korr(pos);
415
uint pack_length= 2; /* Key packing is constant */
416
uint length= uint2korr(pos);
406
417
seg->charset->coll->hash_sort(seg->charset, pos+pack_length, length,
408
419
key+= pack_length;
412
for ( ; pos < (unsigned char*) key ; pos++)
423
for ( ; pos < (uchar*) key ; pos++)
415
426
nr ^=(uint) *pos;
430
DBUG_PRINT("exit", ("hash: 0x%lx", nr));
422
434
/* Calc hashvalue for a key in a record */
424
uint32_t hp_rec_hashnr(register HP_KEYDEF *keydef, register const unsigned char *rec)
436
ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const uchar *rec)
426
uint32_t nr= 1, nr2= 4;
427
439
HA_KEYSEG *seg,*endseg;
429
441
for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++)
431
unsigned char *pos=(unsigned char*) rec+seg->start;
443
uchar *pos=(uchar*) rec+seg->start;
432
444
if (seg->null_bit)
434
446
if (rec[seg->null_pos] & seg->null_bit)
440
452
if (seg->type == HA_KEYTYPE_TEXT)
442
uint32_t char_length= seg->length; /* TODO: fix to use my_charpos() */
454
uint char_length= seg->length; /* TODO: fix to use my_charpos() */
443
455
seg->charset->coll->hash_sort(seg->charset, pos, char_length,
446
458
else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */
448
uint32_t pack_length= seg->bit_start;
449
uint32_t length= (pack_length == 1 ? (uint) *(unsigned char*) pos : uint2korr(pos));
460
uint pack_length= seg->bit_start;
461
uint length= (pack_length == 1 ? (uint) *(uchar*) pos : uint2korr(pos));
450
462
seg->charset->coll->hash_sort(seg->charset, pos+pack_length,
451
463
length, &nr, &nr2);
455
unsigned char *end= pos+seg->length;
467
uchar *end= pos+seg->length;
456
468
for ( ; pos < end ; pos++)
486
499
<> 0 Key differes
489
int hp_rec_key_cmp(HP_KEYDEF *keydef, const unsigned char *rec1, const unsigned char *rec2,
490
bool diff_if_only_endspace_difference)
502
int hp_rec_key_cmp(HP_KEYDEF *keydef, const uchar *rec1, const uchar *rec2,
503
my_bool diff_if_only_endspace_difference)
492
505
HA_KEYSEG *seg,*endseg;
504
517
if (seg->type == HA_KEYTYPE_TEXT)
506
const CHARSET_INFO * const cs= seg->charset;
507
uint32_t char_length1;
508
uint32_t char_length2;
509
unsigned char *pos1= (unsigned char*)rec1 + seg->start;
510
unsigned char *pos2= (unsigned char*)rec2 + seg->start;
519
CHARSET_INFO *cs= seg->charset;
522
uchar *pos1= (uchar*)rec1 + seg->start;
523
uchar *pos2= (uchar*)rec2 + seg->start;
511
524
if (cs->mbmaxlen > 1)
513
uint32_t char_length= seg->length / cs->mbmaxlen;
526
uint char_length= seg->length / cs->mbmaxlen;
514
527
char_length1= my_charpos(cs, pos1, pos1 + seg->length, char_length);
515
528
set_if_smaller(char_length1, seg->length);
516
529
char_length2= my_charpos(cs, pos2, pos2 + seg->length, char_length);
528
541
else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */
530
unsigned char *pos1= (unsigned char*) rec1 + seg->start;
531
unsigned char *pos2= (unsigned char*) rec2 + seg->start;
532
uint32_t char_length1, char_length2;
533
uint32_t pack_length= seg->bit_start;
534
const CHARSET_INFO * const cs= seg->charset;
543
uchar *pos1= (uchar*) rec1 + seg->start;
544
uchar *pos2= (uchar*) rec2 + seg->start;
545
uint char_length1, char_length2;
546
uint pack_length= seg->bit_start;
547
CHARSET_INFO *cs= seg->charset;
535
548
if (pack_length == 1)
537
char_length1= (uint) *(unsigned char*) pos1++;
538
char_length2= (uint) *(unsigned char*) pos2++;
550
char_length1= (uint) *(uchar*) pos1++;
551
char_length2= (uint) *(uchar*) pos2++;
547
560
if (cs->mbmaxlen > 1)
549
uint32_t safe_length1= char_length1;
550
uint32_t safe_length2= char_length2;
551
uint32_t char_length= seg->length / cs->mbmaxlen;
562
uint safe_length1= char_length1;
563
uint safe_length2= char_length2;
564
uint char_length= seg->length / cs->mbmaxlen;
552
565
char_length1= my_charpos(cs, pos1, pos1 + char_length1, char_length);
553
566
set_if_smaller(char_length1, safe_length1);
554
567
char_length2= my_charpos(cs, pos2, pos2 + char_length2, char_length);
574
587
/* Compare a key in a record to a whole key */
576
int hp_key_cmp(HP_KEYDEF *keydef, const unsigned char *rec, const unsigned char *key)
589
int hp_key_cmp(HP_KEYDEF *keydef, const uchar *rec, const uchar *key)
578
591
HA_KEYSEG *seg,*endseg;
597
610
if (seg->type == HA_KEYTYPE_TEXT)
599
const CHARSET_INFO * const cs= seg->charset;
600
uint32_t char_length_key;
601
uint32_t char_length_rec;
602
unsigned char *pos= (unsigned char*) rec + seg->start;
612
CHARSET_INFO *cs= seg->charset;
613
uint char_length_key;
614
uint char_length_rec;
615
uchar *pos= (uchar*) rec + seg->start;
603
616
if (cs->mbmaxlen > 1)
605
uint32_t char_length= seg->length / cs->mbmaxlen;
618
uint char_length= seg->length / cs->mbmaxlen;
606
619
char_length_key= my_charpos(cs, key, key + seg->length, char_length);
607
620
set_if_smaller(char_length_key, seg->length);
608
621
char_length_rec= my_charpos(cs, pos, pos + seg->length, char_length);
617
630
if (seg->charset->coll->strnncollsp(seg->charset,
618
(unsigned char*) pos, char_length_rec,
619
(unsigned char*) key, char_length_key, 0))
631
(uchar*) pos, char_length_rec,
632
(uchar*) key, char_length_key, 0))
622
635
else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */
624
unsigned char *pos= (unsigned char*) rec + seg->start;
625
const CHARSET_INFO * const cs= seg->charset;
626
uint32_t pack_length= seg->bit_start;
627
uint32_t char_length_rec= (pack_length == 1 ? (uint) *(unsigned char*) pos :
637
uchar *pos= (uchar*) rec + seg->start;
638
CHARSET_INFO *cs= seg->charset;
639
uint pack_length= seg->bit_start;
640
uint char_length_rec= (pack_length == 1 ? (uint) *(uchar*) pos :
629
642
/* Key segments are always packed with 2 bytes */
630
uint32_t char_length_key= uint2korr(key);
643
uint char_length_key= uint2korr(key);
631
644
pos+= pack_length;
632
645
key+= 2; /* skip key pack length */
633
646
if (cs->mbmaxlen > 1)
635
uint32_t char_length1, char_length2;
648
uint char_length1, char_length2;
636
649
char_length1= char_length2= seg->length / cs->mbmaxlen;
637
650
char_length1= my_charpos(cs, key, key + char_length_key, char_length1);
638
651
set_if_smaller(char_length_key, char_length1);
643
656
if (cs->coll->strnncollsp(seg->charset,
644
(unsigned char*) pos, char_length_rec,
645
(unsigned char*) key, char_length_key, 0))
657
(uchar*) pos, char_length_rec,
658
(uchar*) key, char_length_key, 0))
650
if (memcmp(rec+seg->start,key,seg->length))
663
if (bcmp(rec+seg->start,key,seg->length))
658
671
/* Copy a key from a record to a keybuffer */
660
void hp_make_key(HP_KEYDEF *keydef, unsigned char *key, const unsigned char *rec)
673
void hp_make_key(HP_KEYDEF *keydef, uchar *key, const uchar *rec)
662
675
HA_KEYSEG *seg,*endseg;
664
677
for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++)
666
const CHARSET_INFO * const cs= seg->charset;
667
uint32_t char_length= seg->length;
668
unsigned char *pos= (unsigned char*) rec + seg->start;
679
CHARSET_INFO *cs= seg->charset;
680
uint char_length= seg->length;
681
uchar *pos= (uchar*) rec + seg->start;
669
682
if (seg->null_bit)
670
683
*key++= test(rec[seg->null_pos] & seg->null_bit);
671
684
if (cs->mbmaxlen > 1)
692
uint32_t hp_rb_make_key(HP_KEYDEF *keydef, unsigned char *key,
693
const unsigned char *rec, unsigned char *recpos)
705
uint hp_rb_make_key(HP_KEYDEF *keydef, uchar *key,
706
const uchar *rec, uchar *recpos)
695
unsigned char *start_key= key;
708
uchar *start_key= key;
696
709
HA_KEYSEG *seg, *endseg;
698
711
for (seg= keydef->seg, endseg= seg + keydef->keysegs; seg < endseg; seg++)
700
uint32_t char_length;
701
714
if (seg->null_bit)
703
716
if (!(*key++= 1 - test(rec[seg->null_pos] & seg->null_bit)))
706
719
if (seg->flag & HA_SWAP_KEY)
708
uint32_t length= seg->length;
709
unsigned char *pos= (unsigned char*) rec + seg->start;
721
uint length= seg->length;
722
uchar *pos= (uchar*) rec + seg->start;
711
724
#ifdef HAVE_ISNAN
712
725
if (seg->type == HA_KEYTYPE_FLOAT)
744
757
if (seg->flag & HA_VAR_LENGTH_PART)
746
unsigned char *pos= (unsigned char*) rec + seg->start;
747
uint32_t length= seg->length;
748
uint32_t pack_length= seg->bit_start;
749
uint32_t tmp_length= (pack_length == 1 ? (uint) *(unsigned char*) pos :
759
uchar *pos= (uchar*) rec + seg->start;
760
uint length= seg->length;
761
uint pack_length= seg->bit_start;
762
uint tmp_length= (pack_length == 1 ? (uint) *(uchar*) pos :
751
const CHARSET_INFO * const cs= seg->charset;
764
CHARSET_INFO *cs= seg->charset;
752
765
char_length= length/cs->mbmaxlen;
754
767
pos+= pack_length; /* Skip VARCHAR length */
755
768
set_if_smaller(length,tmp_length);
756
769
FIX_LENGTH(cs, pos, length, char_length);
757
770
store_key_length_inc(key,char_length);
758
memcpy(key,pos,(size_t) char_length);
771
memcpy((uchar*) key,(uchar*) pos,(size_t) char_length);
759
772
key+= char_length;
774
787
memcpy(key, rec + seg->start, (size_t) char_length);
775
788
key+= seg->length;
777
memcpy(key, &recpos, sizeof(unsigned char*));
790
memcpy(key, &recpos, sizeof(uchar*));
778
791
return (uint) (key - start_key);
782
uint32_t hp_rb_pack_key(HP_KEYDEF *keydef, unsigned char *key, const unsigned char *old,
795
uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old,
783
796
key_part_map keypart_map)
785
798
HA_KEYSEG *seg, *endseg;
786
unsigned char *start_key= key;
799
uchar *start_key= key;
788
801
for (seg= keydef->seg, endseg= seg + keydef->keysegs;
789
802
seg < endseg && keypart_map; old+= seg->length, seg++)
791
uint32_t char_length;
792
805
keypart_map>>= 1;
793
806
if (seg->null_bit)
798
811
if (seg->flag & HA_SWAP_KEY)
800
uint32_t length= seg->length;
801
unsigned char *pos= (unsigned char*) old + length;
813
uint length= seg->length;
814
uchar *pos= (uchar*) old + length;
809
822
if (seg->flag & (HA_VAR_LENGTH_PART | HA_BLOB_PART))
811
824
/* Length of key-part used with heap_rkey() always 2 */
812
uint32_t tmp_length=uint2korr(old);
813
uint32_t length= seg->length;
814
const CHARSET_INFO * const cs= seg->charset;
825
uint tmp_length=uint2korr(old);
826
uint length= seg->length;
827
CHARSET_INFO *cs= seg->charset;
815
828
char_length= length/cs->mbmaxlen;
818
831
set_if_smaller(length,tmp_length); /* Safety */
819
832
FIX_LENGTH(cs, old, length, char_length);
820
833
store_key_length_inc(key,char_length);
821
memcpy(key, old,(size_t) char_length);
834
memcpy((uchar*) key, old,(size_t) char_length);
822
835
key+= char_length;
842
uint32_t hp_rb_key_length(HP_KEYDEF *keydef,
843
const unsigned char *key __attribute__((unused)))
855
uint hp_rb_key_length(HP_KEYDEF *keydef,
856
const uchar *key __attribute__((unused)))
845
858
return keydef->length;
849
uint32_t hp_rb_null_key_length(HP_KEYDEF *keydef, const unsigned char *key)
862
uint hp_rb_null_key_length(HP_KEYDEF *keydef, const uchar *key)
851
const unsigned char *start_key= key;
864
const uchar *start_key= key;
852
865
HA_KEYSEG *seg, *endseg;
854
867
for (seg= keydef->seg, endseg= seg + keydef->keysegs; seg < endseg; seg++)
864
uint32_t hp_rb_var_key_length(HP_KEYDEF *keydef, const unsigned char *key)
877
uint hp_rb_var_key_length(HP_KEYDEF *keydef, const uchar *key)
866
const unsigned char *start_key= key;
879
const uchar *start_key= key;
867
880
HA_KEYSEG *seg, *endseg;
869
882
for (seg= keydef->seg, endseg= seg + keydef->keysegs; seg < endseg; seg++)
871
uint32_t length= seg->length;
884
uint length= seg->length;
872
885
if (seg->null_bit && !*key++)
874
887
if (seg->flag & (HA_VAR_LENGTH_PART | HA_BLOB_PART))
891
bool hp_if_null_in_key(HP_KEYDEF *keydef, const unsigned char *record)
904
my_bool hp_if_null_in_key(HP_KEYDEF *keydef, const uchar *record)
893
906
HA_KEYSEG *seg,*endseg;
894
907
for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++)
917
void heap_update_auto_increment(HP_INFO *info, const unsigned char *record)
930
void heap_update_auto_increment(HP_INFO *info, const uchar *record)
919
uint64_t value= 0; /* Store unsigned values here */
920
int64_t s_value= 0; /* Store signed values here */
932
ulonglong value= 0; /* Store unsigned values here */
933
longlong s_value= 0; /* Store signed values here */
922
935
HA_KEYSEG *keyseg= info->s->keydef[info->s->auto_key - 1].seg;
923
const unsigned char *key= (unsigned char*) record + keyseg->start;
936
const uchar *key= (uchar*) record + keyseg->start;
925
938
switch (info->s->auto_key_type) {
926
939
case HA_KEYTYPE_INT8:
927
s_value= (int64_t) *(char*)key;
940
s_value= (longlong) *(char*)key;
929
942
case HA_KEYTYPE_BINARY:
930
value=(uint64_t) *(unsigned char*) key;
943
value=(ulonglong) *(uchar*) key;
932
945
case HA_KEYTYPE_SHORT_INT:
933
s_value= (int64_t) sint2korr(key);
946
s_value= (longlong) sint2korr(key);
935
948
case HA_KEYTYPE_USHORT_INT:
936
value=(uint64_t) uint2korr(key);
949
value=(ulonglong) uint2korr(key);
938
951
case HA_KEYTYPE_LONG_INT:
939
s_value= (int64_t) sint4korr(key);
952
s_value= (longlong) sint4korr(key);
941
954
case HA_KEYTYPE_ULONG_INT:
942
value=(uint64_t) uint4korr(key);
955
value=(ulonglong) uint4korr(key);
944
957
case HA_KEYTYPE_INT24:
945
s_value= (int64_t) sint3korr(key);
958
s_value= (longlong) sint3korr(key);
947
960
case HA_KEYTYPE_UINT24:
948
value=(uint64_t) uint3korr(key);
961
value=(ulonglong) uint3korr(key);
950
963
case HA_KEYTYPE_FLOAT: /* This shouldn't be used */
953
966
float4get(f_1,key);
954
967
/* Ignore negative values */
955
value = (f_1 < (float) 0.0) ? 0 : (uint64_t) f_1;
968
value = (f_1 < (float) 0.0) ? 0 : (ulonglong) f_1;
958
971
case HA_KEYTYPE_DOUBLE: /* This shouldn't be used */