diff options
author | Michael Widenius <monty@askmonty.org> | 2011-01-11 15:36:41 +0200 |
---|---|---|
committer | Michael Widenius <monty@askmonty.org> | 2011-01-11 15:36:41 +0200 |
commit | 050c004f5e6f152f5c4cdadda8a15e01d2f07a9a (patch) | |
tree | f5828daced42ff651d5f822af17844154fb9ffd1 /storage/maria/ma_rnext.c | |
parent | e63b5546c597f65696868eaf69159107bc4a8e44 (diff) | |
parent | 2eaa76b84426b19f8574876ad1fa85ae6cfe3196 (diff) | |
download | mariadb-git-050c004f5e6f152f5c4cdadda8a15e01d2f07a9a.tar.gz |
Merge with 5.1
Fixes to get Aria handler tests to work.
Fixes LP#697597 "HANDLER + Aria asserts in maria-5.3-handler"
Diffstat (limited to 'storage/maria/ma_rnext.c')
-rw-r--r-- | storage/maria/ma_rnext.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/storage/maria/ma_rnext.c b/storage/maria/ma_rnext.c index bdba5ff3a17..570ea6a0c1d 100644 --- a/storage/maria/ma_rnext.c +++ b/storage/maria/ma_rnext.c @@ -31,6 +31,7 @@ int maria_rnext(MARIA_HA *info, uchar *buf, int inx) MARIA_SHARE *share= info->s; MARIA_KEYDEF *keyinfo; int icp_res= 1; + uint update_mask= HA_STATE_NEXT_FOUND; DBUG_ENTER("maria_rnext"); if ((inx = _ma_check_index(info,inx)) < 0) @@ -62,6 +63,20 @@ int maria_rnext(MARIA_HA *info, uchar *buf, int inx) error= _ma_search_first(info, keyinfo, share->state.key_root[inx]); break; } + /* + "search first" failed. This means we have no pivot for + "search next", or in other words MI_INFO::lastkey is + likely uninitialized. + + Normally SQL layer would never request "search next" if + "search first" failed. But HANDLER may do anything. + + As mi_rnext() without preceeding mi_rkey()/mi_rfirst() + equals to mi_rfirst(), we must restore original state + as if failing mi_rfirst() was not called. + */ + if (error) + update_mask|= HA_STATE_PREV_FOUND; } else { @@ -106,7 +121,7 @@ int maria_rnext(MARIA_HA *info, uchar *buf, int inx) /* Don't clear if database-changed */ info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); - info->update|= HA_STATE_NEXT_FOUND; + info->update|= update_mask; if (icp_res == 2) my_errno=HA_ERR_END_OF_FILE; /* got beyond the end of scanned range */ |