{"record":{"id":"c237b3b7de4396c2","repo":"temporalio/temporal","slug":"only-one-expression-is-allowed-for-s","errorCode":null,"errorMessage":"only one expression is allowed for %s","messagePattern":"only one expression is allowed for (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/archiver/gcloud/query_parser.go","lineNumber":187,"sourceCode":"\t\t}\n\t\tif op != \"=\" {\n\t\t\treturn fmt.Errorf(\"only operation = is support for %s\", WorkflowType)\n\t\t}\n\t\tif parsedQuery.workflowType != nil && *parsedQuery.workflowType != val {\n\t\t\tparsedQuery.emptyResult = true\n\t\t\treturn nil\n\t\t}\n\t\tparsedQuery.workflowType = new(val)\n\tcase SearchPrecision:\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\", SearchPrecision)\n\t\t}\n\t\tif parsedQuery.searchPrecision != nil && *parsedQuery.searchPrecision != val {\n\t\t\treturn fmt.Errorf(\"only one expression is allowed for %s\", SearchPrecision)\n\t\t}\n\t\tswitch val {\n\t\tcase PrecisionDay:\n\t\tcase PrecisionHour:\n\t\tcase PrecisionMinute:\n\t\tcase PrecisionSecond:\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"invalid value for %s: %s\", SearchPrecision, val)\n\t\t}\n\t\tparsedQuery.searchPrecision = new(val)\n\tdefault:\n\t\treturn fmt.Errorf(\"unknown filter name: %s\", colNameStr)\n\t}\n\n\treturn nil\n}\n","sourceCodeStart":169,"sourceCodeEnd":204,"githubUrl":"https://github.com/temporalio/temporal/blob/bde624efd13fbd3843654058db6d9c716166318b/common/archiver/gcloud/query_parser.go#L169-L204","documentation":"The gcloud archive parser allows SearchPrecision to appear at most once. If it appears in two equality expressions with different values (e.g. `SearchPrecision = \"day\" AND SearchPrecision = \"hour\"`), convertComparisonExpr returns this error. Equal duplicate values are tolerated silently; only conflicting duplicates fail.","triggerScenarios":"A WHERE clause containing two SearchPrecision predicates with different values; query builders concatenating filter fragments that each append their own SearchPrecision term.","commonSituations":"Programmatic query construction where the precision is injected by both a caller and a default-template layer; hand-edited queries accumulating duplicate clauses.","solutions":["Keep exactly one SearchPrecision clause with a single value","Audit the query-construction code for duplicate filter injection","Choose one precision level (day/hour/minute/second) appropriate for the query","Pre-parse or normalize the query to de-duplicate SearchPrecision before calling the archive API"],"exampleFix":"// before\nquery := `WHERE StartTime = \"...\" AND SearchPrecision = \"day\" AND SearchPrecision = \"hour\"`\n// after\nquery := `WHERE StartTime = \"...\" AND SearchPrecision = \"hour\"`","handlingStrategy":"validation","validationCode":"if strings.Count(q, \"SearchPrecision\") > 1 {\n\treturn errors.New(\"at most one SearchPrecision clause allowed\")\n}","typeGuard":null,"tryCatchPattern":"q, err := parseArchiveQuery(raw)\nif err != nil {\n\treturn fmt.Errorf(\"dedupe SearchPrecision clauses: %w\", err)\n}","preventionTips":["Centralize SearchPrecision injection in one place","De-duplicate WHERE fragments before concatenation","Ensure templates don't add a default precision when the caller supplies one"],"tags":["go","archiver","gcloud","query-parsing"],"backgroundTag":"duplicate-filter-clause","analyzedSha":"bde624efd13fbd3843654058db6d9c716166318b","analyzedAt":"2026-09-01T07:18:39.080Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}