diff options
author | Alexander Barkov <bar@mariadb.com> | 2020-01-26 20:27:13 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2020-01-28 12:29:23 +0400 |
commit | f1e13fdc8d9e78f4529aa60b6a9b49c6ff063c66 (patch) | |
tree | ce84da1deeea573be5be7db7d739a4c9ba9b40f8 /storage/heap | |
parent | dd68ba74f357aca074609cbd77491ed4ba390369 (diff) | |
download | mariadb-git-f1e13fdc8d9e78f4529aa60b6a9b49c6ff063c66.tar.gz |
MDEV-21581 Helper functions and methods for CHARSET_INFO
Diffstat (limited to 'storage/heap')
-rw-r--r-- | storage/heap/hp_create.c | 6 | ||||
-rw-r--r-- | storage/heap/hp_hash.c | 77 |
2 files changed, 46 insertions, 37 deletions
diff --git a/storage/heap/hp_create.c b/storage/heap/hp_create.c index 171756071eb..8bd653f1b84 100644 --- a/storage/heap/hp_create.c +++ b/storage/heap/hp_create.c @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2018, Oracle and/or its affiliates. - Copyright (c) 2010, 2018, MariaDB Corporation. + Copyright (c) 2010, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -93,7 +93,7 @@ int heap_create(const char *name, HP_CREATE_INFO *create_info, keyinfo->seg[j].flag|= HA_SWAP_KEY; break; case HA_KEYTYPE_VARBINARY1: - /* Case-insensitiveness is handled in coll->hash_sort */ + /* Case-insensitiveness is handled in hash_sort */ keyinfo->seg[j].type= HA_KEYTYPE_VARTEXT1; /* fall through */ case HA_KEYTYPE_VARTEXT1: @@ -110,7 +110,7 @@ int heap_create(const char *name, HP_CREATE_INFO *create_info, keyinfo->seg[j].bit_start= 1; break; case HA_KEYTYPE_VARBINARY2: - /* Case-insensitiveness is handled in coll->hash_sort */ + /* Case-insensitiveness is handled in hash_sort */ /* fall_through */ case HA_KEYTYPE_VARTEXT2: keyinfo->flag|= HA_VAR_LENGTH_KEY; diff --git a/storage/heap/hp_hash.c b/storage/heap/hp_hash.c index 5c4b3b50290..00967dca52f 100644 --- a/storage/heap/hp_hash.c +++ b/storage/heap/hp_hash.c @@ -1,5 +1,6 @@ /* Copyright (c) 2000, 2010, Oracle and/or its affiliates + Copyright (c) 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,6 +20,14 @@ #include "heapdef.h" #include <m_ctype.h> + +static inline size_t +hp_charpos(CHARSET_INFO *cs, const uchar *b, const uchar *e, size_t num) +{ + return my_ci_charpos(cs, (const char*) b, (const char *) e, num); +} + + static ulong hp_hashnr(HP_KEYDEF *keydef, const uchar *key); /* Find out how many rows there is in the given range @@ -242,10 +251,10 @@ static ulong hp_hashnr(HP_KEYDEF *keydef, const uchar *key) if (cs->mbmaxlen > 1) { size_t char_length; - char_length= my_charpos(cs, pos, pos + length, length/cs->mbmaxlen); + char_length= hp_charpos(cs, pos, pos + length, length/cs->mbmaxlen); set_if_smaller(length, char_length); } - cs->coll->hash_sort(cs, pos, length, &nr, &nr2); + my_ci_hash_sort(cs, pos, length, &nr, &nr2); } else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */ { @@ -255,12 +264,12 @@ static ulong hp_hashnr(HP_KEYDEF *keydef, const uchar *key) if (cs->mbmaxlen > 1) { size_t char_length; - char_length= my_charpos(cs, pos +pack_length, + char_length= hp_charpos(cs, pos +pack_length, pos +pack_length + length, seg->length/cs->mbmaxlen); set_if_smaller(length, char_length); } - cs->coll->hash_sort(cs, pos+pack_length, length, &nr, &nr2); + my_ci_hash_sort(cs, pos+pack_length, length, &nr, &nr2); key+= pack_length; } else @@ -302,11 +311,11 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const uchar *rec) size_t char_length= seg->length; if (cs->mbmaxlen > 1) { - char_length= my_charpos(cs, pos, pos + char_length, + char_length= hp_charpos(cs, pos, pos + char_length, char_length / cs->mbmaxlen); set_if_smaller(char_length, seg->length); /* QQ: ok to remove? */ } - cs->coll->hash_sort(cs, pos, char_length, &nr, &nr2); + my_ci_hash_sort(cs, pos, char_length, &nr, &nr2); } else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */ { @@ -316,14 +325,14 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const uchar *rec) if (cs->mbmaxlen > 1) { size_t char_length; - char_length= my_charpos(cs, pos + pack_length, + char_length= hp_charpos(cs, pos + pack_length, pos + pack_length + length, seg->length/cs->mbmaxlen); set_if_smaller(length, char_length); } else set_if_smaller(length, seg->length); - cs->coll->hash_sort(cs, pos+pack_length, length, &nr, &nr2); + my_ci_hash_sort(cs, pos+pack_length, length, &nr, &nr2); } else { @@ -392,18 +401,18 @@ int hp_rec_key_cmp(HP_KEYDEF *keydef, const uchar *rec1, const uchar *rec2) if (cs->mbmaxlen > 1) { size_t char_length= seg->length / cs->mbmaxlen; - char_length1= my_charpos(cs, pos1, pos1 + seg->length, char_length); + char_length1= hp_charpos(cs, pos1, pos1 + seg->length, char_length); set_if_smaller(char_length1, seg->length); - char_length2= my_charpos(cs, pos2, pos2 + seg->length, char_length); + char_length2= hp_charpos(cs, pos2, pos2 + seg->length, char_length); set_if_smaller(char_length2, seg->length); } else { char_length1= char_length2= seg->length; } - if (seg->charset->coll->strnncollsp(seg->charset, - pos1,char_length1, - pos2,char_length2)) + if (my_ci_strnncollsp(seg->charset, + pos1, char_length1, + pos2, char_length2)) return 1; } else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */ @@ -430,9 +439,9 @@ int hp_rec_key_cmp(HP_KEYDEF *keydef, const uchar *rec1, const uchar *rec2) size_t safe_length1= char_length1; size_t safe_length2= char_length2; size_t char_length= seg->length / cs->mbmaxlen; - char_length1= my_charpos(cs, pos1, pos1 + char_length1, char_length); + char_length1= hp_charpos(cs, pos1, pos1 + char_length1, char_length); set_if_smaller(char_length1, safe_length1); - char_length2= my_charpos(cs, pos2, pos2 + char_length2, char_length); + char_length2= hp_charpos(cs, pos2, pos2 + char_length2, char_length); set_if_smaller(char_length2, safe_length2); } else @@ -441,9 +450,9 @@ int hp_rec_key_cmp(HP_KEYDEF *keydef, const uchar *rec1, const uchar *rec2) set_if_smaller(char_length2, seg->length); } - if (cs->coll->strnncollsp(seg->charset, - pos1, char_length1, - pos2, char_length2)) + if (my_ci_strnncollsp(seg->charset, + pos1, char_length1, + pos2, char_length2)) return 1; } else @@ -498,9 +507,9 @@ int hp_key_cmp(HP_KEYDEF *keydef, const uchar *rec, const uchar *key) if (cs->mbmaxlen > 1) { size_t char_length= seg->length / cs->mbmaxlen; - char_length_key= my_charpos(cs, key, key + seg->length, char_length); + char_length_key= hp_charpos(cs, key, key + seg->length, char_length); set_if_smaller(char_length_key, seg->length); - char_length_rec= my_charpos(cs, pos, pos + seg->length, char_length); + char_length_rec= hp_charpos(cs, pos, pos + seg->length, char_length); set_if_smaller(char_length_rec, seg->length); } else @@ -509,9 +518,9 @@ int hp_key_cmp(HP_KEYDEF *keydef, const uchar *rec, const uchar *key) char_length_rec= seg->length; } - if (seg->charset->coll->strnncollsp(seg->charset, - (uchar*) pos, char_length_rec, - (uchar*) key, char_length_key)) + if (my_ci_strnncollsp(seg->charset, + pos, char_length_rec, + key, char_length_key)) return 1; } else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */ @@ -529,17 +538,17 @@ int hp_key_cmp(HP_KEYDEF *keydef, const uchar *rec, const uchar *key) { size_t char_length1, char_length2; char_length1= char_length2= seg->length / cs->mbmaxlen; - char_length1= my_charpos(cs, key, key + char_length_key, char_length1); + char_length1= hp_charpos(cs, key, key + char_length_key, char_length1); set_if_smaller(char_length_key, char_length1); - char_length2= my_charpos(cs, pos, pos + char_length_rec, char_length2); + char_length2= hp_charpos(cs, pos, pos + char_length_rec, char_length2); set_if_smaller(char_length_rec, char_length2); } else set_if_smaller(char_length_rec, seg->length); - if (cs->coll->strnncollsp(seg->charset, - (uchar*) pos, char_length_rec, - (uchar*) key, char_length_key)) + if (my_ci_strnncollsp(seg->charset, + pos, char_length_rec, + key, char_length_key)) return 1; } else @@ -578,7 +587,7 @@ void hp_make_key(HP_KEYDEF *keydef, uchar *key, const uchar *rec) *key++= MY_TEST(rec[seg->null_pos] & seg->null_bit); if (cs->mbmaxlen > 1) { - char_length= my_charpos(cs, pos, pos + seg->length, + char_length= hp_charpos(cs, pos, pos + seg->length, char_length / cs->mbmaxlen); set_if_smaller(char_length, seg->length); /* QQ: ok to remove? */ } @@ -598,7 +607,7 @@ void hp_make_key(HP_KEYDEF *keydef, uchar *key, const uchar *rec) #define FIX_LENGTH(cs, pos, length, char_length) \ do { \ if (length > char_length) \ - char_length= my_charpos(cs, pos, pos+length, char_length); \ + char_length= hp_charpos(cs, pos, pos+length, char_length); \ set_if_smaller(char_length,length); \ } while(0) @@ -676,12 +685,12 @@ uint hp_rb_make_key(HP_KEYDEF *keydef, uchar *key, char_length= seg->length; if (seg->charset->mbmaxlen > 1) { - char_length= my_charpos(seg->charset, + char_length= hp_charpos(seg->charset, rec + seg->start, rec + seg->start + char_length, char_length / seg->charset->mbmaxlen); set_if_smaller(char_length, seg->length); /* QQ: ok to remove? */ if (char_length < seg->length) - seg->charset->cset->fill(seg->charset, (char*) key + char_length, + my_ci_fill(seg->charset, (char*) key + char_length, seg->length - char_length, ' '); } if (seg->type == HA_KEYTYPE_BIT && seg->bit_length) @@ -750,11 +759,11 @@ uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old, char_length= seg->length; if (seg->charset->mbmaxlen > 1) { - char_length= my_charpos(seg->charset, old, old+char_length, + char_length= hp_charpos(seg->charset, old, old+char_length, char_length / seg->charset->mbmaxlen); set_if_smaller(char_length, seg->length); /* QQ: ok to remove? */ if (char_length < seg->length) - seg->charset->cset->fill(seg->charset, (char*) key + char_length, + my_ci_fill(seg->charset, (char*) key + char_length, seg->length - char_length, ' '); } memcpy(key, old, (size_t) char_length); |