From 8624020e7653aa85e5e46f31abb49554fa339841 Mon Sep 17 00:00:00 2001 From: Maximiliano Churichi Date: Fri, 6 Mar 2026 01:03:07 +0000 Subject: [PATCH 1/2] fix: reject trailing tokens in lucene parser --- pkg/query/lucene.go | 5 +++++ pkg/query/lucene_test.go | 3 +++ 2 files changed, 8 insertions(+) diff --git a/pkg/query/lucene.go b/pkg/query/lucene.go index 6e61d3c..2e31792 100644 --- a/pkg/query/lucene.go +++ b/pkg/query/lucene.go @@ -36,6 +36,11 @@ func Parse(queryStr string) (*Query, error) { return nil, err } + parser.skipWhitespace() + if parser.pos < len(parser.input) { + return nil, fmt.Errorf("unexpected token near %q", parser.input[parser.pos:]) + } + return &Query{filters: []Filter{filter}}, nil } diff --git a/pkg/query/lucene_test.go b/pkg/query/lucene_test.go index 5749f4f..2407522 100644 --- a/pkg/query/lucene_test.go +++ b/pkg/query/lucene_test.go @@ -23,6 +23,9 @@ func TestParse(t *testing.T) { {"complex query", "(level:ERROR OR level:WARN) AND service:api", false}, {"wildcard field", "message:*timeout*", false}, {"quoted string", `message:"connection refused"`, false}, + {"dangling closing parenthesis", `level:ERROR)`, true}, + {"trailing token after expression", `level:ERROR foo`, true}, + {"trailing token after grouped expression", `(level:ERROR) bar`, true}, } for _, tt := range tests { From d47e2bd2d2109710d5b30b14bf9431b71afaeeb6 Mon Sep 17 00:00:00 2001 From: Maximiliano Churichi Date: Fri, 6 Mar 2026 01:06:01 +0000 Subject: [PATCH 2/2] test: correct lucene trailing token expectations --- pkg/query/lucene_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/query/lucene_test.go b/pkg/query/lucene_test.go index 2407522..2a3c704 100644 --- a/pkg/query/lucene_test.go +++ b/pkg/query/lucene_test.go @@ -24,8 +24,9 @@ func TestParse(t *testing.T) { {"wildcard field", "message:*timeout*", false}, {"quoted string", `message:"connection refused"`, false}, {"dangling closing parenthesis", `level:ERROR)`, true}, - {"trailing token after expression", `level:ERROR foo`, true}, - {"trailing token after grouped expression", `(level:ERROR) bar`, true}, + {"extra closing parenthesis after group", `(level:ERROR))`, true}, + {"implicit AND with trailing keyword", `level:ERROR foo`, false}, + {"implicit AND after grouped expression", `(level:ERROR) bar`, false}, } for _, tt := range tests {