{"record":{"id":"89989ba77eac3ef2","repo":"SigNoz/signoz","slug":"expression-is-required","errorCode":null,"errorMessage":"expression is required","messagePattern":"expression is required","errorType":"validation","errorClass":null,"httpStatus":400,"severity":"error","filePath":"pkg/query-service/model/v3/v3.go","lineNumber":1106,"sourceCode":"\t\t}\n\t}\n\n\tif b.Having != nil {\n\t\tfor _, having := range b.Having {\n\t\t\tif err := having.Operator.Validate(); err != nil {\n\t\t\t\treturn fmt.Errorf(\"having operator is invalid: %w\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\tfor _, selectColumn := range b.SelectColumns {\n\t\tif err := selectColumn.Validate(); err != nil {\n\t\t\treturn fmt.Errorf(\"select column is invalid %w\", err)\n\t\t}\n\t}\n\n\tif b.Expression == \"\" {\n\t\treturn fmt.Errorf(\"expression is required\")\n\t}\n\n\tif len(b.Functions) > 0 {\n\t\tfor _, function := range b.Functions {\n\t\t\tif err := function.Name.Validate(); err != nil {\n\t\t\t\treturn fmt.Errorf(\"function name is invalid: %w\", err)\n\t\t\t}\n\t\t\tif function.Name == FunctionNameTimeShift {\n\t\t\t\tif len(function.Args) == 0 {\n\t\t\t\t\treturn fmt.Errorf(\"timeShiftBy param missing in query\")\n\t\t\t\t}\n\t\t\t\t_, ok := function.Args[0].(float64)\n\t\t\t\tif !ok {\n\t\t\t\t\t// if string, attempt to convert to float\n\t\t\t\t\ttimeShiftBy, err := strconv.ParseFloat(function.Args[0].(string), 64)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn fmt.Errorf(\"timeShiftBy param should be a number\")\n\t\t\t\t\t}","sourceCodeStart":1088,"sourceCodeEnd":1124,"githubUrl":"https://github.com/SigNoz/signoz/blob/5069bf80b08f1f00d7e014eccc09902f9871004f/pkg/query-service/model/v3/v3.go#L1088-L1124","documentation":"BuilderQuery.Validate requires a non-empty Expression; for simple queries it equals the query name, for formulas it is an expression over query names (e.g. \"A + B\").","triggerScenarios":"Sending a builder query with expression omitted or empty string.","commonSituations":"Programmatic payload construction forgetting the expression field, or partial JSON edits.","solutions":["Set expression to the query name for simple queries (\"A\")","For formulas, set an expression referencing other query names, e.g. \"A/B\""],"exampleFix":"// before\n{\"A\":{\"queryName\":\"A\",\"dataSource\":\"metrics\"}}\n// after\n{\"A\":{\"queryName\":\"A\",\"expression\":\"A\",\"dataSource\":\"metrics\"}}","handlingStrategy":"validation","validationCode":"if strings.TrimSpace(q.Expression) == \"\" { return errors.New(\"expression required\") }","typeGuard":"func hasExpression(q v3.BuilderQuery) bool { return strings.TrimSpace(q.Expression) != \"\" }","tryCatchPattern":null,"preventionTips":["Default expression = queryName when creating simple builder queries"],"tags":["go","required-field","expression"],"backgroundTag":"missing-required-field","analyzedSha":"5069bf80b08f1f00d7e014eccc09902f9871004f","analyzedAt":"2026-08-28T06:22:12.824Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}