SigNoz/signoz · error

clickhouse query is invalid

Error message

clickhouse query %s is invalid: %w

What it means

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).

Solutions

  1. Read the wrapped error to see which SQL rule failed
  2. Ensure the raw SQL field is a non-empty, single valid ClickHouse statement
  3. Trim/validate the SQL string client-side before submitting

Example fix

// before
{"queryType":"clickhouse_sql","clickHouseQueries":{"A":{"rawQuery":""}}}
// after
{"queryType":"clickhouse_sql","clickHouseQueries":{"A":{"rawQuery":"SELECT count() FROM signoz_traces." + "distributed"}}}
Defensive patterns

Strategy: validation

Validate before calling

for name, q := range composite.ClickHouseQueries {
	s := strings.TrimSpace(q.RawQuery)
	if s == "" { return fmt.Errorf("clickhouse query %s: empty SQL", name) }
}

Type guard

func hasValidSQL(q v3.ClickHouseQuery) bool { return strings.TrimSpace(q.RawQuery) != "" }

Try / catch

if err := composite.Validate(); err != nil { return httpError(400, err) } // surface wrapped SQL reason

Prevention

When it happens

Trigger: Submitting queryType=clickhouse_sql with a ClickHouseQueries entry whose raw SQL is empty, only whitespace, or not a permitted statement.

Common situations: Custom ClickHouse SQL panels, hand-crafted API payloads, or SQL strings built by string concatenation that end up empty.

Related errors


AI-assisted analysis of SigNoz/signoz@5069bf80b0 (2026-08-28). Data as JSON: /api/errors/943c1b54aec3f1bc. Report an issue: GitHub.

Appendix: source

Thrown at pkg/query-service/model/v3/v3.go:628

		return fmt.Errorf("composite query is required")
	}

	if c.BuilderQueries == nil && c.ClickHouseQueries == nil && c.PromQueries == nil && len(c.Queries) == 0 {
		return fmt.Errorf("composite query must contain at least one query type")
	}

	if c.QueryType == QueryTypeBuilder {
		for name, query := range c.BuilderQueries {
			if err := query.Validate(c.PanelType); err != nil {
				return fmt.Errorf("builder query %s is invalid: %w", name, err)
			}
		}
	}

	if c.QueryType == QueryTypeClickHouseSQL {
		for name, query := range c.ClickHouseQueries {
			if err := query.Validate(); err != nil {
				return fmt.Errorf("clickhouse query %s is invalid: %w", name, err)
			}
		}
	}

	if c.QueryType == QueryTypePromQL {
		for name, query := range c.PromQueries {
			if err := query.Validate(); err != nil {
				return fmt.Errorf("prom query %s is invalid: %w", name, err)
			}
		}
	}

	if err := c.PanelType.Validate(); err != nil {
		return fmt.Errorf("panel type is invalid: %w", err)
	}

	if err := c.QueryType.Validate(); err != nil {
		return fmt.Errorf("query type is invalid: %w", err)

View on GitHub (pinned to 5069bf80b0)