{"record":{"id":"3af0b897c170990e","repo":"temporalio/temporal","slug":"only-comparison-and-and-expression-is-supported-3af0b8","errorCode":null,"errorMessage":"only comparison and \"and\" expression is supported","messagePattern":"only comparison and \"and\" expression is supported","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/archiver/s3store/query_parser.go","lineNumber":97,"sourceCode":"\t\treturn nil, errors.New(\"SearchPrecision requires a StartTime or CloseTime\")\n\t}\n\treturn parsedQuery, nil\n}\n\nfunc (p *queryParser) convertWhereExpr(expr sqlparser.Expr, parsedQuery *parsedQuery) error {\n\tif expr == nil {\n\t\treturn errors.New(\"where expression is nil\")\n\t}\n\n\tswitch expr := expr.(type) {\n\tcase *sqlparser.ComparisonExpr:\n\t\treturn p.convertComparisonExpr(expr, parsedQuery)\n\tcase *sqlparser.AndExpr:\n\t\treturn p.convertAndExpr(expr, parsedQuery)\n\tcase *sqlparser.ParenExpr:\n\t\treturn p.convertParenExpr(expr, parsedQuery)\n\tdefault:\n\t\treturn errors.New(\"only comparison and \\\"and\\\" expression is supported\")\n\t}\n}\n\nfunc (p *queryParser) convertParenExpr(parenExpr *sqlparser.ParenExpr, parsedQuery *parsedQuery) error {\n\treturn p.convertWhereExpr(parenExpr.Expr, parsedQuery)\n}\n\nfunc (p *queryParser) convertAndExpr(andExpr *sqlparser.AndExpr, parsedQuery *parsedQuery) error {\n\tif err := p.convertWhereExpr(andExpr.Left, parsedQuery); err != nil {\n\t\treturn err\n\t}\n\treturn p.convertWhereExpr(andExpr.Right, parsedQuery)\n}\n\nfunc (p *queryParser) convertComparisonExpr(compExpr *sqlparser.ComparisonExpr, parsedQuery *parsedQuery) error {\n\tcolName, ok := compExpr.Left.(*sqlparser.ColName)\n\tif !ok {\n\t\treturn fmt.Errorf(\"invalid filter name: %s\", sqlparser.String(compExpr.Left))","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/temporalio/temporal/blob/bde624efd13fbd3843654058db6d9c716166318b/common/archiver/s3store/query_parser.go#L79-L115","documentation":"The archival query dialect supports only simple comparisons combined with AND (and parentheses for grouping). convertWhereExpr's default branch fires for any other expression node — OR, NOT, LIKE, IN, arithmetic, function calls, etc. — and rejects it.","triggerScenarios":"Calling Parse with \"WorkflowId = 'w1' OR WorkflowId = 'w2'\", \"NOT WorkflowId = 'w1'\", \"WorkflowType LIKE 'My%'\", or \"WorkflowId IN ('a','b')\".","commonSituations":"Users assuming full SQL support in archival queries; ORMs or query builders generating OR/LIKE conditions; hand-written queries copied from SQL visibility clients.","solutions":["Rewrite OR conditions as two separate queries and merge results client-side.","Replace LIKE with an exact WorkflowType equality comparison.","Replace IN (...) with a single equality predicate or repeated queries.","Remove NOT; express the positive condition explicitly (the dialect only supports positive equality/equality-style comparisons)."],"exampleFix":"// before\nparser.Parse(\"WorkflowType = 'A' OR WorkflowType = 'B'\")\n// after\nresultA, err := parser.Parse(\"WorkflowType = 'A'\")\nif err != nil { return nil, err }\nresultB, err := parser.Parse(\"WorkflowType = 'B'\")","handlingStrategy":"validation","validationCode":"unsupported := []string{\" OR \", \"NOT \", \"LIKE\", \" IN \"}\nq := strings.ToUpper(query)\nfor _, u := range unsupported {\n    if strings.Contains(q, u) {\n        return fmt.Errorf(\"unsupported expression %q in archival query\", strings.TrimSpace(u))\n    }\n}","typeGuard":null,"tryCatchPattern":"pq, err := parser.Parse(query)\nif err != nil {\n    if strings.Contains(err.Error(), \"only comparison and\") {\n        return nil, status.Error(codes.InvalidArgument, \"archival queries support only simple comparisons joined by AND\")\n    }\n    return nil, err\n}","preventionTips":["Restrict query UIs to AND-joined equality/time comparisons.","Rewrite OR/IN conditions into multiple archival queries merged client-side.","Avoid LIKE/NOT operators entirely in archive search input."],"tags":["go","archival","query-validation","sqlparser","s3store"],"backgroundTag":"unsupported-sql-expression","analyzedSha":"bde624efd13fbd3843654058db6d9c716166318b","analyzedAt":"2026-09-01T07:18:39.080Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}