Runtime and driver support
Current status
Section titled “Current status”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.
Evidence labels
Section titled “Evidence labels”- 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
QueryExecutororConnectionProviderthat the user supplies. - Unsupported — the required SQLBraid capability is absent on purpose.
Current matrix
Section titled “Current matrix”| Target | Database | Driver | Runtime | Support status | Exact numeric | JSON | Temporal | Transaction | Streaming |
|---|---|---|---|---|---|---|---|---|---|
| better-sqlite3-node-22-18-0 | sqlite better-sqlite3 bundled SQLite | better-sqlite3@13.0.3 | node@22.18.0 | Compatible | string · lossless · better-sqlite3-exact-string / string · unsupported · better-sqlite3-exact-string | — | — | Transactions: Guaranteed; Savepoints: Guaranteed | — |
| bun-sql-mariadb | mariadb 11.8.9 community | bun-sql@1.3.14 | bun@1.3.14 | Official | string · guarded · bun-sql-mariadb-1.3.14 / string · unsupported · bun-sql-mariadb-1.3.14 | Unsupported / Guaranteed | Guarded (Native Date convenience does not preserve fractional precision or zone identity) / Unsupported | Transactions: 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-mysql | mysql 8.4.2 community | bun-sql@1.3.14 | bun@1.3.14 | Official | string · guarded · bun-sql-mysql-1.3.14 / string · unsupported · bun-sql-mysql-1.3.14 | Guarded (Native parsed JSON is not a lossless numeric representation) / Unsupported | Guarded (Native Date convenience does not preserve fractional precision or zone identity) / Unsupported | Transactions: 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-postgres | postgres 16.4 alpine | bun-sql@1.3.14 | bun@1.3.14 | Official | string · guarded · bun-sql-postgres-1.3.14 / string · lossless · bun-sql-postgres-1.3.14 | Guarded (Native parsed JSON is not a lossless numeric representation) / Unsupported | Guarded (Native Date convenience does not preserve fractional precision or zone identity) / Unsupported | Transactions: 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-sqlite | sqlite 3.53.0 bun-embedded | bun-sql@1.3.14 | bun@1.3.14 | Official | string · guarded · bun-sql-sqlite-1.3.14 / string · unsupported · bun-sql-sqlite-1.3.14 | Unsupported / Guaranteed | Unsupported / Guaranteed | Transactions: Guaranteed; Savepoints: Guaranteed; Read-only transactions: Unsupported; Read uncommitted isolation: Unsupported; Read committed isolation: Unsupported; Repeatable read isolation: Unsupported; Serializable isolation: Guaranteed | Unsupported |
| d1-cloudflare-workerd-2026-07-30 | sqlite Cloudflare D1 managed SQLite (version unreported) | cloudflare-d1@1.20260730.1 | workerd@1.20260730.1 | Compatible | string · guarded · d1-guarded-safe-integer / string · unsupported · d1-guarded-safe-integer | Guaranteed | Guaranteed | Read-only transactions: Unsupported; Read uncommitted isolation: Unsupported; Read committed isolation: Unsupported; Repeatable read isolation: Unsupported; Serializable isolation: Unsupported; Transactions: Unsupported; Savepoints: Unsupported | Unsupported |
| libsql-local-node-22-18-0 | sqlite libSQL local SQLite | libsql@0.18.0 | node@22.18.0 | Compatible | string · lossless · libsql-exact-string / string · unsupported · libsql-exact-string | — | — | Transactions: Guaranteed; Savepoints: Guaranteed | — |
| mariadb-connector-node-11-8-9 | mariadb 11.8.9 community | mariadb@3.5.4 | node@22.18.0 | Official | string · guarded · mariadb-lossless-text / string · guarded · mariadb-lossless-text | Guaranteed | Guaranteed | Read-only transactions: Guaranteed; Read uncommitted isolation: Guaranteed; Read committed isolation: Guaranteed; Repeatable read isolation: Guaranteed; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: Guaranteed | Guaranteed |
| mssql-tedious-developer-node-2022-cu18 | mssql 2022-CU18 Developer | tedious@20.0.0 | node@22.18.0 | Official | string · guarded · mssql-tedious / string · unsupported · mssql-tedious | Guaranteed | Guarded (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: Guaranteed | Guaranteed |
| mysql-mysql2-deno-2-9-3 | mysql 8.4.2 community | mysql2@3.24.4 | deno@2.9.3 | Official | string · guarded · mysql2-lossless-text / string · lossless · mysql2-lossless-text | Guaranteed | Guaranteed | Read-only transactions: Guaranteed; Read uncommitted isolation: Guaranteed; Read committed isolation: Guaranteed; Repeatable read isolation: Guaranteed; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: Guaranteed | Guaranteed |
| mysql-mysql2-node-8-4-2 | mysql 8.4.2 community | mysql2@3.24.4 | node@22.18.0 | Official | string · guarded · mysql2-lossless-text / string · lossless · mysql2-lossless-text | Guaranteed | Guaranteed | Read-only transactions: Guaranteed; Read uncommitted isolation: Guaranteed; Read committed isolation: Guaranteed; Repeatable read isolation: Guaranteed; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: Guaranteed | Guaranteed |
| oracle-oracledb-thin-node-23-9 | oracle 23.9 Free | node-oracledb@7.0.1 | node@22.18.0 | Official | string · unsupported · oracle-thin / string · lossless · oracle-thin | Guaranteed / 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: Guaranteed | Guaranteed |
| postgres-current | postgres 18.6 alpine | pg@8.23.0 | node@22.18.0 | Official | string · lossless · pg-lossless-text / string · lossless · pg-lossless-text | Guaranteed | Guaranteed | — | — |
| postgres-pg-deno-2-9-3 | postgres 16.4 alpine | pg@8.23.0 | deno@2.9.3 | Official | string · lossless · pg-lossless-text / string · lossless · pg-lossless-text | Guaranteed | Guaranteed | Read-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: Guaranteed | Guaranteed |
| postgres-pg-node-16-4 | postgres 16.4 alpine | pg@8.23.0 | node@22.18.0 | Official | string · lossless · pg-lossless-text / string · lossless · pg-lossless-text | Guaranteed | Guaranteed | Read-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: Guaranteed | Guaranteed |
| sqlite-node-sqlite-deno-2-9-3 | sqlite 3.53.2 Deno bundled SQLite | node-sqlite@2.9.3 | deno@2.9.3 | Official | string · lossless · sqlite-exact-string / string · unsupported · sqlite-exact-string | Guaranteed | Guaranteed | Read-only transactions: Unsupported; Read uncommitted isolation: Unsupported; Read committed isolation: Unsupported; Repeatable read isolation: Unsupported; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: Guaranteed | Unsupported |
| sqlite-wasm-browser-3-53-4 | sqlite 3.53.4 official SQLite WASM OO1 | sqlite-wasm@3.53.4-build1 | browser@153.0.8010.12 | Official | string · lossless · sqlite-wasm-exact-string / string · unsupported · sqlite-wasm-exact-string | Guaranteed | Guaranteed | Read-only transactions: Unsupported; Read uncommitted isolation: Unsupported; Read committed isolation: Unsupported; Repeatable read isolation: Unsupported; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: Guaranteed | Guaranteed |
| sqlite-node-sqlite-node-22-18-0 | sqlite 3.50.2 Node bundled SQLite | node-sqlite@22.18.0 | node@22.18.0 | Official | string · lossless · sqlite-exact-string / string · unsupported · sqlite-exact-string | Guaranteed | Guaranteed | Read-only transactions: Unsupported; Read uncommitted isolation: Unsupported; Read committed isolation: Unsupported; Repeatable read isolation: Unsupported; Serializable isolation: Guaranteed; Transactions: Guaranteed; Savepoints: Guaranteed | Guaranteed |
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.
Capability vocabulary
Section titled “Capability vocabulary”Dialect, driver, runtime, host, database version, representation profile and capability are separate axes. The canonical capability identifiers are:
sql.native-transparency sql.generated-structureresult.rows result.commandresult.multiple-sets result.standard-schemanumeric.exact-integer numeric.exact-decimalnumeric.approximate-float numeric.approximate-specialnumeric.bind-exact numeric.aggregatenumeric.command-metadata numeric.special-valuesnumeric.scale-greater-than-precisionnumeric.negative-scaledata.json-parsed data.json-lossless-textdata.sql-variant data.oracle-objectdata.oracle-collection data.vectordata.binary data.uuiddata.temporal-native data.temporal-losslessdata.timezonemetadata.command-safedml.insert-returning dml.update-returningdml.delete-returning dml.merge-returningdml.upsert-returningsession.pinnedstatement.prepare statement.cancelstatement.stream statement.bulkexecution.bulk-fidelitytransaction transaction.savepointtransaction.read-onlytransaction.isolation.read-uncommittedtransaction.isolation.read-committedtransaction.isolation.repeatable-readtransaction.isolation.serializableroutine.call routine.outroutine.inout routine.result-setsroutine.out-cursor routine.return-valuemetadata.identity metadata.generatedmetadata.routines metadata.typesDo 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.
Driver/runtime boundaries
Section titled “Driver/runtime boundaries”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.rowsandresult.commandmetadata is guarded bybun-sql.result-kind-metadata. For MySQL and MariaDB, an emptySELECTand DML or DDL that affects zero rows fail withBRAID_RESULT_KIND_AMBIGUOUSonly after execution, becausecommandis null andaffectedRowsis 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
Numberrows and integral approximateNumberrows 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)orHEX(...)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.
Adding evidence
Section titled “Adding evidence”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.