Skip to content

Runtime and driver support

This matrix is the authoritative source. Each support label applies only to the exact tuple of database, driver, profile, runtime and capability that is recorded here, with its tested versions.

  • Official — exact executable evidence covers the named tuple of database, driver, profile, runtime and capability.
  • Conditional — the evidence applies only under the named condition.
  • Pending — the candidate has no fresh successful gate for the current implementation revision.
  • Historical — an older exact revision tested the combination. It does not prove the current tree.
  • Compatible — the public APIs can work, but no exact certified target is claimed.
  • Custom — a QueryExecutor or ConnectionProvider that the user supplies.
  • Unsupported — the required SQLBraid capability is absent on purpose.
SQLBraid support targets (static/print summary)
TargetDatabaseDriverRuntimeSupport statusExact numericJSONTemporalTransactionStreaming
better-sqlite3-node-22-18-0sqlite better-sqlite3 bundled SQLitebetter-sqlite3@13.0.3node@22.18.0Compatiblestring · lossless · better-sqlite3-exact-string / string · unsupported · better-sqlite3-exact-string——Transactions: Guaranteed; Savepoints: Guaranteed—
bun-sql-mariadbmariadb 11.8.9 communitybun-sql@1.3.14bun@1.3.14Officialstring · guarded · bun-sql-mariadb-1.3.14 / string · unsupported · bun-sql-mariadb-1.3.14Unsupported / GuaranteedGuarded (Native Date convenience does not preserve fractional precision or zone identity) / UnsupportedTransactions: Guaranteed; Savepoints: Guaranteed; Read-only transactions: Unsupported; Read uncommitted isolation: Guarded (Only native isolation and read-only mappings verified for this backend); Read committed isolation: Guarded (Only native isolation and read-only mappings verified for this backend); Repeatable read isolation: Guarded (Only native isolation and read-only mappings verified for this backend); Serializable isolation: Guarded (Only native isolation and read-only mappings verified for this backend)Unsupported
bun-sql-mysqlmysql 8.4.2 communitybun-sql@1.3.14bun@1.3.14Officialstring · guarded · bun-sql-mysql-1.3.14 / string · unsupported · bun-sql-mysql-1.3.14Guarded (Native parsed JSON is not a lossless numeric representation) / UnsupportedGuarded (Native Date convenience does not preserve fractional precision or zone identity) / UnsupportedTransactions: Guaranteed; Savepoints: Guaranteed; Read-only transactions: Unsupported; Read uncommitted isolation: Guarded (Only native isolation and read-only mappings verified for this backend); Read committed isolation: Guarded (Only native isolation and read-only mappings verified for this backend); Repeatable read isolation: Guarded (Only native isolation and read-only mappings verified for this backend); Serializable isolation: Guarded (Only native isolation and read-only mappings verified for this backend)Unsupported
bun-sql-postgrespostgres 16.4 alpinebun-sql@1.3.14bun@1.3.14Officialstring · guarded · bun-sql-postgres-1.3.14 / string · lossless · bun-sql-postgres-1.3.14Guarded (Native parsed JSON is not a lossless numeric representation) / UnsupportedGuarded (Native Date convenience does not preserve fractional precision or zone identity) / UnsupportedTransactions: Guaranteed; Savepoints: Guaranteed; Read-only transactions: Guarded (Only native isolation and read-only mappings verified for this backend); Read uncommitted isolation: Guarded (Only native isolation and read-only mappings verified for this backend); Read committed isolation: Guarded (Only native isolation and read-only mappings verified for this backend); Repeatable read isolation: Guarded (Only native isolation and read-only mappings verified for this backend); Serializable isolation: Guarded (Only native isolation and read-only mappings verified for this backend)Unsupported
bun-sql-sqlitesqlite 3.53.0 bun-embeddedbun-sql@1.3.14bun@1.3.14Officialstring · guarded · bun-sql-sqlite-1.3.14 / string · unsupported · bun-sql-sqlite-1.3.14Unsupported / GuaranteedUnsupported / GuaranteedTransactions: Guaranteed; Savepoints: Guaranteed; Read-only transactions: Unsupported; Read uncommitted isolation: Unsupported; Read committed isolation: Unsupported; Repeatable read isolation: Unsupported; Serializable isolation: GuaranteedUnsupported
d1-cloudflare-workerd-2026-07-30sqlite Cloudflare D1 managed SQLite (version unreported)cloudflare-d1@1.20260730.1workerd@1.20260730.1Compatiblestring · guarded · d1-guarded-safe-integer / string · unsupported · d1-guarded-safe-integerGuaranteedGuaranteedRead-only transactions: Unsupported; Read uncommitted isolation: Unsupported; Read committed isolation: Unsupported; Repeatable read isolation: Unsupported; Serializable isolation: Unsupported; Transactions: Unsupported; Savepoints: UnsupportedUnsupported
libsql-local-node-22-18-0sqlite libSQL local SQLitelibsql@0.18.0node@22.18.0Compatiblestring · lossless · libsql-exact-string / string · unsupported · libsql-exact-string——Transactions: Guaranteed; Savepoints: Guaranteed—
mariadb-connector-node-11-8-9mariadb 11.8.9 communitymariadb@3.5.4node@22.18.0Officialstring · guarded · mariadb-lossless-text / string · guarded · mariadb-lossless-textGuaranteedGuaranteedRead-only transactions: Guaranteed; Read uncommitted isolation: Guaranteed; Read committed isolation: Guaranteed; Repeatable read isolation: Guaranteed; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: GuaranteedGuaranteed
mssql-tedious-developer-node-2022-cu18mssql 2022-CU18 Developertedious@20.0.0node@22.18.0Officialstring · guarded · mssql-tedious / string · unsupported · mssql-tediousGuaranteedGuarded (SQL Server temporal text cast path)Read-only transactions: Unsupported; Read uncommitted isolation: Guaranteed; Read committed isolation: Guaranteed; Repeatable read isolation: Guaranteed; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: GuaranteedGuaranteed
mysql-mysql2-deno-2-9-3mysql 8.4.2 communitymysql2@3.24.4deno@2.9.3Officialstring · guarded · mysql2-lossless-text / string · lossless · mysql2-lossless-textGuaranteedGuaranteedRead-only transactions: Guaranteed; Read uncommitted isolation: Guaranteed; Read committed isolation: Guaranteed; Repeatable read isolation: Guaranteed; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: GuaranteedGuaranteed
mysql-mysql2-node-8-4-2mysql 8.4.2 communitymysql2@3.24.4node@22.18.0Officialstring · guarded · mysql2-lossless-text / string · lossless · mysql2-lossless-textGuaranteedGuaranteedRead-only transactions: Guaranteed; Read uncommitted isolation: Guaranteed; Read committed isolation: Guaranteed; Repeatable read isolation: Guaranteed; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: GuaranteedGuaranteed
oracle-oracledb-thin-node-23-9oracle 23.9 Freenode-oracledb@7.0.1node@22.18.0Officialstring · unsupported · oracle-thin / string · lossless · oracle-thinGuaranteed / Guarded (Oracle JSON_SERIALIZE text path)Guarded (Oracle Date millisecond precision) / Guarded (Oracle temporal text cast path)Read-only transactions: Guaranteed; Read uncommitted isolation: Unsupported; Read committed isolation: Guaranteed; Repeatable read isolation: Unsupported; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: GuaranteedGuaranteed
postgres-currentpostgres 18.6 alpinepg@8.23.0node@22.18.0Officialstring · lossless · pg-lossless-text / string · lossless · pg-lossless-textGuaranteedGuaranteed——
postgres-pg-deno-2-9-3postgres 16.4 alpinepg@8.23.0deno@2.9.3Officialstring · lossless · pg-lossless-text / string · lossless · pg-lossless-textGuaranteedGuaranteedRead-only transactions: Guaranteed; Read uncommitted isolation: Guarded (PostgreSQL READ UNCOMMITTED uses READ COMMITTED semantics); Read committed isolation: Guaranteed; Repeatable read isolation: Guaranteed; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: GuaranteedGuaranteed
postgres-pg-node-16-4postgres 16.4 alpinepg@8.23.0node@22.18.0Officialstring · lossless · pg-lossless-text / string · lossless · pg-lossless-textGuaranteedGuaranteedRead-only transactions: Guaranteed; Read uncommitted isolation: Guarded (PostgreSQL READ UNCOMMITTED uses READ COMMITTED semantics); Read committed isolation: Guaranteed; Repeatable read isolation: Guaranteed; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: GuaranteedGuaranteed
sqlite-node-sqlite-deno-2-9-3sqlite 3.53.2 Deno bundled SQLitenode-sqlite@2.9.3deno@2.9.3Officialstring · lossless · sqlite-exact-string / string · unsupported · sqlite-exact-stringGuaranteedGuaranteedRead-only transactions: Unsupported; Read uncommitted isolation: Unsupported; Read committed isolation: Unsupported; Repeatable read isolation: Unsupported; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: GuaranteedUnsupported
sqlite-wasm-browser-3-53-4sqlite 3.53.4 official SQLite WASM OO1sqlite-wasm@3.53.4-build1browser@153.0.8010.12Officialstring · lossless · sqlite-wasm-exact-string / string · unsupported · sqlite-wasm-exact-stringGuaranteedGuaranteedRead-only transactions: Unsupported; Read uncommitted isolation: Unsupported; Read committed isolation: Unsupported; Repeatable read isolation: Unsupported; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: GuaranteedGuaranteed
sqlite-node-sqlite-node-22-18-0sqlite 3.50.2 Node bundled SQLitenode-sqlite@22.18.0node@22.18.0Officialstring · lossless · sqlite-exact-string / string · unsupported · sqlite-exact-stringGuaranteedGuaranteedRead-only transactions: Unsupported; Read uncommitted isolation: Unsupported; Read committed isolation: Unsupported; Repeatable read isolation: Unsupported; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: GuaranteedGuaranteed

