{"record":{"id":"0976cfa7eae0531f","repo":"temporalio/temporal","slug":"only-operation-is-support-for-s-0976cf","errorCode":null,"errorMessage":"only operation = is support for %s","messagePattern":"only operation = is support for (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/archiver/s3store/query_parser.go","lineNumber":132,"sourceCode":"\tif !ok {\n\t\treturn fmt.Errorf(\"invalid filter name: %s\", sqlparser.String(compExpr.Left))\n\t}\n\tcolNameStr := sqlparser.String(colName)\n\top := compExpr.Operator\n\tvalExpr, ok := compExpr.Right.(*sqlparser.SQLVal)\n\tif !ok {\n\t\treturn fmt.Errorf(\"invalid value: %s\", sqlparser.String(compExpr.Right))\n\t}\n\tvalStr := sqlparser.String(valExpr)\n\n\tswitch colNameStr {\n\tcase WorkflowTypeName, WorkflowType:\n\t\tval, err := sqlquery.ExtractStringValue(valStr)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif op != \"=\" {\n\t\t\treturn fmt.Errorf(\"only operation = is support for %s\", colNameStr)\n\t\t}\n\t\tif parsedQuery.workflowType != nil {\n\t\t\treturn fmt.Errorf(\"can not query %s multiple times\", colNameStr)\n\t\t}\n\t\tparsedQuery.workflowType = new(val)\n\tcase WorkflowID:\n\t\tval, err := sqlquery.ExtractStringValue(valStr)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif op != \"=\" {\n\t\t\treturn fmt.Errorf(\"only operation = is support for %s\", WorkflowID)\n\t\t}\n\t\tif parsedQuery.workflowID != nil {\n\t\t\treturn fmt.Errorf(\"can not query %s multiple times\", WorkflowID)\n\t\t}\n\t\tparsedQuery.workflowID = new(val)\n\tcase CloseTime:","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/temporalio/temporal/blob/bde624efd13fbd3843654058db6d9c716166318b/common/archiver/s3store/query_parser.go#L114-L150","documentation":"The S3 archiver visibility query parser only supports equality comparisons on the WorkflowType (and deprecated WorkflowTypeName) filter. When the WHERE clause uses any other SQL operator (e.g. !=, <>, LIKE, <, >) against this column, convertComparisonExpr returns this error. This is by design: archive lookups by type are exact-match only.","triggerScenarios":"Calling s3store QueryParser.Parse (via the S3 archiver visibility record query path) with a where clause like `WorkflowType != 'MyType'`, `WorkflowType LIKE 'My%'`, or `WorkflowType > 'X'`.","commonSituations":"Users copying visibility-list queries (which support keyword/inequality operators) into an archive-search query; dynamically built queries where the operator is templated; assuming archive queries accept the full SQL operator set.","solutions":["Rewrite the query to use exact equality: `WorkflowType = 'MyType'`","If you need prefix/range matching, enumerate candidate exact workflow type values and query each, or use the database visibility store instead of archive search","Use the deprecated WorkflowTypeName name only if targeting an old deployment; prefer WorkflowType, but either way keep the = operator"],"exampleFix":"// before\n`WorkflowType LIKE \"Order%\"`\n// after\n`WorkflowType = \"OrderWorkflow\"`","handlingStrategy":"validation","validationCode":"// validate before parsing\nif strings.Contains(q, \"WorkflowType\") && !strings.Contains(q, \"WorkflowType =\") {\n    return fmt.Errorf(\"archive queries require WorkflowType = <exact value>\")\n}","typeGuard":null,"tryCatchPattern":"parsed, err := parser.Parse(q)\nif err != nil {\n    return nil, fmt.Errorf(\"invalid archive query %q: %w\", q, err)\n}","preventionTips":["Only ever compose archive queries with the = operator","Validate query strings in UIs/APIs before handing them to the archiver","Do not reuse visibility-list query strings for archive search"],"tags":["go","archiver","s3store","query-parser","visibility"],"backgroundTag":"unsupported-query-operator","analyzedSha":"bde624efd13fbd3843654058db6d9c716166318b","analyzedAt":"2026-09-01T07:18:39.080Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}