← All databases

Database · MySQL wire

MatrixOne into Apache Arrow with ADBC

MatrixOne 4.2 (MySQL 8.0.30 wire), 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

Linux✓ pass

PASS

macOS arm64✓ pass

PASS (MatrixOne, MySQL wire 8.0.30)

Windows x64✓ pass

PASS (MatrixOne v4.2.0, MySQL wire 8.0.30; MySQL Connector/ODBC 26.7.1 + NO_SSPS=1) — with MySQL Connector/ODBC 26.7.1 the astral check passes; through 8.4.0 (the earlier Windows measurement) the same entry FAILED at that check only: héllo 🚀 stored byte-exact, read back as héllo ??? on every read path including pyodbc, because 8.4.0 substitutes ? for a non-BMP character before either C type sees it (SQL_C_CHAR and SQL_C_WCHAR both return 3f 3f 3f; CHARSET= makes no difference)

Driver and connection string

ODBC driver
MySQL Connector/ODBC 9.4 (MySQL wire)
Wire
MySQL wire
adbcBridge
0.1.1 (release)

The connection string the matrix used, as the connection strings reference records it (MySQL 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=16001;User=dump;Password=111;{plugin_dir}{no_ssps}

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=16001;User=dump;Password=111;")
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 MatrixOne 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

mysql_native_password only, so run from the tarball the connector needs PLUGIN_DIR=; server side: a table without a PRIMARY KEY gets a hidden __mo_fake_pk_col that SQLColumns reports in GetObjects; a parameter array bound into a BIT column aborts the server once it holds NULLs (malloc(): unaligned fastbin chunk detected; single parameters and NULL-free arrays are fine), so ingest sends booleans as TINYINT — fixed on MatrixOne main by matrixorigin/matrixone#27645 (2026-08-26): on the 2026-08-28 nightly a bound NULL stores as NULL and the same 999-set array runs clean, so the mapping is for the released 4.2.0; driver quirk handled: MatrixOne describes a TEXT column as SQL_WLONGVARCHAR one third of its widest value's byte length wide (5 characters for the benchmark's 16-byte strings, 0 for an empty result set), so binding at that width truncates every row; a no-declared-length column is bound at long_bind_bytes instead of re-reading every row (2.05M rows/s in the fix's own measurement).

What this stack needed

Native ADBC driver, compared

MatrixOne speaks the MySQL wire protocol, so the ADBC Driver Foundry's native MySQL ADBC driver (0.6.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:

PathResultFirst 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 MatrixOne; the full table for all 28 wire-compatible databases, with each first error, is in the note.

Read next