diff options
author | unknown <monty@mashka.mysql.fi> | 2002-12-05 19:38:42 +0200 |
---|---|---|
committer | unknown <monty@mashka.mysql.fi> | 2002-12-05 19:38:42 +0200 |
commit | 6d33f73416b5576b4e48412fd3a7342385c1c747 (patch) | |
tree | 56f9dc35fe3c9e6c4f341e577ff3db68855d9e81 /heap | |
parent | 930b3fa897112c49392c2154de1ec21b9e44edda (diff) | |
parent | 9b5167eeac3e8d14134769334d94f260cb5db277 (diff) | |
download | mariadb-git-6d33f73416b5576b4e48412fd3a7342385c1c747.tar.gz |
Merge with 4.0.6
BitKeeper/etc/ignore:
auto-union
acinclude.m4:
Auto merged
configure.in:
Auto merged
heap/hp_delete.c:
Auto merged
heap/hp_scan.c:
Auto merged
include/my_base.h:
Auto merged
libmysql/libmysql.c:
Auto merged
libmysqld/lib_sql.cc:
Auto merged
myisam/mi_check.c:
Auto merged
myisam/mi_rnext_same.c:
Auto merged
myisam/sort.c:
Auto merged
mysql-test/r/alter_table.result:
Auto merged
mysql-test/r/distinct.result:
Auto merged
mysql-test/r/func_math.result:
Auto merged
mysql-test/r/group_by.result:
Auto merged
mysql-test/r/innodb.result:
Auto merged
mysql-test/r/select.result:
Auto merged
mysql-test/t/group_by.test:
Auto merged
mysql-test/t/select.test:
Auto merged
mysys/hash.c:
Auto merged
sql/field.h:
Auto merged
sql/field_conv.cc:
Auto merged
sql/ha_innodb.cc:
Auto merged
sql/handler.cc:
Auto merged
sql/item_func.cc:
Auto merged
sql/item_func.h:
Auto merged
sql/log.cc:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/mysqld.cc:
Auto merged
sql/opt_sum.cc:
Auto merged
sql/set_var.cc:
Auto merged
sql/set_var.h:
Auto merged
sql/sql_analyse.cc:
Auto merged
sql/sql_class.cc:
Auto merged
sql/sql_show.cc:
Auto merged
sql/sql_table.cc:
Auto merged
sql/sql_udf.cc:
Auto merged
sql/structs.h:
Auto merged
sql/uniques.cc:
Auto merged
strings/strto.c:
Auto merged
vio/vio.c:
Auto merged
BitKeeper/triggers/post-commit:
Add changeset to commit messages
sql-bench/crash-me.sh:
Use version from 4.0
sql-bench/server-cfg.sh:
Use version from 4.0
Diffstat (limited to 'heap')
-rw-r--r-- | heap/_check.c | 59 | ||||
-rw-r--r-- | heap/hp_delete.c | 4 | ||||
-rw-r--r-- | heap/hp_scan.c | 1 | ||||
-rw-r--r-- | heap/hp_update.c | 4 | ||||
-rw-r--r-- | heap/hp_write.c | 5 |
5 files changed, 68 insertions, 5 deletions
diff --git a/heap/_check.c b/heap/_check.c index 4a6482901d9..5ee511bf92a 100644 --- a/heap/_check.c +++ b/heap/_check.c @@ -20,19 +20,34 @@ static int check_one_key(HP_KEYDEF *keydef, uint keynr, ulong records, ulong blength, my_bool print_status); -static int check_one_rb_key(HP_INFO *info, uint keynr, ulong records, - my_bool print_status); -/* Returns 0 if the HEAP is ok */ + +/* + Check if keys and rows are ok in a heap table + + SYNOPSIS + heap_check_heap() + info Table handler + print_status Prints some extra status + + NOTES + Doesn't change the state of the table handler + + RETURN VALUES + 0 ok + 1 error +*/ int heap_check_heap(HP_INFO *info, my_bool print_status) { int error; uint key; + ulong records=0, deleted=0, pos, next_block; HP_SHARE *share=info->s; - DBUG_ENTER("heap_check_keys"); + HP_INFO save_info= *info; /* Needed because scan_init */ + DBUG_ENTER("heap_check_heap"); - for (error=key=0 ; key < share->keys ; key++) + for (error=key= 0 ; key < share->keys ; key++) { if (share->keydef[key].algorithm == HA_KEY_ALG_BTREE) error|= check_one_rb_key(info, key, share->records, print_status); @@ -40,7 +55,41 @@ int heap_check_heap(HP_INFO *info, my_bool print_status) error|= check_one_key(share->keydef + key, key, share->records, share->blength, print_status); } + /* + This is basicly the same code as in hp_scan, but we repeat it here to + get shorter DBUG log file. + */ + for (pos=next_block= 0 ; ; pos++) + { + if (pos < next_block) + { + info->current_ptr+= share->block.recbuffer; + } + else + { + next_block+= share->block.records_in_block; + if (next_block >= share->records+share->deleted) + { + next_block= share->records+share->deleted; + if (pos >= next_block) + break; /* End of file */ + } + } + _hp_find_record(info,pos); + if (!info->current_ptr[share->reclength]) + deleted++; + else + records++; + } + + if (records != share->records || deleted != share->deleted) + { + DBUG_PRINT("error",("Found rows: %lu (%lu) deleted %lu (%lu)", + records, share->records, deleted, share->deleted)); + error= 1; + } + *info= save_info; DBUG_RETURN(error); } diff --git a/heap/hp_delete.c b/heap/hp_delete.c index 4ba2f2c5310..73e431e6e66 100644 --- a/heap/hp_delete.c +++ b/heap/hp_delete.c @@ -49,6 +49,10 @@ int heap_delete(HP_INFO *info, const byte *record) pos[share->reclength]=0; /* Record deleted */ share->deleted++; info->current_hash_ptr=0; +#if !defined(DBUG_OFF) && defined(EXTRA_HEAP_DEBUG) + DBUG_EXECUTE("check_heap",heap_check_heap(info, 0);); +#endif + DBUG_RETURN(0); err: if (++(share->records) == share->blength) diff --git a/heap/hp_scan.c b/heap/hp_scan.c index 487d48c3a95..59e544ca590 100644 --- a/heap/hp_scan.c +++ b/heap/hp_scan.c @@ -62,6 +62,7 @@ int heap_scan(register HP_INFO *info, byte *record) } if (!info->current_ptr[share->reclength]) { + DBUG_PRINT("warning",("Found deleted record")); info->update= HA_STATE_PREV_FOUND | HA_STATE_NEXT_FOUND; DBUG_RETURN(my_errno=HA_ERR_RECORD_DELETED); } diff --git a/heap/hp_update.c b/heap/hp_update.c index b789ab82b84..2ed0edf08de 100644 --- a/heap/hp_update.c +++ b/heap/hp_update.c @@ -49,6 +49,10 @@ int heap_update(HP_INFO *info, const byte *old, const byte *heap_new) memcpy(pos,heap_new,(size_t) share->reclength); if (++(share->records) == share->blength) share->blength+= share->blength; + +#if !defined(DBUG_OFF) && defined(EXTRA_HEAP_DEBUG) + DBUG_EXECUTE("check_heap",heap_check_heap(info, 0);); +#endif if (auto_key_changed) heap_update_auto_increment(info, heap_new); DBUG_RETURN(0); diff --git a/heap/hp_write.c b/heap/hp_write.c index 87211d4c224..f92d8caa633 100644 --- a/heap/hp_write.c +++ b/heap/hp_write.c @@ -61,9 +61,13 @@ int heap_write(HP_INFO *info, const byte *record) info->current_ptr=pos; info->current_hash_ptr=0; info->update|=HA_STATE_AKTIV; +#if !defined(DBUG_OFF) && defined(EXTRA_HEAP_DEBUG) + DBUG_EXECUTE("check_heap",heap_check_heap(info, 0);); +#endif if (share->auto_key) heap_update_auto_increment(info, record); DBUG_RETURN(0); + err: DBUG_PRINT("info",("Duplicate key: %d", keydef - share->keydef)); info->errkey= keydef - share->keydef; @@ -83,6 +87,7 @@ err: *((byte**) pos)=share->del_link; share->del_link=pos; pos[share->reclength]=0; /* Record deleted */ + DBUG_RETURN(my_errno); } /* heap_write */ |