The matrix is generated from machine-readable support targets and capability conditions. It shows the evidence. It does not promise that each adapter has each operation.

Dialect, driver, runtime, host, database version, representation profile and capability are separate axes. The canonical capability identifiers are:

sql.native-transparency sql.generated-structure
result.rows result.command
result.multiple-sets result.standard-schema
numeric.exact-integer numeric.exact-decimal
numeric.approximate-float numeric.approximate-special
numeric.bind-exact numeric.aggregate
numeric.command-metadata numeric.special-values
numeric.scale-greater-than-precision
numeric.negative-scale
data.json-parsed data.json-lossless-text
data.sql-variant data.oracle-object
data.oracle-collection data.vector
data.binary data.uuid
data.temporal-native data.temporal-lossless
data.timezone
metadata.command-safe
dml.insert-returning dml.update-returning
dml.delete-returning dml.merge-returning
dml.upsert-returning
session.pinned
statement.prepare statement.cancel
statement.stream statement.bulk
execution.bulk-fidelity
transaction transaction.savepoint
transaction.read-only
transaction.isolation.read-uncommitted
transaction.isolation.read-committed
transaction.isolation.repeatable-read
transaction.isolation.serializable
routine.call routine.out
routine.inout routine.result-sets
routine.out-cursor routine.return-value
metadata.identity metadata.generated
metadata.routines metadata.types

