Skip to main content
This page is a formal grammar reference for Sync Streams: it shows the syntax the compiler accepts using railroad diagrams. This page complements the Supported SQL guide, which explains in prose what you can write, with examples and restrictions. When to use this page: If you need to check whether a construct is valid, see how rules nest (e.g. subqueries, CTEs, JOINs), or you’re used to grammar specs, use the diagrams and the “Used by” / “References” links to navigate. For most users just getting started, see Supported SQL and Writing Queries.

SelectStatement

SELECT id, name FROM users WHERE active = true
SelectStatement syntax diagram References: FromSource, JoinClause, SelectItem, WhereClause

SelectItem

name AS user_name
SelectItem syntax diagram References: Expression, Identifier, Reference

Reference

users.id
Reference syntax diagram References: Identifier

FromSource

users
FromSource syntax diagram References: SubquerySource, TableSource, TableValuedSource

TableSource

users AS u
TableSource syntax diagram References: Identifier, Reference

TableValuedCall

json_each(data)
TableValuedCall syntax diagram References: Expression, Identifier

TableValuedSource

json_each(data) AS items
TableValuedSource syntax diagram References: Identifier, TableValuedCall

SubquerySource

(SELECT id FROM users) AS u
SubquerySource syntax diagram References: Identifier, Subquery

JoinClause

JOIN orders ON users.id = orders.user_id
JoinClause syntax diagram References: FromSource, WhereClause

WhereClause

active = true AND age > 18
WhereClause syntax diagram References: Condition

Condition

age BETWEEN 10 AND 100
Condition syntax diagram References: Expression, PredicateTail, WhereClause

PredicateTail

IN (SELECT id FROM users)
PredicateTail syntax diagram References: Expression, InSource

InSource

(SELECT id FROM users)
InSource syntax diagram References: Expression, Identifier, Subquery

Expression

price * quantity + tax
Expression syntax diagram

Operators

Binary operators supported in scalar expressions, listed from highest to lowest precedence.
PowerSync evaluates all binary operators with equal precedence (left to right). Use parentheses to control evaluation order.
PrecedenceOperatorsDescription
1||String concatenation
2* / %Multiplication, division, modulo
3+ -Addition, subtraction
4& | << >>Bitwise AND, OR, left/right shift
5< > <= >=Less than, greater than, etc.
6= !=Equal, not equal
References: PrimaryExpression, PropertyAccess

PropertyAccess

->'address'->>'city'
PropertyAccess syntax diagram References: IntegerLiteral, StringLiteral

PrimaryExpression

(price + tax)
PrimaryExpression syntax diagram References: CaseExpression, CastExpression, Expression, FunctionCall, NumericLiteral, Reference, StringLiteral

CaseExpression

CASE WHEN age >= 18 THEN 'adult' ELSE 'minor' END
CaseExpression syntax diagram References: SearchedCase, SimpleCase

SearchedCase

CASE WHEN x > 0 THEN 'positive' ELSE 'negative' END
SearchedCase syntax diagram References: Expression, WhenClause

WhenClause

WHEN age >= 18 THEN 'adult'
WhenClause syntax diagram References: CaseCondition, Expression, WhenClause

CaseCondition

x > 0 AND y IS NOT NULL
CaseCondition syntax diagram References: Condition

SimpleCase

CASE status WHEN 1 THEN 'active' WHEN 0 THEN 'inactive' END
SimpleCase syntax diagram References: Expression, WhenValueClause

WhenValueClause

WHEN 1 THEN 'active'
WhenValueClause syntax diagram References: Expression, WhenValueClause

CastExpression

CAST(age AS TEXT)
CastExpression syntax diagram References: Expression

FunctionCall

upper(name)
FunctionCall syntax diagram References: Expression, Reference

Subquery

SELECT id FROM orders WHERE orders.user_id = users.id
Subquery syntax diagram References: FromSource, JoinClause, SelectItem, WhereClause

CteDefinition

SELECT id, upper(name) AS display_name FROM users WHERE active = true
CteDefinition syntax diagram References: Expression, FromSource, Identifier, JoinClause, WhereClause

Lexical Rules

TokenExamplesRule
Identifieruser_id, MY_TABLE, "Column Name", "with ""quotes"" inside"[A-Z_] ([A-Z_0-9])*
StringLiteral'hello', 'it''s', ''"'" ([\x20-\x26] | [\x28-\x7E])* "'"
IntegerLiteral0, 42, 12345([0-9])+
NumericLiteral3.14, 42, 0.5([0-9])+ ("." ([0-9])+)?

Identifier

Bare identifiers are normalized to lower case and may contain letters, digits, and underscores. Double-quoted identifiers (“name”) allow any printable character and support escaped quotes ("").

StringLiteral

Single-quoted string literal. Embedded single quotes are escaped by doubling them (”).

IntegerLiteral

One or more decimal digits (0-9).

NumericLiteral

Decimal number: one or more digits with an optional fractional part (.digits).