summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J. Davis <paul.joseph.davis@gmail.com>2020-08-05 13:20:36 -0500
committerPaul J. Davis <paul.joseph.davis@gmail.com>2020-08-05 15:08:42 -0500
commit29d649850874735de919ad39a9e04bef29c96267 (patch)
tree7a4f0a62ebf369ae99a1a6975b74fe817bfe4943
parenta32bc83084e8b927931fe23fb234f5c9fa3f8dbd (diff)
downloadcouchdb-29d649850874735de919ad39a9e04bef29c96267.tar.gz
Fix range scans over an empty tree
-rw-r--r--src/ebtree/src/ebtree.erl24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/ebtree/src/ebtree.erl b/src/ebtree/src/ebtree.erl
index cd08e753e..15a21a695 100644
--- a/src/ebtree/src/ebtree.erl
+++ b/src/ebtree/src/ebtree.erl
@@ -415,6 +415,9 @@ range(Db, #tree{} = Tree, StartKey, EndKey, AccFun, Acc0) ->
end).
+range(_Tx, #tree{}, #node{id = ?NODE_ROOT_ID, members = []}, _StartKey, _EndKey, _AccFun, Acc0) ->
+ Acc0;
+
range(Tx, #tree{} = Tree, #node{level = 0} = Node, StartKey, EndKey, AccFun, Acc0) ->
InRange = [{K, V} || {K, V} <- Node#node.members,
collate(Tree, StartKey, K, [lt, eq]), collate(Tree, K, EndKey, [lt, eq])],
@@ -448,6 +451,9 @@ reverse_range(Db, #tree{} = Tree, StartKey, EndKey, AccFun, Acc0) ->
end).
+reverse_range(_Tx, #tree{}, #node{id = ?NODE_ROOT_ID, members = []}, _StartKey, _EndKey, _AccFun, Acc0) ->
+ Acc0;
+
reverse_range(Tx, #tree{} = Tree, #node{level = 0} = Node, StartKey, EndKey, AccFun, Acc0) ->
InRange = [{K, V} || {K, V} <- Node#node.members,
collate(Tree, StartKey, K, [lt, eq]), collate(Tree, K, EndKey, [lt, eq])],
@@ -1301,6 +1307,15 @@ lookup_test_fun(Max, Order) ->
[Order, Max, 1000 * (Max / msec(T1 - T0)), 1000 * (Max / msec(T2 - T1))]).
+empty_range_test() ->
+ Db = erlfdb_util:get_test_db([empty]),
+ Tree = open(Db, <<1, 2, 3>>, 10),
+ ?assertEqual(
+ blah,
+ range(Db, Tree, min(), max(), fun(_, A) -> A end, blah)
+ ).
+
+
range_test_() ->
{timeout, 1000, fun() ->
Db = erlfdb_util:get_test_db([empty]),
@@ -1317,6 +1332,15 @@ range_test_() ->
end}.
+empty_reverse_range_test() ->
+ Db = erlfdb_util:get_test_db([empty]),
+ Tree = open(Db, <<1, 2, 3>>, 10),
+ ?assertEqual(
+ blah,
+ reverse_range(Db, Tree, min(), max(), fun(_, A) -> A end, blah)
+ ).
+
+
reverse_range_test_() ->
{timeout, 1000, fun() ->
Db = erlfdb_util:get_test_db([empty]),