{"record":{"id":"943c1b54aec3f1bc","repo":"SigNoz/signoz","slug":"clickhouse-query-s-is-invalid-w","errorCode":null,"errorMessage":"clickhouse query %s is invalid: %w","messagePattern":"clickhouse query (.+?) is invalid: %w","errorType":"validation","errorClass":null,"httpStatus":400,"severity":"error","filePath":"pkg/query-service/model/v3/v3.go","lineNumber":628,"sourceCode":"\t\treturn fmt.Errorf(\"composite query is required\")\n\t}\n\n\tif c.BuilderQueries == nil && c.ClickHouseQueries == nil && c.PromQueries == nil && len(c.Queries) == 0 {\n\t\treturn fmt.Errorf(\"composite query must contain at least one query type\")\n\t}\n\n\tif c.QueryType == QueryTypeBuilder {\n\t\tfor name, query := range c.BuilderQueries {\n\t\t\tif err := query.Validate(c.PanelType); err != nil {\n\t\t\t\treturn fmt.Errorf(\"builder query %s is invalid: %w\", name, err)\n\t\t\t}\n\t\t}\n\t}\n\n\tif c.QueryType == QueryTypeClickHouseSQL {\n\t\tfor name, query := range c.ClickHouseQueries {\n\t\t\tif err := query.Validate(); err != nil {\n\t\t\t\treturn fmt.Errorf(\"clickhouse query %s is invalid: %w\", name, err)\n\t\t\t}\n\t\t}\n\t}\n\n\tif c.QueryType == QueryTypePromQL {\n\t\tfor name, query := range c.PromQueries {\n\t\t\tif err := query.Validate(); err != nil {\n\t\t\t\treturn fmt.Errorf(\"prom query %s is invalid: %w\", name, err)\n\t\t\t}\n\t\t}\n\t}\n\n\tif err := c.PanelType.Validate(); err != nil {\n\t\treturn fmt.Errorf(\"panel type is invalid: %w\", err)\n\t}\n\n\tif err := c.QueryType.Validate(); err != nil {\n\t\treturn fmt.Errorf(\"query type is invalid: %w\", err)","sourceCodeStart":610,"sourceCodeEnd":646,"githubUrl":"https://github.com/SigNoz/signoz/blob/5069bf80b08f1f00d7e014eccc09902f9871004f/pkg/query-service/model/v3/v3.go#L610-L646","documentation":"Thrown by CompositeQuery.Validate when a ClickHouseQueries map entry fails ClickHouseQuery.Validate. The %s is the query name key; %w wraps the inner error (typically raw SQL validation such as an empty statement or disallowed statement type).","triggerScenarios":"Submitting queryType=clickhouse_sql with a ClickHouseQueries entry whose raw SQL is empty, only whitespace, or not a permitted statement.","commonSituations":"Custom ClickHouse SQL panels, hand-crafted API payloads, or SQL strings built by string concatenation that end up empty.","solutions":["Read the wrapped error to see which SQL rule failed","Ensure the raw SQL field is a non-empty, single valid ClickHouse statement","Trim/validate the SQL string client-side before submitting"],"exampleFix":"// before\n{\"queryType\":\"clickhouse_sql\",\"clickHouseQueries\":{\"A\":{\"rawQuery\":\"\"}}}\n// after\n{\"queryType\":\"clickhouse_sql\",\"clickHouseQueries\":{\"A\":{\"rawQuery\":\"SELECT count() FROM signoz_traces.\" + \"distributed\"}}}","handlingStrategy":"validation","validationCode":"for name, q := range composite.ClickHouseQueries {\n\ts := strings.TrimSpace(q.RawQuery)\n\tif s == \"\" { return fmt.Errorf(\"clickhouse query %s: empty SQL\", name) }\n}","typeGuard":"func hasValidSQL(q v3.ClickHouseQuery) bool { return strings.TrimSpace(q.RawQuery) != \"\" }","tryCatchPattern":"if err := composite.Validate(); err != nil { return httpError(400, err) } // surface wrapped SQL reason","preventionTips":["Non-empty single-statement SQL check before submit","Sanitize templated SQL before building payloads"],"tags":["go","clickhouse","sql-validation"],"backgroundTag":"query-payload-validation-failed","analyzedSha":"5069bf80b08f1f00d7e014eccc09902f9871004f","analyzedAt":"2026-08-28T06:22:12.824Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}