From caf1e70b6a4852605c8a5a6de211688bb9359403 Mon Sep 17 00:00:00 2001 From: Will Holley Date: Thu, 2 Nov 2023 11:11:23 +0000 Subject: [PATCH] add utf8 check --- src/mango/src/mango_idx_view.erl | 6 +++++- src/mango/src/mango_selector.erl | 12 ++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/mango/src/mango_idx_view.erl b/src/mango/src/mango_idx_view.erl index 29895fbf9c6..671a61fa9c2 100644 --- a/src/mango/src/mango_idx_view.erl +++ b/src/mango/src/mango_idx_view.erl @@ -347,7 +347,7 @@ range(Selector, Index) -> range(Selector, Index, '$gt', mango_json:min(), '$lt', mango_json:max()). % Adjust Low and High based on values found for the -% givend Index in Selector. +% given Index in Selector. range({[{<<"$and">>, Args}]}, Index, LCmp, Low, HCmp, High) -> lists:foldl( fun @@ -624,6 +624,10 @@ indexable_fields_gte_test() -> Selector = #{<<"field">> => #{<<"$gte">> => undefined}}, ?assertEqual([<<"field">>], indexable_fields_of(Selector)). +indexable_fields_beginswith_test() -> + Selector = #{<<"field">> => #{<<"$beginsWith">> => undefined}}, + ?assertEqual([<<"field">>], indexable_fields_of(Selector)). + indexable_fields_gt_test() -> Selector = #{<<"field">> => #{<<"$gt">> => undefined}}, ?assertEqual([<<"field">>], indexable_fields_of(Selector)). diff --git a/src/mango/src/mango_selector.erl b/src/mango/src/mango_selector.erl index 93d3b10ca6c..307efddc449 100644 --- a/src/mango/src/mango_selector.erl +++ b/src/mango/src/mango_selector.erl @@ -136,7 +136,10 @@ norm_ops({[{<<"$text">>, Arg}]}) when norm_ops({[{<<"$text">>, Arg}]}) -> ?MANGO_ERROR({bad_arg, '$text', Arg}); norm_ops({[{<<"$beginsWith">>, Arg}]} = Cond) when is_binary(Arg) -> - Cond; + case couch_util:validate_utf8(Arg) of + true -> Cond; + false -> ?MANGO_ERROR({bad_arg, '$beginsWith', Arg}) + end; % Not technically an operator but we pass it through here % so that this function accepts its own output. This exists % so that $text can have a field name value which simplifies @@ -1070,12 +1073,17 @@ check_beginswith(Field, Prefix) -> match_beginswith_test() -> % matching ?assertEqual(true, check_beginswith(<<"_id">>, <<"f">>)), - % no match (user_id is not a binary string) + % no match (user_id field in the test doc contains an integer) ?assertEqual(false, check_beginswith(<<"user_id">>, <<"f">>)), % invalid (prefix is not a binary string) ?assertThrow( {mango_error, mango_selector, {invalid_operator, <<"$beginsWith">>}}, check_beginswith(<<"user_id">>, 1) + ), + % invalid (prefix is not a utf8 string) + ?assertThrow( + {mango_error, mango_selector, {invalid_operator, <<"$beginsWith">>}}, + check_beginswith(<<123>>, 1) ). -endif.