# Simple select all

SELECT * FROM test

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident))

# Select specific fields

SELECT name, age FROM person

==>

SurrealQL(SelectStatement(Keyword,Fields(Predicate(Ident),Predicate(Ident)),Keyword,Ident))

# Select with alias

SELECT name AS n FROM person

==>

SurrealQL(SelectStatement(Keyword,Fields(Predicate(Ident,Keyword,Ident)),Keyword,Ident))

# Select VALUE

SELECT VALUE name FROM person

==>

SurrealQL(SelectStatement(Keyword,Fields(Keyword,Predicate(Ident)),Keyword,Ident))

# Select ONLY

SELECT * FROM ONLY person:tobie

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Keyword,RecordId(RecordTbIdent,Colon,RecordIdIdent)))

# Select with WHERE

SELECT * FROM person WHERE age > 18

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,WhereClause(Keyword,BinaryExpression(Ident,Operator,Number(Int)))))

# Select with ORDER BY

SELECT * FROM person ORDER BY name ASC

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,OrderClause(Keyword,Keyword,Order(Idiom(Ident),Keyword))))

# Select with ORDER BY DESC

SELECT * FROM person ORDER BY age DESC

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,OrderClause(Keyword,Keyword,Order(Idiom(Ident),Keyword))))

# Select with GROUP BY

SELECT count() FROM person GROUP BY age

==>

SurrealQL(SelectStatement(Keyword,Fields(Predicate(FunctionCall(FunctionName,ArgumentList))),Keyword,Ident,GroupClause(Keyword,Keyword,Idiom(Ident))))

# Select with GROUP ALL

SELECT count() FROM person GROUP ALL

==>

SurrealQL(SelectStatement(Keyword,Fields(Predicate(FunctionCall(FunctionName,ArgumentList))),Keyword,Ident,GroupClause(Keyword,Keyword)))

# Select with LIMIT

SELECT * FROM person LIMIT 10

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,LimitStartComboClause(LimitClause(Keyword,Number(Int)))))

# Select with LIMIT BY

SELECT * FROM person LIMIT BY 10

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,LimitStartComboClause(LimitClause(Keyword,Keyword,Number(Int)))))

# Select with START

SELECT * FROM person START 5

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,LimitStartComboClause(StartClause(Keyword,Number(Int)))))

# Select with START AT

SELECT * FROM person START AT 5

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,LimitStartComboClause(StartClause(Keyword,Keyword,Number(Int)))))

# Select with LIMIT and START

SELECT * FROM person LIMIT 10 START 5

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,LimitStartComboClause(LimitClause(Keyword,Number(Int)),StartClause(Keyword,Number(Int)))))

# Select with FETCH

SELECT * FROM person FETCH posts

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,FetchClause(Keyword,Idiom(Ident))))

# Select with SPLIT

SELECT * FROM person SPLIT emails

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,SplitClause(Keyword,Idiom(Ident))))

# Select with OMIT

SELECT * OMIT password FROM person

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),OmitClause(Keyword,Predicate(Ident)),Keyword,Ident))

# Select with WITH INDEX

SELECT * FROM person WITH INDEX idx_name

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,WithClause(Keyword,Keyword,Ident)))

# Select with WITH NOINDEX

SELECT * FROM person WITH NOINDEX

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,WithClause(Keyword,Keyword)))

# Select with EXPLAIN

SELECT * FROM person EXPLAIN

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,ExplainClause(Keyword)))

# Select with EXPLAIN FULL

SELECT * FROM person EXPLAIN FULL

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,ExplainClause(Keyword,Literal)))

# Select with PARALLEL

SELECT * FROM person PARALLEL

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,ParallelClause(Keyword)))

# Select with TEMPFILES

SELECT * FROM person TEMPFILES

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,TempfilesClause(Keyword)))

# Select with TIMEOUT

SELECT * FROM person TIMEOUT 5s

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,TimeoutClause(Keyword,Duration(DurationPart))))

# Select with VERSION

SELECT * FROM person VERSION d'2024-10-10T14:37:08.444Z'

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,VersionClause(Keyword,String)))

# Select with multiple clauses

SELECT * FROM person WHERE age > 18 ORDER BY name LIMIT 10

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,WhereClause(Keyword,BinaryExpression(Ident,Operator,Number(Int))),OrderClause(Keyword,Keyword,Order(Idiom(Ident))),LimitStartComboClause(LimitClause(Keyword,Number(Int)))))

# Select from multiple targets

SELECT * FROM person, animal

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,Ident,Ident))

# Select from subquery

SELECT * FROM (SELECT * FROM person)

==>

SurrealQL(SelectStatement(Keyword,Fields(Any),Keyword,SubQuery(SelectStatement(Keyword,Fields(Any),Keyword,Ident))))
