Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
889f788
feat: Use a known Schema instead of inferring it from the DB data
martin-g Oct 14, 2026
de8d004
Add IT tests for the engines requiring Docker
martin-g Oct 14, 2026
e5ed94e
fmt
martin-g Oct 14, 2026
670d963
clippy
martin-g Oct 14, 2026
dd33ffc
uppercase the inferred column names for Oracle
martin-g Oct 15, 2026
af01f37
Use LONG for the `id` column in Oracle
martin-g Oct 15, 2026
11b721d
Start an embedded Docker container for the Oracle IT tests
martin-g Oct 15, 2026
73a3194
Add a check for successful connect to Oracle and log any errors
martin-g Oct 15, 2026
6d5e31a
expose the ports, for Docker images like oracle-lite that do not EXPOSE
martin-g Oct 15, 2026
a22ff95
Minor improvements
martin-g Oct 15, 2026
32ce197
Pass a map<TableReference, SchemaRef> to the pool
martin-g Oct 15, 2026
d658276
optimize imports
martin-g Oct 16, 2026
8101d9d
Add a provider for Cassandra
martin-g Oct 14, 2026
a6eea01
Fix the IT tests for Cassandra
martin-g Oct 16, 2026
7a52f19
fmt
martin-g Oct 16, 2026
618c5ef
Add info about the Cassandra table provider and an example
martin-g Oct 16, 2026
6616bc5
Add write support to Cassandra TableProvider
martin-g Oct 16, 2026
828907b
Add support for federation
martin-g Oct 18, 2026
cc2c32b
Start the Cassandra Docker container in single-node setup, i.e. do no…
martin-g Oct 19, 2026
70be91c
Implement filter pushdown for key columns
martin-g Oct 19, 2026
e7d0655
Use constructors for PrimaryKey and KeyColumn
martin-g Oct 19, 2026
1385b2c
Add support for ScyllaDB - IT tests and CI workflow
martin-g Oct 19, 2026
9db5934
Update the README and the Cassandra example to use NetworkTopologyStr…
martin-g Oct 19, 2026
afcd925
Run unit & IT tests for all features
martin-g Oct 19, 2026
4801d20
Update ODBC & Sqlite installation in workflow
martin-g Oct 19, 2026
1d05667
Install ADBC drivers for the unittests run
martin-g Oct 19, 2026
05cfb0e
Run Oracle iT tests with the rest IT test
martin-g Oct 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 45 additions & 65 deletions .github/workflows/pr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ jobs:
crate:
- datafusion-table-providers-common
- datafusion-table-providers-adbc
- datafusion-table-providers-cassandra
- datafusion-table-providers-clickhouse
- datafusion-table-providers-duckdb
- datafusion-table-providers-flightsql
Expand Down Expand Up @@ -114,7 +115,12 @@ jobs:

- name: Install ODBC & Sqlite
run: |
sudo apt-get install -y unixodbc-dev libsqlite3-dev
sudo apt-get install -y unixodbc-dev libsqliteodbc libsqlite3-dev
curl -LsSf https://dbc.columnar.tech/install.sh | sh
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
export PATH="$HOME/.local/bin:$PATH"
dbc install sqlite
dbc install duckdb

- name: Run unit tests
run: make test
Expand All @@ -129,6 +135,8 @@ jobs:
PG_DOCKER_IMAGE: postgres:16
MYSQL_DOCKER_IMAGE: mysql:8.0
CLICKHOUSE_DOCKER_IMAGE: clickhouse/clickhouse-server:24.8
CASSANDRA_DOCKER_IMAGE: cassandra:5.0
ORACLE_DOCKER_IMAGE: docker.io/gvenzl/oracle-free:latest
# Keep integration test logs concise for faster CI runs.
RUST_LOG: info
# Serialize Docker-backed tests a bit to avoid stampeding many Postgres containers.
Expand Down Expand Up @@ -156,7 +164,7 @@ jobs:
uses: actions/cache@v6
with:
path: /tmp/docker-images
key: docker-images-${{ env.PG_DOCKER_IMAGE }}-${{ env.MYSQL_DOCKER_IMAGE }}-${{ env.CLICKHOUSE_DOCKER_IMAGE }}
key: docker-images-${{ env.PG_DOCKER_IMAGE }}-${{ env.MYSQL_DOCKER_IMAGE }}-${{ env.CLICKHOUSE_DOCKER_IMAGE }}-${{ env.CASSANDRA_DOCKER_IMAGE }}-${{ env.ORACLE_DOCKER_IMAGE }}

