mirror of
https://github.com/MariaDB/server.git
synced 2025-01-23 15:24:16 +01:00
16115af97c
Fixed problem with LIKE with latin1_de Added parsing support of UNSIGNED LONG LONG Docs/manual.texi: Changelog client/client_priv.h: Changed to use my_global.h client/completion_hash.cc: Changed to use my_global.h client/errmsg.c: Changed to use my_global.h client/get_password.c: Changed to use my_global.h client/mysqldump.c: Changed to use my_global.h client/mysqlshow.c: Changed to use my_global.h client/mysqltest.c: Changed to use my_global.h client/password.c: Changed to use my_global.h client/readline.cc: Changed to use my_global.h client/sql_string.cc: Changed to use my_global.h client/thimble.cc: Changed to use my_global.h client/thread_test.c: Changed to use my_global.h dbug/dbug.c: Changed to use my_global.h dbug/dbug_analyze.c: Changed to use my_global.h dbug/example1.c: Changed to use my_global.h dbug/example2.c: Changed to use my_global.h dbug/example3.c: Changed to use my_global.h dbug/factorial.c: Changed to use my_global.h dbug/main.c: Changed to use my_global.h dbug/sanity.c: Changed to use my_global.h extra/comp_err.c: Changed to use my_global.h extra/my_print_defaults.c: Changed to use my_global.h extra/perror.c: Changed to use my_global.h extra/replace.c: Changed to use my_global.h extra/resolve_stack_dump.c: Changed to use my_global.h extra/resolveip.c: Changed to use my_global.h fs/libmysqlfs.h: Changed to use my_global.h fs/mysqlcorbafs.h: Changed to use my_global.h heap/hp_test1.c: Changed to use my_global.h include/Makefile.am: Changed to use my_global.h include/m_ctype.h: Changed to use my_global.h include/my_base.h: Changed to use my_global.h innobase/include/univ.i: Changed to use my_global.h libmysql/dll.c: Changed to use my_global.h libmysql/errmsg.c: Changed to use my_global.h libmysql/get_password.c: Changed to use my_global.h libmysql/libmysql.c: Changed to use my_global.h libmysql/net.c: Changed to use my_global.h libmysql/password.c: Changed to use my_global.h libmysqld/lib_sql.cc: Changed to use my_global.h libmysqld/lib_vio.c: Changed to use my_global.h libmysqld/libmysqld.c: Changed to use my_global.h mysql-test/mysql-test-run.sh: Changed to use latin1 as default character set mysql-test/r/ctype_latin1_de.result: Changed to use my_global.h mysql-test/r/func_like.result: New test mysql-test/t/ctype_latin1_de.test: Added test of part keys mysql-test/t/func_like.test: New test mysys/checksum.c: Changed to use my_global.h mysys/getopt.c: Changed to use my_global.h mysys/getopt1.c: Changed to use my_global.h mysys/make-conf.c: Changed to use my_global.h mysys/my_alloc.c: Changed to use my_global.h mysys/my_clock.c: Changed to use my_global.h mysys/my_compress.c: Changed to use my_global.h mysys/mysys_priv.h: Changed to use my_global.h mysys/test_charset.c: Changed to use my_global.h mysys/testhash.c: Changed to use my_global.h mysys/thr_alarm.c: Changed to use my_global.h mysys/thr_mutex.c: Changed to use my_global.h regex/debug.c: Changed to use my_global.h regex/main.c: Changed to use my_global.h regex/regcomp.c: Changed to use my_global.h regex/regerror.c: Changed to use my_global.h regex/regexec.c: Changed to use my_global.h regex/regexp.c: Changed to use my_global.h regex/regfree.c: Changed to use my_global.h regex/reginit.c: Changed to use my_global.h sql/cache_manager.cc: Changed to use my_global.h sql/gen_lex_hash.cc: Changed to use my_global.h sql/ha_berkeley.cc: Fixed problem with UNIQUE keys that could contain NULL sql/ha_gemini.h: Changed to use my_global.h sql/handler.cc: Fixed problem after merge sql/item.cc: Added Item_unit sql/item.h: Added Item_uint sql/matherr.c: Changed to use my_global.h sql/md5.c: Changed to use my_global.h sql/mini_client.cc: Changed to use my_global.h sql/my_lock.c: Changed to use my_global.h sql/mysql_priv.h: Changed to use my_global.h sql/net_serv.cc: Changed to use my_global.h sql/password.c: Changed to use my_global.h sql/sql_lex.cc: Added parsing support of UNSIGNED LONG LONG sql/sql_show.cc: Changed to use my_global.h sql/sql_string.cc: Changed to use my_global.h sql/sql_yacc.yy: Added usage of Int_uint sql/stacktrace.c: Changed to use my_global.h sql/udf_example.cc: Changed to use my_global.h strings/atof.c: Changed to use my_global.h strings/bchange.c: Changed to use my_global.h strings/bcmp.c: Changed to use my_global.h strings/bfill.c: Changed to use my_global.h strings/bmove.c: Changed to use my_global.h strings/bmove512.c: Changed to use my_global.h strings/bmove_upp.c: Changed to use my_global.h strings/ctype-big5.c: Changed to use my_global.h strings/ctype-czech.c: Changed to use my_global.h strings/ctype-euc_kr.c: Changed to use my_global.h strings/ctype-gb2312.c: Changed to use my_global.h strings/ctype-gbk.c: Changed to use my_global.h strings/ctype-latin1_de.c: Fixed problem with LIKE strings/ctype-sjis.c: Changed to use my_global.h strings/ctype-tis620.c: Changed to use my_global.h strings/ctype-ujis.c: Changed to use my_global.h strings/ctype.c: Changed to use my_global.h strings/do_ctype.c: Changed to use my_global.h strings/int2str.c: Changed to use my_global.h strings/is_prefix.c: Changed to use my_global.h strings/llstr.c: Changed to use my_global.h strings/longlong2str.c: Changed to use my_global.h strings/r_strinstr.c: Changed to use my_global.h strings/str2int.c: Changed to use my_global.h strings/str_test.c: Changed to use my_global.h strings/strappend.c: Changed to use my_global.h strings/strcend.c: Changed to use my_global.h strings/strcont.c: Changed to use my_global.h strings/strend.c: Changed to use my_global.h strings/strfill.c: Changed to use my_global.h strings/strings-not-used.h: Changed to use my_global.h strings/strinstr.c: Changed to use my_global.h strings/strmake.c: Changed to use my_global.h strings/strmov.c: Changed to use my_global.h strings/strnlen.c: Changed to use my_global.h strings/strnmov.c: Changed to use my_global.h strings/strstr.c: Changed to use my_global.h strings/strto.c: Changed to use my_global.h strings/strtol.c: Changed to use my_global.h strings/strtoll.c: Changed to use my_global.h strings/strtoul.c: Changed to use my_global.h strings/strtoull.c: Changed to use my_global.h strings/strxmov.c: Changed to use my_global.h strings/strxnmov.c: Changed to use my_global.h strings/udiv.c: Changed to use my_global.h tools/mysqlmanager.c: Changed to use my_global.h vio/test-ssl.c: Changed to use my_global.h vio/test-sslclient.c: Changed to use my_global.h vio/test-sslserver.c: Changed to use my_global.h vio/test-ssl: Changed to use my_global.h vio/vio.c: Changed to use my_global.h vio/viosocket.c: Changed to use my_global.h vio/viossl.c: Changed to use my_global.h vio/viosslfactories.c: Changed to use my_global.h vio/viotest-ssl.c: Changed to use my_global.h
291 lines
6.8 KiB
C
291 lines
6.8 KiB
C
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public
|
|
License along with this library; if not, write to the Free
|
|
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
|
MA 02111-1307, USA */
|
|
|
|
/* Test av hash libarary: stor test */
|
|
|
|
#include <my_global.h>
|
|
#include <my_sys.h>
|
|
#include <hash.h>
|
|
#include <m_string.h>
|
|
|
|
#define MAX_RECORDS 100000
|
|
#define MAX_KEYS 3
|
|
|
|
static int get_options(int argc, char *argv[]);
|
|
static int do_test();
|
|
static int rnd(int max_value);
|
|
|
|
static uint testflag=0,recant=10000,reclength=37;
|
|
static uint16 key1[1000];
|
|
|
|
#ifdef DBUG_OFF
|
|
#define hash_check(A) 0
|
|
#else
|
|
my_bool hash_check(HASH *hash);
|
|
#endif
|
|
void free_record(void *record);
|
|
|
|
static byte *hash2_key(const byte *rec,uint *length,
|
|
my_bool not_used __attribute__((unused)))
|
|
{
|
|
*length=(uint) (uchar) rec[reclength-1];
|
|
return (byte*) rec;
|
|
}
|
|
|
|
/* Huvudprogrammet */
|
|
|
|
int main(int argc,char *argv[])
|
|
{
|
|
MY_INIT(argv[0]);
|
|
DBUG_PROCESS(argv[0]);
|
|
|
|
get_options(argc,argv);
|
|
|
|
exit(do_test());
|
|
}
|
|
|
|
static int do_test()
|
|
{
|
|
register uint i,j;
|
|
uint n1,n2,n3;
|
|
uint write_count,update,delete;
|
|
ulong pos;
|
|
unsigned long key_check;
|
|
char *record,*recpos,oldrecord[120],key[10];
|
|
HASH hash,hash2;
|
|
DBUG_ENTER("do_test");
|
|
|
|
write_count=update=delete=0;
|
|
key_check=0;
|
|
bzero((char*) key1,sizeof(key1[0])*1000);
|
|
|
|
printf("- Creating hash\n");
|
|
if (hash_init(&hash,recant/2,0,6,0,free_record,0))
|
|
goto err;
|
|
printf("- Writing records:s\n");
|
|
|
|
for (i=0 ; i < recant ; i++)
|
|
{
|
|
n1=rnd(1000); n2=rnd(100); n3=rnd(min(recant*5,MAX_RECORDS));
|
|
record= (char*) my_malloc(reclength,MYF(MY_FAE));
|
|
sprintf(record,"%6d:%4d:%8d:Pos: %4d ",n1,n2,n3,write_count);
|
|
if (hash_insert(&hash,record))
|
|
{
|
|
printf("Error: %d in write at record: %d\n",my_errno,i);
|
|
goto err;
|
|
}
|
|
key1[n1]++;
|
|
key_check+=n1;
|
|
write_count++;
|
|
}
|
|
if (hash_check(&hash))
|
|
{
|
|
puts("Heap keys crashed");
|
|
goto err;
|
|
}
|
|
printf("- Delete\n");
|
|
for (i=0 ; i < write_count/10 ; i++)
|
|
{
|
|
for (j=rnd(1000) ; j>0 && key1[j] == 0 ; j--) ;
|
|
if (j != 0)
|
|
{
|
|
sprintf(key,"%6d",j);
|
|
if (!(recpos=hash_search(&hash,key,0)))
|
|
{
|
|
printf("can't find key1: \"%s\"\n",key);
|
|
goto err;
|
|
}
|
|
key1[atoi(recpos)]--;
|
|
key_check-=atoi(recpos);
|
|
memcpy(oldrecord,recpos,reclength);
|
|
if (hash_delete(&hash,recpos))
|
|
{
|
|
printf("error: %d; can't delete record: \"%s\"\n", my_errno,oldrecord);
|
|
goto err;
|
|
}
|
|
delete++;
|
|
if (testflag == 2 && hash_check(&hash))
|
|
{
|
|
puts("Heap keys crashed");
|
|
goto err;
|
|
}
|
|
}
|
|
}
|
|
if (hash_check(&hash))
|
|
{
|
|
puts("Hash keys crashed");
|
|
goto err;
|
|
}
|
|
|
|
printf("- Update\n");
|
|
for (i=0 ; i < write_count/10 ; i++)
|
|
{
|
|
n1=rnd(1000); n2=rnd(100); n3=rnd(min(recant*2,MAX_RECORDS));
|
|
for (j=rnd(1000) ; j>0 && key1[j] == 0 ; j--) ;
|
|
if (j)
|
|
{
|
|
sprintf(key,"%6d",j);
|
|
if (!(recpos=hash_search(&hash,key,0)))
|
|
{
|
|
printf("can't find key1: \"%s\"\n",key);
|
|
goto err;
|
|
}
|
|
key1[atoi(recpos)]--;
|
|
key_check=key_check-atoi(recpos)+n1;
|
|
key1[n1]++;
|
|
sprintf(recpos,"%6d:%4d:%8d:XXX: %4d ",n1,n2,n3,update);
|
|
update++;
|
|
if (hash_update(&hash,recpos,key,0))
|
|
{
|
|
printf("can't update key1: \"%s\"\n",key);
|
|
goto err;
|
|
}
|
|
if (testflag == 3 && hash_check(&hash))
|
|
{
|
|
printf("Heap keys crashed for %d update\n",update);
|
|
goto err;
|
|
}
|
|
}
|
|
}
|
|
if (hash_check(&hash))
|
|
{
|
|
puts("Heap keys crashed");
|
|
goto err;
|
|
}
|
|
|
|
for (j=0 ; j < 1000 ; j++)
|
|
if (key1[j] > 1)
|
|
break;
|
|
if (key1[j] > 1)
|
|
{
|
|
printf("- Testing identical read\n");
|
|
sprintf(key,"%6d",j);
|
|
pos=1;
|
|
if (!(recpos=hash_search(&hash,key,0)))
|
|
{
|
|
printf("can't find key1: \"%s\"\n",key);
|
|
goto err;
|
|
}
|
|
while (hash_next(&hash,key,0) && pos < (ulong) (key1[j]+10))
|
|
pos++;
|
|
if (pos != (ulong) key1[j])
|
|
{
|
|
printf("Found %ld copies of key: %s. Should be %d",pos,key,key1[j]);
|
|
goto err;
|
|
}
|
|
}
|
|
printf("- Creating output heap-file 2\n");
|
|
if (hash_init(&hash2,hash.records,0,0,hash2_key,free_record,0))
|
|
goto err;
|
|
|
|
printf("- Copying and removing records\n");
|
|
pos=0;
|
|
while ((recpos=hash_element(&hash,0)))
|
|
{
|
|
record=(byte*) my_malloc(reclength,MYF(MY_FAE));
|
|
memcpy(record,recpos,reclength);
|
|
record[reclength-1]=rnd(5)+1;
|
|
if (hash_insert(&hash2,record))
|
|
{
|
|
printf("Got error when inserting record: %*s",reclength,record);
|
|
goto err;
|
|
}
|
|
key_check-=atoi(record);
|
|
write_count++;
|
|
if (hash_delete(&hash,recpos))
|
|
{
|
|
printf("Got error when deleting record: %*s",reclength,recpos);
|
|
goto err;
|
|
}
|
|
if (testflag==4)
|
|
{
|
|
if (hash_check(&hash) || hash_check(&hash2))
|
|
{
|
|
puts("Hash keys crashed");
|
|
goto err;
|
|
}
|
|
}
|
|
pos++;
|
|
}
|
|
if (hash_check(&hash) || hash_check(&hash2))
|
|
{
|
|
puts("Hash keys crashed");
|
|
goto err;
|
|
}
|
|
if (key_check != 0)
|
|
{
|
|
printf("Key check didn't get to 0 (%ld)\n",key_check);
|
|
}
|
|
|
|
printf("\nFollowing test have been made:\n");
|
|
printf("Write records: %d\nUpdate records: %d\nDelete records: %d\n", write_count,
|
|
update,delete);
|
|
hash_free(&hash); hash_free(&hash2);
|
|
my_end(MY_GIVE_INFO);
|
|
DBUG_RETURN(0);
|
|
err:
|
|
printf("Got error: %d when using hashing\n",my_errno);
|
|
DBUG_RETURN(-1);
|
|
} /* main */
|
|
|
|
|
|
/* l{ser optioner */
|
|
/* OBS! intierar endast DEBUG - ingen debuggning h{r ! */
|
|
|
|
static int get_options(int argc, char **argv)
|
|
{
|
|
char *pos,*progname;
|
|
DEBUGGER_OFF;
|
|
|
|
progname= argv[0];
|
|
|
|
while (--argc >0 && *(pos = *(++argv)) == '-' ) {
|
|
switch(*++pos) {
|
|
case 'm': /* records */
|
|
recant=atoi(++pos);
|
|
break;
|
|
case 't':
|
|
testflag=atoi(++pos); /* testmod */
|
|
break;
|
|
case 'V':
|
|
case 'I':
|
|
case '?':
|
|
printf("%s Ver 1.0 for %s at %s\n",progname,SYSTEM_TYPE,MACHINE_TYPE);
|
|
puts("TCX Datakonsult AB, by Monty, for your professional use\n");
|
|
printf("Usage: %s [-?ABIKLWv] [-m#] [-t#]\n",progname);
|
|
exit(0);
|
|
case '#':
|
|
DEBUGGER_ON;
|
|
DBUG_PUSH (++pos);
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
} /* get options */
|
|
|
|
/* Ge ett randomv{rde inom ett intervall 0 <=x <= n */
|
|
|
|
static int rnd(int max_value)
|
|
{
|
|
return (int) ((rand() & 32767)/32767.0*max_value);
|
|
} /* rnd */
|
|
|
|
|
|
void free_record(void *record)
|
|
{
|
|
my_free(record,MYF(0));
|
|
}
|