mariadb/heap/hp_open.c
unknown 5c68c9042a Cleanup of tests
Fixed bug with ALTER TABLE on HEAP tables


mysql-test/r/alter_table.result:
  Turn off SCCS flag
mysql-test/r/analyse.result:
  Turn off SCCS flag
mysql-test/r/auto_increment.result:
  Turn off SCCS flag
mysql-test/r/bdb.result:
  Turn off SCCS flag
mysql-test/r/bigint.result:
  Turn off SCCS flag
mysql-test/r/binary.result:
  Turn off SCCS flag
mysql-test/r/case.result:
  Turn off SCCS flag
mysql-test/r/comments.result:
  Turn off SCCS flag
mysql-test/r/compare.result:
  Turn off SCCS flag
mysql-test/r/count_distinct.result:
  Turn off SCCS flag
mysql-test/r/create.result:
  Turn off SCCS flag
mysql-test/r/delayed.result:
  Turn off SCCS flag
mysql-test/r/distinct.result:
  Turn off SCCS flag
mysql-test/r/empty_table.result:
  Turn off SCCS flag
mysql-test/r/explain.result:
  Turn off SCCS flag
mysql-test/r/ft0000001.a.result:
  Turn off SCCS flag
mysql-test/r/ft0000001.b.result:
  Turn off SCCS flag
mysql-test/r/ft0000001.c.result:
  Turn off SCCS flag
mysql-test/r/ft0000001.d.result:
  Turn off SCCS flag
mysql-test/r/ft0000001.e.result:
  Turn off SCCS flag
mysql-test/r/ft0000002.a.result:
  Turn off SCCS flag
mysql-test/r/ft0000002.b.result:
  Turn off SCCS flag
mysql-test/r/ft0000002.c.result:
  Turn off SCCS flag
mysql-test/r/fulltext.result:
  Turn off SCCS flag
mysql-test/r/func_crypt.result:
  Turn off SCCS flag
mysql-test/r/func_date_add.result:
  Turn off SCCS flag
mysql-test/r/func_equal.result:
  Turn off SCCS flag
mysql-test/r/func_group.result:
  Turn off SCCS flag
mysql-test/r/func_in.result:
  Turn off SCCS flag
mysql-test/r/func_like.result:
  Turn off SCCS flag
mysql-test/r/func_math.result:
  Turn off SCCS flag
mysql-test/r/func_misc.result:
  Turn off SCCS flag
mysql-test/r/func_op.result:
  Turn off SCCS flag
mysql-test/r/func_regexp.result:
  Turn off SCCS flag
mysql-test/r/func_set.result:
  Turn off SCCS flag
mysql-test/r/func_str.result:
  Turn off SCCS flag
mysql-test/r/func_system.result:
  Turn off SCCS flag
mysql-test/r/func_test.result:
  Turn off SCCS flag
mysql-test/r/func_time.result:
  Turn off SCCS flag
mysql-test/r/group_by.result:
  Turn off SCCS flag
mysql-test/r/heap.result:
  Turn off SCCS flag
mysql-test/r/ins000001.result:
  Turn off SCCS flag
mysql-test/r/insert.result:
  Turn off SCCS flag
mysql-test/r/insert_select.result:
  Turn off SCCS flag
mysql-test/r/join.result:
  Turn off SCCS flag
mysql-test/r/join_outer.result:
  Turn off SCCS flag
mysql-test/r/key.result:
  Turn off SCCS flag
mysql-test/r/key_diff.result:
  Turn off SCCS flag
mysql-test/r/key_primary.result:
  Turn off SCCS flag
mysql-test/r/keywords.result:
  Turn off SCCS flag
mysql-test/r/limit.result:
  Turn off SCCS flag
mysql-test/r/merge.result:
  Turn off SCCS flag
mysql-test/r/null.result:
  Turn off SCCS flag
mysql-test/r/null_key.result:
  Turn off SCCS flag
mysql-test/r/odbc.result:
  Turn off SCCS flag
mysql-test/r/order_by.result:
  Turn off SCCS flag
mysql-test/r/raid.result:
  Turn off SCCS flag
mysql-test/r/range.result:
  Turn off SCCS flag
mysql-test/r/rename.result:
  Turn off SCCS flag
mysql-test/r/replace.result:
  Turn off SCCS flag
mysql-test/r/rollback.result:
  Turn off SCCS flag
mysql-test/r/rpl000001.a.result:
  Turn off SCCS flag
mysql-test/r/rpl000001.b.result:
  Turn off SCCS flag
mysql-test/r/rpl000002.result:
  Turn off SCCS flag
mysql-test/r/rpl000003.result:
  Turn off SCCS flag
mysql-test/r/rpl000004.a.result:
  Turn off SCCS flag
mysql-test/r/rpl000004.b.result:
  Turn off SCCS flag
mysql-test/r/rpl000005.result:
  Turn off SCCS flag
mysql-test/r/rpl000006.result:
  Turn off SCCS flag
mysql-test/r/rpl000007.result:
  Turn off SCCS flag
mysql-test/r/rpl000008.result:
  Turn off SCCS flag
