- Enabled the crate's
spatialfeature, soDRAW spatialmap layers now render through the Vega-Lite writer instead of raising "Spatial visualization requires the 'spatial' feature to be enabled". Spatial layers require DuckDB'sspatialextension at runtime: ggsql issuesLOAD spatialautomatically but neverINSTALLit, so runINSTALL spatialonce per machine (e.g. viaDuckDBReader.execute_sql(); the download is cached under~/.duckdb/extensions). Works with WKB geometry columns and the built-inggsql:worlddataset, including named map projections such asPROJECT TO equal_earth. - New
CachingReader.execute_sql_cached()method that runs SQL on the reader's private in-memory cache connection — the compute surface where all ggsql-generated derived SQL executes — instead of the primary data source. This is the surface for per-connection setup that derived SQL depends on: e.g.INSTALL/LOADof DuckDB extensions such asspatial, which would fail on a locked-down primary and take no effect on the cache even where it succeeds.
- Removed
Spec.layer_sql()andSpec.stat_sql(). These mirrored a vestigial Rust API that returnedNonein every released crate since v0.1.6 (the backing fields were never populated after the scale-syntax rewrite) and was removed upstream in ggsql PR #569. No functionality is lost.
- Data now crosses the Python↔Rust boundary via the zero-copy Arrow C Data Interface instead of Arrow IPC serialization, reducing memory copies and peak RSS for large results (on a 1M-row × 50-col register+read microbenchmark: ~5.7× faster, ~1 GB lower peak RSS). Set
GGSQL_ARROW_IPC=1to restore the previous IPC behavior. The minimum pyarrow version is now 15.
- New native writers
SVGWriter,PDFWriter, andHepWriter, rendered directly by ggsql (via hephaestus) with no JavaScript round-trip. Each exposesrender(spec)returningstr(SVG) orbytes(PDF/HEP); render warnings are surfaced viawarnings.warn(). - New
ggsql.save(spec, file, ...)helper that writes a spec to disk, picking the writer from the file extension (.svg,.pdf,.hep, or.jsonfor Vega-Lite). - Enabled the crate's
builtin-datafeature, making builtin datasets such asggsql:worldavailable. - New
ggsql.CachingReaderthat caches query results to avoid redundant source reads. Wraps aduckdb://connection string or any custom Python reader; reads are memoized with a configurable TTL and size budget, and derived__ggsql_*tables run on a private in-memory DuckDB cache.
- Upgraded to ggsql Rust crate v0.5.2 (from v0.3.3). See the crate changelog for the many language and rendering improvements in 0.4.0–0.5.2.
- Upgraded the Arrow dependency from v56 to v58.
- Declared Rust MSRV is now 1.88 (required by the native-writer dependency graph, e.g. parley 0.9).
- Upgraded to ggsql Rust crate v0.3.3 (hotfix).
VegaLiteWriter.render_chart()andrender_altair()now acceptvalidate,height, andwidthas explicit keyword arguments.heightandwidthdefault toNone, which preserves whatever dimensions ggsql produces.validatedefaults toFalse(same behavior as before, now a named parameter).- When Altair can't deserialize a spec into the expected chart subclass (e.g.,
LayerChart), the converter now falls back toaltair.Chartinstead of raising. The chart still displays correctly; only Altair-level round-tripping (.to_dict()) is lost.
- Upgraded to ggsql Rust crate v0.3.2.
render_altair()andVegaLiteWriter.render_chart()now default tovalidate=Falsewhen creating Altair chart objects. This avoidsValidationErrors for valid specs (e.g., boxplots) that use Vega-Lite features not yet reflected in Altair's schema. Passvalidate=Trueto re-enable.
- Upgraded to ggsql Rust crate v0.3.1.
- Replaced polars with Arrow (via pyarrow) for the Rust↔Python data bridge.
DuckDBReader.execute_sql(),Spec.data(),Spec.layer_data(), andSpec.stat_data()now returnpyarrow.Tableinstead ofpolars.DataFrame.DuckDBReader.register()acceptspyarrow.Table(polars DataFrames are still accepted via automatic conversion). Custom readers returning polars DataFrames fromexecute_sql()continue to work without changes. - Runtime dependency changed from
polarstopyarrow.
Synced with ggsql Rust crate v0.2.7.
Initial release.