- New
aggregateSETTING on Identity-stat layers (point, line, area, bar, ribbon, range, segment, arrow, rule, text). By default it collapses each group to a single row by replacing every numeric mapping in place with its aggregated value. See theDRAWdocumentation for details. - Added panel decorations (grid lines, axes, background) for polar coordinates (#156).
- Added
radarsetting to polar coordinates for making radar plots (#418).
- Side effects like
CREATE TEMP TABLEbefore theVISUALISEstatement are now separated from directly feeding into the visualisation data (#415) - Fixed bug where panel axes were unintentionally anchored to zero when using
FACET ... SETTING free => 'x'/'y'(#410). - Fixed bug where faceted data were matched to the incorrect panels (#409)
- Restructured how ggsql integrates with ODBC drivers to use the system ODBC, rather than bundling unixodbc as part of binary releases. This fixes several issues on Linux and macOS caused by relative paths to dynamic libraries.
- Fixed stacking in faceted plots (#403)
- Add cell delimiters and code lens actions to the Positron extension (#366)
- ODBC is now turned on for the CLI as well (#344)
FROMcan now come beforeVISUALIZE, mirroring the DuckDB style. This means thatFROM table VISUALIZE x, yandVISUALIZE x, y FROM tableare equivalent queries (#369)- CLI now has built-in documentation through the
docscommand as well as a skill for llms through theskillcommand (#361) - The ggsql wasm package is now published on GitHub Releases and NPM (#367)
- Rendering of inline plots in Positron had a bad interaction with how we handled auto-resizing in the plot pane. We now have a per-output-location path in the Jupyter kernel (#360)
- Passing the shape aesthetic via
SETTINGnow correctly translates named shapes (#368) - Asterisk shape now has lines 60 degrees apart, giving an even shape
validate()now reports an actionable error when a SQL expression (e.g.CAST(...)or a function call) appears inside aVISUALISEmapping, instead of silently treating the entire query as SQL (#389)- Error messages no longer leak internal aesthetic names. Validation, scale,
and writer errors now report user-facing aesthetic names (
x,y,panel,row, …) instead of internal forms (pos1,pos2,facet1, …), translated based on the active coordinate system and facet layout (#388). - Fixed opacity calculation in point layers with Vega-Lite (#393)
- Fixed an issue with case-sensitive column references in mappings (#374)
- Fixed SQL function set quantifiers in the ggsql grammar (#395)
- Fixed loading of dynamic libraries in PyPI build of
ggsql-jupyter(#355, #392) - Fixed an issue with OOB null-filtering, leading to missing median lines in boxplots (#394)
- Reverted an earlier decision to materialize CTEs and the global query in Rust before registering them back to the backend. We now keep the data purely on the backend until the layer query as was always intended (#363)
- Relieved some grammatical constraints on the SQL-portion before the VISUALISE portion (#364).
- Simplified internal approach to DataFrame with DuckDB reader (#365)
- Moved the CLI to its own module rather than be part of the main crate (#379)
- Restructured CLAUDE.md to better deal with the rising complexity of the project (#382)
- Renamed the
errorbarlayer torange. The geom was never error-specific and is generally useful for displaying intervals (min/max ranges, candlestick wicks, percentile bands, etc.). - The
segmentlayer now requires bothxendandyend(rather than auto-filling a missing endpoint from the start position). For axis-aligned 1D intervals — lollipops, candlestick wicks, etc. — use therangelayer instead.
- Removed polars from dependency list along with all its transient dependencies. Rewrote DataFrame struct on top of arrow (#350)
- Moved ggsql-python to its own repo (posit-dev/ggsql-python) and cleaned up any additional references to it
- Moved ggsql-r to its own repo (posit-dev/ggsql-r)
- First alpha release. No changes tracked before this