Runtime and driver support
Current status
Section titled “Current status”This matrix is the canonical evidence authority. Support labels are scoped to the exact database/driver/profile/runtime/capability tuple recorded here, including its revision and workflow evidence. A neighboring version or package installation is not certification. Final exact-SHA Runtime, Docs, and Release gates and explicit release authorization remain separate requirements.
Evidence labels
Section titled “Evidence labels”- Official — exact executable evidence covers the named database, driver, profile, runtime, and capability tuple.
- Conditional — 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 exercised the combination; it does not prove the current tree.
- Compatible — public APIs may work, but no exact certified target is claimed.
- Custom — user-provided
QueryExecutororConnectionProvider. - Unsupported — the required SQLBraid capability is intentionally absent.
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: 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-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: 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-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 | Guaranteed |
| 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 is the evidence rendering, not a promise that every adapter has every 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.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/RenderedBulk before lease acquisition. Providers and
leases expose the same immutable binding adapter identity. Prepared shape means
logical result kind, canonical segments, dialect, and ordered hint/direction/
output metadata; physical placeholder spelling never changes shape.
db.session(callback) pins one physical provider lease and nested sessions reuse
it. db.tx(callback) uses that lease, or acquires one root lease; nested
transactions use savepoints when advertised. Explicit transaction options use
only the fixed isolation literals read-uncommitted, read-committed,
repeatable-read, and serializable, plus 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 preserves its reason. An active signal needs
a real adapter cancellation path; otherwise the operation rejects before I/O
with UnsupportedFeatureError, feature statement.cancel, and
BRAID_CANCEL_UNSUPPORTED. An unavailable session or transaction primitive
uses BRAID_SESSION_UNSUPPORTED or BRAID_TX_UNSUPPORTED respectively.
Oracle’s guarded oracle.connection-break condition is cooperative rather than
a prompt or timeout guarantee: its documented DBMS_SESSION.SLEEP raw probe
can reject with ORA-01013 only when the sleep completes, and the adapter holds
the physical lease through settlement.
Driver/runtime boundaries
Section titled “Driver/runtime boundaries”First-party roots cover PostgreSQL, MySQL, MariaDB, SQLite, Oracle, and SQL
Server. Driver subpaths own the protocol and 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 an explicit user-selected
dialect: "postgres" | "mysql" | "mariadb" | "sqlite"; it does not infer
SQL semantics from the connection. Bun 1.3.14 has active cancellation
unsupported (BRAID_CANCEL_UNSUPPORTED) and stream/routine carriers
unsupported. Its result.rows/result.command metadata is guarded by
bun-sql.result-kind-metadata; for MySQL/MariaDB, empty SELECT and
zero-affected DML/DDL fail with BRAID_RESULT_KIND_AMBIGUOUS only after
execution, because command is null and affectedRows is zero. Deno reuses
existing first-party adapters where their public driver API works; it does not
create a Deno dialect.
Missing stream, routine, output, hint, bulk, transaction, or cancellation support
must be explicit UnsupportedFeatureError failures. SQLBraid does not paginate
to fake streaming, guess routine carriers, ignore hints, create hidden
transactions, or promote an unverified tuple. D1’s managed SQLite version is
unreported; a local Worker binding check is not a version certification.
Exact numeric, JSON/temporal, and container behavior are independent evidence
boundaries. Exact database integers and decimals are canonical strings;
approximate IEEE values are numbers. Profile and codegen descriptors must match.
Metadata is positive open-world evidence: missing facts do not prove SQL invalid.
Bun 1.3.14 uses { bigint: true } for PostgreSQL/MySQL/MariaDB and
{ safeIntegers: true } for SQLite. Because it exposes no column metadata,
integral and integral-approximate Number rows are rejected as ambiguous;
PostgreSQL decimals are strings. MySQL/MariaDB DECIMAL and binary outputs share
an untyped byte carrier and reject; author CAST(... AS CHAR) or HEX(...).
SQLite native decimal is unsupported. MariaDB/SQLite JSON is text, while
PostgreSQL/MySQL native JSON can round nested numbers. Bun SQLite’s result kinds
are guarded by bun-sql.sqlite-result-parser: mixed-quote SQL literals can be
misclassified by Bun; bind JSON values instead. SQLBraid does not rewrite SQL.
Adding evidence
Section titled “Adding evidence”A support addition needs an exact version/profile tuple, executable real-engine coverage, machine-readable target conditions, and a fresh clean revision. The release decision also requires translation freshness, package/export checks, and an immutable release dry-run. Historical links and prose alone cannot promote a label. No npm/tag/Pages publication follows from this page.