Skip to main content

Development

Contributions, bug reports and testing on platforms the suite does not reach (Azure SQL Database, Managed Instance, Fabric SQL database) are welcome — issues and pull requests on GitHub.

Building

git clone --recurse-submodules https://github.com/hugr-lab/mssql-ducklake.git
cd mssql-ducklake
make vcpkg-setup # once (or point VCPKG_TOOLCHAIN_PATH at an existing vcpkg)
GEN=ninja make # release: the duckdb CLI, unittest, the mssql and mssql_ducklake loadables

The build produces build/release/duckdb with both extensions under build/release/extension/; build/release/test/unittest 'test/sql/*' runs the server-free suite and scripts/ci/smoke_load.sh the out-of-tree load and both gates.

The integration suite

test/sql/integration/ runs against a real SQL Server holding a DuckLake catalog. The environment is docker/docker-compose.yml, image pinned like the rest of the stack, every container and volume named mssql-ducklake-*, port 7433, so it lives beside other SQL Servers on the same machine:

cp -n .env.example .env # port, sa password, database name
make docker-up # start, wait for healthy, create the catalog database
make test-integration # the server-backed suite; `make test` skips it
make test-concurrent # four concurrent writers over alternating rounds
make docker-down

The suite resets its database (every ducklake% table) on each run; the init plants a marker table, and a run refuses to reset a database without it. CI runs the same compose file and forbids a silent skip.

Benchmarks

make bench-scale BENCH_SCALE_ARGS='--tables 1000 …' builds a catalog of the given shape on SQL Server and on PostgreSQL (MSSQL_DUCKLAKE_PG_DSN) and times every phase on both; the performance page is its output. make metadata-log WORKLOAD=file.sql lists every metadata query a workload issued, by shape, cost and path.

Specs

Each feature has one lightweight spec under specs/ — the problem, the design with the measurements that decided it, the tests, the alternatives — written before or alongside the work and kept current. specs/README.md is the index; reading 002 (why DuckLake is embedded) and 004 (the manager's first phase) first explains most of the code.

This site

website/ is a Docusaurus site, the same setup as the mssql extension's:

cd website && npm ci && npm start # live preview
npx docusaurus build # what CI and the Pages deploy run; broken links fail it

Pull requests that touch website/ build the site; a push to main deploys it. At each release npm run docusaurus docs:version <X.Y.Z> snapshots the docs, which then serve as the default while the live tree publishes as Next. Links between pages are relative (../catalog/shaping.md), never absolute site paths — scripts/ci/check_docs_links.py enforces that, because an absolute link leaves the version the reader is in.