diff options
author | Paul J. Davis <paul.joseph.davis@gmail.com> | 2021-02-26 13:08:42 -0600 |
---|---|---|
committer | Paul J. Davis <paul.joseph.davis@gmail.com> | 2021-02-26 13:24:06 -0600 |
commit | 73875b5233138dcdd965bbd36d9581ca625e3a2d (patch) | |
tree | a64fff6ab8586638cf45d68cd959828125d1d839 | |
parent | 79b64ea6956875b5715e585ca6210ad018e6094b (diff) | |
download | couchdb-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.erl | 26 | ||||
-rw-r--r-- | src/ebtree/src/ebtree.erl | 3 |
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() -> |