mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-15458 Segfault in heap_scan() upon UPDATE after ADD SYSTEM VERSIONING
handler::write_row() should not destroy the state of the running index_search/index_next/... or rnd_init/rnd_next/... scan
This commit is contained in:
@ -254,12 +254,7 @@ int TABLE::delete_row()
|
|||||||
|
|
||||||
store_record(this, record[1]);
|
store_record(this, record[1]);
|
||||||
vers_update_end();
|
vers_update_end();
|
||||||
int res;
|
return file->ha_update_row(record[1], record[0]);
|
||||||
if ((res= file->extra(HA_EXTRA_REMEMBER_POS)))
|
|
||||||
return res;
|
|
||||||
if ((res= file->ha_update_row(record[1], record[0])))
|
|
||||||
return res;
|
|
||||||
return file->extra(HA_EXTRA_RESTORE_POS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -58,8 +58,6 @@ int heap_write(HP_INFO *info, const uchar *record)
|
|||||||
if (++share->records == share->blength)
|
if (++share->records == share->blength)
|
||||||
share->blength+= share->blength;
|
share->blength+= share->blength;
|
||||||
info->s->key_version++;
|
info->s->key_version++;
|
||||||
info->current_ptr=pos;
|
|
||||||
info->current_hash_ptr=0;
|
|
||||||
info->update|=HA_STATE_AKTIV;
|
info->update|=HA_STATE_AKTIV;
|
||||||
#if !defined(DBUG_OFF) && defined(EXTRA_HEAP_DEBUG)
|
#if !defined(DBUG_OFF) && defined(EXTRA_HEAP_DEBUG)
|
||||||
DBUG_EXECUTE("check_heap",heap_check_heap(info, 0););
|
DBUG_EXECUTE("check_heap",heap_check_heap(info, 0););
|
||||||
|
@ -88,7 +88,7 @@ int maria_write(MARIA_HA *info, uchar *record)
|
|||||||
MARIA_SHARE *share= info->s;
|
MARIA_SHARE *share= info->s;
|
||||||
uint i;
|
uint i;
|
||||||
int save_errno;
|
int save_errno;
|
||||||
MARIA_RECORD_POS filepos;
|
MARIA_RECORD_POS filepos, oldpos= info->cur_row.lastpos;
|
||||||
uchar *buff;
|
uchar *buff;
|
||||||
my_bool lock_tree= share->lock_key_trees;
|
my_bool lock_tree= share->lock_key_trees;
|
||||||
my_bool fatal_error;
|
my_bool fatal_error;
|
||||||
@ -302,7 +302,7 @@ int maria_write(MARIA_HA *info, uchar *record)
|
|||||||
share->state.changed|= STATE_NOT_MOVABLE | STATE_NOT_ZEROFILLED;
|
share->state.changed|= STATE_NOT_MOVABLE | STATE_NOT_ZEROFILLED;
|
||||||
info->state->changed= 1;
|
info->state->changed= 1;
|
||||||
|
|
||||||
info->cur_row.lastpos= filepos;
|
info->cur_row.lastpos= oldpos;
|
||||||
_ma_writeinfo(info, WRITEINFO_UPDATE_KEYFILE);
|
_ma_writeinfo(info, WRITEINFO_UPDATE_KEYFILE);
|
||||||
if (info->invalidator != 0)
|
if (info->invalidator != 0)
|
||||||
{
|
{
|
||||||
|
@ -153,7 +153,6 @@ int mi_write(MI_INFO *info, uchar *record)
|
|||||||
info->update= (HA_STATE_CHANGED | HA_STATE_AKTIV | HA_STATE_WRITTEN |
|
info->update= (HA_STATE_CHANGED | HA_STATE_AKTIV | HA_STATE_WRITTEN |
|
||||||
HA_STATE_ROW_CHANGED);
|
HA_STATE_ROW_CHANGED);
|
||||||
info->state->records++;
|
info->state->records++;
|
||||||
info->lastpos=filepos;
|
|
||||||
myisam_log_record(MI_LOG_WRITE,info,record,filepos,0);
|
myisam_log_record(MI_LOG_WRITE,info,record,filepos,0);
|
||||||
(void) _mi_writeinfo(info, WRITEINFO_UPDATE_KEYFILE);
|
(void) _mi_writeinfo(info, WRITEINFO_UPDATE_KEYFILE);
|
||||||
if (info->invalidator != 0)
|
if (info->invalidator != 0)
|
||||||
|
Reference in New Issue
Block a user