diff options
Diffstat (limited to 'myisam/mi_update.c')
-rw-r--r-- | myisam/mi_update.c | 23 |
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; |