From 365d054e01934bd5e0017c70d2f7da2bde6249e5 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Tue, 5 Mar 2024 13:27:07 +0100 Subject: [PATCH 1/2] fix: add subbits/4 and subits/5 rule_engine functions The documentation for the family of subbits functions says that the fifth and sixth parameters are optional (since they only make sense when the forth parameter is 'integer'). However, before this commit `subbits/4` and `subbits/5` did not exist. Fixes: https://emqx.atlassian.net/browse/EMQX-11942 https://github.com/emqx/emqx/issues/12587 --- apps/emqx_rule_engine/src/emqx_rule_funcs.erl | 12 ++++++++++++ apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl | 11 +++++++++++ 2 files changed, 23 insertions(+) diff --git a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl index 07d6597c3..735025e2b 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl @@ -96,6 +96,8 @@ bytesize/1, subbits/2, subbits/3, + subbits/4, + subbits/5, subbits/6 ]). @@ -556,6 +558,16 @@ subbits(Bits, Len) when is_integer(Len), is_bitstring(Bits) -> subbits(Bits, Start, Len) when is_integer(Start), is_integer(Len), is_bitstring(Bits) -> get_subbits(Bits, Start, Len, <<"integer">>, <<"unsigned">>, <<"big">>). +subbits(Bits, Start, Len, Type) when + is_integer(Start), is_integer(Len), is_bitstring(Bits) +-> + get_subbits(Bits, Start, Len, Type, <<"unsigned">>, <<"big">>). + +subbits(Bits, Start, Len, Type, Signedness) when + is_integer(Start), is_integer(Len), is_bitstring(Bits) +-> + get_subbits(Bits, Start, Len, Type, Signedness, <<"big">>). + subbits(Bits, Start, Len, Type, Signedness, Endianness) when is_integer(Start), is_integer(Len), is_bitstring(Bits) -> diff --git a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl index 358cca3fe..3bdfaa5b4 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl @@ -911,6 +911,17 @@ t_subbits2_float(_) -> ct:pal(";;;;~p", [R2]), ?assert((RL2 >= 0 andalso RL2 < 0.0001) orelse (RL2 =< 0 andalso RL2 > -0.0001)). +t_subbits_4_args(_) -> + R = apply_func(subbits, [<<5.3:64/float>>, 1, 64, <<"float">>]), + RL = (5.3 - R), + ?assert((RL >= 0 andalso RL < 0.0001) orelse (RL =< 0 andalso RL > -0.0001)). + +t_subbits_5_args(_) -> + ?assertEqual( + 456, + apply_func(subbits, [<<456:32/integer>>, 1, 32, <<"integer">>, <<"unsigned">>]) + ). + %%------------------------------------------------------------------------------ %% Test cases for Hash funcs %%------------------------------------------------------------------------------ From f0aecaf16fbeba9b7895e3550bffe7b9843b5ad9 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Tue, 5 Mar 2024 13:38:14 +0100 Subject: [PATCH 2/2] docs: add changelog text for new rule engine subbits functions --- changes/ce/fix-12652.en.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changes/ce/fix-12652.en.md diff --git a/changes/ce/fix-12652.en.md b/changes/ce/fix-12652.en.md new file mode 100644 index 000000000..22cdd0e5f --- /dev/null +++ b/changes/ce/fix-12652.en.md @@ -0,0 +1 @@ +The subbits functions with 4 and 5 parameters are documented but did not exist in the implementation. These functions have now been added.