- name: Load or pull Docker images
run: |
Expand All @@ -177,11 +185,13 @@ jobs:
load_or_pull postgres "${{ env.PG_DOCKER_IMAGE }}"
load_or_pull mysql "${{ env.MYSQL_DOCKER_IMAGE }}"
load_or_pull clickhouse "${{ env.CLICKHOUSE_DOCKER_IMAGE }}"
load_or_pull cassandra "${{ env.CASSANDRA_DOCKER_IMAGE }}"
load_or_pull oracle "${{ env.ORACLE_DOCKER_IMAGE }}"

- name: Install ODBC & Sqlite
run: |
sudo apt-get update
sudo apt-get install -y unixodbc-dev libsqlite3-dev
sudo apt-get install -y unixodbc-dev libsqliteodbc libsqlite3-dev

- name: Install ADBC drivers
run: |
Expand All @@ -192,16 +202,32 @@ jobs:
dbc install duckdb
ls -la "${XDG_CONFIG_HOME:-$HOME/.config}/adbc/drivers" || true

- name: Install Oracle Instant Client
run: |
# `rust-oracle` uses ODPI-C and dlopens the Instant Client at runtime.
sudo apt-get update
sudo apt-get install -y libaio1t64 wget unzip || sudo apt-get install -y libaio1 wget unzip
wget -q https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip
mkdir -p /opt/oracle
unzip -q instantclient-basiclite-linuxx64.zip -d /opt/oracle -x "META-INF/*"
IC_DIR=$(ls -d /opt/oracle/instantclient*)
# Ubuntu 22.04+ renamed libaio.so.1 to libaio.so.1t64; the Instant Client still looks for the old name.
if [ -f /usr/lib/x86_64-linux-gnu/libaio.so.1t64 ] && [ ! -f "$IC_DIR/libaio.so.1" ]; then
sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 "$IC_DIR/libaio.so.1"
fi
echo "LD_LIBRARY_PATH=$IC_DIR" >> "$GITHUB_ENV"

- name: Run integration tests
run: make test-integration

oracle-integration-test:
name: Oracle Integration Tests
scylla-integration-test:
name: ScyllaDB Integration Tests
runs-on: ubuntu-latest
timeout-minutes: 45
timeout-minutes: 25

env:
ORACLE_DOCKER_IMAGE: docker.io/gvenzl/oracle-free:latest
# The Cassandra provider is tested against ScyllaDB with the Cassandra integration tests
CASSANDRA_DOCKER_IMAGE: scylladb/scylla:2026.3.3
RUST_LOG: info

steps:
Expand All @@ -212,71 +238,25 @@ jobs:
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2

- name: Install Oracle Instant Client
run: |
# `rust-oracle` uses ODPI-C and dlopens the Instant Client at runtime.
sudo apt-get update
sudo apt-get install -y libaio1t64 wget unzip || sudo apt-get install -y libaio1 wget unzip
wget -q https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip
mkdir -p /opt/oracle
unzip -q instantclient-basiclite-linuxx64.zip -d /opt/oracle -x "META-INF/*"
IC_DIR=$(ls -d /opt/oracle/instantclient*)
# Ubuntu 22.04+ renamed libaio.so.1 to libaio.so.1t64; the Instant Client still looks for the old name.
if [ -f /usr/lib/x86_64-linux-gnu/libaio.so.1t64 ] && [ ! -f "$IC_DIR/libaio.so.1" ]; then
sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 "$IC_DIR/libaio.so.1"
fi
echo "LD_LIBRARY_PATH=$IC_DIR" >> "$GITHUB_ENV"

- name: Cache Oracle Docker image
id: oracle-docker-cache
- name: Cache ScyllaDB Docker image
id: scylla-docker-cache
uses: actions/cache@v6
with:
path: /tmp/oracle-image
key: oracle-image-${{ env.ORACLE_DOCKER_IMAGE }}
path: /tmp/scylla-image
key: scylla-image-${{ env.CASSANDRA_DOCKER_IMAGE }}

