This is an automated email from the ASF dual-hosted git repository.
vatamane pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git
The following commit(s) were added to refs/heads/main by this push:
new a6ab75b43 Querying `_all_docs` with non-string `key` should return an
empty list
a6ab75b43 is described below
commit a6ab75b43685117467ff0c1628022d9487d1ade9
Author: jiahuili <[email protected]>
AuthorDate: Tue Apr 11 16:25:37 2023 -0500
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.
---
src/couch_mrview/src/couch_mrview_util.erl | 4 ++--
.../test/eunit/couch_mrview_all_docs_tests.erl | 27 ++++++++++++++++++++--
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, [