summaryrefslogtreecommitdiff
path: root/src/couch_mrview
diff options
context:
space:
mode:
authorjiahuili <lijiahui702@gmail.com>2023-04-11 16:25:37 -0500
committerNick Vatamaniuc <nickva@users.noreply.github.com>2023-04-12 11:13:39 -0400
commita6ab75b43685117467ff0c1628022d9487d1ade9 (patch)
tree15852aa001320eb06b2b291e7b9fc4771e93a1bf /src/couch_mrview
parente32cfd63d8950e2d1e083374e8cd2a1445b606e5 (diff)
downloadcouchdb-a6ab75b43685117467ff0c1628022d9487d1ade9.tar.gz
Querying `_all_docs` with non-string `key` should return an empty list
Querying `_all_docs` with a non-string `key` should return an empty list, but currently it will return all documents. This PR should fix it.
Diffstat (limited to 'src/couch_mrview')
-rw-r--r--src/couch_mrview/src/couch_mrview_util.erl4
-rw-r--r--src/couch_mrview/test/eunit/couch_mrview_all_docs_tests.erl27
2 files changed, 27 insertions, 4 deletions
diff --git a/src/couch_mrview/src/couch_mrview_util.erl b/src/couch_mrview/src/couch_mrview_util.erl
index 1f39959af..440eb7222 100644
--- a/src/couch_mrview/src/couch_mrview_util.erl
+++ b/src/couch_mrview/src/couch_mrview_util.erl
@@ -903,12 +903,12 @@ all_docs_key_opts(#mrargs{keys = Keys, direction = Dir} = Args, Extra) ->
Keys
).
-ad_skey_opts(#mrargs{start_key = SKey}) when is_binary(SKey) ->
+ad_skey_opts(#mrargs{start_key = SKey}) when SKey =/= undefined ->
[{start_key, SKey}];
ad_skey_opts(#mrargs{start_key_docid = SKeyDocId}) ->
[{start_key, SKeyDocId}].
-ad_ekey_opts(#mrargs{end_key = EKey} = Args) when is_binary(EKey) ->
+ad_ekey_opts(#mrargs{end_key = EKey} = Args) when EKey =/= undefined ->
Type =
if
Args#mrargs.inclusive_end -> end_key;
diff --git a/src/couch_mrview/test/eunit/couch_mrview_all_docs_tests.erl b/src/couch_mrview/test/eunit/couch_mrview_all_docs_tests.erl
index 5b9db435b..4de050ef4 100644
--- a/src/couch_mrview/test/eunit/couch_mrview_all_docs_tests.erl
+++ b/src/couch_mrview/test/eunit/couch_mrview_all_docs_tests.erl
@@ -40,6 +40,8 @@ all_docs_test_() ->
[
fun should_query/1,
fun should_query_with_range/1,
+ fun should_query_with_non_string_key/1,
+ fun should_query_with_non_string_keys/1,
fun should_query_with_range_and_same_keys/1,
fun raise_error_query_with_range_and_different_keys/1,
fun should_query_with_range_rev/1,
@@ -81,6 +83,25 @@ should_query_with_range(Db) ->
]},
?_assertEqual(Expect, Result).
+should_query_with_non_string_key(Db) ->
+ Expect = {ok, [{meta, [{total, 11}, {offset, 0}]}]},
+ [
+ ?_assertEqual(Expect, run_query(Db, [{start_key, Key}, {end_key, Key}]))
+ || Key <- [1, a, [1, "2"], #{id => 1}]
+ ].
+
+should_query_with_non_string_keys(Db) ->
+ [
+ ?_assertEqual(
+ {ok, [
+ {meta, [{total, 11}, {offset, 0}]},
+ {row, [{id, error}, {key, Key}, {value, not_found}]}
+ ]},
+ run_query(Db, [{keys, [Key]}])
+ )
+ || Key <- [1, a, [1, "2"], #{id => 1}]
+ ].
+
should_query_with_range_and_same_keys(Db) ->
Result = run_query(Db, [{keys, [<<"3">>]}, {start_key, <<"3">>}, {end_key, <<"3">>}]),
Expect =
@@ -92,8 +113,10 @@ should_query_with_range_and_same_keys(Db) ->
raise_error_query_with_range_and_different_keys(Db) ->
Error = {query_parse_error, <<"`keys` is incompatible with `key`, `start_key` and `end_key`">>},
- ?_assertThrow(Error, run_query(Db, [{keys, [<<"1">>]}, {start_key, <<"5">>}])),
- ?_assertThrow(Error, run_query(Db, [{keys, [<<"5">>]}, {start_key, <<"5">>}])).
+ [
+ ?_assertThrow(Error, run_query(Db, [{keys, [<<"1">>]}, {start_key, <<"5">>}])),
+ ?_assertThrow(Error, run_query(Db, [{keys, [<<"5">>]}, {start_key, <<"5">>}]))
+ ].
should_query_with_range_rev(Db) ->
Result = run_query(Db, [