diff options
author | jiahuili <lijiahui702@gmail.com> | 2023-04-11 16:25:37 -0500 |
---|---|---|
committer | Nick Vatamaniuc <nickva@users.noreply.github.com> | 2023-04-12 11:13:39 -0400 |
commit | a6ab75b43685117467ff0c1628022d9487d1ade9 (patch) | |
tree | 15852aa001320eb06b2b291e7b9fc4771e93a1bf /src/couch_mrview | |
parent | e32cfd63d8950e2d1e083374e8cd2a1445b606e5 (diff) | |
download | couchdb-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.erl | 4 | ||||
-rw-r--r-- | src/couch_mrview/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, [ |