Vertica into Apache Arrow with ADBC
Vertica 25.3 (OpenText Analytics Database), read and written through adbcBridge — the ADBC driver that loads the database's ODBC driver — verified on Linux and Windows x64. Everything below is the compatibility matrix's record for this row.
Status
PASS
driver unavailable: vertica.com's macOS download is vsql only, no ODBC
PASS (Vertica Database (via ODBC) 25.03.0000, opentext/vertica-k8s:25.3.0-8-minimal bootstrapped with fixtures/setup_vertica.sh; Vertica client 25.1.0 MSI, driver name Vertica — the 25.3 client URL 404s and 25.1 drives the 25.3 server). Windows note: run the vcluster create_db step from PowerShell, not Git Bash (path conversion mangles /opt/vertica/bin/vcluster), and --password "" must be passed as an empty argument — PowerShell 5.1 drops it, leaving dbadmin with a non-empty password to reset
Driver and connection string
- ODBC driver
- Vertica ODBC 25.1 (
libverticaodbc.so, native wire) - Wire
- native ODBC
- adbcBridge
- 0.1.1 (release)
The connection string the matrix used, as the connection strings reference records it (Databases with their own native protocol and ODBC driver); {drv} is the driver library or its name from odbcinst.ini, and the host, port and credentials are the test server's.
Driver={drv};Server=127.0.0.1;Port=15433;Database=VMart;UID=dbadmin;PWD=;
Python
import adbcbridge
# {drv}: the ODBC driver library (path), or its name from odbcinst.ini
conn = adbcbridge.connect(uri="Driver={drv};Server=127.0.0.1;Port=15433;Database=VMart;UID=dbadmin;PWD=;")
with conn.cursor() as cur:
cur.execute("SELECT * FROM my_table")
table = cur.fetch_arrow_table() # pyarrow.Table
Polars and pandas
import polars as pl, pandas as pd
df = pl.read_database("SELECT * FROM my_table", connection=conn) # Polars, Arrow-native
pdf = pd.read_sql("SELECT * FROM my_table", conn) # pandas 2.2+, ADBC connection
pip install adbcbridge brings the driver library; the Vertica ODBC driver is installed the way its vendor documents, then named in Driver=. Rust, Go, C# and Java use the same connection string through their ADBC driver managers — see the docs.
What the matrix recorded
first-party driver on 5433 — the port speaks the PostgreSQL v3 wire (libpq connects, server_version 14.0) but the PostgreSQL catalogs are absent, so psqlodbc fails at its connect-time pg_type lookup (Relation "pg_type" does not exist) and cannot drive it.
What this stack needed
- Needs no tolerance flags at all (as Cloudberry does not): every workload type is a native Vertica type and the workload round-trips exactly, emoji and microseconds included (
iis int64 — Vertica's integer types are all 64-bit aliases). fis exact because 1.5 is: the driver passesDOUBLE PRECISIONthrough a 15-significant-digit decimal form in both directions (%1.15einlibverticaodbc.so,SQLDescribeColsize 15), so a bound3.141592653589793is stored as3.14159265358979.- The entry points
VERTICAINIat avertica.iniof its own for the driver's message catalogue (ErrorMessagesPath; without it every driver diagnostic degrades to[Vertica][DSI] ... Could not open error message files, though the workload still passes) and pinsDriverManagerEncoding = UTF-16— client 25.1 detects unixODBC's 2-byteSQLWCHARby itself, butUTF-32there corrupts every wide string in both directions with no error (six U+FFFD) and can abort the process. - One quirk: its parameter arrays are a native bulk load (
COPY ... FROM LOCAL STDIN NATIVE) and beat the one-row-per-execute path 7-8× (17-20k rows/s → 135-139k), soprefer_param_arrays— the flagmaodbcalready uses. - Multi-row
VALUESis refused on this fixture (Function public.explode("array") does not exist:vcluster create_db --skip-package-installleaves theComplexTypespackage out); with the package installed it parses and runs at ~2.5k rows/s, a column store taking each multi-rowVALUESas one row-store insert, so the array path stays ahead either way. - Server side,
vertica/vertica-ceno longer exists (theverticaDocker Hub namespace is empty and theopentextone publishes no CE image), so the entry runsopentext/vertica-k8sand builds the database withvclusteritself (fixtures/setup_vertica.sh); pinned to 25.3 because Vertica 26.1 dropped Community Edition and a 26.x server refuses the licence its own image ships; needsnofile65536; ingest 151k rows/s (array binding), fetch 948k rows/s