Skip to main content
Version: Next

Semantic provider query errors

Providers can distinguish deliberately rejected query input from operational failures by raising superset_core.semantic_layers.errors.SemanticQueryRejectedError. Its SemanticQueryErrorCode accepts UNSUPPORTED_QUERY, UNSUPPORTED_OFFSET, INVALID_FILTER, and INVALID_QUERY. Unknown code strings normalize to INVALID_QUERY. Do not pass provider diagnostics, SQL, or credentials as codes.

The host selects localized messages for these codes. Chart-data execution returns HTTP 400 for typed rejections, including row-count and required comparison queries. Embedded guests receive the existing generic error message. An unclassified failure from provider execution returns HTTP 500 with generic text; a plain ValueError is not evidence of invalid query input. Authentication, authorization, cancellation, and worker timeout control exceptions keep their existing behavior.

SemanticView.validate_selection_version is a separate selection-boundary check: it raises ValueError when a saved selection's version does not match. Handle that specific call at the selection boundary. This does not make arbitrary ValueError exceptions from provider execution deliberate query refusals.

During get_table and get_row_count execution, provider-raised SupersetTimeoutException (previously HTTP 408), SupersetGenericDBErrorException (previously HTTP 400), and SupersetTemplateParamsErrorException (previously HTTP 400) now return generic HTTP 500 responses. They are unclassified provider failures, not deliberate input rejections. This does not change the passthrough for worker control timeouts (SoftTimeLimitExceeded) or host QueryObjectValidationError subclasses.

Use this exception only for positively identified input validation failures in get_table, get_row_count, and get_values. Do not translate conversion, transport, configuration, or unexpected failures into it. Unknown codes are logged at warning level before they normalize, so adapter typos stay visible. Existing providers remain import-compatible, but must adopt the new core contract to receive actionable validation messages. Deploy compatible core/host versions before adapters that import the new exception. Discovery and compatibility methods are outside this execution contract.

The host mapper converts invalid query selections and filter values rejected during its validation and translation steps into QueryObjectValidationError, so chart-data requests receive HTTP 400 instead of HTTP 500. This conversion does not surround provider metadata discovery or query execution. Malformed timezone metadata remains a server error rather than a query validation refusal. This mapper boundary does not govern earlier schema loading: dimension discovery can fail there with HTTP 400, while metric discovery failures in the mapper remain HTTP 500.

An asynchronous totals-prerequisite query whose payload is marked FAILED fails its task with that payload's error. It does not publish a cache key for dependent contribution queries to read as if totals had been successfully cached. Typed query validation failures also fail ordinary asynchronous chart tasks, without publishing a cache key or retrying the rejected query synchronously. Ordinary SQL engine errors retain their structured-error readback behavior.

Host-classified client errors (QueryObjectValidationError and subclasses) keep their status. The shared SDK module also defines SemanticResultCompletenessError with incomplete and unverified reasons; the host translates these into its completeness validation error with fixed guidance. These errors remain HTTP 400 and guest-sanitized regardless of whether the provider raises the core or host completeness type. Unclassified provider exceptions remain server faults.

Value suggestions use the same translation and HTTP classification for get_values, with the route's documented {"message": string} error envelope. The host applies search LIKE filters to string, large-string, string-view, and dictionary-encoded text dimensions; numeric and temporal suggestions use the sorted bounded page without that filter. Typed rejections log the view, dimension, and closed rejection code without logging search text. A failed search does not retry without its filter: typed rejections return HTTP 400 with host-owned guidance, and unclassified faults return HTTP 500 with generic text. The semantic picker displays the sanitized HTTP 400 guidance and still accepts manual values. Non-text suggestions are limited to the bounded page. No failed result is cached. Completeness failures retain their existing HTTP 400 and guest-sanitized guidance.

Asynchronous chart-data execution preserves the same rejection/fault classification and host-owned messages in worker failures. The subscriber-authorized task status route returns HTTP 200 for a status read and includes the sanitized failure message; that polling status is not the provider error's HTTP classification. The client uses that message for ordinary query failures without another rejection-code mapping. Completeness failures retain their separate closed-reason handling and fixed guidance.