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

  1. Rewrite the query to use exact equality: `WorkflowType = 'MyType'`
  2. 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
  3. 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

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


AI-assisted analysis of temporalio/temporal@bde624efd1 (2026-09-01). Data as JSON: /api/errors/0976cfa7eae0531f. Report an issue: GitHub.