By Prateek Singh, maintainer of adbcBridge. An ecosystem and integration note: every issue, timestamp and number below is public. Facts as of 2026-09-21.
The short version
In August a new client stack started exercising ArcadeDB’s PostgreSQL wire protocol: Apache Arrow’s ADBC API, through adbcBridge and the standard PostgreSQL ODBC driver, and separately through Arrow’s own native PostgreSQL driver.
Over three weeks that testing found four gaps in the protocol implementation. ArcadeDB fixed the first in four and a half hours, the second in nine days, merged an external fix for the third the day it arrived, and opened the fourth on its own tracker with a root cause on the same day it was raised.
The wire protocol held up. Where it did not, the response was the story.
The four findings
1. The Arrow native PostgreSQL ADBC driver could not connect (#7178). That driver bootstraps its type table with a query against pg_catalog.pg_type, and ArcadeDB answered it with zero columns. Raised as a follow-up in discussion #6888; the maintainers opened the issue themselves at 22:11 UTC on 2026-09-05 and closed it, fixed, at 02:48 UTC on 2026-09-06. Four hours and thirty-seven minutes.
2. COPY (query) TO STDOUT was not supported (#7188). The native Arrow driver reads every result through binary COPY by default, so after the first fix it connected and then stopped at the first result set. Opened 2026-09-06, implemented in text and binary form and closed 2026-09-15. With that, Arrow’s own PostgreSQL driver reads ArcadeDB main with default options.
3. Transaction-control statements answered with a row description (#7815). On the simple-query path, BEGIN, COMMIT, ROLLBACK and the savepoint statements were sent with an empty RowDescription before CommandComplete, so libpq reported a result set where it expected a command status. psql printed an empty table after BEGIN, and clients that start with autocommit off could not open a transaction at all. Sent as a pull request from the adbcBridge side on 2026-09-17, reviewed and merged the same day by a maintainer, who added a follow-up commit of his own.
4. A datetime literal with a space separator and a fraction is stored as NULL (#8090). '2024-02-29 13:45:10.123456' is the form psqlodbc renders a bound timestamp in. The space alone parses, the fraction alone parses, both together fail to parse, and a blanket exception handler in the type converter turns the value into NULL while the INSERT reports success. Recorded on the adbcBridge side as an observed behaviour; the ArcadeDB team reproduced it on main, traced the root cause and opened the issue with a reproducer and a two-part fix proposal on 2026-09-21, the day it came up.
Why a client stack was pushing on the wire protocol
ADBC is Apache Arrow’s database connectivity API: one interface, columnar results, one driver per database. Most databases have no native ADBC driver, and ArcadeDB is one of them.
adbcBridge (adbcbridge.org, Apache-2.0) implements ADBC on top of any ODBC driver, so a database with an ODBC driver becomes reachable from pandas, Polars, DuckDB, Rust, .NET, Java and Go through Arrow. ArcadeDB has no ODBC driver either, and does not need one: its PostgreSQL protocol plugin lets the standard PostgreSQL ODBC driver, psqlodbc, connect. adbcBridge drives psqlodbc; psqlodbc drives ArcadeDB.
That is the route that has passed adbcBridge’s compatibility checks on Linux, macOS and Windows since August. The second route, Arrow’s own PostgreSQL ADBC driver straight to ArcadeDB, is what findings 1 and 2 unblocked. Both of them lean on the same thing: a client-server ArcadeDB speaking a protocol that other people’s tools already know how to speak.
What it looks like from Python
import adbcbridge, pandas
conn = adbcbridge.connect(
uri="Driver={psqlodbcw.so};Server=127.0.0.1;Port=5432;"
"Database=mydb;Uid=root;Pwd=...;BoolsAsChar=0;")
df = pandas.read_sql("SELECT * FROM Product WHERE price > 10", conn)
The same connection string works from Rust, C#, Java and Go through each language’s ADBC binding.
Driver= names the psqlodbc library as installed on Linux and macOS; on Windows the driver is registered as PostgreSQL Unicode(x64). BoolsAsChar=0 is a psqlodbc setting, not an ArcadeDB one: without it the ODBC driver reports every BOOLEAN as a five-character string.
Where it stands
Compatibility. ArcadeDB through psqlodbc is a passing read-only entry in adbcBridge’s matrix on Linux, macOS (Apple Silicon) and Windows. The timestamp behaviour in #8090 and the boolean fix from #6674 were re-verified on 26.9.1 on 2026-09-21 on Linux and macOS. The entry covers queries, parameters and catalog calls.

It is read-only by design: ArcadeDB has no CREATE TABLE, its DDL is CREATE DOCUMENT TYPE plus one CREATE PROPERTY per column, so the table-creating bulk-ingest path does not apply.
Two Arrow routes. adbcBridge over psqlodbc works against any released ArcadeDB. Arrow’s native PostgreSQL driver works against main after #7178 and #7188, with default options.
Every fix went upstream. None of the four findings is worked around on the client side. Each was fixed or filed in ArcadeDB, so every PostgreSQL client benefits, not only Arrow users.
Throughput, with the method
ArcadeDB 26.9 (PostgreSQL wire) through psqlodbc 16, in a 1 GB Docker container on the same laptop (Intel Core i9-13900HK, 14 cores / 20 threads, 31 GiB, Linux Mint 22.3, unixODBC 2.3.12). One table (id int32, val float64, txt utf8, dt date32); SELECT id, val, txt, dt of 100,000 rows drained into each language’s own Arrow record batches through adbcBridge; native delegation off, so every row travels over ODBC; median of 3 timings after a warmup, one database per run.
There is no ingest figure: ArcadeDB has no CREATE TABLE over the wire.
| Language (ADBC binding) | Fetch, rows/s |
|---|---|
| Python | 397,502 |
| Rust | 327,191 |
| C# | 355,848 |
| Java | 332,503 |
| Go | 417,419 |

The five land between 327,000 and 417,000 rows/s, close enough to say what matters: the driver behaves the same whichever language loads it, and the differences are the bindings’ own.
Servers run locally, so the numbers reflect the ODBC driver plus the database rather than a network, and they move with whatever else is running on the host; read them as ratios, not absolutes. If you want numbers measured the way a database vendor measures them, ArcadeDB publishes its own on the benchmarks page; these are a client-stack measurement and answer a different question.
Harness: bench/langbench.sh. Published rows: bench/LANGUAGE_BENCHMARKS.md. The ArcadeDB fixture is the arcadedb service in tests/compat/docker-compose.yml.
Links
The two ArcadeDB notes on adbcbridge.org: ArcadeDB fixed the pg_type bootstrap within a day and A timestamp that stores NULL and says it worked, and a boolean note that went stale, which carries the 26.9.1 retest and the bound-parameter case.
The compatibility matrix: adbcbridge.org. The repository: github.com/singhpratech/adbcbridge; questions and defects go to its issues.
Published with the author’s permission. The findings above were reported through ArcadeDB’s public issue tracker, and #7815 was contributed as a pull request by the adbcBridge project.