sqlx-exasol 0.9.2

Exasol driver for the SQLx framework.
Documentation
name: CI

on:
  push:
    branches: ["main"]
  pull_request:
    branches: ["main"]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  EXASOL_VERSION: latest-7.1
  NUM_NODES: 4
  TESTS_TIMEOUT: 15
  EXA_CLUSTER_SETUP_TIMEOUT: 10

jobs:
  format:
    name: Format
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: dtolnay/rust-toolchain@nightly
        with:
          components: rustfmt

      - name: Check format
        run: cargo +nightly fmt --check

  docs:
    name: Docs
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Swatinem/rust-cache@v2
      - uses: dtolnay/rust-toolchain@1.86.0

      - name: Check format
        run: cargo doc --workspace --no-deps --document-private-items --all-features
        env:
          RUSTDOCFLAGS: -D warnings
          
  docs_rs:
    name: Emulate docs.rs build
    runs-on: ubuntu-latest
    env:
      RUSTDOCFLAGS: -Dwarnings
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@nightly
      - uses: dtolnay/install@cargo-docs-rs
      - run: cargo +nightly docs-rs

  clippy:
    name: Clippy
    needs: [format, docs, docs_rs]
    runs-on: ubuntu-latest
    strategy:
      matrix:
        features: ["--all-features", ""]
    steps:
      - uses: actions/checkout@v4
      - uses: Swatinem/rust-cache@v2

      - uses: dtolnay/rust-toolchain@1.86.0
        with:
          components: clippy

      - name: Run clippy
        run: cargo clippy --tests ${{ matrix.features }}
        env:
          RUSTFLAGS: -D warnings
          
  io_tests:
    name: IO tests
    needs: clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Free disk space
        uses: ./.github/actions/free-space

      - name: Create Exasol cluster
        timeout-minutes: ${{ fromJSON(env.EXA_CLUSTER_SETUP_TIMEOUT) }}
        id: exa-cluster
        uses: ./.github/actions/exa-cluster
        with:
          exasol-version: ${{ env.EXASOL_VERSION }}
          num-nodes: ${{ env.NUM_NODES }}

      - uses: dtolnay/rust-toolchain@1.86.0
      - uses: Swatinem/rust-cache@v2

      - name: Test IO combos (no TLS, no compression)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: cargo test --features runtime-tokio,etl -- it_works_with_io_combo --ignored --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true
          
      - name: Test IO combos (no TLS, with compression)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: cargo test --features runtime-tokio,etl,compression -- it_works_with_io_combo --ignored  --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true
          
      - name: Test IO combos (NativeTLS, no compression)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: cargo test --features runtime-tokio,etl,tls-native-tls -- it_works_with_io_combo --ignored --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true
          
      - name: Test IO combos (NativeTLS, with compression)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: cargo test --features runtime-tokio,etl,tls-native-tls,compression -- it_works_with_io_combo --ignored --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true
          
      - name: Test IO combos (Rustls, no compression)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: cargo test --features runtime-tokio,etl,tls-rustls-aws-lc-rs -- it_works_with_io_combo --ignored --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true
          
      - name: Test IO combos (Rustls, with compression)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: cargo test --features runtime-tokio,etl,tls-rustls-aws-lc-rs,compression -- it_works_with_io_combo --ignored --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true
          
  io_tests_latest:
    name: IO tests on latest Exasol (TLS only)
    needs: clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Free disk space
        uses: ./.github/actions/free-space

      - name: Create Exasol cluster
        timeout-minutes: ${{ fromJSON(env.EXA_CLUSTER_SETUP_TIMEOUT) }}
        id: exa-cluster
        uses: ./.github/actions/exa-cluster
        with:
          exasol-version: latest
          num-nodes: 1

      - uses: dtolnay/rust-toolchain@1.86.0
      - uses: Swatinem/rust-cache@v2
          
      - name: Test IO combos (NativeTLS, no compression)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: cargo test --features runtime-tokio,etl,tls-native-tls -- it_works_with_io_combo_tls --ignored --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true
          
      - name: Test IO combos (NativeTLS, with compression)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: cargo test --features runtime-tokio,etl,tls-native-tls,compression -- it_works_with_io_combo_tls --ignored --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true
          
      - name: Test IO combos (Rustls, no compression)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: cargo test --features runtime-tokio,etl,tls-rustls-aws-lc-rs -- it_works_with_io_combo_tls --ignored --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true
          
      - name: Test IO combos (Rustls, with compression)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: cargo test --features runtime-tokio,etl,tls-rustls-aws-lc-rs,compression -- it_works_with_io_combo_tls --ignored --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true

  driver_tests:
    name: Driver tests
    needs: clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Free disk space
        uses: ./.github/actions/free-space

      - name: Create Exasol cluster
        timeout-minutes: ${{ fromJSON(env.EXA_CLUSTER_SETUP_TIMEOUT) }}
        id: exa-cluster
        uses: ./.github/actions/exa-cluster
        with:
          exasol-version: ${{ env.EXASOL_VERSION }}
          num-nodes: ${{ env.NUM_NODES }}

      - uses: dtolnay/rust-toolchain@1.86.0
      - uses: Swatinem/rust-cache@v2
      
      - name: Drop database (non-existent)
        run: cargo run -p sqlx-exasol-cli -- database drop -y
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}/test
          
      - name: Setup database
        run: cargo run -p sqlx-exasol-cli -- database create
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}/test

      - name: Run migrations
        run: cargo run -p sqlx-exasol-cli -- migrate run --source tests/migrations_compile_time
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}/test
          
      - name: Run prepare
        run: cargo run -p sqlx-exasol-cli -- prepare -- --tests --all-features
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}/test

      - name: Run tests (preferred crates)
        run: cargo test --features runtime-tokio,bigdecimal,time,uuid -- test_compile_time --ignored --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}/test
          
      - name: Run tests (chrono)
        run: cargo test --features runtime-tokio,chrono -- test_compile_time_chrono --ignored --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}/test
          
      - name: Run tests (rust_decimal)
        run: cargo test --features runtime-tokio,rust_decimal -- test_compile_time_rust_decimal --ignored --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}/test

      - name: Unit tests
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: cargo test -p sqlx-exasol-impl --features migrate -- --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}/test

      - name: Integration connection tests
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: cargo test --all-features -- --nocapture
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}/test?ssl-mode=disabled&compression=disabled
          
      - name: Drop database (existent)
        run: cargo run -p sqlx-exasol-cli -- database drop -y
        env:
          DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}/test

  etl_tests:
    name: ETL tests
    needs: clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Free disk space
        uses: ./.github/actions/free-space

      - name: Create Exasol cluster
        timeout-minutes: ${{ fromJSON(env.EXA_CLUSTER_SETUP_TIMEOUT) }}
        id: exa-cluster
        uses: ./.github/actions/exa-cluster
        with:
          exasol-version: ${{ env.EXASOL_VERSION }}
          num-nodes: ${{ env.NUM_NODES }}

      - uses: dtolnay/rust-toolchain@1.86.0
      - uses: Swatinem/rust-cache@v2

      - name: ETL tests (no TLS)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: |
          export DATABASE_URL="$BASE_DATABASE_URL?ssl-mode=disabled"
          cargo test --features runtime-tokio,compression,etl -- test_etl --ignored --nocapture
        env:
          BASE_DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true
          
      - name: ETL tests (NativeTLS)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: |
          export DATABASE_URL="$BASE_DATABASE_URL?ssl-mode=required"
          cargo test --features runtime-tokio,compression,etl,tls-native-tls -- test_etl --ignored --nocapture
        env:
          BASE_DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true
          
      - name: ETL tests (Rustls)
        timeout-minutes: ${{ fromJSON(env.TESTS_TIMEOUT) }}
        run: |
          export DATABASE_URL="$BASE_DATABASE_URL?ssl-mode=required"
          cargo test --features runtime-tokio,compression,etl,tls-rustls-aws-lc-rs -- test_etl --ignored --nocapture
        env:
          BASE_DATABASE_URL: ${{ steps.exa-cluster.outputs.url }}
          SQLX_OFFLINE: true