diff --git a/pkg/logql/log/filter.go b/pkg/logql/log/filter.go index 92097c44dfe9e..5f5eff6b2ff89 100644 --- a/pkg/logql/log/filter.go +++ b/pkg/logql/log/filter.go @@ -307,11 +307,16 @@ type orFilter struct { // newOrFilter creates a new filter which matches only if left or right matches. func newOrFilter(left MatcherFilterer, right MatcherFilterer) MatcherFilterer { - if left == nil || isTrueFilter(left) { - return right + // If either side matches all, OR matches all. + if isTrueFilter(left) || isTrueFilter(right) { + return TrueFilter } - if right == nil || isTrueFilter(right) { + // nil behaves as false: nil OR X = X. + if left == nil { + return right + } + if right == nil { return left } diff --git a/pkg/logql/log/filter_test.go b/pkg/logql/log/filter_test.go index b364ee2888e7f..19ade3066fcb2 100644 --- a/pkg/logql/log/filter_test.go +++ b/pkg/logql/log/filter_test.go @@ -159,6 +159,21 @@ func Test_TrueFilter(t *testing.T) { } } +func Test_OrFilterWithEmptyString(t *testing.T) { + // empty string produces TrueFilter + notfoundFilter := newContainsFilter([]byte("notfound"), false) + emptyFilter := newContainsFilter([]byte(""), false) + + // notfound OR "" produces TrueFilter + orFilter := newOrFilter(notfoundFilter, emptyFilter) + require.Equal(t, TrueFilter, orFilter) + + // "(notfound|)" contains an empty branch → TrueFilter + regexFilter, err := parseRegexpFilter("(notfound|)", true, false) + require.NoError(t, err) + require.Equal(t, TrueFilter, regexFilter) +} + func Benchmark_LineFilter(b *testing.B) { b.ReportAllocs() logline := `level=bar ts=2020-02-22T14:57:59.398312973Z caller=logging.go:44 traceID=2107b6b551458908 msg="GET /buzz (200) 4.599635ms`