temporalio/temporal · error
only operation = is support for %s
Error message
only operation = is support for %s
What it means
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.
Source
Thrown at common/archiver/s3store/query_parser.go:132
if !ok {
return fmt.Errorf("invalid filter name: %s", sqlparser.String(compExpr.Left))
}
colNameStr := sqlparser.String(colName)
op := compExpr.Operator
valExpr, ok := compExpr.Right.(*sqlparser.SQLVal)
if !ok {
return fmt.Errorf("invalid value: %s", sqlparser.String(compExpr.Right))
}
valStr := sqlparser.String(valExpr)
switch colNameStr {
case WorkflowTypeName, WorkflowType:
val, err := sqlquery.ExtractStringValue(valStr)
if err != nil {
return err
}
if op != "=" {
return fmt.Errorf("only operation = is support for %s", colNameStr)
}
if parsedQuery.workflowType != nil {
return fmt.Errorf("can not query %s multiple times", colNameStr)
}
parsedQuery.workflowType = new(val)
case WorkflowID:
val, err := sqlquery.ExtractStringValue(valStr)
if err != nil {
return err
}
if op != "=" {
return fmt.Errorf("only operation = is support for %s", WorkflowID)
}
if parsedQuery.workflowID != nil {
return fmt.Errorf("can not query %s multiple times", WorkflowID)
}
parsedQuery.workflowID = new(val)
case CloseTime:View on GitHub (pinned to bde624efd1)
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
Example fix
// before `WorkflowType LIKE "Order%"` // after `WorkflowType = "OrderWorkflow"`
Defensive patterns
Strategy: validation
Validate before calling
// validate before parsing
if strings.Contains(q, "WorkflowType") && !strings.Contains(q, "WorkflowType =") {
return fmt.Errorf("archive queries require WorkflowType = <exact value>")
} Try / catch
parsed, err := parser.Parse(q)
if err != nil {
return nil, fmt.Errorf("invalid archive query %q: %w", q, err)
} Prevention
- 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
When it happens
Trigger: 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'`.
Common situations: 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.
Related errors
- unknown workflow close status: %s
- can not query %s multiple times
- only one expression is allowed for %s
- invalid value for %s: %s
- unknown filter name: %s
AI-assisted analysis of temporalio/temporal@bde624efd1 (2026-09-01).
Data as JSON: /api/errors/0976cfa7eae0531f.
Report an issue: GitHub.