Do not add obsolete aliases such as execution.prepared, execution.stream, routine.resultsets or routine.return-status.

statementBinding.describe() and describeBulk() validate the logical RenderedStatement or RenderedBulk before lease acquisition. Providers and leases expose the same immutable identity of the binding adapter. The prepared shape is the logical result kind, the canonical segments, the dialect and the ordered hint, direction and output metadata. The physical placeholder spelling never changes the shape.

db.session(callback) pins one physical provider lease. Nested sessions use the same lease. db.tx(callback) uses that lease, or acquires one root lease. When supported, nested transactions use savepoints.

Explicit transaction options use only the fixed isolation literals read-uncommitted, read-committed, repeatable-read and serializable, and readOnly.

  • Malformed runtime options fail before acquisition with TypeError / BRAID_TX_OPTIONS_INVALID.
  • A valid but unsupported option uses UnsupportedFeatureError / BRAID_TX_OPTION_UNSUPPORTED.
  • Nested explicit options use BRAID_TX_OPTIONS_NESTED.

An already-aborted AbortSignal keeps its reason. An active signal needs a real cancellation path in the adapter. If not, the operation rejects before I/O with UnsupportedFeatureError, the feature statement.cancel and BRAID_CANCEL_UNSUPPORTED. An unavailable session primitive uses BRAID_SESSION_UNSUPPORTED. An unavailable transaction primitive uses BRAID_TX_UNSUPPORTED.

