summaryrefslogtreecommitdiff
path: root/storage/maria/ma_rnext.c
diff options
context:
space:
mode:
authorMichael Widenius <monty@askmonty.org>2011-02-22 11:15:47 +0200
committerMichael Widenius <monty@askmonty.org>2011-02-22 11:15:47 +0200
commit4ad6d6b6c9e551d84fe727d1f48edc8722098bfd (patch)
treee305bc182a35eaf41802e4cc51a61bfd5bde5cd2 /storage/maria/ma_rnext.c
parent38e3787af4ac87274c7ef0e632a97aa1217e284a (diff)
parent2c7d6f12ee10903c3002bba42ee15abc2b89fa8e (diff)
downloadmariadb-git-4ad6d6b6c9e551d84fe727d1f48edc8722098bfd.tar.gz
Merge in new handler and handlersocket code into 5.3 main
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 2fd8bf4e603..e5ee84b61c7 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;
ICP_RESULT icp_res= ICP_MATCH;
+ 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
{
@@ -118,7 +133,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 (error || icp_res != ICP_MATCH)
{