{"record":{"id":"ccdc7fe705114d67","repo":"SigNoz/signoz","slug":"composite-query-must-contain-at-least-one-query-ty","errorCode":null,"errorMessage":"composite query must contain at least one query type","messagePattern":"composite query must contain at least one query type","errorType":"validation","errorClass":null,"httpStatus":400,"severity":"error","filePath":"pkg/query-service/model/v3/v3.go","lineNumber":614,"sourceCode":"func (c *CompositeQuery) Sanitize() {\n\tif c == nil {\n\t\treturn\n\t}\n\t// remove groupBy for queries with list panel type\n\tfor _, query := range c.BuilderQueries {\n\t\tif len(query.GroupBy) > 0 && c.PanelType == PanelTypeList {\n\t\t\tquery.GroupBy = []AttributeKey{}\n\t\t}\n\t}\n}\n\nfunc (c *CompositeQuery) Validate() error {\n\tif c == nil {\n\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","sourceCodeStart":596,"sourceCodeEnd":632,"githubUrl":"https://github.com/SigNoz/signoz/blob/5069bf80b08f1f00d7e014eccc09902f9871004f/pkg/query-service/model/v3/v3.go#L596-L632","documentation":"CompositeQuery.Validate() requires that at least one of BuilderQueries, ClickHouseQueries, PromQueries, or the legacy Queries field is populated. A composite query with a valid queryType/panelType but zero actual queries is meaningless and rejected.","triggerScenarios":"Sending compositeQuery with queryType set but all query maps empty/absent — e.g. {\"queryType\":\"builder\",\"panelType\":\"graph\"} with no builderQueries — or all maps present but empty objects.","commonSituations":"Frontend serializing a query tab before the user writes anything, templating that renders query maps to empty objects, or clients stripping unknown fields (a version skew where the server expects a differently named map).","solutions":["Include at least one entry in builderQueries, clickHouseQueries, promQueries, or queries","Make sure the map matches the queryType (builder→builderQueries, promql→promQueries, clickhouse_sql→clickHouseQueries)","Don't send empty objects like \"builderQueries\":{} — omit the field or add a real query"],"exampleFix":"// before\n{\"compositeQuery\":{\"queryType\":\"builder\",\"panelType\":\"graph\"}}\n\n// after\n{\"compositeQuery\":{\"queryType\":\"builder\",\"panelType\":\"graph\",\"builderQueries\":{\"A\":{\"dataSource\":\"metrics\",\"queryName\":\"A\",\"aggregateAttribute\":{\"key\":\"system_cpu_load\",\"aggregateOperator\":\"avg\"},\"expression\":\"A\"}}}}","handlingStrategy":"validation","validationCode":"if len(cq.BuilderQueries) == 0 && len(cq.ClickHouseQueries) == 0 && len(cq.PromQueries) == 0 && len(cq.Queries) == 0 { return errors.New(\"add at least one query\") }","typeGuard":"func hasAtLeastOneQuery(cq *v3.CompositeQuery) bool { return cq != nil && (len(cq.BuilderQueries) > 0 || len(cq.ClickHouseQueries) > 0 || len(cq.PromQueries) > 0 || len(cq.Queries) > 0) }","tryCatchPattern":null,"preventionTips":["Match the query map to queryType (builder→builderQueries, etc.)","Omit empty maps instead of sending {}"],"tags":["go","validation","missing-field","composite-query","signoz"],"backgroundTag":"missing-required-field","analyzedSha":"5069bf80b08f1f00d7e014eccc09902f9871004f","analyzedAt":"2026-08-28T06:22:12.824Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}