mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 13:32:33 +01:00
67ce247965
Renamed HA_VAR_LENGTH to HA_VAR_LENGTH_PART Renamed in all files FIELD_TYPE_STRING and FIELD_TYPE_VAR_STRING to MYSQL_TYPE_STRING and MYSQL_TYPE_VAR_STRING to make it easy to catch all possible errors Added support for VARCHAR KEYS to heap Removed support for ISAM Now only long VARCHAR columns are changed to TEXT on demand (not CHAR) Internal temporary files can now use fixed length tables if the used VARCHAR columns are short
89 lines
2.8 KiB
C
89 lines
2.8 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 */
|
|
|
|
/* Update current record in heap-database */
|
|
|
|
#include "heapdef.h"
|
|
|
|
int heap_update(HP_INFO *info, const byte *old, const byte *heap_new)
|
|
{
|
|
HP_KEYDEF *keydef, *end, *p_lastinx;
|
|
byte *pos;
|
|
bool auto_key_changed= 0;
|
|
HP_SHARE *share= info->s;
|
|
DBUG_ENTER("heap_update");
|
|
|
|
test_active(info);
|
|
pos=info->current_ptr;
|
|
|
|
if (info->opt_flag & READ_CHECK_USED && hp_rectest(info,old))
|
|
DBUG_RETURN(my_errno); /* Record changed */
|
|
if (--(share->records) < share->blength >> 1) share->blength>>= 1;
|
|
share->changed=1;
|
|
|
|
p_lastinx= share->keydef + info->lastinx;
|
|
for (keydef= share->keydef, end= keydef + share->keys; keydef < end; keydef++)
|
|
{
|
|
if (hp_rec_key_cmp(keydef, old, heap_new, 0))
|
|
{
|
|
if ((*keydef->delete_key)(info, keydef, old, pos, keydef == p_lastinx) ||
|
|
(*keydef->write_key)(info, keydef, heap_new, pos))
|
|
goto err;
|
|
if (share->auto_key == (uint) (keydef - share->keydef + 1))
|
|
auto_key_changed= 1;
|
|
}
|
|
}
|
|
|
|
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);
|
|
|
|
err:
|
|
if (my_errno == HA_ERR_FOUND_DUPP_KEY)
|
|
{
|
|
info->errkey = keydef - share->keydef;
|
|
if (keydef->algorithm == HA_KEY_ALG_BTREE)
|
|
{
|
|
/* we don't need to delete non-inserted key from rb-tree */
|
|
if ((*keydef->write_key)(info, keydef, old, pos))
|
|
{
|
|
if (++(share->records) == share->blength)
|
|
share->blength+= share->blength;
|
|
DBUG_RETURN(my_errno);
|
|
}
|
|
keydef--;
|
|
}
|
|
while (keydef >= share->keydef)
|
|
{
|
|
if (hp_rec_key_cmp(keydef, old, heap_new, 0))
|
|
{
|
|
if ((*keydef->delete_key)(info, keydef, heap_new, pos, 0) ||
|
|
(*keydef->write_key)(info, keydef, old, pos))
|
|
break;
|
|
}
|
|
keydef--;
|
|
}
|
|
}
|
|
if (++(share->records) == share->blength)
|
|
share->blength+= share->blength;
|
|
DBUG_RETURN(my_errno);
|
|
} /* heap_update */
|