diff options
author | unknown <monty@hundin.mysql.fi> | 2002-04-13 15:34:39 +0300 |
---|---|---|
committer | unknown <monty@hundin.mysql.fi> | 2002-04-13 15:34:39 +0300 |
commit | fdc446d0c621c3be38b5b11cc0e40308679fb996 (patch) | |
tree | 6bb12842fb04d64fa854f04ec3d07da1e1f7c48b /mysys/hash.c | |
parent | 54373c16f8435db653ffbad55466e457eb816976 (diff) | |
parent | adc7a375368892eac433e19aab29ecefcf867d4b (diff) | |
download | mariadb-git-fdc446d0c621c3be38b5b11cc0e40308679fb996.tar.gz |
merge
BitKeeper/etc/ignore:
auto-union
BitKeeper/etc/logging_ok:
auto-union
BUILD/FINISH.sh:
Auto merged
BUILD/SETUP.sh:
Auto merged
BUILD/compile-pentium-debug:
Auto merged
acconfig.h:
Auto merged
client/mysql.cc:
Auto merged
client/mysqldump.c:
Auto merged
client/mysqltest.c:
Auto merged
heap/hp_rfirst.c:
Auto merged
heap/hp_rnext.c:
Auto merged
include/my_sys.h:
Auto merged
include/myisam.h:
Auto merged
libmysql/Makefile.shared:
Auto merged
myisam/mi_write.c:
Auto merged
mysql-test/mysql-test-run.sh:
Auto merged
mysql-test/r/heap.result:
Auto merged
mysql-test/r/select_found.result:
Auto merged
mysql-test/r/union.result:
Auto merged
mysql-test/t/heap.test:
Auto merged
mysql-test/t/select_found.test:
Auto merged
mysql-test/t/union.test:
Auto merged
mysys/mf_iocache2.c:
Auto merged
mysys/my_vsnprintf.c:
Auto merged
sql/convert.cc:
Auto merged
sql/field.cc:
Auto merged
sql/field.h:
Auto merged
sql/filesort.cc:
Auto merged
sql/ha_myisam.cc:
Auto merged
sql/item.cc:
Auto merged
sql/item.h:
Auto merged
sql/item_cmpfunc.cc:
Auto merged
sql/item_func.cc:
Auto merged
sql/item_func.h:
Auto merged
sql/item_strfunc.cc:
Auto merged
sql/item_timefunc.cc:
Auto merged
sql/lex.h:
Auto merged
sql/log.cc:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/mysqld.cc:
Auto merged
sql/opt_range.cc:
Auto merged
sql/opt_range.h:
Auto merged
sql/opt_sum.cc:
Auto merged
sql/slave.cc:
Auto merged
sql/sql_base.cc:
Auto merged
sql/sql_cache.cc:
Auto merged
sql/sql_class.cc:
Auto merged
sql/sql_db.cc:
Auto merged
sql/sql_handler.cc:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/sql_lex.h:
Auto merged
sql/sql_parse.cc:
Auto merged
sql/sql_show.cc:
Auto merged
sql/sql_table.cc:
Auto merged
sql/sql_union.cc:
Auto merged
sql/sql_yacc.yy:
Auto merged
sql/structs.h:
Auto merged
sql/table.cc:
Auto merged
sql/table.h:
Auto merged
strings/Makefile.am:
Auto merged
Diffstat (limited to 'mysys/hash.c')
-rw-r--r-- | mysys/hash.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/mysys/hash.c b/mysys/hash.c index b3769d1dfb2..656732598c1 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -31,12 +31,13 @@ static uint hash_mask(uint hashnr,uint buffmax,uint maxlength); static void movelink(HASH_LINK *array,uint pos,uint next_link,uint newlink); -static uint calc_hashnr(const byte *key,uint length); -static uint calc_hashnr_caseup(const byte *key,uint length); +static uint calc_hashnr(CHARSET_INFO *cs,const byte *key,uint length); +static uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key,uint length); static int hashcmp(HASH *hash,HASH_LINK *pos,const byte *key,uint length); -my_bool _hash_init(HASH *hash,uint size,uint key_offset,uint key_length, +_hash_init(HASH *hash,CHARSET_INFO *charset, + uint size,uint key_offset,uint key_length, hash_get_key get_key, void (*free_element)(void*),uint flags CALLER_INFO_PROTO) { @@ -56,6 +57,7 @@ my_bool _hash_init(HASH *hash,uint size,uint key_offset,uint key_length, hash->get_key=get_key; hash->free=free_element; hash->flags=flags; + hash->charset=charset; if (flags & HASH_CASE_INSENSITIVE) hash->calc_hashnr=calc_hashnr_caseup; else @@ -104,14 +106,16 @@ static uint hash_rec_mask(HASH *hash,HASH_LINK *pos,uint buffmax, { uint length; byte *key=hash_key(hash,pos->data,&length,0); - return hash_mask((*hash->calc_hashnr)(key,length),buffmax,maxlength); + return hash_mask((*hash->calc_hashnr)(hash->charset,key,length), + buffmax,maxlength); } #ifndef NEW_HASH_FUNCTION /* Calc hashvalue for a key */ -static uint calc_hashnr(const byte *key,uint length) +static uint calc_hashnr(CHARSET_INFO *cs __attribute__((unused)), + const byte *key,uint length) { register uint nr=1, nr2=4; while (length--) @@ -124,12 +128,13 @@ static uint calc_hashnr(const byte *key,uint length) /* Calc hashvalue for a key, case indepenently */ -static uint calc_hashnr_caseup(const byte *key,uint length) +static uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key,uint length) { register uint nr=1, nr2=4; while (length--) { - nr^= (((nr & 63)+nr2)*((uint) (uchar) toupper(*key++)))+ (nr << 8); + nr^= (((nr & 63)+nr2)* + ((uint) (uchar) my_toupper(cs, *key++)))+ (nr << 8); nr2+=3; } return((uint) nr); @@ -150,7 +155,7 @@ static uint calc_hashnr_caseup(const byte *key,uint length) * This works well on both numbers and strings. */ -uint calc_hashnr(const byte *key, uint len) +uint calc_hashnr(CHARSET_INFO *cs, const byte *key, uint len) { const byte *end=key+len; uint hash; @@ -162,14 +167,14 @@ uint calc_hashnr(const byte *key, uint len) return (hash); } -uint calc_hashnr_caseup(const byte *key, uint len) +uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key, uint len) { const byte *end=key+len; uint hash; for (hash = 0; key < end; key++) { hash *= 16777619; - hash ^= (uint) (uchar) toupper(*key); + hash ^= (uint) (uchar) my_toupper(cs,*key); } return (hash); } @@ -184,7 +189,7 @@ uint rec_hashnr(HASH *hash,const byte *record) { uint length; byte *key=hash_key(hash,record,&length,0); - return (*hash->calc_hashnr)(key,length); + return (*hash->calc_hashnr)(hash->charset,key,length); } @@ -200,7 +205,7 @@ gptr hash_search(HASH *hash,const byte *key,uint length) flag=1; if (hash->records) { - idx=hash_mask((*hash->calc_hashnr)(key,length ? length : + idx=hash_mask((*hash->calc_hashnr)(hash->charset,key,length ? length : hash->key_length), hash->blength,hash->records); do @@ -273,7 +278,7 @@ static int hashcmp(HASH *hash,HASH_LINK *pos,const byte *key,uint length) byte *rec_key=hash_key(hash,pos->data,&rec_keylength,1); return (length && length != rec_keylength) || (hash->flags & HASH_CASE_INSENSITIVE ? - my_casecmp(rec_key,key,rec_keylength) : + my_strncasecmp(hash->charset, rec_key,key,rec_keylength) : memcmp(rec_key,key,rec_keylength)); } @@ -513,7 +518,7 @@ my_bool hash_update(HASH *hash,byte *record,byte *old_key,uint old_key_length) /* Search after record with key */ - idx=hash_mask((*hash->calc_hashnr)(old_key,(old_key_length ? + idx=hash_mask((*hash->calc_hashnr)(hash->charset, old_key,(old_key_length ? old_key_length : hash->key_length)), blength,records); |