mysql-test/r/rpl000009.result:
  Turn off SCCS flag
mysql-test/r/rpl000010.result:
  Turn off SCCS flag
mysql-test/r/rpl000011.result:
  Turn off SCCS flag
mysql-test/r/rpl000012.result:
  Turn off SCCS flag
mysql-test/r/rpl000012.status.result:
  Turn off SCCS flag
mysql-test/r/rpl000013.result:
  Turn off SCCS flag
mysql-test/r/rpl000013.status.result:
  Turn off SCCS flag
mysql-test/r/rpl000014.result:
  Turn off SCCS flag
mysql-test/r/rpl000015.result:
  Turn off SCCS flag
mysql-test/r/rpl000016.result:
  Turn off SCCS flag
mysql-test/r/sel000001.result:
  Turn off SCCS flag
mysql-test/r/sel000002.result:
  Turn off SCCS flag
mysql-test/r/sel000003.result:
  Turn off SCCS flag
mysql-test/r/sel000031.result:
  Turn off SCCS flag
mysql-test/r/sel000032.result:
  Turn off SCCS flag
mysql-test/r/sel000033.result:
  Turn off SCCS flag
mysql-test/r/sel000100.result:
  Turn off SCCS flag
mysql-test/r/select_safe.result:
  Turn off SCCS flag
mysql-test/r/show_check.result:
  Turn off SCCS flag
mysql-test/r/shw000001.result:
  Turn off SCCS flag
mysql-test/r/slave-running.result:
  Turn off SCCS flag
mysql-test/r/slave-stopped.result:
  Turn off SCCS flag
mysql-test/r/tablelock.result:
  Turn off SCCS flag
mysql-test/r/temp_table.result:
  Turn off SCCS flag
mysql-test/r/truncate.result:
  Turn off SCCS flag
mysql-test/r/type_blob.result:
  Turn off SCCS flag
mysql-test/r/type_date.result:
  Turn off SCCS flag
mysql-test/r/type_datetime.result:
  Turn off SCCS flag
mysql-test/r/type_enum.result:
  Turn off SCCS flag
mysql-test/r/type_float.result:
  Turn off SCCS flag
mysql-test/r/type_ranges.result:
  Turn off SCCS flag
mysql-test/r/type_time.result:
  Turn off SCCS flag
mysql-test/r/type_timestamp.result:
  Turn off SCCS flag
mysql-test/r/type_uint.result:
  Turn off SCCS flag
mysql-test/r/type_year.result:
  Turn off SCCS flag
mysql-test/r/update.result:
  Turn off SCCS flag
mysql-test/r/varbinary.result:
  Turn off SCCS flag
mysql-test/r/variables.result:
  Turn off SCCS flag
Docs/manual.texi:
  Changelog
client/my_readline.h:
  Added read length to readline()
client/mysql.cc:
  cleanup
client/mysqladmin.c:
  cleanup
client/mysqldump.c:
  Added handling of hexadecimal constants
client/mysqlimport.c:
  Version change
client/mysqltest.c:
  Don't append the .reject extension, instead replace the old extension
client/readline.cc:
  Added read length to readline()
heap/hp_open.c:
  extra debug
merge/rrnd.c:
  Fix bug in merge tables
mysql-test/install_test_db.sh:
  Portability fixes
mysql-test/mysql-test-run.sh:
  Portability fixes
  Added --ddd and --debug options
scripts/mysqld_multi.sh:
  Add pathname to mysqladmin
sql-bench/Results/ATIS-mysql-Linux_2.2.13_SMP_alpha:
  New benchmark results
sql-bench/Results/RUN-mysql-Linux_2.2.13_SMP_alpha:
  New benchmark results
sql-bench/Results/alter-table-mysql-Linux_2.2.13_SMP_alpha:
  New benchmark results
sql-bench/Results/big-tables-mysql-Linux_2.2.13_SMP_alpha:
  New benchmark results
sql-bench/Results/connect-mysql-Linux_2.2.13_SMP_alpha:
  New benchmark results
sql-bench/Results/create-mysql-Linux_2.2.13_SMP_alpha:
  New benchmark results
sql-bench/Results/insert-mysql-Linux_2.2.13_SMP_alpha:
  New benchmark results
sql-bench/Results/select-mysql-Linux_2.2.13_SMP_alpha:
  New benchmark results
sql-bench/Results/wisconsin-mysql-Linux_2.2.13_SMP_alpha:
  New benchmark results
sql/mysqld.cc:
  Some fixes for gemini
sql/sql_table.cc:
  Fixed bug with ALTER TABLE on HEAP tables
2000-12-28 19:25:41 +02:00

174 lines
5.4 KiB
C

