{"record":{"id":"2fdcdae2b40faaff","repo":"temporalio/temporal","slug":"only-operation-is-support-for-s","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/gcloud/query_parser.go","lineNumber":126,"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 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 && *parsedQuery.workflowID != val {\n\t\t\tparsedQuery.emptyResult = true\n\t\t\treturn nil\n\t\t}\n\t\tparsedQuery.workflowID = new(val)\n\tcase RunID:\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\", RunID)\n\t\t}\n\t\tif parsedQuery.runID != nil && *parsedQuery.runID != val {\n\t\t\tparsedQuery.emptyResult = true\n\t\t\treturn nil\n\t\t}","sourceCodeStart":108,"sourceCodeEnd":144,"githubUrl":"https://github.com/temporalio/temporal/blob/bde624efd13fbd3843654058db6d9c716166318b/common/archiver/gcloud/query_parser.go#L108-L144","documentation":"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.","triggerScenarios":"Running an archive search with `WorkflowId != 'x'`, `WorkflowId LIKE 'prefix%'`, or any non-equality operator on WorkflowId.","commonSituations":"Users attempting prefix/pattern searches by workflow ID against the archive; the archived visibility store supports exact-ID lookup or CloseTime-range scans only.","solutions":["Use equality: WorkflowId = 'exact-id'","If the exact ID is unknown, filter by CloseTime range instead (CloseTime >= / <= are supported)","Retrieve the full workflow ID from another visibility source, then re-run the archive query with equality"],"exampleFix":"// before\nWHERE WorkflowId LIKE 'prod-%'\n// after\nWHERE WorkflowId = 'prod-orders-123' // or filter by CloseTime range","handlingStrategy":"validation","validationCode":"if strings.Contains(query, \"WorkflowId\") && !strings.Contains(query, \"WorkflowId =\") {\n  return errors.New(\"WorkflowId filter supports only = operator\")\n}","typeGuard":"func workflowIdFilterIsEquality(q string) bool { return !strings.Contains(q, \"WorkflowId\") || strings.Contains(q, \"WorkflowId =\") }","tryCatchPattern":"_, err := client.ArchiveQuery(ctx, req)\nif err != nil && strings.Contains(err.Error(), \"only operation = is support\") {\n  return fmt.Errorf(\"use exact equality for WorkflowId in archive queries: %w\", err)\n}","preventionTips":["Use only exact workflow IDs in archive queries","Fall back to CloseTime range filters when the exact ID is unknown","Do not attempt LIKE/prefix or negation filters on WorkflowId"],"tags":["go","archiver","gcloud","query-parser"],"backgroundTag":"unsupported-query-operator","analyzedSha":"bde624efd13fbd3843654058db6d9c716166318b","analyzedAt":"2026-09-01T07:18:39.080Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}