temporalio/temporal · error

only operation = is support for %s

Error message

only operation = is support for %s

What it means

For the WorkflowId filter in the gcloud archiver query parser, only the '=' operator is supported. If a comparison on WorkflowId uses another operator (like !=, LIKE, <, >), it returns 'only operation = is support for WorkflowId' (sic). This is because the archiver walks a fixed set of files and can only prune by exact workflow ID.

Source

Thrown at common/archiver/gcloud/query_parser.go:126

	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 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 && *parsedQuery.workflowID != val {
			parsedQuery.emptyResult = true
			return nil
		}
		parsedQuery.workflowID = new(val)
	case RunID:
		val, err := sqlquery.ExtractStringValue(valStr)
		if err != nil {
			return err
		}
		if op != "=" {
			return fmt.Errorf("only operation = is support for %s", RunID)
		}
		if parsedQuery.runID != nil && *parsedQuery.runID != val {
			parsedQuery.emptyResult = true
			return nil
		}

View on GitHub (pinned to bde624efd1)

Solutions

  1. Use equality: WorkflowId = 'exact-id'
  2. If the exact ID is unknown, filter by CloseTime range instead (CloseTime >= / <= are supported)
  3. Retrieve the full workflow ID from another visibility source, then re-run the archive query with equality

Example fix

// before
WHERE WorkflowId LIKE 'prod-%'
// after
WHERE WorkflowId = 'prod-orders-123' // or filter by CloseTime range
Defensive patterns

Strategy: validation

Validate before calling

if strings.Contains(query, "WorkflowId") && !strings.Contains(query, "WorkflowId =") {
  return errors.New("WorkflowId filter supports only = operator")
}

Type guard

func workflowIdFilterIsEquality(q string) bool { return !strings.Contains(q, "WorkflowId") || strings.Contains(q, "WorkflowId =") }

Try / catch

_, err := client.ArchiveQuery(ctx, req)
if err != nil && strings.Contains(err.Error(), "only operation = is support") {
  return fmt.Errorf("use exact equality for WorkflowId in archive queries: %w", err)
}

Prevention

When it happens

Trigger: Running an archive search with `WorkflowId != 'x'`, `WorkflowId LIKE 'prefix%'`, or any non-equality operator on WorkflowId.

Common situations: Users attempting prefix/pattern searches by workflow ID against the archive; the archived visibility store supports exact-ID lookup or CloseTime-range scans only.

Related errors


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