~mdcallag/+junk/5.1-map

« back to all changes in this revision

Viewing changes to storage/heap/hp_hash.c

  • Committer: msvensson at pilot
  • Date: 2007-04-24 09:11:45 UTC
  • mfrom: (2469.1.106)
  • Revision ID: sp1r-msvensson@pilot.blaudden-20070424091145-10463
Merge pilot.blaudden:/home/msvensson/mysql/my51-m-mysql_upgrade
into  pilot.blaudden:/home/msvensson/mysql/mysql-5.1-maint

Show diffs side-by-side

added added

removed removed

Lines of Context:
35
35
      HA_READ_KEY_EXACT         Include the key in the range
36
36
      HA_READ_AFTER_KEY         Don't include key in range
37
37
 
38
 
    max_key.flag can have one of the following values:  
 
38
    max_key.flag can have one of the following values:
39
39
      HA_READ_BEFORE_KEY        Don't include key in range
40
40
      HA_READ_AFTER_KEY         Include all 'end_key' values in the range
41
41
 
62
62
  {
63
63
    custom_arg.key_length= hp_rb_pack_key(keyinfo, (uchar*) info->recbuf,
64
64
                                          (uchar*) min_key->key,
65
 
                                          min_key->length);
 
65
                                          min_key->keypart_map);
66
66
    start_pos= tree_record_pos(rb_tree, info->recbuf, min_key->flag,
67
67
                               &custom_arg);
68
68
  }
70
70
  {
71
71
    start_pos= 0;
72
72
  }
73
 
  
 
73
 
74
74
  if (max_key)
75
75
  {
76
76
    custom_arg.key_length= hp_rb_pack_key(keyinfo, (uchar*) info->recbuf,
77
77
                                          (uchar*) max_key->key,
78
 
                                          max_key->length);
 
78
                                          max_key->keypart_map);
79
79
    end_pos= tree_record_pos(rb_tree, info->recbuf, max_key->flag,
80
80
                             &custom_arg);
81
81
  }
772
772
                              char_length / seg->charset->mbmaxlen);
773
773
      set_if_smaller(char_length, seg->length); /* QQ: ok to remove? */
774
774
      if (char_length < seg->length)
775
 
        seg->charset->cset->fill(seg->charset, (char*) key + char_length, 
 
775
        seg->charset->cset->fill(seg->charset, (char*) key + char_length,
776
776
                                 seg->length - char_length, ' ');
777
777
    }
778
778
    memcpy(key, rec + seg->start, (size_t) char_length);
784
784
 
785
785
 
786
786
uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old,
787
 
                    uint k_len)
 
787
                    key_part_map keypart_map)
788
788
{
789
789
  HA_KEYSEG *seg, *endseg;
790
790
  uchar *start_key= key;
791
 
  
 
791
 
792
792
  for (seg= keydef->seg, endseg= seg + keydef->keysegs;
793
 
       seg < endseg && (int) k_len > 0; old+= seg->length, seg++)
 
793
       seg < endseg && keypart_map; old+= seg->length, seg++)
794
794
  {
795
795
    uint char_length;
 
796
    keypart_map>>= 1;
796
797
    if (seg->null_bit)
797
798
    {
798
 
      k_len--;
799
799
      if (!(*key++= (char) 1 - *old++))
800
 
      {
801
 
        k_len-= seg->length;
802
800
        continue;
803
801
      }
804
 
    }
805
802
    if (seg->flag & HA_SWAP_KEY)
806
803
    {
807
804
      uint length= seg->length;
808
805
      byte *pos= (byte*) old + length;
809
806
      
810
 
      k_len-= length;
811
807
      while (length--)
812
808
      {
813
809
        *key++= *--pos;
822
818
      CHARSET_INFO *cs= seg->charset;
823
819
      char_length= length/cs->mbmaxlen;
824
820
 
825
 
      k_len-= 2+length;
826
821
      old+= 2;
827
822
      set_if_smaller(length,tmp_length);        /* Safety */
828
823
      FIX_LENGTH(cs, old, length, char_length);
843
838
    }
844
839
    memcpy(key, old, (size_t) char_length);
845
840
    key+= seg->length;
846
 
    k_len-= seg->length;
847
841
  }
848
842
  return (uint) (key - start_key);
849
843
}