fix: rule engine different behavior for div and mod
Previously, the div operation could only be used as an infix operation while mod could only be used as a function call. After this commit, one can use both div and mod using function call syntax and infix syntax. Fixes: https://emqx.atlassian.net/browse/EMQX-10216
This commit is contained in:
parent
8ba5a54f2e
commit
cf31b65076
|
@ -70,7 +70,8 @@
|
||||||
Op =:= '-' orelse
|
Op =:= '-' orelse
|
||||||
Op =:= '*' orelse
|
Op =:= '*' orelse
|
||||||
Op =:= '/' orelse
|
Op =:= '/' orelse
|
||||||
Op =:= 'div')
|
Op =:= 'div' orelse
|
||||||
|
Op =:= 'mod')
|
||||||
).
|
).
|
||||||
|
|
||||||
%% Compare operators
|
%% Compare operators
|
||||||
|
|
|
@ -66,6 +66,7 @@ groups() ->
|
||||||
t_sqlselect_with_3rd_party_impl2,
|
t_sqlselect_with_3rd_party_impl2,
|
||||||
t_sqlselect_with_3rd_party_funcs_unknown,
|
t_sqlselect_with_3rd_party_funcs_unknown,
|
||||||
t_sqlselect_001,
|
t_sqlselect_001,
|
||||||
|
t_sqlselect_002,
|
||||||
t_sqlselect_inject_props,
|
t_sqlselect_inject_props,
|
||||||
t_sqlselect_01,
|
t_sqlselect_01,
|
||||||
t_sqlselect_02,
|
t_sqlselect_02,
|
||||||
|
@ -1089,6 +1090,36 @@ t_sqlselect_001(_Config) ->
|
||||||
)
|
)
|
||||||
).
|
).
|
||||||
|
|
||||||
|
t_sqlselect_002(_Config) ->
|
||||||
|
%% Verify that the div and mod can be used both as infix operations and as
|
||||||
|
%% function calls
|
||||||
|
Sql =
|
||||||
|
""
|
||||||
|
"select 2 mod 2 as mod1,\n"
|
||||||
|
" mod(3, 2) as mod2,\n"
|
||||||
|
" 4 div 2 as div1,\n"
|
||||||
|
" div(7, 2) as div2\n"
|
||||||
|
" from \"t/#\" "
|
||||||
|
"",
|
||||||
|
?assertMatch(
|
||||||
|
{ok, #{
|
||||||
|
<<"mod1">> := 0,
|
||||||
|
<<"mod2">> := 1,
|
||||||
|
<<"div1">> := 2,
|
||||||
|
<<"div2">> := 3
|
||||||
|
}},
|
||||||
|
emqx_rule_sqltester:test(
|
||||||
|
#{
|
||||||
|
sql => Sql,
|
||||||
|
context =>
|
||||||
|
#{
|
||||||
|
payload => #{<<"what">> => 4},
|
||||||
|
topic => <<"t/a">>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
).
|
||||||
|
|
||||||
t_sqlselect_inject_props(_Config) ->
|
t_sqlselect_inject_props(_Config) ->
|
||||||
SQL =
|
SQL =
|
||||||
"SELECT json_decode(payload) as p, payload, "
|
"SELECT json_decode(payload) as p, payload, "
|
||||||
|
|
2
mix.exs
2
mix.exs
|
@ -65,7 +65,7 @@ defmodule EMQXUmbrella.MixProject do
|
||||||
# maybe forbid to fetch quicer
|
# maybe forbid to fetch quicer
|
||||||
{:emqtt,
|
{:emqtt,
|
||||||
github: "emqx/emqtt", tag: "1.8.6", override: true, system_env: maybe_no_quic_env()},
|
github: "emqx/emqtt", tag: "1.8.6", override: true, system_env: maybe_no_quic_env()},
|
||||||
{:rulesql, github: "emqx/rulesql", tag: "0.1.6"},
|
{:rulesql, github: "emqx/rulesql", tag: "0.1.7"},
|
||||||
{:observer_cli, "1.7.1"},
|
{:observer_cli, "1.7.1"},
|
||||||
{:system_monitor, github: "ieQu1/system_monitor", tag: "3.0.3"},
|
{:system_monitor, github: "ieQu1/system_monitor", tag: "3.0.3"},
|
||||||
{:telemetry, "1.1.0"},
|
{:telemetry, "1.1.0"},
|
||||||
|
|
|
@ -70,7 +70,7 @@
|
||||||
, {replayq, {git, "https://github.com/emqx/replayq.git", {tag, "0.3.7"}}}
|
, {replayq, {git, "https://github.com/emqx/replayq.git", {tag, "0.3.7"}}}
|
||||||
, {pbkdf2, {git, "https://github.com/emqx/erlang-pbkdf2.git", {tag, "2.0.4"}}}
|
, {pbkdf2, {git, "https://github.com/emqx/erlang-pbkdf2.git", {tag, "2.0.4"}}}
|
||||||
, {emqtt, {git, "https://github.com/emqx/emqtt", {tag, "1.8.6"}}}
|
, {emqtt, {git, "https://github.com/emqx/emqtt", {tag, "1.8.6"}}}
|
||||||
, {rulesql, {git, "https://github.com/emqx/rulesql", {tag, "0.1.6"}}}
|
, {rulesql, {git, "https://github.com/emqx/rulesql", {tag, "0.1.7"}}}
|
||||||
, {observer_cli, "1.7.1"} % NOTE: depends on recon 2.5.x
|
, {observer_cli, "1.7.1"} % NOTE: depends on recon 2.5.x
|
||||||
, {system_monitor, {git, "https://github.com/ieQu1/system_monitor", {tag, "3.0.3"}}}
|
, {system_monitor, {git, "https://github.com/ieQu1/system_monitor", {tag, "3.0.3"}}}
|
||||||
, {getopt, "1.0.2"}
|
, {getopt, "1.0.2"}
|
||||||
|
|
Loading…
Reference in New Issue