}
return FALSE;
} else if (node->op != EVENT_FILTER_OP_CMP_EQ) {
- /* we only support string equality comparisons */
+ /* In this branch a numeric value is matched against a
+ wildcard, which requires an equality operation. */
+ if (!node->warned_type_mismatch) {
+ const char *name = event->sending_name;
+ /* Use i_warning to prevent event filter recursions. */
+ i_warning("Event filter matches integer field "
+ "'%s' against wildcard value '%s' "
+ "with an incompatible operation '%s', "
+ "please use '='. (event=%s, "
+ "source=%s:%u)",
+ wanted_field->key,
+ wanted_field->value.str,
+ event_filter_export_query_expr_op(node->op),
+ name != NULL ? name : "",
+ source_filename, source_linenum);
+ node->warned_type_mismatch = TRUE;
+ }
return FALSE;
} else {
char tmp[MAX_INT_STRLEN];
event_add_int(e, "number", 0);
- filter = event_filter_create();
- test_assert(event_filter_parse("number > *", filter, &error) == 0);
- test_assert(!event_filter_match(filter, e, &failure_ctx));
- event_filter_unref(&filter);
-
filter = event_filter_create();
test_assert(event_filter_parse("number=0", filter, &error) == 0);
test_assert(event_filter_match(filter, e, &failure_ctx));
test_expect_no_more_errors();
event_filter_unref(&filter);
+ event_add_int(e, "status_code", 204);
+
+ filter = event_filter_create();
+ test_assert(event_filter_parse("status_code > 2*", filter, &error) == 0);
+ test_expect_error_string("Event filter matches integer field "
+ "'status_code' against wildcard value '2*' "
+ "with an incompatible operation '>', please "
+ "use '='.");
+ test_assert(!event_filter_match(filter, e, &failure_ctx));
+ test_expect_no_more_errors();
+ event_filter_unref(&filter);
+
+ filter = event_filter_create();
+ test_assert(event_filter_parse("status_code = 2*", filter, &error) == 0);
+ test_assert(event_filter_match(filter, e, &failure_ctx));
+ event_filter_unref(&filter);
+
event_unref(&e);
test_end();
}