v1.34.0
Changed
-
Upgraded Apache Arrow from 23.0.1 to 25.0.0 (two releases: 24.0.0 and 25.0.0). Highlights that matter to GizmoSQL users:
- Flight SQL protocol groundwork for retiring client-side DML/DDL detection. The protocol now lets servers declare at prepare time whether a statement returns a result set (
is_updateonActionCreatePreparedStatementResult, apache/arrow#49498) — the first step toward GizmoSQL client drivers dropping query-vs-update text sniffing for prepared statements. Adoption lands as the ecosystem catches up: the field is protobuf-only in Arrow 25's C++ release (not yet exposed in the C++ Flight SQL server API, so GizmoSQL cannot populate it yet), while Arrow Java has already merged client support. - Stricter Arrow IPC validation: the IPC reader now rejects malformed streams and files it previously tolerated — a hardening win for a network-facing server. Note that a non-conforming client producing sloppy IPC could newly see rejections.
- A formal Arrow security model: the Arrow project published project-wide and C++-specific security documentation covering guarantees when handling untrusted Arrow data — relevant to GizmoSQL since Arrow is our entire wire format.
- Refreshed bundled gRPC/protobuf stack, bringing the server's network layer up to current security patch levels.
- ARM64 SVE runtime dispatch: Arrow's vectorized routines now use SVE on capable ARM CPUs (e.g. AWS Graviton 3/4) — a modest boost for GizmoSQL's arm64 builds on the Flight data path.
Build notes: two of the three local Arrow source patches (the macOS c-ares
set_target_propertiesfix and thecctools_ldlibtool-detection regex) were fixed upstream and now no-op; the MSVC SSE-defines guard still applies. - Flight SQL protocol groundwork for retiring client-side DML/DDL detection. The protocol now lets servers declare at prepare time whether a statement returns a result set (
Added
- Full per-execution timeline in instrumentation:
sql_executionsnow records five timestamps and two durations. New columnsfetch_start_time(first result batch delivered to the client; NULL if none; can precedeexecution_end_timesince results stream),fetch_end_time(last batch delivered),cursor_close_time(client released the statement/stream), andtotal_duration_ms(fetch_end_time - execution_start_time, i.e. execution through result delivery) join the existingenqueue_time/execution_start_time/execution_end_time/duration_ms, so queue wait, engine time, time-to-first-row, fetch phase, and idle-open-cursor time are all derivable by subtraction. Added viaADD COLUMN IF NOT EXISTSmigrations on all backends (file, PostgreSQL, DuckLake); exposed in thesession_activityandexecution_detailsviews, withavg_total_duration_ms/max_total_duration_msadded tosession_stats. cluster_idis now exposed in the instrumentationsession_activityandactive_sessionsviews. Both views carry the owning instance'scluster_id(from--cluster-id/GIZMOSQL_CLUSTER_ID; NULL when unset), so activity can be filtered or grouped per cluster in multi-instance deployments. New view columns are appended at the end of each view's column list so existing PostgreSQL-backed catalogs upgrade in place viaCREATE OR REPLACE VIEW.
Fixed
- Instrumentation
sql_executions.execution_end_timewas wildly inconsistent withduration_ms(e.g.duration_ms = 5for a start→end span of over an hour). The two columns measured different events:duration_mswas stamped when the engine finished executing, whileexecution_end_timewas stamped when the statement was finally closed or re-executed — for a client holding the statement open, hours after the query finished (that moment is still recorded, now under its honest name:cursor_close_time).execution_end_timenow marks when the engine finished and is derived asexecution_start_time + duration_ms, soend - startalways equalsduration_msexactly; the result-delivery phase is tracked separately byfetch_end_time/total_duration_ms. Timestamps are computed from wall-clock offsets captured synchronously, so instrumentation write-queue latency can no longer skew them.