Skip to content

Commit 53795fc

Browse files
committed
stream_processor: fix operator precedence for logical operations
Signed-off-by: Aleksandr Cupacenko <apaxuc@gmail.com> revert definition removal Signed-off-by: Aleksandr Cupacenko <apaxuc@gmail.com> add operator precedence unit tests correct precedencer order add not_and precedent check correct function references
1 parent db27a84 commit 53795fc

3 files changed

Lines changed: 55 additions & 1 deletion

File tree

src/stream_processor/parser/sql.y

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
%name-prefix="flb_sp_" // replace with %define api.prefix {flb_sp_}
1+
%name-prefix "flb_sp_" // replace with %define api.prefix {flb_sp_}
22
%define api.pure full
33
%define parse.error verbose
44
%parse-param { struct flb_sp_cmd *cmd };
@@ -98,6 +98,10 @@ void yyerror(struct flb_sp_cmd *cmd, const char *query, void *scanner, const cha
9898
%type <integer> aggregate_func
9999
%type <integer> COUNT AVG SUM MAX MIN TIMESERIES_FORECAST
100100

101+
/* Define operator precedence and associativity for logical operations in conditions */
102+
%left OR // Lowest precedence for OR
103+
%left AND // Middle precedence for AND
104+
%right NOT // Highest precedence for NOT
101105

102106
%destructor { flb_free ($$); } IDENTIFIER
103107

tests/internal/include/sp_cb_functions.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,36 @@ static void cb_record_not_contains(int id, struct task_check *check,
206206
TEST_CHECK(ret == 0);
207207
}
208208

209+
static void cb_select_and_or_precedence(int id, struct task_check *check,
210+
char *buf, size_t size)
211+
{
212+
int ret;
213+
214+
/* Expect all 11 rows */
215+
ret = mp_count_rows(buf, size);
216+
TEST_CHECK_(ret == 11, "expected 11 rows but got %d", ret);
217+
}
218+
219+
static void cb_select_not_or_precedence(int id, struct task_check *check,
220+
char *buf, size_t size)
221+
{
222+
int ret;
223+
224+
/* Expect all 11 rows */
225+
ret = mp_count_rows(buf, size);
226+
TEST_CHECK_(ret == 11, "expected 11 rows but got %d", ret);
227+
}
228+
229+
static void cb_select_not_and_precedence(int id, struct task_check *check,
230+
char *buf, size_t size)
231+
{
232+
int ret;
233+
234+
/* Expect 0 rows */
235+
ret = mp_count_rows(buf, size);
236+
TEST_CHECK_(ret == 0, "expected 0 rows but got %d", ret);
237+
}
238+
209239
/* Callback functions to perform checks over results */
210240
static void cb_select_sub_blue(int id, struct task_check *check,
211241
char *buf, size_t size)

tests/internal/include/sp_select_keys.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,26 @@ struct task_check select_keys_checks[] = {
126126
"SELECT id FROM TAG:'samples' WHERE @record.contains(x);",
127127
cb_record_not_contains,
128128
},
129+
130+
/* Operator precedence */
131+
{
132+
18, 0, 0, 0,
133+
"and_or_precedence",
134+
"SELECT id FROM STREAM:FLB WHERE false AND true OR true;",
135+
cb_select_and_or_precedence,
136+
},
137+
{
138+
19, 0, 0, 0,
139+
"not_or_precedence",
140+
"SELECT id FROM STREAM:FLB WHERE NOT true OR true;",
141+
cb_select_not_or_precedence,
142+
},
143+
{
144+
20, 0, 0, 0,
145+
"not_and_precedence",
146+
"SELECT id FROM STREAM:FLB WHERE NOT true AND false;",
147+
cb_select_not_and_precedence,
148+
},
129149
};
130150

131151
#endif

0 commit comments

Comments
 (0)