summaryrefslogtreecommitdiff
path: root/storage/heap
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2020-01-26 20:27:13 +0400
committerAlexander Barkov <bar@mariadb.com>2020-01-28 12:29:23 +0400
commitf1e13fdc8d9e78f4529aa60b6a9b49c6ff063c66 (patch)
treece84da1deeea573be5be7db7d739a4c9ba9b40f8 /storage/heap
parentdd68ba74f357aca074609cbd77491ed4ba390369 (diff)
downloadmariadb-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.c6
-rw-r--r--storage/heap/hp_hash.c77
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);