summaryrefslogtreecommitdiff
path: root/storage/maria/ma_rnext.c
diff options
context:
space:
mode:
authorMichael Widenius <monty@askmonty.org>2011-01-11 15:36:41 +0200
committerMichael Widenius <monty@askmonty.org>2011-01-11 15:36:41 +0200
commit050c004f5e6f152f5c4cdadda8a15e01d2f07a9a (patch)
treef5828daced42ff651d5f822af17844154fb9ffd1 /storage/maria/ma_rnext.c
parente63b5546c597f65696868eaf69159107bc4a8e44 (diff)
parent2eaa76b84426b19f8574876ad1fa85ae6cfe3196 (diff)
downloadmariadb-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.c17
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 */