Database Compatibility Matrix
This page shows which FraiseQL features are supported on each database backend. Check this before starting a project to avoid discovering limitations mid-development.
Core Features
Section titled “Core Features”| Feature | PostgreSQL | MySQL 8+ | SQL Server | SQLite |
|---|---|---|---|---|
| Queries (SELECT from views) | ✅ | ✅ | ✅ | ✅ |
| Mutations | ✅ | ✅ | ✅ | ✅ DirectSql |
| Relay cursor pagination | ✅ | ✅ | ✅ | ✅ |
| Automatic WHERE from args | ✅ | ✅ | ✅ | ✅ |
| Rich filters (operators, ILIKE, IS NULL) | ✅ | ✅ | ✅ | ✅ |
| Full-text search | ✅ | ⚠️ Limited | ⚠️ Limited | ❌ |
| JSONB field traversal | ✅ | ⚠️ JSON_EXTRACT | ⚠️ JSON_VALUE | ⚠️ json_extract |
| Row-Level Security (RLS) | ✅ Native | ⚠️ View-based | ⚠️ View-based | ❌ |
Advanced Query Features
Section titled “Advanced Query Features”| Feature | PostgreSQL | MySQL 8+ | SQL Server | SQLite |
|---|---|---|---|---|
| Window functions | ✅ Full | ⚠️ Partial | ⚠️ Partial | ⚠️ Partial |
Fact table analytics (tf_*) | ✅ | ❌ | ❌ | ❌ |
| Automatic Persisted Queries (APQ) | ✅ | ✅ | ✅ | ✅ |
| Query result caching | ✅ | ✅ | ✅ | ✅ |
| Subscriptions (CDC) | ✅ pg_notify | ❌ | ❌ | ❌ |
| Multi-tenancy / RLS injection | ✅ | ⚠️ Manual | ⚠️ Manual | ❌ |
Window Function Support Detail
Section titled “Window Function Support Detail”| Function | PostgreSQL | MySQL 8+ | SQL Server | SQLite |
|---|---|---|---|---|
ROW_NUMBER(), RANK(), DENSE_RANK() | ✅ | ✅ | ✅ | ✅ |
NTILE(n) | ✅ | ✅ | ✅ | ✅ |
PERCENT_RANK(), CUME_DIST() | ✅ | ❌ | ✅ | ❌ |
LAG(), LEAD(), FIRST_VALUE(), LAST_VALUE() | ✅ | ✅ | ✅ | ✅ |
SUM() OVER, COUNT() OVER | ✅ | ✅ | ✅ | ✅ |
STDDEV() OVER, VARIANCE() OVER | ✅ | ❌ | ✅ | ❌ |
FILTER (WHERE ...) on aggregates | ✅ | ❌ | ❌ | ❌ |
GROUPS frame type | ✅ | ❌ | ❌ | ❌ |
Operational Features
Section titled “Operational Features”| Feature | PostgreSQL | MySQL 8+ | SQL Server | SQLite |
|---|---|---|---|---|
| GraphQL transport | ✅ | ✅ | ✅ | ✅ |
| REST transport | ✅ | ✅ | ✅ | ✅ |
| gRPC transport | ✅ | ✅ | ✅ | ✅ |
| Wire protocol (binary streaming) | ✅ | ❌ | ❌ | ❌ |
| Apollo Federation subgraph | ✅ | ✅ | ✅ | ❌ |
| Federation circuit breaker | ✅ | ✅ | ✅ | ❌ |
| TLS / mTLS connections | ✅ | ✅ | ✅ | N/A |
| Connection pooling (PgBouncer-compatible) | ✅ | ✅ | ✅ | N/A |
| Health check endpoint | ✅ | ✅ | ✅ | ✅ |
Legend
Section titled “Legend”| Symbol | Meaning |
|---|---|
| ✅ | Fully supported |
| ⚠️ | Partial support — see notes below |
| ❌ | Not supported |
| N/A | Not applicable |
Notes by Database
Section titled “Notes by Database”MySQL 8+
Section titled “MySQL 8+”- Mutations — fully supported. All mutation functions use the same
mutation_responsereturn type as PostgreSQL. - Window functions — ranking and value functions work.
PERCENT_RANK,CUME_DIST,STDDEV,VARIANCEaggregate-as-window, and theFILTERclause are not supported. The planner raises an error at compile time for unsupported functions. - Fact table analytics — not supported. Fact table introspection requires JSONB operators (PostgreSQL-native). MySQL uses
JSON_EXTRACTwhich lacks the binary JSONB aggregation operators. - RLS — FraiseQL implements view-based security (inject a
WHERE tenant_id = $userfilter). MySQL does not have native RLS like PostgreSQL. - Full-text search — MySQL FULLTEXT indexes are supported via the
MATCH ... AGAINSToperator but require explicit index declarations. Not auto-detected.
SQL Server
Section titled “SQL Server”- Mutations — fully supported, using SQL Server’s
SELECT * FROM fn_name(args)calling convention. - Window functions —
ROWS/RANGEframes work.GROUPSframe type is not supported.PERCENT_RANKis available on SQL Server 2012+. - Fact table analytics — not supported (no JSONB, limited JSON aggregation).
- JSONB traversal — available via
JSON_VALUE(col, '$.path')but requires explicit path declarations; JSONB operators (->,->>) are PostgreSQL-only. - UUID columns — use
UNIQUEIDENTIFIER; cursor pagination usesCONVERT(UNIQUEIDENTIFIER, @p)comparisons.
SQLite
Section titled “SQLite”- Mutations — supported via
MutationStrategy::DirectSql. SQLite does not have stored procedures, so FraiseQL executes INSERT, UPDATE, and DELETE statements directly with a RETURNING clause to produce the mutation response. This enables full read-write development and testing against SQLite without requiring PostgreSQL. - Subscriptions — not supported. SQLite has no
LISTEN/NOTIFYequivalent. - Wire protocol — not supported. SQLite is in-process only.
- Window functions — basic ranking and
SUM/COUNTOVER work.PERCENT_RANK,CUME_DIST,STDDEV,VARIANCE, and frame exclusion are not supported.
Choosing a Database
Section titled “Choosing a Database”| Scenario | Recommendation |
|---|---|
| Production SaaS / multi-tenant | PostgreSQL (native RLS, subscriptions, JSONB) |
| Existing MySQL codebase | MySQL 8+ (mutations, relay pagination, most query features) |
| Enterprise .NET / Windows | SQL Server (full mutation support, most query features) |
| Local development / tests | SQLite (zero config, fast, no server needed, full read-write support) |
| Analytics / data warehouse | PostgreSQL (fact tables, window functions, JSONB dimensions) |
| Real-time features (subscriptions) | PostgreSQL only |
See Also
Section titled “See Also”- PostgreSQL guide — Production configuration, connection pooling, RLS
- MySQL guide — MySQL-specific idioms and limitations
- SQL Server guide — Enterprise configuration and Windows auth
- SQLite guide — Local development and testing setup