Revision history for DBIO-DuckDB
0.900001 2026-07-12
* Fixes
- Every croak in DBIO::DuckDB::Storage (17 sites, including the
private _validate_quack_addr / _validate_quack_token helpers) now
routes through the inherited $self->throw_exception, so callers can
catch driver errors with $e->isa('DBIO::Exception') like the rest
of the family, instead of a plain Carp croak. Messages are
preserved verbatim; there is no DBIO::Exception::* subclass
taxonomy in core, so this is the same flat DBIO::Exception every
other driver throws. karr #7.
* Diff
- Fix DROP INDEX / DROP TABLE collision in full-schema sync (karr #8).
When diff reconciled a live schema containing a table absent from the
target (removed from the app's DBIO classes, or an unmanaged
leftover), it emitted both DROP TABLE <t> and a later standalone
DROP INDEX <t_idx>; since DuckDB's DROP TABLE already removes the
table's own indexes, and as_sql orders tables before indexes, the
standalone DROP INDEX failed once the table was gone and aborted
apply()/upgrade(). DBIO::DuckDB::Diff::Index now receives the tables
sections (threaded in by DBIO::DuckDB::Diff) and suppresses a
standalone DROP INDEX for any index whose owning table is itself
being dropped in the same pass. Indexes of surviving tables are still
dropped as before; the two-argument diff() call stays backward
compatible (absent table sections yield an empty dropped set).
* Tests
- Add t/41-diff-drop-table-index.t: full-diff regression for the
DROP INDEX / DROP TABLE collision (karr #8) plus Diff::Index unit
cases for the tables-aware drop suppression, including an
over-suppression guard (a surviving table's index is still dropped
standalone) and a two-argument backward-compatibility case.
- Add t/70-exceptions.t: asserts representative former-croak paths
(usage, invalid identifier, quack address) now throw a
DBIO::Exception object with the message preserved. karr #7.
* Dependencies
- Requires core DBIO >= 0.900001 (family-wide version alignment)
* Project
- Added SECURITY.md (CPAN Security Group guidelines v1.5.0)
0.900000 2026-06-23
First release. DuckDB driver for DBIO built on the pure-FFI DBD::DuckDB.
* Storage
- DBIO::DuckDB schema component; autodetects dbi:DuckDB: DSNs and
forces +DBIO::DuckDB::Storage
- DBIO::DuckDB::Storage on DBIO::Storage::DBI: double-quoted
identifiers, INSERT ... RETURNING, savepoints
- `-du` shortcut (use DBIO Schema => -du) via DBIO::Shortcut::du
* SQLMaker
- DBIO::DuckDB::SQLMaker: PostgreSQL-flavored dialect, disables
SELECT ... FOR UPDATE
* DDL / Deploy
- DBIO::DuckDB::DDL generates DuckDB DDL from Result classes via a
single-source emitter (DBIO::DuckDB::DDL::Emit)
- emits CREATE VIEW for non-virtual views (from view_definition),
after all tables
- DBIO::DuckDB::Deploy installs and upgrades schemas via native
test-deploy-and-compare
* Introspect / Diff
- DBIO::DuckDB::Introspect reads information_schema and duckdb_*
views (tables, columns, indexes, foreign keys)
- DBIO::DuckDB::Diff compares two introspected models (tables,
columns, indexes)
* DuckDB specials
- Arrow-fetch and Appender escape hatches for columnar / bulk paths
- read_csv / read_parquet / read_json table-function helpers
- extension install, checkpoint, version helpers
- Quack client-server RPC (libduckdb >= 1.5): quack_serve,
quack_attach, quack_detach, plus on-connect attach hook
* Tests
- TAP suite: 00-load, 08-shortcut, 10-smoke, 20-introspect,
21-introspect-contract, 30-deploy, 35-ddl-emit, 40-diff,
50-arrow, 60-quack