summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J. Davis <paul.joseph.davis@gmail.com>2021-02-26 13:08:42 -0600
committerPaul J. Davis <paul.joseph.davis@gmail.com>2021-02-26 13:24:06 -0600
commit73875b5233138dcdd965bbd36d9581ca625e3a2d (patch)
treea64fff6ab8586638cf45d68cd959828125d1d839
parent79b64ea6956875b5715e585ca6210ad018e6094b (diff)
downloadcouchdb-73875b5233138dcdd965bbd36d9581ca625e3a2d.tar.gz
Add failing cases for ebtree:lookup_multi/3 bug
These two test cases expose the subtle bug in ebtree:lookup_multi/3 where a key that doesn't exist in the tree can prevent a subsequent lookup key from matching in the same KV node.
-rw-r--r--src/couch_views/test/couch_views_indexer_test.erl26
-rw-r--r--src/ebtree/src/ebtree.erl3
2 files changed, 28 insertions, 1 deletions
diff --git a/src/couch_views/test/couch_views_indexer_test.erl b/src/couch_views/test/couch_views_indexer_test.erl
index e18c00783..182cd6803 100644
--- a/src/couch_views/test/couch_views_indexer_test.erl
+++ b/src/couch_views/test/couch_views_indexer_test.erl
@@ -47,6 +47,7 @@ indexer_test_() ->
?TDEF_FE(multiple_identical_keys_from_same_doc),
?TDEF_FE(fewer_multiple_identical_keys_from_same_doc),
?TDEF_FE(multiple_design_docs),
+ ?TDEF_FE(multiple_doc_update_with_existing_rows),
?TDEF_FE(handle_size_key_limits),
?TDEF_FE(handle_size_value_limits),
?TDEF_FE(index_autoupdater_callback),
@@ -424,6 +425,31 @@ multiple_design_docs(Db) ->
?assertError({ddoc_deleted, _}, run_query(Db, DDoc2, ?MAP_FUN1)).
+multiple_doc_update_with_existing_rows(Db) ->
+ DDoc = create_ddoc(),
+ Doc0 = doc(0),
+ Doc1 = doc(1),
+
+ {ok, _} = fabric2_db:update_doc(Db, DDoc, []),
+ {ok, {Pos, Rev}} = fabric2_db:update_doc(Db, Doc1, []),
+
+ {ok, Out1} = run_query(Db, DDoc, ?MAP_FUN1),
+
+ ?assertEqual([row(<<"1">>, 1, 1)], Out1),
+
+ Doc2 = Doc1#doc{
+ revs = {Pos, [Rev]},
+ body = {[{<<"val">>, 2}]}
+ },
+ {ok, _} = fabric2_db:update_docs(Db, [Doc0, Doc2], []),
+
+ {ok, Out2} = run_query(Db, DDoc, ?MAP_FUN1),
+
+ ?assertEqual([
+ row(<<"0">>, 0, 0),
+ row(<<"1">>, 2, 2)
+ ], Out2).
+
handle_db_recreated_when_running(Db) ->
DbName = fabric2_db:name(Db),
diff --git a/src/ebtree/src/ebtree.erl b/src/ebtree/src/ebtree.erl
index 1a65c9a5e..bbb0ca897 100644
--- a/src/ebtree/src/ebtree.erl
+++ b/src/ebtree/src/ebtree.erl
@@ -1394,7 +1394,8 @@ lookup_multi_test() ->
validate_tree(Db, Tree),
?assertEqual([{1, 2}], lookup_multi(Db, Tree, [1])),
?assertEqual([{15, 16}, {2, 3}], lookup_multi(Db, Tree, [2, 15])),
- ?assertEqual([{15, 16}, {4, 5}, {2, 3}], lookup_multi(Db, Tree, [2, 101, 15, 4, -3])).
+ ?assertEqual([{15, 16}, {4, 5}, {2, 3}], lookup_multi(Db, Tree, [2, 101, 15, 4, -3])),
+ ?assertEqual([{2, 3}], lookup_multi(Db, Tree, [1.5, 2])).
insert_multi_test() ->