The guarded Oracle condition oracle.connection-break is cooperative. It does not guarantee a prompt stop or a timeout. Its documented DBMS_SESSION.SLEEP raw probe can reject with ORA-01013 only when the sleep completes. The adapter holds the physical lease until settlement.

The first-party roots cover PostgreSQL, MySQL, MariaDB, SQLite, Oracle and SQL Server. The driver subpaths own the protocol and the cleanup behavior: pg, mysql2, MariaDB Connector/Node.js, node:sqlite, SQLite WASM, D1, node-oracledb Thin and Tedious.

Bun uses one SQL adapter family with a user-selected dialect: "postgres" | "mysql" | "mariadb" | "sqlite". It does not infer SQL semantics from the connection.

  • In Bun 1.3.14, active cancellation is unsupported (BRAID_CANCEL_UNSUPPORTED). Stream and routine carriers are unsupported.
  • Its result.rows and result.command metadata is guarded by bun-sql.result-kind-metadata. For MySQL and MariaDB, an empty SELECT and DML or DDL that affects zero rows fail with BRAID_RESULT_KIND_AMBIGUOUS only after execution, because command is null and affectedRows is zero.

Deno uses the existing first-party adapters where their public driver API is compatible.

Missing stream, routine, output, hint, bulk, transaction or cancellation support must be an explicit UnsupportedFeatureError failure. SQLBraid does not do these things:

  • paginate to fake streaming;
  • guess routine carriers;
  • ignore hints;
  • create hidden transactions;
  • promote an unverified tuple.

The managed SQLite version of D1 is not reported. A local Worker binding check is not a version certification.

Each driver profile defines the numeric, JSON, temporal and container behavior. Exact database integers and decimals are canonical strings. Approximate IEEE values are numbers. The profile and codegen descriptors must match.

Database metadata gives positive evidence. A missing metadata entry does not always mean that the SQL is invalid.

Bun 1.3.14 uses { bigint: true } for PostgreSQL, MySQL and MariaDB, and { safeIntegers: true } for SQLite.

  • Bun exposes no column metadata. Thus, integral Number rows and integral approximate Number rows are rejected as ambiguous.
  • PostgreSQL decimals are strings.
  • MySQL and MariaDB DECIMAL and binary outputs share an untyped byte carrier and reject. Write CAST(... AS CHAR) or HEX(...) in your SQL.
  • SQLite native decimal is unsupported.
  • MariaDB and SQLite JSON is text. PostgreSQL and MySQL native JSON can round nested numbers.
  • The result kinds of Bun SQLite are guarded by bun-sql.sqlite-result-parser. Bun can misclassify SQL literals with mixed quotes. Bind JSON values instead. SQLBraid does not rewrite SQL.

A support addition needs an exact version and profile tuple, coverage on a real engine and machine-readable target conditions. Historical links and prose alone cannot prove the current tree.