# CrateDB into Apache Arrow through ADBC: the native PostgreSQL ADBC driver vs the ODBC route, measured

**URL:** <https://community.cratedb.com/t/cratedb-into-apache-arrow-through-adbc-the-native-postgresql-adbc-driver-vs-the-odbc-route-measured/2155>\
**Category:** CrateDB\
**Created:** [September 8, 2026, 7:09am UTC](https://community.cratedb.com/t/cratedb-into-apache-arrow-through-adbc-the-native-postgresql-adbc-driver-vs-the-odbc-route-measured/2155 "2026-09-08T07:09:50Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![singhpratech](https://sea2.discourse-cdn.com/flex020/user_avatar/community.cratedb.com/singhpratech/32/1500_2.png) [@singhpratech](https://community.cratedb.com/u/singhpratech)\
**Post date:** [September 8, 2026, 7:09am UTC](https://community.cratedb.com/t/cratedb-into-apache-arrow-through-adbc-the-native-postgresql-adbc-driver-vs-the-odbc-route-measured/2155/1 "2026-09-08T07:09:50Z")

</div>

CrateDB speaks the PostgreSQL wire protocol, so there are two ways to get its results into Arrow record batches through ADBC (Arrow Database Connectivity): the Apache Arrow project’s native PostgreSQL ADBC driver, or adbcBridge, an ADBC driver that wraps an ODBC driver, here psqlodbc. On 2026-09-05 I ran one seven-step workload through both against CrateDB 6.4: connect, SELECT 1, an eight-column CREATE TABLE plus two INSERTs and a read, a 1,000-row bulk ingest, table schema, catalog listing, and a read of the ingested table.

Native PostgreSQL ADBC driver 1.12.0: connects, then stops at SELECT 1 with “could not begin COPY: ERROR: line 1:6: no viable alternative at input ‘COPY (’”. The driver reads every result through COPY … TO STDOUT (FORMAT binary), which CrateDB does not have. Its ingest also creates the table with a date column, which CrateDB rejects (“Type `date` does not support storage”); the ODBC route maps date to timestamp for that reason.  
adbcBridge over psqlodbc: all seven steps pass, with the REFRESH TABLE step before the count check that CrateDB’s per-second refresh needs.

One thing for anyone using adbcBridge 0.1.0 with adbc-driver-postgresql also installed: its default auto-delegation handed CrateDB connections to the native driver, which then failed as above. Set adbc.odbc.delegate=never on 0.1.0; 0.1.1 probes the native driver first and falls back to ODBC on its own.

Verified matrix entry, and the full native-vs-ODBC table for all 28 PostgreSQL-wire and MySQL-wire databases with each first error: [Where the native PostgreSQL and MySQL ADBC drivers stop on wire-compatible databases — adbcBridge notes](https://adbcbridge.org/notes/native-adbc-drivers-on-wire-compatible-databases/)
