{"record":{"id":"7c682e120bd9bbca","repo":"hashicorp/nomad","slug":"failed-to-read-filter-expression-v","errorCode":null,"errorMessage":"failed to read filter expression: %v","messagePattern":"failed to read filter expression: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nomad/state/paginator/paginator.go","lineNumber":61,"sourceCode":"\tselector SelectorFunc[T],\n\ttokenizer Tokenizer[T],\n\tstubFn func(T) (TStub, error),\n) (*Paginator[T, TStub], error) {\n\n\tp := &Paginator[T, TStub]{\n\t\titer:           iter,\n\t\ttokenizer:      tokenizer,\n\t\tselector:       selector,\n\t\tstubFn:         stubFn,\n\t\tperPage:        opts.PerPage,\n\t\treverse:        opts.Reverse,\n\t\tnextTokenFound: opts.NextToken == \"\",\n\t}\n\n\tif opts.Filter != \"\" {\n\t\tevaluator, err := bexpr.CreateEvaluator(opts.Filter)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to read filter expression: %v\", err)\n\t\t}\n\t\tp.bexpr = evaluator\n\t}\n\n\treturn p, nil\n}\n\n// Page populates a page by running the append function\n// over all results. Returns the next token.\nfunc (p *Paginator[T, TStub]) Page() ([]TStub, string, error) {\n\tout := []TStub{}\nDONE:\n\tfor {\n\t\tobj, andThen := p.next()\n\t\tswitch andThen {\n\t\tcase paginatorInclude:\n\t\t\tout = append(out, obj)\n\t\tcase paginatorSkip:","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/state/paginator/paginator.go#L43-L79","documentation":"NewPaginator wraps any error returned by bexpr.CreateEvaluator when parsing the caller-supplied filter expression string. It means the filter expression failed to parse — invalid syntax, unknown operators, or malformed expressions. The paginator is not created and the error is returned synchronously from NewPaginator.","triggerScenarios":"Calling state.paginator.NewPaginator with opts.Filter set to a non-empty string that is not a valid bexpr expression, e.g. 'Foo ==>' or 'Status != ' (unbalanced quotes/operators), or referencing syntax bexpr does not support.","commonSituations":"Hand-written filter strings in API clients or Job specs with typos; dynamically built filter expressions where user input was interpolated without quoting; users copying filter syntax from other systems (e.g. Consul filter syntax) that bexpr does not accept.","solutions":["Print the wrapped underlying error (%v) to see the exact parse failure (line/column) and fix the expression syntax.","Validate the expression with bexpr.CreateEvaluator in a unit test or CLI before sending it to the server.","Quote string literals properly in the expression, e.g. Status == \"ready\" not Status == ready.","If the filter is empty, pass \"\" instead of whitespace so the evaluator is skipped entirely."],"exampleFix":"// before\np, err := paginator.NewPaginator(iter, nil, \"Status == \"+status, objs)\n// after\nexpr := fmt.Sprintf(\"Status == %q\", status)\np, err := paginator.NewPaginator(iter, nil, expr, objs)","handlingStrategy":"validation","validationCode":"if filter != \"\" {\n    if _, err := bexpr.CreateEvaluator(filter); err != nil {\n        return fmt.Errorf(\"invalid filter expression %q: %w\", filter, err)\n    }\n}","typeGuard":null,"tryCatchPattern":"p, err := paginator.NewPaginator(iter, nil, filter, objs)\nif err != nil {\n    if strings.Contains(err.Error(), \"failed to read filter expression\") {\n        // fall back to unpaginated/unfiltered view or surface a 400\n    }\n    return err\n}","preventionTips":["Unit-test every static filter expression string against bexpr before shipping.","Use %q to quote interpolated string values in generated expressions.","Keep an empty-string sentinel for 'no filter' rather than whitespace.","Mirror the expression in a CLI validation command for users."],"tags":["nomad","filter-expression","bexpr","input-validation"],"backgroundTag":"filter-expression-parse-error","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}