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
