Arrow Flight SQL

A wire protocol for data systems that uses Apache Arrow. See the specification.

client API

The API that an application uses to interact with a database. May abstract over the underlying wire protocol and other details. For example, ADBC, JDBC, ODBC.


In ADBC, the connection object/struct represents a single connection to a database. Multiple connections may be created from one database.


In ADBC, the database object/struct holds state that is shared across connections.


Loosely speaking, a library that implements a client API using a wire protocol. For example, the ADBC PostgreSQL driver exposes the ADBC client API and interacts with a PostgreSQL database via the PostgreSQL wire protocol. The JDBC PostgreSQL driver uses the same wire protocol, but exposes the JDBC client API instead.

driver manager

A library that helps manage multiple drivers for a given client API. For example, the JDBC driver manager can find a appropriate driver implementation for a database URI.

The ADBC driver manager in each language is similar. In C/C++, it can dynamically load drivers so that applications do not have to directly link to them. (Since all drivers expose the same API, their symbols would collide otherwise.) In Python, it loads drivers and provides Python bindings on top.


In ADBC, the statement object/struct holds state for executing a single query. The query itself, bind parameters, result sets, and so on are all tied to the statement. Multiple statements may be created from one connection (though not all drivers will support this).


Substrait describes itself as a “cross-language serialization for relational algebra”. It operates in a similar space as SQL, but is lower-level. You’re unlikely to write a Substrait query by hand, but may use tools that opt to generate Substrait instead of SQL for more predictable semantics.

wire protocol

The actual way a database driver connects to a database, issues commands, gets results, and so forth. For example, Arrow Flight SQL, the PostgreSQL wire protocol, or Tabular Data Stream (Microsoft SQL Server). Generally, an application is not going to implement and use this directly, but instead use something higher-level, like an ADBC, JDBC, or ODBC driver.