diff --git a/pkg/logql/syntax/ast.go b/pkg/logql/syntax/ast.go index 900802207c506..cea41f4d95c5d 100644 --- a/pkg/logql/syntax/ast.go +++ b/pkg/logql/syntax/ast.go @@ -353,6 +353,8 @@ func newNestedLineFilterExpr(left *LineFilterExpr, right *LineFilterExpr) *LineF return &LineFilterExpr{ Left: left, LineFilter: right.LineFilter, + Or: right.Or, + IsOrChild: right.IsOrChild, } } diff --git a/pkg/logql/syntax/ast_test.go b/pkg/logql/syntax/ast_test.go index b0c20005b74ad..ece470516eb45 100644 --- a/pkg/logql/syntax/ast_test.go +++ b/pkg/logql/syntax/ast_test.go @@ -383,6 +383,13 @@ func Test_FilterMatcher(t *testing.T) { }, []linecheck{{"foo", true}, {"bar", true}, {"none", false}}, }, + { + `{app="foo"} |= "foo" or "bar" |= "buzz" or "fizz"`, + []*labels.Matcher{ + mustNewMatcher(labels.MatchEqual, "app", "foo"), + }, + []linecheck{{"foo buzz", true}, {"bar fizz", true}, {"foo", false}, {"bar", false}, {"none", false}}, + }, { `{app="foo"} != "foo" or "bar"`, []*labels.Matcher{ @@ -496,6 +503,14 @@ func TestStringer(t *testing.T) { in: `{app="foo"} |~ "foo" or "bar" or "baz"`, out: `{app="foo"} |~ "foo" or "bar" or "baz"`, }, + { + in: `{app="foo"} |= "foo" or "bar" |= "buzz" or "fizz"`, + out: `{app="foo"} |= "foo" or "bar" |= "buzz" or "fizz"`, + }, + { + out: `{app="foo"} |= "foo" or "bar" |~ "buzz|fizz"`, + in: `{app="foo"} |= "foo" or "bar" |~ "buzz|fizz"`, + }, { in: `{app="foo"} |= ip("127.0.0.1") or "foo"`, out: `{app="foo"} |= ip("127.0.0.1") or "foo"`, diff --git a/pkg/logql/syntax/parser_test.go b/pkg/logql/syntax/parser_test.go index cd45b6ec74c1e..7152d78adac12 100644 --- a/pkg/logql/syntax/parser_test.go +++ b/pkg/logql/syntax/parser_test.go @@ -3138,6 +3138,41 @@ var ParseTestCases = []struct { }, }, }, + { + in: `{app="foo"} |= "foo" or "bar" |= "buzz" or "fizz"`, + exp: &PipelineExpr{ + Left: newMatcherExpr([]*labels.Matcher{mustNewMatcher(labels.MatchEqual, "app", "foo")}), + MultiStages: MultiStageExpr{ + &LineFilterExpr{ + Left: newOrLineFilter( + &LineFilterExpr{ + LineFilter: LineFilter{ + Ty: labels.MatchEqual, + Match: "foo", + }, + }, + &LineFilterExpr{ + LineFilter: LineFilter{ + Ty: labels.MatchEqual, + Match: "bar", + }, + }), + LineFilter: LineFilter{ + Ty: labels.MatchEqual, + Match: "buzz", + }, + Or: &LineFilterExpr{ + LineFilter: LineFilter{ + Ty: labels.MatchEqual, + Match: "fizz", + }, + IsOrChild: true, + }, + IsOrChild: false, + }, + }, + }, + }, } func TestParse(t *testing.T) {