SigNoz/signoz · error

clickhouse query %s is invalid: %w

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

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)

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.