SQL¶
Files ending in .sql are formatted by the SQL pack
(rainbow_fmt.languages.sql, grammar
tree-sitter-sql, which
reads the common dialects).
select a.id, b.name as n, count(*) from users a join orders b on a.id = b.user_id where a.active = 1 and b.total > 10 group by a.id, b.name having count(*) > 1 order by n desc limit 10;
becomes
select a.id, b.name as n, count(*)
from users a
join orders b on a.id = b.user_id
where a.active = 1 and b.total > 10
group by a.id, b.name
having count(*) > 1
order by n desc
limit 10;
What changes and what does not¶
- One clause per line:
WITH(its common table expressions one per line when too long),SELECT,FROM, eachJOIN,WHERE,GROUP BY,HAVING,ORDER BY,LIMIT,OFFSET,RETURNING, set operations. A clause that is only keywords shares its line with the next (DELETE FROM t). - The items of a clause stay on the keyword's line when they fit;
otherwise they go one per line, indented by
core.indent_size. A condition that does not fit breaks before eachAND/OR. - Parenthesized lists (
INSERT … (a, b) VALUES (1, 2), column definitions) break one item per line when too long. A call or a type size hugs its parenthesis (count(*),varchar(10));IN (…)andVALUES (…)keep a space. - Subqueries stay on one line inside their parentheses.
- Keywords are written in the case
keyword_caseasks for; identifiers, strings, numbers and operators are as written, and so is anything the grammar reads as one token (interval '7 days'). - Statements are separated as written; blank lines between them are kept,
at most
core.max_blank_lines. Comments (--and/* */) stay where they are.
Inline directives (-- rainbow: off … -- rainbow: on, -- rainbow:
skip-next) keep statements as written
(configuration.md).
Options¶
| Key | Values | Default |
|---|---|---|
language.sql.keyword_case |
"preserve", "upper", "lower" |
"preserve" |