Repository navigation
v0.2.0
Added
-
Webhook notifications when a run finishes:
notifications:with a Slack Block Kit message
or a JSON run summary, chosen per webhook by outcome (when: [failure, view_errors, success]). Runs that fail before or while connecting notify too; an unreachable webhook is
a warning, never a failed run; URLs are never printed.adbc-replicate test-notifications
sends a test message. -
Retries on transient connection errors (gRPC "unavailable", such as "the connection is
draining" when an nginx in front of GizmoSQL reloads). A table load is retried whole
(ingest.retries, default 2, withingest.retry_wait_secondsbackoff); that's safe because
each load is one transaction that replaces the table. A single statement is resent only if it
failed while being prepared, so it never ran. -
columns[].rename: give a column a different target name, for names the target can't take
(DuckLake reservesrow_id,begin_snapshotandend_snapshotwhile data inlining is on).
A rename that matches no column fails the plan, like other column rules. -
Oracle
external_tables: include | exclude. Included external tables are read without
AS OF SCN(files have no SCN), soconsistency: snapshotno longer fails on them.
Fixed
-
Oracle
BFILEcolumns, which the driver can't read, failed the whole table; they're now
skipped, and the plan names each one. -
View translation no longer produces views that silently return different results. sqlglot,
by default, warns and then drops what DuckDB lacks:TO_CHAR(dt, 'YYYY-MM')became
CAST(dt AS TEXT),INSTR's occurrence argument was ignored, andTO_NUMBER(... DEFAULT ... ON CONVERSION ERROR)lost its default. These views are now reported as view errors
(use an override). Found on a live Oracle schema, where 15 of 322 views were affected. -
Oracle views:
CAST(x AS DATE)became DuckDBDATE, dropping the time of day; it's now
TIMESTAMP_S.SYSDATEbecame UTC "now" although Oracle returns the server's wall-clock
time (US Eastern on the schema where this was found); it now needs
views.source_time_zone, and the plan warns when that doesn't match the server's clock. -
Oracle
OUTER APPLY/CROSS APPLYproduced a lateral join withoutON, which DuckDB
rejects; they're now[LEFT] JOIN LATERAL ... ON TRUE.
Changed
- Every dependency floor is now its latest release (pyarrow 26, sqlglot 30.22, pydantic 2.14,
adbc-driver-manager 1.12, ...): the tool runs in its own environment, and older sqlglot
releases parse OracleSYSTIMESTAMP,TRUNC,APPLYandREGEXP_SUBSTRdifferently.
Compatibility code for older releases is gone. - Oracle date arithmetic in views follows Oracle:
DATE ± nis n days later or earlier,
rounded to the second (aTIMESTAMPis truncated to the second first), andDATE - DATE
is a number of days (a DOUBLE, where Oracle's is a 38-digit NUMBER). Operand types come
from the source catalog, through subqueries and CTEs; compared with Oracle in the
integration tests. - Oracle
TRUNC(date),TRUNC(date, 'DD' | 'HH' | 'MM' | 'YYYY' | ...)andTO_CHARwith the
formats that have an exact DuckDB equivalent are translated; results are compared with
Oracle's in the integration tests. views.source_pseudo_columns: nullkeeps views that select OracleORA_ROWSCN/ROWID
(APEX optimistic locking), with those columns as NULL; the default still reports them.- Oracle
TO_NUMBER(x)(no format) in views becomesCAST(x AS DECIMAL(38,10)), exact like
unconstrainedNUMBERcolumns, instead of sqlglot'sDOUBLE. Optimizer hints are dropped.