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, [

Reply via email to