/* wanted_field has the value in all available formats */
while ((field = event_find_field(event, wanted_field->key)) == NULL) {
event = event_get_parent(event);
- if (event == NULL)
- return FALSE;
+ if (event == NULL) {
+ /* "field=" matches nonexistent field */
+ return wanted_field->value.str[0] == '\0';
+ }
}
switch (field->value_type) {
case EVENT_FIELD_VALUE_TYPE_STR:
if (field->value.str[0] == '\0') {
- /* field was removed */
- return FALSE;
+ /* field was removed, but it matches "field=" filter */
+ return wanted_field->value.str[0] == '\0';
}
return wildcard_match_icase(field->value.str, wanted_field->value.str);
case EVENT_FIELD_VALUE_TYPE_INTMAX:
event_field_clear(child, "int");
for (unsigned int i = 0; i < N_ELEMENTS(keys); i++) {
+ /* match any value */
filter_fields[0].key = keys[i];
filter = event_filter_create();
event_filter_add(filter, &query);
event_filter_unref(&filter);
}
+ /* match empty field */
+ filter_fields[0].key = "str";
+ filter_fields[0].value = "";
+ filter = event_filter_create();
+ event_filter_add(filter, &query);
+
+ test_assert(!event_filter_match(filter, parent, &failure_ctx));
+ test_assert(event_filter_match(filter, child, &failure_ctx));
+ event_filter_unref(&filter);
+
+ /* match nonexistent field */
+ filter_fields[0].key = "nonexistent";
+ filter_fields[0].value = "";
+ filter = event_filter_create();
+ event_filter_add(filter, &query);
+
+ test_assert(event_filter_match(filter, parent, &failure_ctx));
+ test_assert(event_filter_match(filter, child, &failure_ctx));
+ event_filter_unref(&filter);
+
event_unref(&parent);
event_unref(&child);
test_end();