/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/* open a heap-database */
#include "heapdef.h"
#ifdef VMS
#include "hp_static.c" /* Stupid vms-linker */
#endif
static void init_block(HP_BLOCK *block,uint reclength,ulong min_records,
ulong max_records);
/* open a heap database. */
HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef,
uint reclength, ulong max_records, ulong min_records)
{
uint i,j,key_segs,max_length,length;
HP_INFO *info;
HP_SHARE *share;
HP_KEYSEG *keyseg;
DBUG_ENTER("heap_open");
pthread_mutex_lock(&THR_LOCK_heap);
if (!(share=_hp_find_named_heap(name)))
{
DBUG_PRINT("info",("Initializing new table"));
for (i=key_segs=max_length=0 ; i < keys ; i++)
{
key_segs+= keydef[i].keysegs;
bzero((char*) &keydef[i].block,sizeof(keydef[i].block));
for (j=length=0 ; j < keydef[i].keysegs; j++)
length+=keydef[i].seg[j].length;
keydef[i].length=length;
if (length > max_length)
max_length=length;
}
if (!(share = (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+
keys*sizeof(HP_KEYDEF)+
key_segs*sizeof(HP_KEYSEG),
MYF(MY_ZEROFILL))))
{
pthread_mutex_unlock(&THR_LOCK_heap);
DBUG_RETURN(0);
}
share->keydef=(HP_KEYDEF*) (share+1);
keyseg=(HP_KEYSEG*) (share->keydef+keys);
init_block(&share->block,reclength+1,min_records,max_records);
/* Fix keys */
memcpy(share->keydef,keydef,(size_t) (sizeof(keydef[0])*keys));
for (i=0 ; i < keys ; i++)
{
share->keydef[i].seg=keyseg;
memcpy(keyseg,keydef[i].seg,
(size_t) (sizeof(keyseg[0])*keydef[i].keysegs));
keyseg+=keydef[i].keysegs;
init_block(&share->keydef[i].block,sizeof(HASH_INFO),min_records,
max_records);
}
share->min_records=min_records;
share->max_records=max_records;
share->data_length=share->index_length=0;
share->reclength=reclength;
share->blength=1;
share->keys=keys;
share->max_key_length=max_length;
share->changed=0;
if (!(share->name=my_strdup(name,MYF(0))))
{
my_free((gptr) share,MYF(0));
pthread_mutex_unlock(&THR_LOCK_heap);
DBUG_RETURN(0);
}
#ifdef THREAD
thr_lock_init(&share->lock);
VOID(pthread_mutex_init(&share->intern_lock,NULL));
#endif
share->open_list.data=(void*) share;
heap_share_list=list_add(heap_share_list,&share->open_list);
}
if (!(info= (HP_INFO*) my_malloc((uint) sizeof(HP_INFO)+
share->max_key_length,
MYF(MY_ZEROFILL))))
{
pthread_mutex_unlock(&THR_LOCK_heap);
DBUG_RETURN(0);
}
share->open_count++;
#ifdef THREAD
thr_lock_data_init(&share->lock,&info->lock,NULL);
#endif
info->open_list.data=(void*) info;
heap_open_list=list_add(heap_open_list,&info->open_list);
pthread_mutex_unlock(&THR_LOCK_heap);
info->s=share;
info->lastkey=(byte*) (info+1);
info->mode=mode;
info->current_record= (ulong) ~0L; /* No current record */
info->current_ptr=0;
info->current_hash_ptr=0;
info->lastinx= info->errkey= -1;
info->update=0;
#ifndef DBUG_OFF
info->opt_flag=READ_CHECK_USED; /* Check when changing */
#endif
DBUG_PRINT("exit",("heap: %lx reclength: %d records_in_block: %d",
info,share->reclength,share->block.records_in_block));
DBUG_RETURN(info);
} /* heap_open */
/* map name to a heap-nr. If name isn't found return 0 */
HP_SHARE *_hp_find_named_heap(const char *name)
{
LIST *pos;
HP_SHARE *info;
DBUG_ENTER("heap_find");
DBUG_PRINT("enter",("name: %s",name));
for (pos=heap_share_list ; pos ; pos=pos->next)
{
info=(HP_SHARE*) pos->data;
if (!strcmp(name,info->name))
{
DBUG_PRINT("exit",("Old heap_database: %lx",info));
DBUG_RETURN(info);
}
}
DBUG_RETURN((HP_SHARE *)0);
}
static void init_block(HP_BLOCK *block, uint reclength, ulong min_records,
ulong max_records)
{
uint i,recbuffer,records_in_block;
max_records=max(min_records,max_records);
if (!max_records)
max_records=1000; /* As good as quess as anything */
recbuffer=(uint) (reclength+sizeof(byte**)-1) & ~(sizeof(byte**)-1);
records_in_block=max_records/10;
if (records_in_block < 10 && max_records)
records_in_block=10;
if (!records_in_block || records_in_block*recbuffer >
(my_default_record_cache_size-sizeof(HP_PTRS)*HP_MAX_LEVELS))
records_in_block=(my_default_record_cache_size-sizeof(HP_PTRS)*
HP_MAX_LEVELS)/recbuffer+1;
block->records_in_block=records_in_block;
block->recbuffer=recbuffer;
block->last_allocated= 0L;
for (i=0 ; i <= HP_MAX_LEVELS ; i++)
block->level_info[i].records_under_level=
(!i ? 1 : i == 1 ? records_in_block :
HP_PTRS_IN_NOD * block->level_info[i-1].records_under_level);
}