diff --git a/plugin/filter/render.go b/plugin/filter/render.go index 10eeac39e..0bd8fdb60 100644 --- a/plugin/filter/render.go +++ b/plugin/filter/render.go @@ -352,7 +352,7 @@ func (r *renderer) renderTagInList(values []ValueExpr) (renderResult, error) { case DialectPostgres: // Support hierarchical tags: match exact tag OR tags with this prefix exactMatch := fmt.Sprintf("%s @> jsonb_build_array(%s::json)", jsonArrayExpr(r.dialect, field), r.addArg(fmt.Sprintf(`"%s"`, str))) - prefixMatch := fmt.Sprintf("%s::text LIKE %s::text", jsonArrayExpr(r.dialect, field), r.addArg(fmt.Sprintf(`%%"%s/%%`, str))) + prefixMatch := fmt.Sprintf("(%s)::text LIKE %s", jsonArrayExpr(r.dialect, field), r.addArg(fmt.Sprintf(`%%"%s/%%`, str))) expr := fmt.Sprintf("(%s OR %s)", exactMatch, prefixMatch) conditions = append(conditions, expr) default: diff --git a/store/db/postgres/memo_filter_test.go b/store/db/postgres/memo_filter_test.go index 12045197a..50d94af42 100644 --- a/store/db/postgres/memo_filter_test.go +++ b/store/db/postgres/memo_filter_test.go @@ -18,12 +18,12 @@ func TestConvertExprToSQL(t *testing.T) { }{ { filter: `tag in ["tag1", "tag2"]`, - want: "((memo.payload->'tags' @> jsonb_build_array($1::json) OR memo.payload->'tags'::text LIKE $2::text) OR (memo.payload->'tags' @> jsonb_build_array($3::json) OR memo.payload->'tags'::text LIKE $4::text))", + want: "((memo.payload->'tags' @> jsonb_build_array($1::json) OR (memo.payload->'tags')::text LIKE $2) OR (memo.payload->'tags' @> jsonb_build_array($3::json) OR (memo.payload->'tags')::text LIKE $4))", args: []any{`"tag1"`, `%"tag1/%`, `"tag2"`, `%"tag2/%`}, }, { filter: `!(tag in ["tag1", "tag2"])`, - want: "NOT (((memo.payload->'tags' @> jsonb_build_array($1::json) OR memo.payload->'tags'::text LIKE $2::text) OR (memo.payload->'tags' @> jsonb_build_array($3::json) OR memo.payload->'tags'::text LIKE $4::text)))", + want: "NOT (((memo.payload->'tags' @> jsonb_build_array($1::json) OR (memo.payload->'tags')::text LIKE $2) OR (memo.payload->'tags' @> jsonb_build_array($3::json) OR (memo.payload->'tags')::text LIKE $4)))", args: []any{`"tag1"`, `%"tag1/%`, `"tag2"`, `%"tag2/%`}, }, { @@ -43,7 +43,7 @@ func TestConvertExprToSQL(t *testing.T) { }, { filter: `tag in ['tag1'] || content.contains('hello')`, - want: "((memo.payload->'tags' @> jsonb_build_array($1::json) OR memo.payload->'tags'::text LIKE $2::text) OR memo.content ILIKE $3)", + want: "((memo.payload->'tags' @> jsonb_build_array($1::json) OR (memo.payload->'tags')::text LIKE $2) OR memo.content ILIKE $3)", args: []any{`"tag1"`, `%"tag1/%`, "%hello%"}, }, {