mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
New multi-table-update code
New (simpler) internal timestamp handling. More debuging to heap tables. Small cleanups to multi-table-delete false -> 0 and true -> 1 (We should use TRUE and FALSE)
This commit is contained in:
@ -21,19 +21,70 @@
|
||||
static int check_one_key(HP_KEYDEF *keydef, uint keynr, ulong records,
|
||||
ulong blength, 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++)
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -48,6 +48,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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -46,6 +46,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
|
||||
DBUG_RETURN(0);
|
||||
|
||||
err:
|
||||
|
@ -60,7 +60,11 @@ 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
|
||||
DBUG_RETURN(0);
|
||||
|
||||
err:
|
||||
DBUG_PRINT("info",("Duplicate key: %d",key));
|
||||
info->errkey= key;
|
||||
@ -74,6 +78,7 @@ err:
|
||||
*((byte**) pos)=share->del_link;
|
||||
share->del_link=pos;
|
||||
pos[share->reclength]=0; /* Record deleted */
|
||||
|
||||
DBUG_RETURN(my_errno);
|
||||
} /* heap_write */
|
||||
|
||||
|
Reference in New Issue
Block a user