Revision history for DBIO-Oracle
0.900001 2026-07-12
* Fixes
- SQLMaker's _quote() now allowlists Oracle's hierarchical/row
pseudo-columns (LEVEL, ROWNUM, ROWID, CONNECT_BY_ISCYCLE,
CONNECT_BY_ISLEAF) and emits them bare instead of quoting them;
quoting any of them raises ORA-00904 ("invalid identifier") now
that identifier quoting defaults to on. Caught both as a bare
string and as the single-segment arrayref shape SQL::Abstract v2
uses for an already-split identifier (e.g. order_by).
CONNECT_BY_ROOT is a prefix operator, not a standalone
identifier, so it never reaches _quote() and is intentionally
not in the allowlist. karr #17.
- Type::is_lob_type / is_text_lob_type took a Data::Type object,
but LOBSupport's _prep_for_execute passes a plain data-type
string (matching sqlt_datatype), so the predicate silently
returned false for every bind and LOB bind attrs were never
applied. Now takes the string, mirroring DBIx::Class::Storage::
DBI::_is_lob_type semantics.
- dump_value's diagnostic in the "Partially failed populate
throws" test pinned Data::Dumper's exact quoting form
(name => "pop_art_1"), coupling a behavioural assertion (which
row failed) to a serialization detail. Relaxed to assert the
diagnostic header by pattern and the dumped failing row
structurally (eval'd back to a hashref and compared with
is_deeply), so either quoting form passes. ADR core/0027,
karr #18.
* Storage
- DBIO::Oracle::Test::SequenceTest switched from
is_auto_increment => sequence => 'name' to auto_nextval => 1
with the sequence as a scalar ref, matching the API documented
in DBIO::Oracle::Storage.
- Added a DBIO::PK::Auto::Oracle deprecated compat shim: the
generic DBIO::PK::Auto component now covers Oracle auto-PK
handling directly, but load_components('PK::Auto::Oracle')
still needs a class to exist to load. The shim exists only to
satisfy that call and pulls in the generic component; new code
should use DBIO::PK::Auto directly. karr #16.
* Tests
- t/10/t/12/t/20/t/22/t/32: DDL and literal identifiers used in
the test fixtures are now quoted to match identifier quoting
being on by default (the unquoted `cd` table stays unquoted by
design, per its table(\'cd') declaration); the LEVEL order_by
expectation is corrected to bare LEVEL, with a new assertion
that LEVEL/ROWNUM stay bare under both quote_char states.
* Documentation
- Added SECURITY.md (CPANSec author guidelines v1.5.0): email-first
private reporting with CPANSec escalation; explicit notice that
Codeberg has no confidential issue channel.
* Dependencies
- DBD::Oracle is now a hard requires (was recommends): a database-
specific driver is useless without its DBD. Dropped the runtime
require DBD::Oracle workaround in Type, LOBSupport, and
Introspect::Columns in favour of plain use.
- Requires core DBIO >= 0.900001 (family-wide version alignment)
0.900000 2026-06-23
First release. Oracle database driver for DBIO.
* Storage
- Oracle storage auto-detected for dbi:Oracle: DSNs, with the -ora
shortcut, load_components('Oracle'), and DBIO::Base subclassing
- Sequence-based auto-increment (auto_nextval / SELECT seq.nextval)
- LOB binding and chunking for CLOB/NCLOB/BLOB
- Savepoints, deferrable FK constraint handling, and NLS session
setup on connect
- Pre-9.0 fallback to WHERE-clause joins when ANSI joins are
unavailable
* SQLMaker
- ROWNUM-based limit/offset via the _RowNum dialect (apply_limit)
- RETURNING ... INTO ? insert-returning syntax
- CONNECT BY / START WITH / ORDER SIBLINGS BY / PRIOR hierarchical
query support
- Automatic identifier shortening to Oracle's 30-character limit
across SELECT/FROM and WHERE/HAVING paths and relation aliases
* Deploy
- Desired-state deployment via test-deploy-and-compare
- install_ddl creates a fresh schema; upgrade diffs live vs. desired
* Introspect
- Native introspection of tables, columns, keys, indexes, and
foreign keys via USER_*/ALL_* views
* Diff
- Native diff of two introspected models at table, column, and
index level
* DDL
- Native Oracle DDL generation from DBIO Result classes
- Dedupe sources sharing a physical table, skip subquery and view
sources, dereference literal table names, and emit CREATE VIEW
for non-virtual views