Skip to content

Commit d7798ac

Browse files
committed
revert(mssql): use msodbcsql instead of freetds
This reverts commit 082a807. Resolve #763
1 parent d8786d1 commit d7798ac

File tree

5 files changed

+39
-50
lines changed

5 files changed

+39
-50
lines changed

.github/workflows/ibis-ci.yml

+6-9
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,13 @@ jobs:
5454
~/.cargo/git/db/
5555
wren-core-py/target/
5656
key: ${{ runner.os }}-cargo-${{ hashFiles('wren-core-py/Cargo.lock') }}
57-
- name: Install FreeTDS to be a ODBC driver
57+
- name: Install MS ODBC SQL driver
5858
run: |
59-
sudo apt-get update -y && sudo apt-get install -y unixodbc-dev freetds-dev tdsodbc
60-
cat << EOF > free.tds.ini
61-
[FreeTDS]
62-
Description = FreeTDS driver
63-
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
64-
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
65-
EOF
66-
sudo odbcinst -i -d -f free.tds.ini
59+
sudo apt-get update
60+
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
61+
curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
62+
sudo apt-get update
63+
sudo ACCEPT_EULA=Y apt-get -y install unixodbc-dev msodbcsql18
6764
- name: Install dependencies
6865
run: |
6966
just install

ibis-server/Dockerfile

+11-25
Original file line numberDiff line numberDiff line change
@@ -35,33 +35,19 @@ RUN just install-core $RUST_PROFILE
3535

3636
FROM python:3.11-slim-buster AS runtime
3737

38-
# libpq-dev is required for psycopg2
39-
# unixodbc-dev, freetds-dev and tdsodbc are required for pyodbc
40-
RUN apt-get update \
41-
&& apt-get -y install libpq-dev \
42-
&& apt-get -y install unixodbc-dev freetds-dev tdsodbc \
43-
&& rm -rf /var/lib/apt/lists/*
38+
# Add microsoft package list
39+
RUN apt-get update \
40+
&& apt-get install -y curl gnupg \
41+
&& curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc \
42+
&& curl https://packages.microsoft.com/config/debian/11/prod.list | tee /etc/apt/sources.list.d/mssql-release.list \
43+
&& apt-get update
4444

45-
ARG TARGETPLATFORM
45+
# Install msodbcsql 18 driver for mssql
46+
RUN ACCEPT_EULA=Y apt-get -y install unixodbc-dev msodbcsql18
4647

47-
# Install FreeTDS driver
48-
RUN <<EOT
49-
if [ "$TARGETPLATFORM" = "linux/amd64" ]; then
50-
export FREE_TDS_PATH=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so;
51-
elif [ "$TARGETPLATFORM" = "linux/arm64" ]; then
52-
export FREE_TDS_PATH=/usr/lib/aarch64-linux-gnu/odbc/libtdsodbc.so;
53-
else \
54-
echo "Unsupported platform: $TARGETPLATFORM"; exit 1;
55-
fi && \
56-
echo "FREE_TDS_PATH is set to $FREE_TDS_PATH"
57-
cat <<EOF > free.tds.ini
58-
[FreeTDS]
59-
Description = FreeTDS driver
60-
Driver = ${FREE_TDS_PATH}
61-
Setup = ${FREE_TDS_PATH}
62-
EOF
63-
odbcinst -i -d -f free.tds.ini
64-
EOT
48+
# libpq-dev is required for psycopg2
49+
RUN apt-get -y install libpq-dev \
50+
&& rm -rf /var/lib/apt/lists/*
6551

6652
ENV VIRTUAL_ENV=/app/.venv \
6753
PATH="/app/.venv/bin:$PATH" \

ibis-server/app/model/__init__.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,7 @@ class MSSqlConnectionInfo(BaseModel):
8282
database: SecretStr
8383
user: SecretStr
8484
password: SecretStr
85-
driver: str = Field(
86-
default="FreeTDS",
87-
description="On Mac and Linux this is usually `FreeTDS. On Windows, it is usually `ODBC Driver 18 for SQL Server`",
88-
)
85+
driver: str = Field(default="ODBC Driver 18 for SQL Server")
8986
tds_version: str = Field(default="8.0", alias="TDS_Version")
9087
kwargs: dict[str, str] | None = Field(
9188
description="Additional keyword arguments to pass to PyODBC", default=None

ibis-server/docs/development.md

+17-11
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,21 @@ Please see [How to Add a New Data Source](how-to-add-data-source.md) for more in
5959

6060

6161
## Troubleshooting
62-
### MS SQL Server Tests
63-
If you're having trouble running tests related to MS SQL Server, you may need to install the appropriate driver. For Linux or macOS, we recommend installing the `unixodbc` and `freetds` packages.
64-
After installation, run `odbcinst -j` to check the path of the `odbcinst.ini` file. Then, find the path of `libtdsodbc.so` in freetds and add the following content to the odbcinst.ini file:
65-
```ini
66-
[FreeTDS]
67-
Description = FreeTDS driver
68-
Driver = /opt/homebrew/Cellar/freetds/1.4.17/lib/libtdsodbc.so
69-
Setup = /opt/homebrew/Cellar/freetds/1.4.17/lib/libtdsodbc.so
70-
FileUsage = 1
62+
### No driver for MS SQL Server
63+
If you want to run tests related to MS SQL Server, you may need to install the `Microsoft ODBC 18 driver`. \
64+
You can follow the instructions to install the driver:
65+
- [Microsoft ODBC driver for SQL Server (Linux)](https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server).
66+
- [Microsoft ODBC driver for SQL Server (macOS)](https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/install-microsoft-odbc-driver-sql-server-macos).
67+
- [Microsoft ODBC driver for SQL Server (Windows)](https://learn.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server).
68+
69+
### [ODBC Driver 18 for SQL Server]SSL Provider: [error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:self signed certificate]
70+
If you encounter this error, you can add the `TrustServerCertificate` parameter to the connection string.
71+
```json
72+
{
73+
"connectionInfo": {
74+
"kwargs": {
75+
"TrustServerCertificate": "YES"
76+
}
77+
}
78+
}
7179
```
72-
Adjust the paths as necessary for your system.
73-

ibis-server/tests/routers/v2/connector/test_mssql.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,9 @@ def mssql(request) -> SqlServerContainer:
7979
mssql = SqlServerContainer(
8080
"mcr.microsoft.com/mssql/server:2019-CU27-ubuntu-20.04", dialect="mssql+pyodbc"
8181
).start()
82-
engine = sqlalchemy.create_engine(f"{mssql.get_connection_url()}?driver=FreeTDS")
82+
engine = sqlalchemy.create_engine(
83+
f"{mssql.get_connection_url()}?driver=ODBC+Driver+18+for+SQL+Server&TrustServerCertificate=YES"
84+
)
8385
pd.read_parquet(file_path("resource/tpch/data/orders.parquet")).to_sql(
8486
"orders", engine, index=False
8587
)
@@ -382,6 +384,7 @@ def _to_connection_info(mssql: SqlServerContainer):
382384
"user": mssql.username,
383385
"password": mssql.password,
384386
"database": mssql.dbname,
387+
"kwargs": {"TrustServerCertificate": "YES"},
385388
}
386389

387390
def _to_connection_url(mssql: SqlServerContainer):

0 commit comments

Comments
 (0)