ArcadeDB into Apache Arrow with ADBC
ArcadeDB 26.9 (PostgreSQL wire), read and written through adbcBridge — the ADBC driver that loads the database's ODBC driver — read-only on Linux, macOS arm64 and Windows x64. Everything below is the compatibility matrix's record for this row.
Status
PASS
PASS (ArcadeDB, PostgreSQL wire 12.0.0; read-only fixture)
PASS (ArcadeDB, PostgreSQL wire 12.0.0; psqlodbc 18.00.0002; read-only fixture)
Driver and connection string
- ODBC driver
- psqlodbc 16 (PG wire)
- Wire
- PostgreSQL wire
- adbcBridge
- 0.1.3 (release)
The connection string the matrix used, as the connection strings reference records it (PostgreSQL wire); {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=15441;Database=adbc;Uid=root;Pwd=Adbc2026;BoolsAsChar=0;
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=15441;Database=adbc;Uid=root;Pwd=Adbc2026;BoolsAsChar=0;")
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 ArcadeDB 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
multi-model engine behind the PG wire: no CREATE TABLE at all (a table is a document type plus one CREATE PROPERTY per column), so adbc_ingest's generated DDL has nowhere to go and the entry runs the read side — queries, parameters and the catalog all work; driver quirks handled: psqlodbc's SQLColumns and SQLTables(SQL_ALL_TABLE_TYPES) are queries its parser will not run -- SQLColumns answers SQL_SUCCESS with zero rows, SQLTables(SQL_ALL_TABLE_TYPES) answers SQL_ERROR -- so GetObjects describes a zero-row SELECT and GetTableTypes falls back to the types the server's own tables have; BoolsAsChar=0, ISO-8601 T timestamp literals, @rid/@type/@cat in every SELECT *; also traverses a small graph (vertices, edges, expand(out())); fetch 332k rows/s.
What this stack needed
- ArcadeDB published an account of this integration and the four protocol findings behind it on 2026-09-21: <https://arcadedb.com/blog/arcadedb-apache-arrow-adbc-postgresql-wire/>.
- The
T-literal requirement is a 26.9.1 trait only: the silentNULLbehind it, #8090, is fixed in #8096 (merged 2026-09-22, ships in 26.10.1), and on26.10.1-SNAPSHOTthe space-and-fraction literal and a bound timestamp parameter both round-trip, verified here 2026-09-22. - Native-driver status, for comparison: the Apache Arrow PostgreSQL ADBC driver (1.12.0) could not connect at all until ArcadeDB fixed its
pg_typebootstrap (#7178, opened and merged by the maintainer within a day of the probe note, 2026-09-06; ships in 26.10.1, in26.10.1-SNAPSHOTnow); on the merged build it connects and lists types, stops atCOPY … TO STDOUT (FORMAT binary)with its defaults, and withadbc.postgresql.use_copy=falsereads the fixture end to end;GetTableSchema's::regclasslookup, the last catalog gap, is fixed in #7187 (merged 2026-09-06, also in 26.10.1); binaryCOPYitself, #7188, was implemented in #7398 and its framing matched to PostgreSQL's in #7607 (2026-09-15), so on26.10.1-SNAPSHOTthe native driver passes the whole probe with its defaults; on the released 26.9.1 the ODBC route above is the one that works
Read next
- Five defects from the sweep, sent upstream as fixes instead of reports
- psqlodbc hands a timestamptz over in session time, and the offset is gone
- ArcadeDB fixed the pg_type bootstrap within a day, verified on the merged build
- Where the native PostgreSQL and MySQL ADBC drivers stop on wire-compatible databases
- A timestamp that stores NULL and says it worked, and a boolean note that went stale
- Where PostgreSQL-wire servers part company with PostgreSQL
- Two psqlodbc bugs that lost rows and narrowed integers, and two traps