- name: Load or pull Oracle image
- name: Load or pull ScyllaDB image
run: |
mkdir -p /tmp/oracle-image
if [ -f /tmp/oracle-image/oracle.tar ]; then
docker load -i /tmp/oracle-image/oracle.tar
mkdir -p /tmp/scylla-image
if [ -f /tmp/scylla-image/scylla.tar ]; then
docker load -i /tmp/scylla-image/scylla.tar
else
docker pull "${ORACLE_DOCKER_IMAGE}"
docker save -o /tmp/oracle-image/oracle.tar "${ORACLE_DOCKER_IMAGE}"
docker pull "${CASSANDRA_DOCKER_IMAGE}"
docker save -o /tmp/scylla-image/scylla.tar "${CASSANDRA_DOCKER_IMAGE}"
fi

# Build the test binary first so the Rust compile does not eat into the
# Oracle container's boot/health window below or the job timeout.
- name: Build integration test binary
run: cargo build --tests -p datafusion-table-providers --no-default-features --features oracle

- name: Start Oracle container
run: |
docker run -d --name oracle-it \
-e ORACLE_PASSWORD=password \
-p 1521:1521 \
"${ORACLE_DOCKER_IMAGE}"
echo "Waiting for Oracle to become ready (cold boot can take ~10 minutes on CI runners)..."
# gvenzl/oracle-free ships no Docker HEALTHCHECK, so readiness is
# detected via the image's own "DATABASE IS READY TO USE!" marker
# plus a successful TCP probe of the published listener port.
for i in $(seq 1 360); do
if docker logs oracle-it 2>&1 | grep -q "DATABASE IS READY TO USE!" \
&& (exec 3<>/dev/tcp/127.0.0.1/1521) 2>/dev/null; then
echo "Oracle listener is up on 1521"
exit 0
fi
if docker inspect --format '{{.State.Status}}' oracle-it | grep -q exited; then
docker logs oracle-it
exit 1
fi
sleep 5
done
echo "Oracle never became ready" >&2
docker logs oracle-it >&2 || true
exit 1

- name: Run Oracle integration tests
run: cargo test -p datafusion-table-providers --test integration --no-default-features --features oracle -- --test-threads=1 --nocapture
- name: Run ScyllaDB integration tests
run: cargo test -p datafusion-table-providers --test integration --no-default-features --features cassandra -- --nocapture cassandra

python-integration-test:
name: Python Tests
Expand Down
111 changes: 110 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
# under the License.

[workspace]
members = ["core", "crates/common", "python", "crates/odbc", "crates/clickhouse", "crates/flightsql", "crates/mongodb", "crates/mysql", "crates/sqlite", "crates/postgres", "crates/duckdb", "crates/adbc", "crates/oracle"]
members = ["core", "crates/common", "python", "crates/odbc", "crates/clickhouse", "crates/flightsql", "crates/mongodb", "crates/mysql", "crates/sqlite", "crates/postgres", "crates/duckdb", "crates/adbc", "crates/oracle", "crates/cassandra"]
resolver = "2"

[workspace.package]
Expand Down Expand Up @@ -57,6 +57,7 @@ datafusion-table-providers-postgres = { version = "0.14.0", path = "crates/postg
datafusion-table-providers-duckdb = { version = "0.14.0", path = "crates/duckdb" }
datafusion-table-providers-adbc = { version = "0.14.0", path = "crates/adbc" }
datafusion-table-providers-oracle = { version = "0.14.0", path = "crates/oracle" }
datafusion-table-providers-cassandra = { version = "0.14.0", path = "crates/cassandra" }
duckdb = { version = "1.10505.0" }
adbc_core = { version = "0.24" }
adbc_driver_manager = { version = "0.24" }
Expand Down
5 changes: 2 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@ all:

.PHONY: test
test:
cargo test --features clickhouse,duckdb,flight,mysql,postgres,sqlite,adbc -p datafusion-table-providers --lib
cargo test -p datafusion-table-providers-oracle
RUST_LOG=$${RUST_LOG:-info} cargo test --all-features --lib -- --nocapture

.PHONY: lint
lint:
cargo clippy --all-features

.PHONY: test-integration
test-integration:
RUST_LOG=$${RUST_LOG:-info} cargo test -p datafusion-table-providers --test integration --no-default-features --features postgres,sqlite,mysql,flight,clickhouse,duckdb,adbc -- --nocapture
RUST_LOG=$${RUST_LOG:-info} cargo test -p datafusion-table-providers --test integration --all-features -- --nocapture
Loading
Loading