- Immutable AST: query and expression nodes are frozen dataclasses, and chaining returns new objects.
- Deterministic compilation: parameters are named
:p0,:p1, ... in traversal order. - Identifier quoting: double quotes for all table/column/alias identifiers.
- Hydration is separate from compilation: the runner applies hydration based on projection keys.
- Collision policy: duplicate projection keys raise a
HydrationError; useAS()to disambiguate. - Column access style: use
table.c.columnto avoid name collisions withTableattributes.
- SQLite-only dialect.
- No DDL AST (DDL runs via
Runner.exec_ddl). - No ORMs, schema reflection, migrations, or async support.
- Functions without
AS()cannot be hydrated.