FindOptions produce correct SQL for whichever engine you point at.SQL_DIALECTS.length in src/dialect-names.ts), one page each, plusdialect; the table after it gives the| Use case | Recommended | Also consider | What the code gives you |
|---|---|---|---|
| OLTP application | PostgreSQL | MySQL, MariaDB, SQL Server, Oracle | Atomic transactions with savepoints, row locks with SKIP LOCKED and NOWAIT, a native upsert, and RETURNING (OUTPUT INSERTED on SQL Server). PostgreSQL has the most WHERE operators (62). |
| Analytics / warehouse | Snowflake, BigQuery | ClickHouse, Redshift, Databricks, DuckDB locally | MERGE upserts (ClickHouse: a plain INSERT) and window functions. lock is ignored on Snowflake, Redshift and ClickHouse and refused on BigQuery. BigQuery and ClickHouse have no multi-statement transactions. |
| Edge / serverless | Cloudflare D1 | Turso, Neon, RDS Data API | No socket and no pool. On D1 and rqlite transaction() is not atomic, and requireAtomic refuses them. |
| Embedded | SQLite | DuckDB for analytics | No server to run. SQLite has savepoints and ON CONFLICT but no row locks, and lock is ignored. |
| Distributed SQL | CockroachDB | YugabyteDB, TiDB, Spanner, Citus, Vitess, Aurora DSQL | Most speak PostgreSQL's or MySQL's grammar over a sharded store; Spanner has its own GoogleSQL and no savepoints. Aurora DSQL refuses SKIP LOCKED and NOWAIT. |
| Time series | TimescaleDB | QuestDB | TimescaleDB is PostgreSQL, so it has all of the above. QuestDB has no savepoints and no row locks, and its upsert is a plain INSERT. |
| Streaming | Materialize | RisingWave | Native materialized views. There is no upsert (refused) and no savepoints. |
| Managed cloud | The managed dialect for your provider | See Managed and cloud variants | The engine's SQL, plus the provider's authentication (IAM, Entra ID, the Cloud SQL connector) and TLS defaults. |
rdspostgres, azuresql, cloudsqlmysql and thedialectFamily() (src/dialect-names.ts) puts it in. Each card names the npm driver the driver catalog records and the default port of the Quick start URL.pg: the engine itself, its forks and extensions, and the managed services.pg · port 5432pg · port 3050pg · port 26257pg · port 5433pg · port 5432pg · port 5432pg · port 5439 · hostedpg · port 5432pg · port 5433pg · port 8563pg · port 8080pg · port 5432pg · port 8812@aws-sdk/client-athena · hostedpg · port 6875pg · port 4566pg · port 5432pg · port 5432 · hosted@aws-sdk/dsql-signer · hostedpg · port 5432 · hostedpg · port 5432fetch) · port 8080pg · port 5432 · hostedpg · port 5432 · hosted@aws-sdk/client-rds-data · hosted@aws-sdk/client-redshift-data · hostedpg · port 5432 · hostedpg · hostedpg · hostedpgpg · port 5432pg · port 5432 · hostedpg · port 6543 · hostedmysql2 (MariaDB over mariadb): forks, distributed MySQL and the managed services.mysql2 · port 3306mariadb · port 3306mysql2 · port 4000mysql2 · port 3306mysql2 · port 2881mysql2 · port 3306 · hostedmysql2 · hostedmysql2 · port 9030mysql2 · port 9030mysql2 · port 15306mysql2 · port 3306mysql2 · port 3306 · hostedmysql2 · port 3306 · hostedmariadb · port 3306 · hostedmysql2 · port 3306 · hostedmysql2 · hostedmysql2 · port 3306 · hostedmssql/tedious: SQL Server, its Azure and AWS editions, the warehouses and Kusto.mssql · port 1433mssql · port 1433 · hostedmssql · hostedmssql · port 1433 · hostedmssql · port 1433 · hostedmssql · port 1433 · hostedfetch) · hostedmssql · hostedbetter-sqlite3@libsql/clientfetch)fetch) · port 4001oracledb · port 1521ibm_db · port 50000hdb@clickhouse/client · port 8123duckdbsnowflake-sdk · hosted@google-cloud/bigquery · hostedduckdbteradatasql · port 1025 · hostedmonetdb · port 50000fetch) · port 8888@google-cloud/spanneroracledb · port 1521 · hostedibm_db · port 50000 · hostedoracledb · hostedLIMIT ... OFFSET on PostgreSQL and MySQL, OFFSET ... FETCH
NEXT on MSSQL, Oracle and Snowflake. The dialect handles it, but theextends the base whose wire protocolDIALECT_LOADERS and walksObject.getPrototypeOf), not from prose.PostgresDialect directly: they speak PostgreSQL'spg driver (Athena and Presto swap the transport) andSQL_DIALECT_LINEAGE marks Teradata and MonetDB as standalone), anddialectOptions.engine.MariaDBDialect is its own class (driver mariadb), thoughMySQLDialect and uses mysql2SQLiteDialect in a Proxy rather than subclassing it.dialectFamily() in src/dialect-names.ts names the root of each dialect'sSQL_DIALECTS (77 entries) by the same script:new Prorm({ dialect }), which goesDIALECT_LOADERS, with every driver and cloud SDK mocked andquery() stubbed. It then reads the values below:prorm.transaction() starts at all. no means thestartTransaction() throws before anything is sent.capabilitiesOf(dialect) insrc/transaction-support.ts, which is the dialect's owntransactionCapabilities(). Isolation is the strongest ANSI level the≤ SER means every level up to SERIALIZABLE, and abuildInsertQuery('users', …, { returning:
['id'] }) and buildUpsertQuery('users', { id, name }, { conflictFields:
['id'] }) emit. not emitted means the option is accepted and dropped,findAll(): containment ({ meta: { [Op.contains]: { plan: 'pro' } } }){ meta: { [Op.json('$.plan')]: 'pro' } }). The cell— means both are refused withUnsupportedWhereError.findAll({ lock }) with true, { skipLocked: true }{ nowait: true }. A lock clause is emitted, ignored (theSELECT is sent without one), or refused.buildSelectQuery() with a rowNumber() attribute,cte entry, and a recursive: true entry, first with a column list andsqlObjectCapabilitiesOf(dialect)src/sql-objects/capabilities.ts. This is what createView,createStoredProcedure, createTrigger and createSequence emit or| Dialect | Tx | Savepoints | Atomic | Isolation | RETURNING | Upsert | JSON operators | Row locks | Window fns | CTEs | Views; materialized views | Routines | Triggers | Sequences |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| PostgreSQL | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Firebird | yes | yes | yes | ≤ SER | RETURNING | UPDATE OR INSERT | — | FOR UPDATE WITH LOCK only | yes | recursive | drop + create; no MV | — | — | — |
| CockroachDB | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| YugabyteDB | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| TimescaleDB | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Greenplum | yes | yes | yes | ≤ SER | RETURNING | staging table | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Amazon Redshift | yes | no | yes | ≤ SER | RETURNING | staging table | — | ignored | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| openGauss | yes | yes | yes | ≤ SER | RETURNING | ON DUPLICATE KEY | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | drop + create; no MV | — | — | — |
| Vertica | yes | yes | yes | ≤ SER | not emitted | MERGE | — | FOR UPDATE only | yes | recursive | drop + create; no MV | — | — | — |
| Exasol | yes | no | yes | ≤ SER | not emitted | MERGE | — | refused | yes | recursive | drop + create; no MV | — | — | — |
| Trino | yes | no | yes | ≤ SER | not emitted | MERGE | — | refused | yes | recursive | drop + create; no MV | — | — | — |
| CrateDB | yes | no | yes | ≤ SER | RETURNING | ON CONFLICT | — | refused | yes | recursive | drop + create; no MV | — | — | — |
| QuestDB | yes | no | yes | ≤ SER | not emitted | plain INSERT | — | refused | yes | recursive | drop + create; no MV | — | — | — |
| Amazon Athena | no | — | — | — | not emitted | refused | — | refused | yes | recursive | drop + create; no MV | — | — | — |
| Materialize | yes | no | yes | ≤ SER | RETURNING | refused | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | — | — | — |
| RisingWave | yes | no | yes | ≤ SER | RETURNING | refused | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | — | — | — |
| Citus | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| AlloyDB | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Aurora DSQL | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE only | yes | recursive | drop + create; no MV | — | — | — |
| Yellowbrick | yes | yes | yes | ≤ SER | refused | refused | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | drop + create; no MV | — | — | — |
| ParadeDB | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Presto | no | — | — | — | not emitted | MERGE | — | refused | yes | recursive | drop + create; no MV | — | — | — |
| Amazon RDS for PostgreSQL | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Amazon Aurora PostgreSQL | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Amazon Aurora (RDS Data API) | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | drop + create; no MV | — | — | — |
| Amazon Redshift (Data API) | yes | no | no | ≤ SER | RETURNING | staging table | — | ignored | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Azure Database for PostgreSQL | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Azure Cosmos DB for PostgreSQL | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Cloud SQL for PostgreSQL | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Spanner (PostgreSQL interface) | yes | no | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | drop + create; no MV | — | — | — |
| AlloyDB Omni | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Neon | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Supabase | yes | yes | yes | ≤ SER | RETURNING | ON CONFLICT | @>, #>> | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV native | procedures, functions | yes | yes |
| Dialect | Tx | Savepoints | Atomic | Isolation | RETURNING | Upsert | JSON operators | Row locks | Window fns | CTEs | Views; materialized views | Routines | Triggers | Sequences |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| MySQL | yes | yes | yes | ≤ SER | not emitted | ON DUPLICATE KEY | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | — |
| MariaDB | yes | yes | yes | ≤ SER | RETURNING | ON DUPLICATE KEY | JSON_CONTAINS, JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | yes |
| TiDB | yes | yes | yes | ≤ SER | not emitted | ON DUPLICATE KEY | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | — |
| SingleStore | yes | no | yes | ≤ SER | not emitted | ON DUPLICATE KEY | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | — |
| OceanBase | yes | yes | yes | ≤ SER | not emitted | ON DUPLICATE KEY | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | — |
| PolarDB for MySQL | yes | yes | yes | ≤ SER | not emitted | ON DUPLICATE KEY | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | — |
| Databricks | yes | yes | yes | ≤ SER | not emitted | MERGE | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | drop + create; no MV | — | — | — |
| Apache Doris | yes | no | yes | ≤ SER | refused | refused | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | drop + create; no MV | — | — | — |
| StarRocks | yes | no | yes | ≤ SER | refused | refused | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | drop + create; no MV | — | — | — |
| Vitess | yes | yes | yes | ≤ SER | not emitted | ON DUPLICATE KEY | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | drop + create; no MV | — | — | — |
| Dolt | yes | yes | yes | ≤ SER | not emitted | ON DUPLICATE KEY | JSON_EXTRACT | refused | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | — |
| Amazon RDS for MySQL | yes | yes | yes | ≤ SER | not emitted | ON DUPLICATE KEY | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | — |
| Amazon Aurora MySQL | yes | yes | yes | ≤ SER | not emitted | ON DUPLICATE KEY | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | — |
| Amazon RDS for MariaDB | yes | yes | yes | ≤ SER | RETURNING | ON DUPLICATE KEY | JSON_CONTAINS, JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | yes |
| Azure Database for MySQL | yes | yes | yes | ≤ SER | not emitted | ON DUPLICATE KEY | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | — |
| Cloud SQL for MySQL | yes | yes | yes | ≤ SER | not emitted | ON DUPLICATE KEY | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | — |
| MySQL HeatWave (OCI) | yes | yes | yes | ≤ SER | not emitted | ON DUPLICATE KEY | JSON_EXTRACT | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive | OR REPLACE; MV emulated (procedure) | procedures, functions | yes | — |
| Dialect | Tx | Savepoints | Atomic | Isolation | RETURNING | Upsert | JSON operators | Row locks | Window fns | CTEs | Views; materialized views | Routines | Triggers | Sequences |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Microsoft SQL Server | yes | yes | yes | ≤ SER + SNAPSHOT | OUTPUT INSERTED | MERGE | JSON_VALUE | table hints, READPAST, NOWAIT | yes | recursive | OR ALTER; MV emulated (indexedView) | procedures, functions | yes (row-level lowered) | yes |
| Azure Synapse Analytics | yes | no | yes | ≤ SER + SNAPSHOT | refused | MERGE | JSON_VALUE | refused | yes | non-recursive only | OR ALTER; MV emulated (indexedView) | procedures, functions | yes (row-level lowered) | yes |
| Microsoft Fabric Data Warehouse | yes | no | yes | ≤ SER + SNAPSHOT | refused | MERGE | JSON_VALUE | refused | yes | non-recursive only | OR ALTER; MV emulated (indexedView) | procedures, functions | yes (row-level lowered) | yes |
| Amazon RDS for SQL Server | yes | yes | yes | ≤ SER + SNAPSHOT | OUTPUT INSERTED | MERGE | JSON_VALUE | table hints, READPAST, NOWAIT | yes | recursive | OR ALTER; MV emulated (indexedView) | procedures, functions | yes (row-level lowered) | yes |
| Azure SQL Database | yes | yes | yes | ≤ SER + SNAPSHOT | OUTPUT INSERTED | MERGE | JSON_VALUE | table hints, READPAST, NOWAIT | yes | recursive | OR ALTER; MV emulated (indexedView) | procedures, functions | yes (row-level lowered) | yes |
| Azure SQL Managed Instance | yes | yes | yes | ≤ SER + SNAPSHOT | OUTPUT INSERTED | MERGE | JSON_VALUE | table hints, READPAST, NOWAIT | yes | recursive | OR ALTER; MV emulated (indexedView) | procedures, functions | yes (row-level lowered) | yes |
| Azure Data Explorer (Kusto) | no | — | — | — | refused | refused | JSON_VALUE | table hints, READPAST, NOWAIT | yes | recursive | OR ALTER; MV emulated (indexedView) | procedures, functions | yes (row-level lowered) | yes |
| Cloud SQL for SQL Server | yes | yes | yes | ≤ SER + SNAPSHOT | OUTPUT INSERTED | MERGE | JSON_VALUE | table hints, READPAST, NOWAIT | yes | recursive | OR ALTER; MV emulated (indexedView) | procedures, functions | yes (row-level lowered) | yes |
| Dialect | Tx | Savepoints | Atomic | Isolation | RETURNING | Upsert | JSON operators | Row locks | Window fns | CTEs | Views; materialized views | Routines | Triggers | Sequences |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| SQLite | yes | yes | yes | ≤ SER | not emitted | ON CONFLICT | json_each, json_extract | ignored | yes | recursive | drop + create; MV emulated (app) | functions (driverUdf) | yes | — |
| Turso / libSQL | yes | yes | yes | ≤ SER | not emitted | ON CONFLICT | json_each, json_extract | ignored | yes | recursive | drop + create; MV emulated (app) | functions (driverUdf) | yes | — |
| Cloudflare D1 | yes | no | no | ≤ SER | not emitted | ON CONFLICT | json_each, json_extract | ignored | yes | recursive | drop + create; MV emulated (app) | functions (driverUdf) | yes | — |
| rqlite | yes | no | no | ≤ SER | not emitted | ON CONFLICT | json_each, json_extract | ignored | yes | recursive | drop + create; MV emulated (app) | functions (driverUdf) | yes | — |
| Dialect | Tx | Savepoints | Atomic | Isolation | RETURNING | Upsert | JSON operators | Row locks | Window fns | CTEs | Views; materialized views | Routines | Triggers | Sequences |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Oracle | yes | yes | yes | RC, SER + READ ONLY | RETURNING … INTO | MERGE | — | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive (column list required) | OR REPLACE; MV native | procedures, functions | yes | yes |
| IBM Db2 | yes | yes | yes | ≤ SER + UR/CS/RS/RR | FINAL TABLE | MERGE | — | FOR UPDATE only | yes | recursive (column list required) | OR REPLACE; MV native | procedures, functions | yes | yes |
| SAP HANA | yes | no | yes | ≤ SER | refused | MERGE | — | FOR UPDATE, NOWAIT only | yes | non-recursive only | drop + create; no MV | — | — | — |
| ClickHouse | no | — | — | — | not emitted | plain INSERT | — | ignored | yes | recursive (no column list) | OR REPLACE; MV native | functions (expressionOnly) | — | — |
| DuckDB | yes | no | yes | ≤ RR | RETURNING | ON CONFLICT | list_contains, json_extract_string | ignored | yes | recursive | OR REPLACE; MV emulated (app) | functions (macro) | — | yes |
| Snowflake | yes | no | yes | ≤ RC | not emitted | MERGE | — | ignored | yes | recursive | OR REPLACE; MV native | procedures, functions (expressionOnly) | — | yes |
| Google BigQuery | no | — | — | — | refused | MERGE | — | refused | yes | recursive | OR REPLACE; MV native | procedures, functions (expressionOnly) | — | — |
| MotherDuck | yes | no | yes | ≤ RR | RETURNING | ON CONFLICT | list_contains, json_extract_string | ignored | yes | recursive | OR REPLACE; MV emulated (app) | functions (macro) | — | yes |
| Teradata | yes | no | yes | ≤ SER | refused | MERGE | — | refused | yes | recursive | drop + create; no MV | — | — | — |
| MonetDB | yes | yes | yes | ≤ SER | refused | MERGE | — | refused | yes | recursive | drop + create; no MV | — | — | — |
| Apache Druid | no | — | — | — | refused | refused | json_each, JSON_VALUE | ignored | yes | recursive | drop + create; no MV | — | — | — |
| Google Cloud Spanner | yes | no | yes | ≤ SER | not emitted | INSERT OR UPDATE | — | ignored | yes | recursive (no column list) | drop + create; no MV | — | — | — |
| Amazon RDS for Oracle | yes | yes | yes | RC, SER + READ ONLY | RETURNING … INTO | MERGE | — | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive (column list required) | OR REPLACE; MV native | procedures, functions | yes | yes |
| Amazon RDS for Db2 | yes | yes | yes | ≤ SER + UR/CS/RS/RR | FINAL TABLE | MERGE | — | FOR UPDATE only | yes | recursive (column list required) | OR REPLACE; MV native | procedures, functions | yes | yes |
| Oracle Autonomous Database | yes | yes | yes | RC, SER + READ ONLY | RETURNING … INTO | MERGE | — | FOR UPDATE, SKIP LOCKED, NOWAIT | yes | recursive (column list required) | OR REPLACE; MV native | procedures, functions | yes | yes |
runTransactionScript([...]) instead. Seetransaction() runsrequireAtomic: true refuses them.transactionCapabilities() insrc/dialects/d1/index.ts), so capabilitiesOf() on a D1 instance isname: 'sqlite'.INSERT (ClickHouse,FINAL TABLE is Db2's SELECT … FROM FINAL TABLE (INSERT …).RETURNING … INTO is Oracle's, with out-binds.recursive: true.sqlObjectFamilyOf('kusto') is mssql and the lock hint builder iscreateView, createTrigger,createSequence and createStoredProcedure refuse, and the engine isjson_each.PostgresDialect without its procedural languagegetDataTypeSql({ key: 'JSON' }), getDataTypeSql({ key: 'VECTOR', dimensions: 3 })whereSupportOf(dialect) (src/query-builders/expression-render.ts).| Dialect | JSON column | VECTOR(3) column | WHERE operator keys |
|---|---|---|---|
| PostgreSQL | JSON | VECTOR(3) | 62 |
| Firebird | BLOB SUB_TYPE TEXT | refused | 46 |
| CockroachDB | JSON | VECTOR(3) | 56 |
| YugabyteDB | JSON | VECTOR(3) | 62 |
| TimescaleDB | JSON | VECTOR(3) | 62 |
| Greenplum | JSON | VECTOR(3) | 62 |
| Amazon Redshift | SUPER | refused | 35 |
| openGauss | JSON | VECTOR(3) | 62 |
| Vertica | LONG VARCHAR | refused | 46 |
| Exasol | VARCHAR(2000000) | refused | 46 |
| Trino | JSON | ARRAY(REAL) | 46 |
| CrateDB | OBJECT | FLOAT_VECTOR(3) | 46 |
| QuestDB | STRING | refused | 46 |
| Amazon Athena | VARCHAR | ARRAY(REAL) | 46 |
| Materialize | JSONB | refused | 62 |
| RisingWave | JSONB | VECTOR(3) | 62 |
| Citus | JSON | VECTOR(3) | 62 |
| AlloyDB | JSON | VECTOR(3) | 62 |
| Aurora DSQL | JSON | refused | 62 |
| Yellowbrick | JSON | refused | 62 |
| ParadeDB | JSON | VECTOR(3) | 35 |
| Presto | JSON | ARRAY(REAL) | 46 |
| Amazon RDS for PostgreSQL | JSON | VECTOR(3) | 62 |
| Amazon Aurora PostgreSQL | JSON | VECTOR(3) | 62 |
| Amazon Aurora (RDS Data API) | JSON | VECTOR(3) | 62 |
| Amazon Redshift (Data API) | SUPER | refused | 35 |
| Azure Database for PostgreSQL | JSON | VECTOR(3) | 62 |
| Azure Cosmos DB for PostgreSQL | JSON | VECTOR(3) | 62 |
| Cloud SQL for PostgreSQL | JSON | VECTOR(3) | 62 |
| Spanner (PostgreSQL interface) | jsonb | refused | 62 |
| AlloyDB Omni | JSON | VECTOR(3) | 62 |
| Neon | JSON | VECTOR(3) | 62 |
| Supabase | JSON | VECTOR(3) | 62 |
| MySQL | JSON | VECTOR(3) | 28 |
| MariaDB | JSON | VECTOR(3) | 37 |
| TiDB | JSON | VECTOR(3) | 28 |
| SingleStore | JSON | VECTOR(3, F32) | 28 |
| OceanBase | JSON | VECTOR(3) | 28 |
| PolarDB for MySQL | JSON | VECTOR(3) | 28 |
| Databricks | STRING | ARRAY<FLOAT> | 28 |
| Apache Doris | JSON | ARRAY<FLOAT> | 28 |
| StarRocks | JSON | ARRAY<FLOAT> | 28 |
| Vitess | JSON | VECTOR(3) | 28 |
| Dolt | JSON | VECTOR(3) | 28 |
| Amazon RDS for MySQL | JSON | VECTOR(3) | 28 |
| Amazon Aurora MySQL | JSON | VECTOR(3) | 28 |
| Amazon RDS for MariaDB | JSON | VECTOR(3) | 37 |
| Azure Database for MySQL | JSON | VECTOR(3) | 28 |
| Cloud SQL for MySQL | JSON | VECTOR(3) | 28 |
| MySQL HeatWave (OCI) | JSON | VECTOR(3) | 28 |
| Microsoft SQL Server | NVARCHAR(MAX) | VECTOR(3) | 18 |
| Azure Synapse Analytics | NVARCHAR(MAX) | refused | 18 |
| Microsoft Fabric Data Warehouse | VARCHAR(MAX) | refused | 18 |
| Amazon RDS for SQL Server | NVARCHAR(MAX) | VECTOR(3) | 18 |
| Azure SQL Database | NVARCHAR(MAX) | VECTOR(3) | 18 |
| Azure SQL Managed Instance | NVARCHAR(MAX) | VECTOR(3) | 18 |
| Azure Data Explorer (Kusto) | NVARCHAR(MAX) | VECTOR(3) | 18 |
| Cloud SQL for SQL Server | NVARCHAR(MAX) | VECTOR(3) | 18 |
| SQLite | TEXT | refused | 32 |
| Turso / libSQL | TEXT | F32_BLOB(3) | 32 |
| Cloudflare D1 | TEXT | refused | 32 |
| rqlite | TEXT | refused | 32 |
| Oracle | CLOB | VECTOR(3, FLOAT32) | 34 |
| IBM Db2 | CLOB | VECTOR(3, FLOAT32) | 32 |
| SAP HANA | NCLOB | REAL_VECTOR(3) | 32 |
| ClickHouse | String | Array(Float32) | 38 |
| DuckDB | JSON | FLOAT[3] | 39 |
| Snowflake | VARIANT | VECTOR(FLOAT, 3) | 38 |
| Google BigQuery | JSON | ARRAY<FLOAT64> | 38 |
| MotherDuck | JSON | FLOAT[3] | 39 |
| Teradata | JSON | refused | 35 |
| MonetDB | JSON | refused | 35 |
| Apache Druid | COMPLEX<json> | VARCHAR | 32 |
| Google Cloud Spanner | JSON | ARRAY<FLOAT32>(vector_length=>3) | 32 |
| Amazon RDS for Oracle | CLOB | VECTOR(3, FLOAT32) | 34 |
| Amazon RDS for Db2 | CLOB | VECTOR(3, FLOAT32) | 32 |
| Oracle Autonomous Database | CLOB | VECTOR(3, FLOAT32) | 34 |
query() stubbedid there is a plain allowNull: false key and theimport { DataTypes } from 'ts-prorm-orm';
const User = db.define(
'User',
{
id: { type: DataTypes.INTEGER(), primaryKey: true, autoIncrement: true },
email: { type: DataTypes.STRING(255), allowNull: false },
name: { type: DataTypes.STRING(100) },
meta: { type: DataTypes.JSON() },
joinedAt: { type: DataTypes.DATE(), allowNull: false, defaultValue: 'CURRENT_TIMESTAMP' },
},
{ timestamps: false },
);import { Op } from 'ts-prorm-orm';
await User.findAll({
where: { name: { [Op.like]: 'A%' } },
order: [['id', 'ASC']],
limit: 20,
offset: 40,
});await User.upsert({ id: 1, email: 'ada@example.com', name: 'Ada Lovelace' });upsert() also reads the row by its key before and after the statement.INSERT: it adds a row rather than updating the existing one.await User.create({ email: 'ada@example.com', name: 'Ada' }, { returning: ['id', 'joinedAt'] });returning is accepted and the statement is sent without it. Read the row back by its key.returning is accepted and the statement is sent without it. Read the row back by its key.returning is accepted and the statement is sent without it. Read the row back by its key.[!CAUTION]
Refused before anything is sent: RETURNING on INSERT is not supported for the bigquery dialect.
returning is accepted and the statement is sent without it. Read the row back by its key.jsonExtract() renders a JSON path read in each engine's own spelling. Its'postgres' here and the tab's dialect inimport { jsonExtract } from 'ts-prorm-orm';
await User.findAll({ attributes: ['id', [jsonExtract('postgres', 'meta', 'plan'), 'plan']] });await db.transaction(async (t) => {
await User.findAll({ where: { id: 1 }, lock: { level: 'UPDATE', skipLocked: true }, transaction: t });
});lock is ignored.READPAST is its SKIP LOCKED.lock option is dropped and the SELECT runs unlocked inside the transaction.[!CAUTION]
Refused before anything is sent: startTransaction() is not supported for the bigquery dialect.
[!CAUTION]
Refused before anything is sent: ClickHouse does not support multi-statement transactions (no BEGIN/COMMIT/ROLLBACK spanning multiple statements).
db.sync() for the model above. The 'CURRENT_TIMESTAMP' default reaches[!WARNING]
Use the string'CURRENT_TIMESTAMP'for a column default, as above. In
4.9.4,defaultValue: DataTypes.NOWonly becomes a real default on
SQLite (and Turso, rqlite), SQL Server (and its RDS, Azure and Cloud SQL
editions) and Oracle (CURRENT_TIMESTAMP,GETDATE(),SYSTIMESTAMP). On PostgreSQL, MySQL, MariaDB, Db2, HANA, Snowflake,
BigQuery, ClickHouse, DuckDB and most of their managed editions, theCREATE TABLEgets the quoted textDEFAULT '() => new NOW()'. On
Firebird, Greenplum, Vertica, SingleStore, Databricks and a few others,createTable()throws aTypeErrorinstead.
[!CAUTION] No transactions
ClickHouse, BigQuery,
Athena and Presto refusetransaction(),
and so do Druid and Kusto.startTransaction()
throws, so a lock or a savepoint inside one is never reached. BigQuery can
still run one atomic script withrunTransactionScript([sql, …]).
[!WARNING] Transactions that are not atomic
Cloudflare D1, rqlite and the
Redshift Data API run each statement in atransaction()as its own request. A failure part-way leaves the earlier
statements applied, and a rollback cannot undo them. PassrequireAtomic: trueto refuse them. On D1, use its batch API for an
all-or-nothing unit.
[!WARNING] No upsert upsert()throws on Apache Doris and
StarRocks (upsert is a table property: a unique or
primary key model), Materialize and
RisingWave (noON CONFLICT), and
Yellowbrick (neitherON CONFLICTnorMERGE). It
also throws on Athena, Druid and
Kusto. On ClickHouse and
QuestDB it is a plainINSERT, which adds a row instead
of updating one.
[!IMPORTANT] No DDL or DML
Apache Druid has noCREATE TABLE,INSERT … VALUES,UPDATEorDELETE. Data arrives by ingestion (buildInsertIngestion()
andsubmitIngestion()). The T-SQL that
Azure Data Explorer (Kusto) accepts is read-only:CREATE,INSERT,UPDATE,DELETE, views, triggers, sequences and procedures
all throw. Both are for querying data loaded some other way.
[!NOTE] Generate-only: the connection is unverified
Firebird, Trino, Vertica,
Exasol and Databricks generate their
engine's SQL, but none of them overridesconnect(). They connect with
their parent's driver (pg, ormysql2for Databricks), which does not
speak the engine's own wire protocol. Use them to build SQL, and run it
with the engine's own client until a native driver lands.
dialectOptions (password is the top-level username /password). The shared token, connector and certificate code is in| Dialect | Engine family | Authentication | TLS |
|---|---|---|---|
| Amazon RDS for PostgreSQL | PostgreSQL | Password; IAM (iamAuth, tokenProvider) | Verified TLS for a token; caBundle or PRORM_RDS_CA_BUNDLE (RDS CA bundle) |
| Amazon Aurora PostgreSQL | PostgreSQL | As RDS for PostgreSQL; the reader pool (routeReads) signs its own token | As RDS for PostgreSQL |
| Amazon RDS for MySQL | MySQL | Password; IAM (iamAuth, tokenProvider) | A token is refused without TLS; caBundle |
| Amazon Aurora MySQL | MySQL | As RDS for MySQL | As RDS for MySQL |
| Amazon RDS for MariaDB | MySQL (MariaDB) | Password only; iamAuth and tokenProvider throw | caBundle for verified TLS |
| Amazon RDS for SQL Server | SQL Server | Password only | encrypt: true, verified against the RDS CA |
| Amazon RDS for Oracle | Standalone (Oracle) | Password only; SYS / SYSTEM refused | Opt-in TCPS: tls: { port, walletLocation } |
| Amazon RDS for Db2 | Standalone (Db2) | Password only | Opt-in: tls: { port, caPath } |
| Amazon Aurora (RDS Data API) | PostgreSQL or MySQL (engine) | AWS SDK credentials plus secretArn; password refused | HTTPS only |
| Amazon Redshift | PostgreSQL | Password (iamRole is for COPY / UNLOAD only) | ssl passed to pg |
| Amazon Redshift (Data API) | PostgreSQL | secretArn, dbUser (cluster), or the IAM identity | HTTPS only |
| Amazon Athena | PostgreSQL (Trino) | AWS SDK credential chain or credentials | HTTPS only |
| Aurora DSQL | PostgreSQL | IAM token (default, @aws-sdk/dsql-signer) or tokenProvider | Verified by default; ssl: false throws |
| Azure SQL Database | SQL Server | Password; Entra ID (entra, tokenProvider) | encrypt: true, certificate verified; Entra refused over unverified TLS |
| Azure SQL Managed Instance | SQL Server | As Azure SQL Database | As Azure SQL Database |
| Azure Database for PostgreSQL | PostgreSQL | Password; Entra ID | Verified by default; Entra needs verified ssl |
| Azure Database for MySQL | MySQL | Password; Entra ID | Verified by default |
| Azure Cosmos DB for PostgreSQL | PostgreSQL (Citus) | Password; Entra ID | Verified by default; ssl: false refused |
| Azure Synapse Analytics | SQL Server | Password only (no Entra option in the dialect) | encrypt: true with trustServerCertificate: true (unverified) |
| Microsoft Fabric Data Warehouse | SQL Server | Entra ID only (authentication, entra, tokenProvider); no SQL logins | encrypt: true, certificate verified |
| Azure Data Explorer (Kusto) | SQL Server (T-SQL subset) | Entra ID only (credential, tokenProvider) | HTTPS only |
| Cloud SQL for PostgreSQL | PostgreSQL | Password; connector (cloudSql); IAM (cloudSql.iam, tokenProvider) | Connector is mTLS; direct uses cloudSql.serverCa |
| Cloud SQL for MySQL | MySQL | As Cloud SQL for PostgreSQL | As Cloud SQL for PostgreSQL |
| Cloud SQL for SQL Server | SQL Server | Password plus the connector; IAM refused | Connector is mTLS; direct uses serverCa |
| AlloyDB | PostgreSQL | Password; IAM (iam) | IAM defaults to unverified TLS; tls: 'verify' to require your own ssl |
| Google Cloud Spanner | Standalone (GoogleSQL) | Application Default Credentials, keyFilename or credentials | gRPC to Google's API |
| Spanner (PostgreSQL interface) | PostgreSQL | The PGAdapter sidecar authenticates | Plain pg to a local PGAdapter |
| Google BigQuery | Standalone | Application Default Credentials, keyFilename or credentials | Google's API over HTTPS |
| Oracle Autonomous Database | Standalone (Oracle) | Password plus wallet | Always TLS: wallet mTLS (port 1522) or wallet-less TLS |
| MySQL HeatWave (OCI) | MySQL | Password only | Unverified by default (self-signed); tlsCa or tls: 'verify' |
| PolarDB for MySQL | MySQL | Password only | ssl passed to mysql2 |
| Neon | PostgreSQL | Password or connectionString; authToken on the HTTP transport | Verified by default over TCP; sslmode=require over WebSocket / HTTP |
| Supabase | PostgreSQL | Password only (postgres.<ref> on the pooler) | Unverified by default; sslRootCert or tls: 'verify' |
| Turso / libSQL | SQLite | authToken | libsql:// / https:// |
| Cloudflare D1 | SQLite | Worker binding, or the HTTP API with accountId, databaseId and token | HTTPS only |
| MotherDuck | Standalone (DuckDB) | token or motherduck_token | Handled by the extension |
| Snowflake | Standalone | Password; key pair (privateKey, privateKeyPath); authenticator | The SDK's HTTPS |
| Databricks | MySQL (generate-only) | None beyond the inherited MySQL password; no token auth | Not verified against a live warehouse |
| Yellowbrick | PostgreSQL | Password only | ssl passed to pg |
| Teradata | Standalone | Password plus logmech (TD2, LDAP, JWT, …) | encryptdata; connectParams: { sslmode: 'VERIFY-FULL' } |
| PlanetScale (use Vitess) | MySQL | Password; dialect: 'planetscale' is an alias for vitess | TLS required; pass port 3306 and ssl |
require() calls that load each driver, andtests/cli-driver-catalog.test.ts fails if it drifts. prorm packages| Driver package | Dialects | Install | Optional (features that need them) |
|---|---|---|---|
pg | PostgreSQL, Firebird, CockroachDB, YugabyteDB, TimescaleDB, Greenplum, Amazon Redshift, openGauss, Vertica, Exasol, Trino, CrateDB, QuestDB, Materialize, RisingWave, Citus, AlloyDB, Yellowbrick, ParadeDB, Amazon RDS for PostgreSQL, Amazon Aurora PostgreSQL, Azure Database for PostgreSQL, Azure Cosmos DB for PostgreSQL, Cloud SQL for PostgreSQL, Spanner (PostgreSQL interface), AlloyDB Omni, Neon, Supabase | npm install pg | @aws-sdk/rds-signer, @azure/identity, @google-cloud/cloud-sql-connector, @neondatabase/serverless, google-auth-library, pg-copy-streams |
mysql2 | MySQL, TiDB, SingleStore, OceanBase, PolarDB for MySQL, Databricks, Apache Doris, StarRocks, Vitess, Dolt, Amazon RDS for MySQL, Amazon Aurora MySQL, Azure Database for MySQL, Cloud SQL for MySQL, MySQL HeatWave (OCI) | npm install mysql2 | @aws-sdk/rds-signer, @azure/identity, @google-cloud/cloud-sql-connector, google-auth-library |
mssql | Microsoft SQL Server, Azure Synapse Analytics, Microsoft Fabric Data Warehouse, Amazon RDS for SQL Server, Azure SQL Database, Azure SQL Managed Instance, Cloud SQL for SQL Server | npm install mssql | @azure/identity, @google-cloud/cloud-sql-connector |
| none | Presto, Azure Data Explorer (Kusto), Cloudflare D1, rqlite, Apache Druid | — | @azure/identity |
oracledb | Oracle, Amazon RDS for Oracle, Oracle Autonomous Database | npm install oracledb | — |
mariadb | MariaDB, Amazon RDS for MariaDB | npm install mariadb | — |
ibm_db | IBM Db2, Amazon RDS for Db2 | npm install ibm_db | — |
duckdb | DuckDB, MotherDuck | npm install duckdb | — |
@aws-sdk/client-athena | Amazon Athena | npm install @aws-sdk/client-athena | — |
@aws-sdk/dsql-signer (not a peer dependency) | Aurora DSQL | npm install @aws-sdk/dsql-signer | — |
@aws-sdk/client-rds-data | Amazon Aurora (RDS Data API) | npm install @aws-sdk/client-rds-data | — |
@aws-sdk/client-redshift-data | Amazon Redshift (Data API) | npm install @aws-sdk/client-redshift-data | — |
better-sqlite3 | SQLite | npm install better-sqlite3 | — |
@libsql/client | Turso / libSQL | npm install @libsql/client | — |
hdb | SAP HANA | npm install hdb | — |
@clickhouse/client | ClickHouse | npm install @clickhouse/client | — |
snowflake-sdk | Snowflake | npm install snowflake-sdk | — |
@google-cloud/bigquery | Google BigQuery | npm install @google-cloud/bigquery | — |
teradatasql (not a peer dependency) | Teradata | npm install teradatasql | — |
monetdb (not a peer dependency) | MonetDB | npm install monetdb | — |
@google-cloud/spanner | Google Cloud Spanner | npm install @google-cloud/spanner | — |
fetch. D1 insidebinding instead and makes no request@azure/identity only when you let it acquire thets-prorm-orm at all (the catalog's NOT_SHIPPED list), so npmcapabilitiesOf().savepointsfalse on Redshift, SingleStore, Synapse, Fabric, Doris andSAVEPOINT.UnsupportedWhereError for @>, &&, ?, range and@@ operators. lock renders FOR UPDATE WITH LOCK on Firebird andFOR UPDATE on Vertica, and is refused where the engine has no row locks.CURRENT_TIMESTAMP defaults are keywords, not strings. The default isnow() on ClickHouse, and as CURRENT_TIMESTAMP() on BigQuery.CREATE
TABLE and ADD COLUMN emit FOREIGN KEY (…) REFERENCES …, so InnoDBonDelete / onUpdate now reach the DDL onENUM. Under the legacy type mapping, PostgreSQL andENUM() columns carry CHECK (col IN (…)).DATE(p, true) keeps its zone (TIMESTAMPTZ(p)) across the PostgreSQLpostgres (triggers, PL/pgSQL, sequences), and OceanBase and PolarDBmysql (triggers, procedures). They used to be unknown, which[!IMPORTANT]
Tables created by an older release are not rewritten. They keep a quoted'CURRENT_TIMESTAMP'default, a bareVARCHARforENUM, and on MySQL no
foreign keys. Migrate those columns and constraints yourself.
| Dialect | What it is |
|---|---|
| PostgreSQL | PostgreSQL is the ORM's most fully-featured dialect. |
| MySQL | The MySQL dialect targets MySQL 5.7 and 8.0+ servers (and compatible forks). |
| MariaDB | The MariaDB dialect provides first-class support for MariaDB servers. |
| SQLite | SQLite is an embedded, serverless, zero-configuration SQL database engine that stores an entire database (schema,… |
| Oracle | Oracle Database is an enterprise-grade relational database. prorm talks to it through the oracledb driver. |
| Microsoft SQL Server | The mssql dialect targets Microsoft SQL Server (and Azure SQL) through the mssql Node.js package, which uses the… |
| IBM Db2 | IBM Db2 (specifically Db2 for LUW — Linux/Unix/Windows) is IBM's flagship relational database. |
| Firebird | Firebird is a lightweight, open-source relational database derived from InterBase. |
| Turso / libSQL | Turso is a hosted database service built on libSQL, an open-source fork of SQLite. |
| openGauss | Huawei's fork of PostgreSQL 9.2. It has no ON CONFLICT — upserts use MySQL-shaped ON DUPLICATE KEY UPDATE. |
| Dolt | A SQL database with Git-style version control in its storage, speaking the MySQL protocol. |
| Dialect | What it is |
|---|---|
| ClickHouse | ClickHouse is a columnar OLAP database built for real-time analytics over very large datasets — aggregations,… |
| DuckDB | DuckDB is an embedded, in-process OLAP (analytical) database. |
| MotherDuck | DuckDB in the cloud: the same engine reached through the motherduck extension. |
| Amazon Redshift | Amazon Redshift is a columnar, massively-parallel cloud data warehouse. |
| Snowflake | Snowflake is a cloud-native, columnar, analytical data warehouse. |
| Vertica | Reference documentation for the vertica dialect. Everything below is drawn from the dialect source… |
| Greenplum | Reference documentation for the greenplum SQL dialect. |
| Exasol | Exasol is an in-memory, column-oriented, massively-parallel (MPP) analytic database. |
| SAP HANA | The hana dialect targets SAP HANA — both on-premise HANA 2.0 and the continuously-delivered HANA Cloud editions. |
| Databricks | Reference for the databricks SQL dialect (src/dialects/databricks/index.ts). |
| Trino | Reference for the trino SQL dialect. |
| Presto | The original Presto (PrestoDB): Trino's grammar with the older HTTP headers and no MERGE. |
| Google BigQuery | BigQuery is Google's serverless warehouse: backtick quoting, ARRAY/STRUCT, unenforced key constraints, and partitioning and clustering in place of indexes. |
| Amazon Athena | Athena is Trino over S3 — query-only on Hive tables, row-level writes on Iceberg, and Hive DDL alongside Trino queries. |
| Azure Synapse Analytics | Synapse dedicated SQL pools speak T-SQL but drop much of it: no OFFSET/FETCH, no OUTPUT, no enforced foreign keys, and distribution declared on CREATE TABLE. |
| Microsoft Fabric Data Warehouse | T-SQL over TDS through the mssql driver, with Fabric's type subset and no OUTPUT. |
| Teradata | Teradata Vantage: its own engine and driver, with the SQL shape the PostgreSQL builders already produce. |
| MonetDB | An independent column store whose SQL follows the standard closely enough to reuse the PostgreSQL builders. |
| Yellowbrick | An MPP warehouse with a PostgreSQL-derived front end, over the pg driver. |
| Apache Doris | A real-time MPP OLAP database speaking the MySQL protocol; upsert is a table property, not a clause. |
| StarRocks | A real-time MPP OLAP database speaking the MySQL protocol, with its own index types. |
| Apache Druid | Read-mostly real-time analytics, queried with Druid SQL over HTTP. |
| Dialect | What it is |
|---|---|
| CockroachDB | CockroachDB is a distributed, horizontally-scalable SQL database that speaks the PostgreSQL wire protocol. |
| YugabyteDB | YugabyteDB is a distributed SQL database whose YSQL API is forked from the PostgreSQL source. |
| TiDB | TiDB is a distributed, MySQL-wire-protocol-compatible NewSQL database: it speaks the MySQL client/server protocol… |
| SingleStore | Reference documentation for the singlestore dialect. |
| Google Cloud Spanner | Google Cloud Spanner is a fully-managed, horizontally-scalable, strongly-consistent distributed SQL database. |
| Spanner (PostgreSQL interface) | PostgreSQL syntax over Spanner's storage, type system and schema rules, through PGAdapter. |
| OceanBase | OceanBase in MySQL-compatible mode — port 2881 rather than 3306, tenanted usernames, and distributed table options. |
| PolarDB for MySQL | Alibaba Cloud's PolarDB for MySQL, with read/write-split and parallel-query hints. Its PostgreSQL and X editions are not covered. |
| Citus | The PostgreSQL extension that shards a cluster of servers: distributed and reference tables from the coordinator. |
| Vitess | Sharded MySQL behind vtgate: keyspaces, VSchema-aware DDL and sequences in place of AUTO_INCREMENT. |
| Aurora DSQL | AWS's serverless, active-active distributed PostgreSQL: token-only authentication and a reduced DDL surface. |
| Dialect | What it is |
|---|---|
| TimescaleDB | Reference for the timescaledb SQL dialect. |
| QuestDB | Reference for the questdb SQL dialect. |
| CrateDB | CrateDB is a distributed SQL database built for search and analytics over large volumes of structured and… |
| ParadeDB | PostgreSQL with pg_search: BM25 full-text search inside Postgres. |
| Materialize | A streaming database: sources, views and incrementally maintained materialized views, over the PostgreSQL protocol. |
| RisingWave | A streaming database with connector-backed tables and incrementally maintained materialized views, over the PostgreSQL protocol. |
| Dialect | What it is |
|---|---|
| Cloudflare D1 | SQLite run by Cloudflare, reached through a Worker binding or the HTTP API. |
| rqlite | SQLite made highly available with Raft, driven over its HTTP API with the global fetch. |
| Amazon Aurora (RDS Data API) | Aurora PostgreSQL or Aurora MySQL over HTTPS: no socket, no pool, and no database password in the client. |
| Amazon Redshift (Data API) | Redshift's SQL over HTTPS, against a provisioned cluster or a Serverless workgroup. |
| Dialect | What it is |
|---|---|
| Amazon RDS for PostgreSQL | Community PostgreSQL run by AWS: password or IAM token authentication, the RDS CA bundle, and rds_superuser in place of a superuser. |
| Amazon Aurora PostgreSQL | RDS for PostgreSQL's authentication and TLS, plus Aurora's cluster endpoints and replica routing. |
| Amazon RDS for MySQL | MySQL Community run by AWS: IAM tokens, no SUPER, and the mysql.rds_* procedures. |
| Amazon Aurora MySQL | RDS for MySQL's authentication and TLS, plus what Aurora MySQL adds on top. |
| Amazon RDS for MariaDB | MariaDB run by AWS on 3306, through the mariadb driver. |
| Amazon RDS for SQL Server | SQL Server run by AWS: native backup and restore through msdb.dbo.rds_*, and no sysadmin. |
| Amazon RDS for Oracle | Oracle Database run by AWS, administered through the rdsadmin packages. |
| Amazon RDS for Db2 | Db2 LUW run by AWS, administered through the rdsadmin procedures. |
| Dialect | What it is |
|---|---|
| Azure SQL Database | SQL Server's engine as a single database on a logical server, with Entra ID authentication and firewall rules. |
| Azure SQL Managed Instance | A whole SQL Server instance run by Azure: several databases, USE, SQL Server Agent. |
| Azure Database for PostgreSQL | Flexible server: community PostgreSQL with Entra ID tokens and the built-in PgBouncer. |
| Azure Database for MySQL | Flexible server: community MySQL with Entra ID tokens. |
| Azure Cosmos DB for PostgreSQL | Managed Citus. On a retirement path; the page says what to use instead. |
| Azure Data Explorer (Kusto) | The read-only T-SQL subset Kusto accepts, over HTTP. |
| Dialect | What it is |
|---|---|
| Cloud SQL for PostgreSQL | Stock PostgreSQL, reached directly or through the Cloud SQL connector, with IAM database authentication. |
| Cloud SQL for MySQL | Stock MySQL, reached directly or through the Cloud SQL connector, with IAM database authentication. |
| Cloud SQL for SQL Server | SQL Server run by Google, with the flags and stored procedures Cloud SQL uses in place of sysadmin. |
| AlloyDB | Google's PostgreSQL-compatible service: IAM authentication and the columnar engine, over pg. |
| AlloyDB Omni | The downloadable edition of AlloyDB: the same engine, run where you choose, with a real superuser. |
| Dialect | What it is |
|---|---|
| Oracle Autonomous Database | ATP, ADW and AJD: Oracle Database run by Oracle, with wallets, mTLS and DBMS_CLOUD. |
| MySQL HeatWave (OCI) | MySQL Enterprise run by Oracle, with the HeatWave in-memory columnar accelerator. |
| Neon | Serverless PostgreSQL: pooled and direct endpoints, and an optional WebSocket driver. |
| Supabase | A Supabase project's PostgreSQL: the session and transaction poolers, and Supabase's roles. |
prorm db up