fix(odbc): improve error handling in column collection and statement … #434
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: SQLx | |
| on: | |
| pull_request: | |
| push: | |
| branches: | |
| - main | |
| jobs: | |
| format: | |
| name: Format | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - run: cargo fmt --all -- --check | |
| check: | |
| name: Check | |
| runs-on: ubuntu-24.04 | |
| strategy: | |
| matrix: | |
| runtime: [async-std, tokio] | |
| tls: [native-tls, rustls] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| prefix-key: v1-sqlx | |
| save-if: ${{ false }} | |
| - name: Run clippy for core with all features | |
| run: | | |
| cargo clippy --manifest-path sqlx-core/Cargo.toml \ | |
| --no-default-features \ | |
| --features offline,all-databases,all-types,migrate,runtime-${{ matrix.runtime }}-${{ matrix.tls }} \ | |
| -- -D warnings | |
| - name: Run clippy for root with all features | |
| run: | | |
| cargo clippy \ | |
| --no-default-features \ | |
| --features offline,all-databases,all-types,migrate,runtime-${{ matrix.runtime }}-${{ matrix.tls }},macros \ | |
| -- -D warnings | |
| - name: Run clippy for all targets | |
| run: | | |
| cargo clippy \ | |
| --no-default-features \ | |
| --all-targets \ | |
| --features offline,all-databases,all-types,migrate,runtime-${{ matrix.runtime }}-${{ matrix.tls }} \ | |
| -- -D warnings | |
| test: | |
| name: Unit Test ${{ matrix.os }} | |
| strategy: | |
| matrix: | |
| os: [ubuntu-latest, windows-latest] | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| prefix-key: v1-sqlx | |
| save-if: ${{ false }} | |
| - run: sudo apt-get update && sudo apt-get install -y libodbc2 unixodbc-dev | |
| if: ${{ matrix.os == 'ubuntu-latest' }} | |
| - run: cargo test | |
| --manifest-path sqlx-core/Cargo.toml | |
| --features offline,all-databases,all-types,runtime-tokio-rustls | |
| cli: | |
| name: CLI Binaries | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| matrix: | |
| os: [ubuntu-latest, windows-latest] #, macOS-latest] | |
| include: | |
| - os: ubuntu-latest | |
| target: x86_64-unknown-linux-musl | |
| args: --features openssl-vendored | |
| bin: target/debug/cargo-sqlx | |
| - os: windows-latest | |
| target: x86_64-pc-windows-msvc | |
| bin: target/debug/cargo-sqlx.exe | |
| # FIXME: macOS build fails because of missing pin-project-internal | |
| # - os: macOS-latest | |
| # target: x86_64-apple-darwin | |
| # bin: target/debug/cargo-sqlx | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| prefix-key: v1-sqlx | |
| save-if: ${{ github.ref == 'refs/heads/main' }} | |
| - run: cargo build | |
| --manifest-path sqlx-cli/Cargo.toml | |
| --bin cargo-sqlx | |
| ${{ matrix.args }} | |
| - uses: actions/upload-artifact@v4 | |
| with: | |
| name: cargo-sqlx-${{ matrix.target }} | |
| path: ${{ matrix.bin }} | |
| sqlite: | |
| name: SQLite | |
| runs-on: ubuntu-24.04 | |
| strategy: | |
| matrix: | |
| runtime: [async-std, tokio, actix] | |
| tls: [native-tls, rustls] | |
| needs: check | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - run: mkdir /tmp/sqlite3-lib && wget -O /tmp/sqlite3-lib/ipaddr.so https://github.com/nalgeon/sqlean/releases/download/0.15.2/ipaddr.so | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| prefix-key: v1-sqlx | |
| shared-key: sqlite-${{ matrix.runtime }}-${{ matrix.tls }} | |
| save-if: ${{ github.ref == 'refs/heads/main' && matrix.runtime == 'tokio' && matrix.tls == 'native-tls' }} | |
| - name: Run clippy for sqlite | |
| run: | | |
| cargo clippy \ | |
| --no-default-features \ | |
| --features sqlite,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }},macros,migrate \ | |
| -- -D warnings | |
| - run: cargo test | |
| --no-default-features | |
| --features any,macros,migrate,sqlite,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }} | |
| env: | |
| DATABASE_URL: sqlite://tests/sqlite/sqlite.db | |
| RUSTFLAGS: --cfg sqlite_ipaddr | |
| LD_LIBRARY_PATH: /tmp/sqlite3-lib | |
| postgres: | |
| name: Postgres | |
| runs-on: ubuntu-24.04 | |
| strategy: | |
| matrix: | |
| postgres: [14, 10] | |
| runtime: [async-std, tokio, actix] | |
| tls: [native-tls, rustls] | |
| needs: check | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| prefix-key: v1-sqlx | |
| shared-key: postgres-${{ matrix.runtime }}-${{ matrix.tls }} | |
| save-if: ${{ github.ref == 'refs/heads/main' && matrix.postgres == '14' }} | |
| - run: | | |
| cargo build --features postgres,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }} | |
| env: | |
| # FIXME: needed to disable `ltree` tests in Postgres 9.6 | |
| # but `PgLTree` should just fall back to text format | |
| RUSTFLAGS: --cfg postgres_${{ matrix.postgres }} | |
| - name: Run clippy for postgres | |
| run: | | |
| cargo clippy \ | |
| --no-default-features \ | |
| --features postgres,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }},macros,migrate \ | |
| -- -D warnings | |
| env: | |
| RUSTFLAGS: --cfg postgres_${{ matrix.postgres }} | |
| - run: | | |
| docker compose -f tests/docker-compose.yml run -d -p 5432:5432 --name postgres_${{ matrix.postgres }} postgres_${{ matrix.postgres }} | |
| docker exec postgres_${{ matrix.postgres }} bash -c "until pg_isready; do sleep 1; done" | |
| - run: | | |
| cargo test --no-default-features --features any,postgres,macros,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }} | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/sqlx | |
| # FIXME: needed to disable `ltree` tests in Postgres 9.6 | |
| # but `PgLTree` should just fall back to text format | |
| RUSTFLAGS: --cfg postgres_${{ matrix.postgres }} | |
| - run: | | |
| cargo test --no-default-features --features any,postgres,macros,migrate,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }} | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/sqlx?sslmode=verify-ca&sslrootcert=./tests/certs/ca.crt | |
| # FIXME: needed to disable `ltree` tests in Postgres 9.6 | |
| # but `PgLTree` should just fall back to text format | |
| RUSTFLAGS: --cfg postgres_${{ matrix.postgres }} | |
| postgres_ssl_client_cert: | |
| name: Postgres with SSL client cert | |
| runs-on: ubuntu-24.04 | |
| needs: check | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| prefix-key: v1-sqlx | |
| shared-key: postgres-actix-rustls | |
| save-if: ${{ false }} | |
| - run: docker compose up --wait postgres_16 | |
| working-directory: tests | |
| - run: cargo test --no-default-features --features any,postgres,macros,all-types,runtime-actix-rustls | |
| env: | |
| DATABASE_URL: postgres://postgres@localhost:5432/sqlx?sslmode=verify-ca&sslrootcert=./tests/certs/ca.crt&sslcert=./tests/certs/client.crt&sslkey=./tests/keys/client.key | |
| mysql: | |
| name: MySQL | |
| runs-on: ubuntu-24.04 | |
| strategy: | |
| matrix: | |
| mysql: [8, 5_7] | |
| runtime: [async-std, tokio, actix] | |
| tls: [native-tls, rustls] | |
| needs: check | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| prefix-key: v1-sqlx | |
| shared-key: mysql-${{ matrix.runtime }}-${{ matrix.tls }} | |
| save-if: ${{ github.ref == 'refs/heads/main' && matrix.mysql == '8' }} | |
| - run: | | |
| cargo build --features mysql,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }} | |
| - name: Run clippy for mysql | |
| run: | | |
| cargo clippy \ | |
| --no-default-features \ | |
| --features mysql,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }},macros,migrate \ | |
| -- -D warnings | |
| - run: docker compose -f tests/docker-compose.yml run -d -p 3306:3306 mysql_${{ matrix.mysql }} | |
| - run: sleep 60 | |
| - run: | | |
| cargo test --no-default-features --features any,mysql,macros,migrate,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }} | |
| env: | |
| DATABASE_URL: mysql://root:password@localhost:3306/sqlx?ssl-mode=disabled | |
| # MySQL 5.7 supports TLS but not TLSv1.3 as required by RusTLS. | |
| - run: | | |
| cargo test --no-default-features --features any,mysql,macros,migrate,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }} | |
| if: ${{ !(matrix.mysql == '5_7' && matrix.tls == 'rustls') }} | |
| env: | |
| DATABASE_URL: mysql://root:password@localhost:3306/sqlx | |
| mariadb: | |
| name: MariaDB | |
| runs-on: ubuntu-24.04 | |
| strategy: | |
| matrix: | |
| mariadb: [10_6, 10_3] | |
| runtime: [async-std, tokio, actix] | |
| tls: [native-tls, rustls] | |
| needs: check | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| prefix-key: v1-sqlx | |
| shared-key: mariadb-${{ matrix.runtime }}-${{ matrix.tls }} | |
| save-if: ${{ github.ref == 'refs/heads/main' && matrix.mariadb == '10_6' }} | |
| - run: | | |
| cargo build --features mysql,runtime-${{ matrix.runtime }}-${{ matrix.tls }} | |
| - name: Run clippy for mariadb | |
| run: | | |
| cargo clippy \ | |
| --no-default-features \ | |
| --features mysql,runtime-${{ matrix.runtime }}-${{ matrix.tls }},macros,migrate \ | |
| -- -D warnings | |
| - run: docker compose -f tests/docker-compose.yml run -d -p 3306:3306 mariadb_${{ matrix.mariadb }} | |
| - run: sleep 30 | |
| - run: | | |
| cargo test --no-default-features --features any,mysql,macros,migrate,runtime-${{ matrix.runtime }}-${{ matrix.tls }} | |
| env: | |
| DATABASE_URL: mysql://root:password@localhost:3306/sqlx | |
| mssql: | |
| name: MSSQL | |
| runs-on: ubuntu-24.04 | |
| strategy: | |
| matrix: | |
| mssql: [2019, 2022] | |
| runtime: [async-std, tokio, actix] | |
| tls: [native-tls, rustls] | |
| needs: check | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| prefix-key: v1-sqlx | |
| shared-key: mssql-${{ matrix.runtime }}-${{ matrix.tls }} | |
| save-if: ${{ github.ref == 'refs/heads/main' && matrix.mssql == '2022' }} | |
| - run: | | |
| cargo build --features mssql,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }} | |
| - name: Run clippy for mssql | |
| run: | | |
| cargo clippy \ | |
| --no-default-features \ | |
| --features mssql,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }},macros,migrate \ | |
| -- -D warnings | |
| - run: docker compose -f tests/docker-compose.yml run -d -p 1433:1433 mssql_${{ matrix.mssql }} | |
| - run: sleep 80 # MSSQL takes a "bit" to startup | |
| - run: | | |
| cargo test --no-default-features --features any,mssql,macros,migrate,all-types,runtime-${{ matrix.runtime }}-${{ matrix.tls }} | |
| env: | |
| DATABASE_URL: mssql://sa:Password123!@localhost/sqlx | |
| odbc: | |
| name: ODBC (PostgreSQL and SQLite) | |
| runs-on: ubuntu-24.04 | |
| needs: check | |
| timeout-minutes: 15 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| prefix-key: v1-sqlx | |
| shared-key: odbc | |
| save-if: ${{ github.ref == 'refs/heads/main' }} | |
| - name: Start Postgres (no SSL) | |
| run: | | |
| docker compose -f tests/docker-compose.yml run -d -p 5432:5432 --name postgres_16_no_ssl postgres_16_no_ssl | |
| docker exec postgres_16_no_ssl bash -c "until pg_isready; do sleep 1; done" | |
| - name: Install unixODBC and ODBC drivers (PostgreSQL, SQLite) | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y unixodbc odbcinst unixodbc-common libodbcinst2 odbc-postgresql libsqliteodbc libodbc2 unixodbc-dev | |
| odbcinst -j | |
| - name: Configure system/user DSN for PostgreSQL | |
| run: | | |
| cp tests/odbc.ini ~/.odbc.ini | |
| odbcinst -q -s || true | |
| echo "select 1;" | isql -v SQLX_PG_5432 || true | |
| - name: Run ODBC tests (PostgreSQL DSN) | |
| run: cargo test --no-default-features --features any,odbc,macros,all-types,runtime-tokio-rustls | |
| env: | |
| DATABASE_URL: DSN=SQLX_PG_5432;UID=postgres;PWD=password | |
| - name: Run ODBC tests (SQLite driver) | |
| run: cargo test --no-default-features --features any,odbc,macros,all-types,runtime-tokio-rustls | |
| env: | |
| DATABASE_URL: Driver={SQLite3};Database=./tests/odbc/sqlite.db |