diff --git a/src/main/kotlin/kestrel/sql/lexer/Lexer.kt b/src/main/kotlin/kestrel/sql/lexer/Lexer.kt index 3ff5380..b1094aa 100644 Binary files a/src/main/kotlin/kestrel/sql/lexer/Lexer.kt and b/src/main/kotlin/kestrel/sql/lexer/Lexer.kt differ diff --git a/src/main/kotlin/kestrel/sql/lexer/Token.kt b/src/main/kotlin/kestrel/sql/lexer/Token.kt index 105ad56..da85448 100644 --- a/src/main/kotlin/kestrel/sql/lexer/Token.kt +++ b/src/main/kotlin/kestrel/sql/lexer/Token.kt @@ -3,14 +3,28 @@ package kestrel.sql.lexer enum class TokenType { Identifier, IntLiteral, RealLiteral, TextLiteral, Create, Table, Insert, Into, Values, Select, From, Where, - Order, By, Asc, Desc, Limit, Delete, Update, Set, Drop, + Order, By, Asc, Desc, Limit, Offset, Delete, Update, Set, Drop, Truncate, Identity, Continue, + Alter, Add, Column, Rename, To, Default, And, Or, Not, Null, True, False, Primary, Key, As, - Index, On, Inner, Left, Outer, Join, Group, Having, - Begin, Commit, Rollback, Transaction, Explain, - Integer, Text, Boolean, Real, + Index, On, Inner, Left, Right, Full, Cross, Outer, Join, Lateral, Group, Having, Over, Partition, + Rows, Row, Range, Groups, Preceding, Following, Unbounded, Current, Exclude, Ties, Others, + Begin, Commit, Rollback, Transaction, Explain, Savepoint, Release, + Conflict, Nothing, Do, Returning, + Trigger, Before, After, For, Each, + Is, In, Between, Like, Case, When, Then, Else, End, Exists, View, Replace, + Union, All, Intersect, Except, With, Recursive, Distinct, + Cast, Cascade, Restrict, References, Foreign, Check, No, Action, Unique, Constraint, + Sequence, Increment, Minvalue, Maxvalue, Start, Cycle, Restart, + Merge, Using, Matched, + Prepare, Execute, Deallocate, + Temp, Temporary, + Collate, + Integer, Text, Boolean, Real, Decimal, Date, Equal, NotEqual, Less, LessEqual, Greater, GreaterEqual, Plus, Minus, Star, Slash, Dot, LeftParen, RightParen, Comma, Semicolon, + /** `$1`, `$2`, ... - see [kestrel.sql.ast.ParameterExpression]. [Token.intValue] carries the 1-based index. */ + Parameter, EndOfInput } @@ -38,10 +52,20 @@ internal val keywords: Map = mapOf( "ASC" to TokenType.Asc, "DESC" to TokenType.Desc, "LIMIT" to TokenType.Limit, + "OFFSET" to TokenType.Offset, "DELETE" to TokenType.Delete, "UPDATE" to TokenType.Update, "SET" to TokenType.Set, "DROP" to TokenType.Drop, + "TRUNCATE" to TokenType.Truncate, + "IDENTITY" to TokenType.Identity, + "CONTINUE" to TokenType.Continue, + "ALTER" to TokenType.Alter, + "ADD" to TokenType.Add, + "COLUMN" to TokenType.Column, + "RENAME" to TokenType.Rename, + "TO" to TokenType.To, + "DEFAULT" to TokenType.Default, "AND" to TokenType.And, "OR" to TokenType.Or, "NOT" to TokenType.Not, @@ -55,17 +79,92 @@ internal val keywords: Map = mapOf( "ON" to TokenType.On, "INNER" to TokenType.Inner, "LEFT" to TokenType.Left, + "RIGHT" to TokenType.Right, + "FULL" to TokenType.Full, + "CROSS" to TokenType.Cross, "OUTER" to TokenType.Outer, "JOIN" to TokenType.Join, + "LATERAL" to TokenType.Lateral, "GROUP" to TokenType.Group, "HAVING" to TokenType.Having, + "OVER" to TokenType.Over, + "PARTITION" to TokenType.Partition, + "ROWS" to TokenType.Rows, + "ROW" to TokenType.Row, + "RANGE" to TokenType.Range, + "GROUPS" to TokenType.Groups, + "PRECEDING" to TokenType.Preceding, + "FOLLOWING" to TokenType.Following, + "UNBOUNDED" to TokenType.Unbounded, + "CURRENT" to TokenType.Current, + "EXCLUDE" to TokenType.Exclude, + "TIES" to TokenType.Ties, + "OTHERS" to TokenType.Others, "BEGIN" to TokenType.Begin, "COMMIT" to TokenType.Commit, "ROLLBACK" to TokenType.Rollback, "TRANSACTION" to TokenType.Transaction, "EXPLAIN" to TokenType.Explain, + "SAVEPOINT" to TokenType.Savepoint, + "RELEASE" to TokenType.Release, + "CONFLICT" to TokenType.Conflict, + "NOTHING" to TokenType.Nothing, + "DO" to TokenType.Do, + "RETURNING" to TokenType.Returning, + "TRIGGER" to TokenType.Trigger, + "BEFORE" to TokenType.Before, + "AFTER" to TokenType.After, + "FOR" to TokenType.For, + "EACH" to TokenType.Each, "INTEGER" to TokenType.Integer, "TEXT" to TokenType.Text, "BOOLEAN" to TokenType.Boolean, - "REAL" to TokenType.Real + "REAL" to TokenType.Real, + "IS" to TokenType.Is, + "IN" to TokenType.In, + "BETWEEN" to TokenType.Between, + "LIKE" to TokenType.Like, + "CASE" to TokenType.Case, + "WHEN" to TokenType.When, + "THEN" to TokenType.Then, + "ELSE" to TokenType.Else, + "END" to TokenType.End, + "EXISTS" to TokenType.Exists, + "VIEW" to TokenType.View, + "REPLACE" to TokenType.Replace, + "UNION" to TokenType.Union, + "ALL" to TokenType.All, + "INTERSECT" to TokenType.Intersect, + "EXCEPT" to TokenType.Except, + "WITH" to TokenType.With, + "RECURSIVE" to TokenType.Recursive, + "DISTINCT" to TokenType.Distinct, + "CAST" to TokenType.Cast, + "CASCADE" to TokenType.Cascade, + "RESTRICT" to TokenType.Restrict, + "DECIMAL" to TokenType.Decimal, + "DATE" to TokenType.Date, + "REFERENCES" to TokenType.References, + "FOREIGN" to TokenType.Foreign, + "CHECK" to TokenType.Check, + "NO" to TokenType.No, + "ACTION" to TokenType.Action, + "UNIQUE" to TokenType.Unique, + "CONSTRAINT" to TokenType.Constraint, + "SEQUENCE" to TokenType.Sequence, + "INCREMENT" to TokenType.Increment, + "MINVALUE" to TokenType.Minvalue, + "MAXVALUE" to TokenType.Maxvalue, + "START" to TokenType.Start, + "CYCLE" to TokenType.Cycle, + "RESTART" to TokenType.Restart, + "MERGE" to TokenType.Merge, + "USING" to TokenType.Using, + "MATCHED" to TokenType.Matched, + "PREPARE" to TokenType.Prepare, + "EXECUTE" to TokenType.Execute, + "DEALLOCATE" to TokenType.Deallocate, + "TEMP" to TokenType.Temp, + "TEMPORARY" to TokenType.Temporary, + "COLLATE" to TokenType.Collate )