Skip to content

feat(query): add arrow ipc stream response format - #166

Merged
hotdata-automation[bot] merged 1 commit into
mainfrom
openapi-update-38689621972
Oct 15, 2026
Merged

hotdata-automation[bot] merged 1 commit into
mainfrom
openapi-update-38689621972

Conversation

@hotdata-automation

Copy link
Copy Markdown
Contributor

Auto-generated from the updated HotData OpenAPI spec.
Source: https://github.com/hotdata-dev/www/pull/452

@hotdata-automation
hotdata-automation Bot requested a review from a team as a code owner October 15, 2026 05:58
@hotdata-automation
hotdata-automation Bot requested review from rohan-hotdata and removed request for a team October 15, 2026 05:58
@hotdata-automation
hotdata-automation Bot enabled auto-merge (squash) October 15, 2026 05:58
Comment thread src/apis/query_api.rs
}

/// Execute a SQL query scoped to a database. A database is the only window into catalogs: the query sees only that database's auto `default` catalog plus any catalogs explicitly attached to it. Select the database with EITHER the `X-Database-Id` header OR the `database_id` body field (exactly one must be given; if both are sent and disagree, that's a 400). Use standard Postgres-compatible SQL; reference the default catalog as `default.<schema>.<table>` (or just `<schema>.<table>` / `<table>`) and attached catalogs by their alias. Results are returned inline and a `result_id` is provided for later retrieval via the Results API. Set `async: true` to execute asynchronously — returns a query run ID for polling. Optionally set `async_after_ms` to attempt synchronous execution first, falling back to async if the query exceeds the timeout.
/// Execute a SQL query scoped to a database. A database is the only window into catalogs: the query sees only that database's auto `default` catalog plus any catalogs explicitly attached to it. Select the database with EITHER the `X-Database-Id` header OR the `database_id` body field (exactly one must be given; if both are sent and disagree, that's a 400). Use standard Postgres-compatible SQL; reference the default catalog as `default.<schema>.<table>` (or just `<schema>.<table>` / `<table>`) and attached catalogs by their alias. Results are returned inline and a `result_id` is provided for later retrieval via the Results API. Set `async: true` to execute asynchronously — returns a query run ID for polling. Optionally set `async_after_ms` to attempt synchronous execution first, falling back to async if the query exceeds the timeout. To receive the rows as an Arrow IPC stream instead of JSON, send `Accept: application/vnd.apache.arrow.stream` (without also listing `application/json`). A query that completes within the request then returns 200 with an Arrow IPC stream body (schema, record batches, end-of-stream), and the values the JSON body would carry are sent as response headers: `X-Query-Run-Id`, `X-Result-Id` (when the result was saved), `X-Total-Row-Count`, `X-Execution-Time-Ms`, and `X-Query-Warning` (when there is a warning). Arrow keeps `±Inf` and `NaN` float values as they are. An Arrow response always holds the whole result: if the result is larger than an inline response can hold, the request returns 202 with the query run ticket and an `X-Result-Id` header instead, and the full result is read from `GET /v1/results/{id}?format=arrow` once it is ready. A query that goes async, and every error, return the same JSON bodies as without the header.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: The doc comment describes an Arrow mode that query() cannot use (not blocking).

Add a note that query() returns JSON only. Or add a separate Arrow method that returns raw bytes and the X-* headers.

query() sends no Accept header, and its return type is fixed to models::QueryResponse. Suppose a caller sets Accept: application/vnd.apache.arrow.stream as a default header on configuration.client. The 200 response then reaches the ContentType::Unsupported branch at line 84 and fails. A 202 response also fails, because it carries a run ticket and not a QueryResponse.

@hotdata-automation
hotdata-automation Bot merged commit 50a797d into main Oct 15, 2026
4 checks passed
@hotdata-automation
hotdata-automation Bot deleted the openapi-update-38689621972 branch October 15, 2026 05:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants