Skip to content

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.


FeaturePostgreSQLMySQL 8+SQL ServerSQLite
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

FeaturePostgreSQLMySQL 8+SQL ServerSQLite
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

FunctionPostgreSQLMySQL 8+SQL ServerSQLite
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

FeaturePostgreSQLMySQL 8+SQL ServerSQLite
GraphQL transport
REST transport
gRPC transport
Wire protocol (binary streaming)
Apollo Federation subgraph
Federation circuit breaker
TLS / mTLS connectionsN/A
Connection pooling (PgBouncer-compatible)N/A
Health check endpoint

SymbolMeaning
Fully supported
⚠️Partial support — see notes below
Not supported
N/ANot applicable

  • Mutations — fully supported. All mutation functions use the same mutation_response return type as PostgreSQL.
  • Window functions — ranking and value functions work. PERCENT_RANK, CUME_DIST, STDDEV, VARIANCE aggregate-as-window, and the FILTER clause 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_EXTRACT which lacks the binary JSONB aggregation operators.
  • RLS — FraiseQL implements view-based security (inject a WHERE tenant_id = $user filter). MySQL does not have native RLS like PostgreSQL.
  • Full-text search — MySQL FULLTEXT indexes are supported via the MATCH ... AGAINST operator but require explicit index declarations. Not auto-detected.
  • Mutations — fully supported, using SQL Server’s SELECT * FROM fn_name(args) calling convention.
  • Window functionsROWS/RANGE frames work. GROUPS frame type is not supported. PERCENT_RANK is 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 uses CONVERT(UNIQUEIDENTIFIER, @p) comparisons.
  • 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/NOTIFY equivalent.
  • Wire protocol — not supported. SQLite is in-process only.
  • Window functions — basic ranking and SUM/COUNT OVER work. PERCENT_RANK, CUME_DIST, STDDEV, VARIANCE, and frame exclusion are not supported.

ScenarioRecommendation
Production SaaS / multi-tenantPostgreSQL (native RLS, subscriptions, JSONB)
Existing MySQL codebaseMySQL 8+ (mutations, relay pagination, most query features)
Enterprise .NET / WindowsSQL Server (full mutation support, most query features)
Local development / testsSQLite (zero config, fast, no server needed, full read-write support)
Analytics / data warehousePostgreSQL (fact tables, window functions, JSONB dimensions)
Real-time features (subscriptions)PostgreSQL only