We read your SQL with full precision, and can give it back exactly as written — comments, casing, habits and all.
SQL dialects
43
Every common database, from one grammar.
Formatting errors
0
Over 28 361 dbt models and 36 193 SQL files.
Unstable layouts
0
format(format(x)) = format(x), at any width.
AST node types
7 235
Typed and immutable, generated per dialect.
dfmt is the first product we shipped on what the parser reads. No trial, no signup. The easiest way to show you what is underneath is to let you format some SQL with it.
select o.customer_id, count(*) as n,sum(o.total) as revenue from orders ojoin customers c on c.id=o.customer_idwhere o.status in ('paid','shipped')and o.created_at >= '2026-01-01'group by o.customer_id order by revenue descSELECT o.customer_id, count(*) AS n, sum(o.total) AS revenueFROM orders oJOIN customers c ON c.id = o.customer_idWHERE o.status IN ('paid', 'shipped') AND o.created_at >= '2026-01-01'GROUP BY o.customer_idORDER BY revenue DESCLaying that query out took a parse. The parse is where dquery starts: on the same tree it resolves every name, infers every type, and traces each column back to the physical table it came from. Here is what it reads in that same query — and what the rest of the family is built to answer.
SELECT o.customer_id,bigint orders.customer_id count(*) AS n,bigint derived, never null sum(o.total) AS revenuenumeric(12,2) orders.totalFROM orders otable analytics.public.ordersJOIN customers ctable analytics.public.customers ON c.id = o.customer_idWHERE o.status IN ('paid', 'shipped')text 2 of 6 known valuesGROUP BY o.customer_idEach of these is a walk over the same reading of your SQL. Two of them you can use today; the rest are what we are building next.