Apache Cloudberry into Apache Arrow with ADBC
Apache Cloudberry 2.1.0-incubating (Greenplum fork), read and written through adbcBridge — the ADBC driver that loads the database's ODBC driver — verified on Linux, macOS arm64 and Windows x64. Everything below is the compatibility matrix's record for this row.
Status
PASS
PASS (Apache Cloudberry, PostgreSQL wire 14.4; amd64 emulated)
PASS (Apache Cloudberry 2.1.0-incubating, PostgreSQL wire 14.4.0; compose service unchanged, 3 GB / shm 1 GB)
Driver and connection string
- ODBC driver
- psqlodbc 16 (PG wire)
- Wire
- PostgreSQL wire
- adbcBridge
- 0.1.1 (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=15443;Database=adbc;Uid=gpadmin;Pwd=adbc;
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=15443;Database=adbc;Uid=gpadmin;Pwd=adbc;")
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 Apache Cloudberry 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
no driver quirks and no tolerance flags: an MPP cluster of PostgreSQL 14 segments behind one coordinator, driven by the postgres entry's types unchanged (and, unlike CockroachDB, needing no PRIMARY KEY) — and since it reports SQL_DBMS_NAME "PostgreSQL" behind the same psqlodbcw.so, no driver-name quirk *could* be correct here without also firing on real PostgreSQL.
What this stack needed
- Cloudberry is named once in the bridge and not as a workaround:
version()carriesApache Cloudberry, a fork marker, so it is excluded from theunnestarray-ingest form only PostgreSQL proper is claimed to owe (see the array-ingest note above) — conservative rather than necessary, since the form's own proof query passes and a 5,000-rowunnestingest lands on heap, append-optimized row and append-optimized column tables alike, about an order of magnitude faster server-side than the multi-rowINSERTit keeps (~530k against ~33k rows/s, bare SQL on a shared host); no Apache-published *server* image exists --apache/incubator-cloudberryholds onlycbdb-build-*/cbdb-test-*CI toolchains andapache/cloudberry-dbdoes not exist -- so the communitywoblerr/cloudberryimage is used, and it needs--shm-size=1gorgpinitsystemfails;extrasteps cover what the standard workload cannot tell apart frompostgres: aDISTRIBUTED BYtable whose bulk-ingested rows occupy more than one segment plus an aggregate merged on the coordinator, and append-optimized column-oriented storage (read frompg_amasao_column-- Greenplum 6'srelstorageis gone in the PostgreSQL 14-based 2.x); ingest 9.7k rows/s (9.8k with array binding), fetch 1.33M rows/s
Native ADBC driver, compared
Apache Cloudberry speaks the PostgreSQL wire protocol, so Apache Arrow's native PostgreSQL ADBC driver (adbc-driver-postgresql 1.12.0) can be pointed at it too. On 2026-09-05 the same seven-step ADBC workload (connect, SELECT 1, DDL and inserts and a read, a 1,000-row adbc_ingest, table schema, catalog listing, read back) ran through both:
| Path | Result | First error |
|---|---|---|
| Native ADBC driver | ✓ all seven steps | |
| adbcBridge over ODBC | ✓ all seven steps |
Where the native driver stops it is by design of that driver, not a defect of Apache Cloudberry; the full table for all 28 wire-compatible databases, with each first error, is in the note.