Files

tests/fixtures/duckdb/ — BI-P014

sales.parquet and customers.csv are committed: small, binary-stable, and portable across checkouts.

The Iceberg fixture is deliberately NOT committed. pyiceberg writes ABSOLUTE paths into its metadata and Avro manifests, so a committed table only resolves on the machine that built it — a fixture that silently fails everywhere else is worse than no fixture. The recorded result of a real iceberg_scan run is kept in evidence/bi-p014/duckdb-sandbox.json instead, and tests/analytics/duckdb-provider.test.ts pins it.

To rebuild the Iceberg fixture locally:

python -m venv .venv && .venv/bin/pip install duckdb pyarrow 'pyiceberg[sql-sqlite]'
DUCKDB_PYTHON=.venv/bin/python pnpm vitest run tests/duckdb/duckdb-provider.live.test.ts

iceberg_scan is pointed at an EXACT metadata JSON file rather than a table directory. That is not a workaround: DuckDB refuses to glob for the latest version by default because globbing can read uncommitted data, and an exact metadata file is precisely what "Iceberg snapshot" means in BI-P014.