Evidence report: exit exercise

Source: duckdb:demo.duckdb · Target: local:iceberg · Finding dated 2026-10-19 11:15, on the scope run · Canot 0.3.0

Summary

Exit feasible on this scope. 2 points to address before leaving.

Identical
The content arrives, except for precision.All 8 tables, 8,661,245 rows in total, were copied then compared: row count, per-column statistics and content fingerprint. Only the columns flagged below differ.
3 of 4
Your reports give almost the same figures.4 reporting queries were replayed on both sides. 3 return exactly the same result.
To address
A report returns a different result.select * from tpch.lineitem order by l_orderkey, l_linenumber limit 50…: sorted row 0, column 16: Timestamp('1996-02-12 00:00:00.000001001') / datetime.datetime(1996, 2, 12, 0, 0, 0, 1). The figures may be right and only the presentation differs: better to know before leaving.
To address
1 column(s) lose precision on arrival.tpch.lineitem.l_loaded_at: TIMESTAMP_NS becomes timestamp[us]. The values differ beyond the precision of the target type. This is not corruption: it is a type choice to make before leaving.
Signed
Any change to the log shows.Each step is recorded in a log signed with a key created on your side. The signature attests the integrity of the log, not the identity of its author nor the date: the key fingerprint is shown at the bottom of the report.
Finding: mismatches to review — 7/8 identical tables, 3/4 identical queries, 0 not replayable, 1 with a mismatch, 1 conversion(s) with possible loss.

Measurements from this exercise

These measurements describe this exercise, on this scope. They do not compare two platforms.

Where the copy is

Destination: local:iceberg · location: …/iceberg/warehouse · catalog: SQLite (catalog.db in the output folder).
The copy is in Apache Iceberg format: you can reread it without Canot. The reread.sql file next to this report holds the DuckDB commands to do so.

Tables

TableSource rowsTarget rowsResultDetails
tpch.customer150000150000identical
tpch.lineitem60012156001215precisionl_loaded_at.min: Timestamp('1992-01-31 00:00:00.287971001') / datetime.datetime(1992, 1, 31, 0, 0, 0, 287971); l_loaded_at.max: Timestamp('1998-10-31 00:00:05.354144001') / datetime.datetime(1998, 10, 31, 0, 0, 5, 354144)
tpch.nation2525identical
tpch.orders15000001500000identical
tpch.part200000200000identical
tpch.partsupp800000800000identical
tpch.region55identical
tpch.supplier1000010000identical

Queries replayed on both sides

QueryResultDetails
select l_returnflag, l_linestatus, sum(l_quantity) as sum_qty, sum(l_extendedprice) as sum_base_price, sum(l_extendedprice * (1 - l_dmatch
select l_orderkey, sum(l_extendedprice * (1 - l_discount)) as revenue, o_orderdate from tpch.customer, tpch.orders, tpch.lineitem where c_mkmatch
select sum(l_extendedprice * l_discount) as revenue from tpch.lineitem where l_shipdate >= date '1994-01-01' and l_shipdate < date '1995-01-match
select * from tpch.lineitem order by l_orderkey, l_linenumber limit 50mismatchsorted row 0, column 16: Timestamp('1996-02-12 00:00:00.000001001') / datetime.datetime(1996, 2, 12, 0, 0, 0, 1)

Type conversions

tpch.lineitem.l_loaded_atTIMESTAMP_NS → timestamp[us]ns -> us (Iceberg v2 does not keep nanoseconds) (possible loss)

What does not move as is

Columns with a platform-specific type: 0. Objects to rebuild (views, procedures, tasks…):

TypeCountExamples
none detected

What these figures do not say

Tolerances applied

{"float_rel": 1e-09, "decimal_abs": 0.0, "columns": {}}

Report integrity

Chained log: 23 entries, last hash 3ce3b217c91ce8d27a925c4db4a6c89c15c634cbd1f358fb7c20af5612417f5b. Any change to the log shows. Verification: canot verify-evidence evidence

Fingerprint of the public signing key: 47371597 1591e860 04c9cf93 0acc0d7d. The signature attests the integrity of the log. It establishes neither the identity of the author nor the date: for that, keep the report in your own timestamped archive.

This report is a record of measurements for your own assessment. It is not a certification and it does not say whether your contracts or your organization meet any regulation.

This report covers the scope you chose. To get it on your environment, with three exit-cost scenarios and the steps to follow: canot.io.