summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDon Anderson <dda@mongodb.com>2016-05-02 11:36:37 -0400
committerDon Anderson <dda@mongodb.com>2016-05-02 11:36:37 -0400
commit92497038c06e5ef7e640434fe2b4a1166f644174 (patch)
treeb507ac814477c42914bda5e16126103772464a8f
parent29c36f5e86b3e772924486d1da737b1a58c76a48 (diff)
downloadmongo-92497038c06e5ef7e640434fe2b4a1166f644174.tar.gz
WT-2592 Fix joins for the non-recno, non-raw case (#2705)
WT-2592 Fix joins for the non-recno, non-raw case. Also detect a failed search as the last step of the WT_CURSOR::next() operation, and distinguish it from WT_NOTFOUND.
-rw-r--r--src/cursor/cur_join.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/src/cursor/cur_join.c b/src/cursor/cur_join.c
index 8bf7007527b..675d4851b38 100644
--- a/src/cursor/cur_join.c
+++ b/src/cursor/cur_join.c
@@ -1076,7 +1076,6 @@ __curjoin_next(WT_CURSOR *cursor)
WT_CURSOR_JOIN_ITER *iter;
WT_DECL_RET;
WT_SESSION_IMPL *session;
- const uint8_t *p;
int tret;
cjoin = (WT_CURSOR_JOIN *)cursor;
@@ -1104,19 +1103,17 @@ __curjoin_next(WT_CURSOR *cursor)
if (ret == 0) {
/*
- * Position the 'main' cursor, this will be used to
- * retrieve values from the cursor join.
+ * Position the 'main' cursor, this will be used to retrieve
+ * values from the cursor join. The key we have is raw, but
+ * the main cursor may not be raw.
*/
c = cjoin->main;
- if (WT_CURSOR_RECNO(cursor) &&
- !F_ISSET(cursor, WT_CURSTD_RAW)) {
- p = (const uint8_t *)iter->curkey->data;
- WT_ERR(__wt_vunpack_uint(&p, iter->curkey->size,
- &cjoin->iface.recno));
- c->set_key(c, cjoin->iface.recno);
- } else
- c->set_key(c, iter->curkey);
- WT_ERR(c->search(c));
+ __wt_cursor_set_raw_key(c, iter->curkey);
+
+ /* A failed search is not expected, don't return WT_NOTFOUND. */
+ if ((ret = c->search(c)) == WT_NOTFOUND)
+ ret = WT_ERROR;
+ WT_ERR(ret);
F_SET(cursor, WT_CURSTD_KEY_INT | WT_CURSTD_VALUE_INT);
} else if (ret == WT_NOTFOUND &&
(tret = __curjoin_iter_close_all(iter)) != 0)