automatic merge with 5.1
This commit is contained in:
commit
e6ba9d285a
@ -881,6 +881,7 @@ static int chk_index(HA_CHECK *param, MARIA_HA *info, MARIA_KEYDEF *keyinfo,
|
|||||||
}
|
}
|
||||||
|
|
||||||
info->last_key.keyinfo= tmp_key.keyinfo= keyinfo;
|
info->last_key.keyinfo= tmp_key.keyinfo= keyinfo;
|
||||||
|
info->lastinx= ~0; /* Safety */
|
||||||
tmp_key.data= tmp_key_buff;
|
tmp_key.data= tmp_key_buff;
|
||||||
for ( ;; )
|
for ( ;; )
|
||||||
{
|
{
|
||||||
@ -1134,6 +1135,7 @@ static int check_keys_in_record(HA_CHECK *param, MARIA_HA *info, int extend,
|
|||||||
{
|
{
|
||||||
(*keyinfo->make_key)(info, &key, keynr, info->lastkey_buff, record,
|
(*keyinfo->make_key)(info, &key, keynr, info->lastkey_buff, record,
|
||||||
start_recpos, 0);
|
start_recpos, 0);
|
||||||
|
info->last_key.keyinfo= key.keyinfo;
|
||||||
if (extend)
|
if (extend)
|
||||||
{
|
{
|
||||||
/* We don't need to lock the key tree here as we don't allow
|
/* We don't need to lock the key tree here as we don't allow
|
||||||
|
@ -357,6 +357,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
|
|||||||
ftbw->key_root=info->s->state.key_root[ftb->keynr];
|
ftbw->key_root=info->s->state.key_root[ftb->keynr];
|
||||||
ftbw->keyinfo=info->s->keyinfo+ftb->keynr;
|
ftbw->keyinfo=info->s->keyinfo+ftb->keynr;
|
||||||
info->last_key.keyinfo= key.keyinfo= ftbw->keyinfo;
|
info->last_key.keyinfo= key.keyinfo= ftbw->keyinfo;
|
||||||
|
info->lastinx= ~0; /* Safety */
|
||||||
key.data= ftbw->word;
|
key.data= ftbw->word;
|
||||||
key.data_length= ftbw->len;
|
key.data_length= ftbw->len;
|
||||||
key.ref_length= 0;
|
key.ref_length= 0;
|
||||||
@ -381,6 +382,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
|
|||||||
}
|
}
|
||||||
|
|
||||||
info->last_key.keyinfo= key.keyinfo= ftbw->keyinfo;
|
info->last_key.keyinfo= key.keyinfo= ftbw->keyinfo;
|
||||||
|
info->lastinx= ~0; /* Safety */
|
||||||
key.data= lastkey_buf;
|
key.data= lastkey_buf;
|
||||||
key.data_length= USE_WHOLE_KEY;
|
key.data_length= USE_WHOLE_KEY;
|
||||||
key.ref_length= 0;
|
key.ref_length= 0;
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
Find current row with read on position or read on key
|
Find current row with read on position or read on key
|
||||||
|
|
||||||
@notes
|
@notes
|
||||||
If inx >= 0 find record using key
|
If inx >= 0 find record using key else re-read row on last position
|
||||||
|
|
||||||
@warning
|
@warning
|
||||||
This function is not row version safe.
|
This function is not row version safe.
|
||||||
@ -29,6 +29,7 @@
|
|||||||
@retval 0 Ok
|
@retval 0 Ok
|
||||||
@retval HA_ERR_KEY_NOT_FOUND Row is deleted
|
@retval HA_ERR_KEY_NOT_FOUND Row is deleted
|
||||||
@retval HA_ERR_END_OF_FILE End of file
|
@retval HA_ERR_END_OF_FILE End of file
|
||||||
|
@retval HA_ERR_WRONG_INDEX Wrong inx argument
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@ -36,10 +37,10 @@ int maria_rsame(MARIA_HA *info, uchar *record, int inx)
|
|||||||
{
|
{
|
||||||
DBUG_ENTER("maria_rsame");
|
DBUG_ENTER("maria_rsame");
|
||||||
|
|
||||||
if (inx >= 0 && !_ma_check_index(info, inx))
|
if (inx >= 0 && _ma_check_index(info, inx) < 0)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("error", ("wrong index usage"));
|
DBUG_PRINT("error", ("wrong index usage"));
|
||||||
DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX);
|
DBUG_RETURN(my_errno);
|
||||||
}
|
}
|
||||||
if (info->cur_row.lastpos == HA_OFFSET_ERROR ||
|
if (info->cur_row.lastpos == HA_OFFSET_ERROR ||
|
||||||
info->update & HA_STATE_DELETED)
|
info->update & HA_STATE_DELETED)
|
||||||
|
@ -134,7 +134,6 @@ static int maria_rtree_find_req(MARIA_HA *info, MARIA_KEYDEF *keyinfo,
|
|||||||
tmp_key.data_length= key_data_length;
|
tmp_key.data_length= key_data_length;
|
||||||
|
|
||||||
info->cur_row.lastpos= _ma_row_pos_from_key(&tmp_key);
|
info->cur_row.lastpos= _ma_row_pos_from_key(&tmp_key);
|
||||||
info->last_key.keyinfo= keyinfo;
|
|
||||||
info->last_key.data_length= key_data_length;
|
info->last_key.data_length= key_data_length;
|
||||||
info->last_key.ref_length= share->base.rec_reflength;
|
info->last_key.ref_length= share->base.rec_reflength;
|
||||||
info->last_key.flag= 0;
|
info->last_key.flag= 0;
|
||||||
|
@ -44,8 +44,12 @@ int _ma_check_index(MARIA_HA *info, int inx)
|
|||||||
info->update= ((info->update & (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED)) |
|
info->update= ((info->update & (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED)) |
|
||||||
HA_STATE_NEXT_FOUND | HA_STATE_PREV_FOUND);
|
HA_STATE_NEXT_FOUND | HA_STATE_PREV_FOUND);
|
||||||
}
|
}
|
||||||
if (info->opt_flag & WRITE_CACHE_USED && flush_io_cache(&info->rec_cache))
|
if ((info->opt_flag & WRITE_CACHE_USED) && flush_io_cache(&info->rec_cache))
|
||||||
|
{
|
||||||
|
if (unlikely(!my_errno))
|
||||||
|
my_errno= HA_ERR_INTERNAL_ERROR; /* Impossible */
|
||||||
return(-1);
|
return(-1);
|
||||||
|
}
|
||||||
return(inx);
|
return(inx);
|
||||||
} /* _ma_check_index */
|
} /* _ma_check_index */
|
||||||
|
|
||||||
@ -97,6 +101,7 @@ int _ma_search(register MARIA_HA *info, MARIA_KEY *key, uint32 nextflag,
|
|||||||
|
|
||||||
@note
|
@note
|
||||||
Position to row is stored in info->lastpos
|
Position to row is stored in info->lastpos
|
||||||
|
Last used key is stored in info->last_key
|
||||||
|
|
||||||
@return
|
@return
|
||||||
@retval 0 ok (key found)
|
@retval 0 ok (key found)
|
||||||
@ -122,6 +127,7 @@ static int _ma_search_no_save(register MARIA_HA *info, MARIA_KEY *key,
|
|||||||
(ulong) (pos / info->s->block_size),
|
(ulong) (pos / info->s->block_size),
|
||||||
nextflag, (ulong) info->cur_row.lastpos));
|
nextflag, (ulong) info->cur_row.lastpos));
|
||||||
DBUG_EXECUTE("key", _ma_print_key(DBUG_FILE, key););
|
DBUG_EXECUTE("key", _ma_print_key(DBUG_FILE, key););
|
||||||
|
DBUG_ASSERT(info->last_key.keyinfo == key->keyinfo);
|
||||||
|
|
||||||
if (pos == HA_OFFSET_ERROR)
|
if (pos == HA_OFFSET_ERROR)
|
||||||
{
|
{
|
||||||
|
@ -34,6 +34,7 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
|
|||||||
MARIA_KEYDEF *keyinfo= &info->s->keyinfo[def->key];
|
MARIA_KEYDEF *keyinfo= &info->s->keyinfo[def->key];
|
||||||
uchar *key_buff= info->lastkey_buff2;
|
uchar *key_buff= info->lastkey_buff2;
|
||||||
MARIA_KEY key;
|
MARIA_KEY key;
|
||||||
|
int error= 0;
|
||||||
DBUG_ENTER("_ma_check_unique");
|
DBUG_ENTER("_ma_check_unique");
|
||||||
DBUG_PRINT("enter",("unique_hash: %lu", (ulong) unique_hash));
|
DBUG_PRINT("enter",("unique_hash: %lu", (ulong) unique_hash));
|
||||||
|
|
||||||
@ -43,14 +44,19 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
|
|||||||
|
|
||||||
/* The above changed info->lastkey_buff2. Inform maria_rnext_same(). */
|
/* The above changed info->lastkey_buff2. Inform maria_rnext_same(). */
|
||||||
info->update&= ~HA_STATE_RNEXT_SAME;
|
info->update&= ~HA_STATE_RNEXT_SAME;
|
||||||
|
|
||||||
|
/* Setup that unique key is active key */
|
||||||
info->last_key.keyinfo= keyinfo;
|
info->last_key.keyinfo= keyinfo;
|
||||||
|
|
||||||
|
/* any key pointer in data is destroyed */
|
||||||
|
info->lastinx= ~0;
|
||||||
|
|
||||||
DBUG_ASSERT(key.data_length == MARIA_UNIQUE_HASH_LENGTH);
|
DBUG_ASSERT(key.data_length == MARIA_UNIQUE_HASH_LENGTH);
|
||||||
if (_ma_search(info, &key, SEARCH_FIND, info->s->state.key_root[def->key]))
|
if (_ma_search(info, &key, SEARCH_FIND, info->s->state.key_root[def->key]))
|
||||||
{
|
{
|
||||||
info->page_changed=1; /* Can't optimize read next */
|
info->page_changed=1; /* Can't optimize read next */
|
||||||
info->cur_row.lastpos= lastpos;
|
info->cur_row.lastpos= lastpos;
|
||||||
DBUG_RETURN(0); /* No matching rows */
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
@ -64,7 +70,8 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
|
|||||||
info->page_changed= 1; /* Can't optimize read next */
|
info->page_changed= 1; /* Can't optimize read next */
|
||||||
info->cur_row.lastpos= lastpos;
|
info->cur_row.lastpos= lastpos;
|
||||||
DBUG_PRINT("info",("Found duplicate"));
|
DBUG_PRINT("info",("Found duplicate"));
|
||||||
DBUG_RETURN(1); /* Found identical */
|
error= 1; /* Found identical */
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
DBUG_ASSERT(info->last_key.data_length == MARIA_UNIQUE_HASH_LENGTH);
|
DBUG_ASSERT(info->last_key.data_length == MARIA_UNIQUE_HASH_LENGTH);
|
||||||
if (_ma_search_next(info, &info->last_key, SEARCH_BIGGER,
|
if (_ma_search_next(info, &info->last_key, SEARCH_BIGGER,
|
||||||
@ -73,9 +80,12 @@ my_bool _ma_check_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, uchar *record,
|
|||||||
{
|
{
|
||||||
info->page_changed= 1; /* Can't optimize read next */
|
info->page_changed= 1; /* Can't optimize read next */
|
||||||
info->cur_row.lastpos= lastpos;
|
info->cur_row.lastpos= lastpos;
|
||||||
DBUG_RETURN(0); /* end of tree */
|
break; /* end of tree */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user