summaryrefslogtreecommitdiff
path: root/myisam/mi_update.c
diff options
context:
space:
mode:
Diffstat (limited to 'myisam/mi_update.c')
-rw-r--r--myisam/mi_update.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/myisam/mi_update.c b/myisam/mi_update.c
index 2c6bc42bbdb..c52989f493e 100644
--- a/myisam/mi_update.c
+++ b/myisam/mi_update.c
@@ -83,8 +83,6 @@ int mi_update(register MI_INFO *info, const byte *oldrec, byte *newrec)
/* Check which keys changed from the original row */
new_key=info->lastkey2;
- key_changed=HA_STATE_KEY_CHANGED; /* We changed current database */
- /* Remove key that didn't change */
changed=0;
for (i=0 ; i < share->base.keys ; i++)
{
@@ -93,7 +91,7 @@ int mi_update(register MI_INFO *info, const byte *oldrec, byte *newrec)
/* The following code block is for text searching by SerG */
if (share->keyinfo[i].flag & HA_FULLTEXT )
{
- if(_mi_ft_cmp(info,i,oldrec, newrec))
+ if (_mi_ft_cmp(info,i,oldrec, newrec))
{
if ((int) i == info->lastinx)
key_changed|=HA_STATE_WRITTEN;
@@ -121,11 +119,24 @@ int mi_update(register MI_INFO *info, const byte *oldrec, byte *newrec)
}
}
}
+ if (changed)
+ key_changed|= HA_STATE_KEY_CHANGED;
if (share->calc_checksum)
+ {
info->checksum=(*share->calc_checksum)(info,newrec);
- if ((*share->update_record)(info,pos,newrec))
- goto err;
+ key_changed|= HA_STATE_KEY_CHANGED; /* Must update index file */
+ }
+ {
+ /* Don't update index file if data file is not extended */
+ MI_STATUS_INFO state;
+ memcpy((char*) &state, (char*) info->state, sizeof(state));
+ if ((*share->update_record)(info,pos,newrec))
+ goto err;
+ if (!key_changed &&
+ memcmp((char*) &state, (char*) info->state, sizeof(state)))
+ key_changed|= HA_STATE_KEY_CHANGED; /* Must update index file */
+ }
if (auto_key_changed)
update_auto_increment(info,newrec);
if (share->calc_checksum)
@@ -147,6 +158,8 @@ int mi_update(register MI_INFO *info, const byte *oldrec, byte *newrec)
err:
DBUG_PRINT("error",("key: %d errno: %d",i,my_errno));
save_errno=my_errno;
+ if (changed)
+ key_changed|= HA_STATE_KEY_CHANGED;
if (my_errno == HA_ERR_FOUND_DUPP_KEY || my_errno == HA_ERR_RECORD_FILE_FULL)
{
info->errkey= (int) i;