diff options
author | Michael Widenius <monty@askmonty.org> | 2011-02-22 11:15:47 +0200 |
---|---|---|
committer | Michael Widenius <monty@askmonty.org> | 2011-02-22 11:15:47 +0200 |
commit | 4ad6d6b6c9e551d84fe727d1f48edc8722098bfd (patch) | |
tree | e305bc182a35eaf41802e4cc51a61bfd5bde5cd2 /storage/maria/ma_rnext.c | |
parent | 38e3787af4ac87274c7ef0e632a97aa1217e284a (diff) | |
parent | 2c7d6f12ee10903c3002bba42ee15abc2b89fa8e (diff) | |
download | mariadb-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.c | 17 |
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) { |