feat(parser): extend Parser
This commit is contained in:
1 parent
cfabe95271
commit
63bc1c01ba
1 file changed
+113
-4
@@ -1,38 +1,119 @@
|
|||||||
package kestrel.sql.parser
|
package kestrel.sql.parser
|
||||||
|
|
||||||
import kestrel.ParseException
|
import kestrel.ParseException
|
||||||
|
import kestrel.catalog.CheckConstraint
|
||||||
import kestrel.catalog.Column
|
import kestrel.catalog.Column
|
||||||
|
import kestrel.catalog.ForeignKeyAction
|
||||||
|
import kestrel.catalog.ForeignKeyConstraint
|
||||||
|
import kestrel.catalog.UniqueConstraint
|
||||||
|
import kestrel.sql.ast.AddColumn
|
||||||
|
import kestrel.sql.ast.AddConstraint
|
||||||
|
import kestrel.sql.ast.AddedCheck
|
||||||
|
import kestrel.sql.ast.AddedConstraint
|
||||||
|
import kestrel.sql.ast.AddedForeignKey
|
||||||
|
import kestrel.sql.ast.AddedUnique
|
||||||
|
import kestrel.sql.ast.AlterSequenceStatement
|
||||||
|
import kestrel.sql.ast.AlterTableAction
|
||||||
|
import kestrel.sql.ast.AlterTableStatement
|
||||||
import kestrel.sql.ast.Assignment
|
import kestrel.sql.ast.Assignment
|
||||||
import kestrel.sql.ast.BeginStatement
|
import kestrel.sql.ast.BeginStatement
|
||||||
|
import kestrel.sql.ast.BetweenExpression
|
||||||
import kestrel.sql.ast.BinaryExpression
|
import kestrel.sql.ast.BinaryExpression
|
||||||
import kestrel.sql.ast.BinaryOperator
|
import kestrel.sql.ast.BinaryOperator
|
||||||
|
import kestrel.sql.ast.CallExpression
|
||||||
|
import kestrel.sql.ast.CaseBranch
|
||||||
|
import kestrel.sql.ast.CaseExpression
|
||||||
|
import kestrel.sql.ast.CastExpression
|
||||||
|
import kestrel.sql.ast.ChangeColumnType
|
||||||
|
import kestrel.sql.ast.CollateExpression
|
||||||
import kestrel.sql.ast.ColumnExpression
|
import kestrel.sql.ast.ColumnExpression
|
||||||
import kestrel.sql.ast.CommitStatement
|
import kestrel.sql.ast.CommitStatement
|
||||||
|
import kestrel.sql.ast.CommonTableExpression
|
||||||
|
import kestrel.sql.ast.ConflictAction
|
||||||
|
import kestrel.sql.ast.ConflictDoNothing
|
||||||
|
import kestrel.sql.ast.ConflictDoUpdate
|
||||||
import kestrel.sql.ast.CreateIndexStatement
|
import kestrel.sql.ast.CreateIndexStatement
|
||||||
|
import kestrel.sql.ast.CreateSequenceStatement
|
||||||
import kestrel.sql.ast.CreateTableStatement
|
import kestrel.sql.ast.CreateTableStatement
|
||||||
|
import kestrel.sql.ast.CreateTriggerStatement
|
||||||
|
import kestrel.sql.ast.CreateViewStatement
|
||||||
|
import kestrel.sql.ast.CubeSpec
|
||||||
|
import kestrel.sql.ast.CurrentValueExpression
|
||||||
|
import kestrel.sql.ast.DeallocateStatement
|
||||||
import kestrel.sql.ast.DeleteStatement
|
import kestrel.sql.ast.DeleteStatement
|
||||||
|
import kestrel.sql.ast.DropColumn
|
||||||
|
import kestrel.sql.ast.DropConstraint
|
||||||
import kestrel.sql.ast.DropIndexStatement
|
import kestrel.sql.ast.DropIndexStatement
|
||||||
|
import kestrel.sql.ast.DropMode
|
||||||
|
import kestrel.sql.ast.DropSequenceStatement
|
||||||
import kestrel.sql.ast.DropTableStatement
|
import kestrel.sql.ast.DropTableStatement
|
||||||
|
import kestrel.sql.ast.DropTriggerStatement
|
||||||
|
import kestrel.sql.ast.DropViewStatement
|
||||||
|
import kestrel.sql.ast.ExecuteStatement
|
||||||
import kestrel.sql.ast.Expression
|
import kestrel.sql.ast.Expression
|
||||||
import kestrel.sql.ast.ExpressionProjection
|
import kestrel.sql.ast.ExpressionProjection
|
||||||
|
import kestrel.sql.ast.ExistsExpression
|
||||||
import kestrel.sql.ast.ExplainStatement
|
import kestrel.sql.ast.ExplainStatement
|
||||||
|
import kestrel.sql.ast.FrameBound
|
||||||
|
import kestrel.sql.ast.FrameBoundType
|
||||||
|
import kestrel.sql.ast.FrameExclude
|
||||||
|
import kestrel.sql.ast.FrameUnit
|
||||||
|
import kestrel.sql.ast.FromItem
|
||||||
import kestrel.sql.ast.FunctionExpression
|
import kestrel.sql.ast.FunctionExpression
|
||||||
|
import kestrel.sql.ast.GroupingSetsSpec
|
||||||
|
import kestrel.sql.ast.GroupingSpec
|
||||||
|
import kestrel.sql.ast.InExpression
|
||||||
|
import kestrel.sql.ast.InSubqueryExpression
|
||||||
import kestrel.sql.ast.InsertStatement
|
import kestrel.sql.ast.InsertStatement
|
||||||
|
import kestrel.sql.ast.IsNullExpression
|
||||||
import kestrel.sql.ast.JoinClause
|
import kestrel.sql.ast.JoinClause
|
||||||
import kestrel.sql.ast.JoinType
|
import kestrel.sql.ast.JoinType
|
||||||
|
import kestrel.sql.ast.LikeExpression
|
||||||
import kestrel.sql.ast.LiteralExpression
|
import kestrel.sql.ast.LiteralExpression
|
||||||
|
import kestrel.sql.ast.MergeActionExpression
|
||||||
|
import kestrel.sql.ast.MergeMatchedDelete
|
||||||
|
import kestrel.sql.ast.MergeMatchedUpdate
|
||||||
|
import kestrel.sql.ast.MergeNotMatchedInsert
|
||||||
|
import kestrel.sql.ast.MergeStatement
|
||||||
|
import kestrel.sql.ast.MergeWhenClause
|
||||||
|
import kestrel.sql.ast.NextValueExpression
|
||||||
|
import kestrel.sql.ast.OnConflictClause
|
||||||
import kestrel.sql.ast.OrderBy
|
import kestrel.sql.ast.OrderBy
|
||||||
|
import kestrel.sql.ast.OrderKey
|
||||||
|
import kestrel.sql.ast.ParameterExpression
|
||||||
|
import kestrel.sql.ast.PrepareStatement
|
||||||
|
import kestrel.sql.ast.PreparableStatement
|
||||||
import kestrel.sql.ast.Projection
|
import kestrel.sql.ast.Projection
|
||||||
|
import kestrel.sql.ast.QueryStatement
|
||||||
|
import kestrel.sql.ast.ReleaseSavepointStatement
|
||||||
|
import kestrel.sql.ast.RenameColumn
|
||||||
|
import kestrel.sql.ast.RenameTable
|
||||||
import kestrel.sql.ast.RollbackStatement
|
import kestrel.sql.ast.RollbackStatement
|
||||||
|
import kestrel.sql.ast.RollbackToSavepointStatement
|
||||||
|
import kestrel.sql.ast.RollupSpec
|
||||||
|
import kestrel.sql.ast.SavepointStatement
|
||||||
|
import kestrel.sql.ast.ScalarSubqueryExpression
|
||||||
import kestrel.sql.ast.SelectItem
|
import kestrel.sql.ast.SelectItem
|
||||||
import kestrel.sql.ast.SelectStatement
|
import kestrel.sql.ast.SelectStatement
|
||||||
|
import kestrel.sql.ast.SetOperationStatement
|
||||||
|
import kestrel.sql.ast.SetOperator
|
||||||
import kestrel.sql.ast.StarProjection
|
import kestrel.sql.ast.StarProjection
|
||||||
import kestrel.sql.ast.Statement
|
import kestrel.sql.ast.Statement
|
||||||
|
import kestrel.sql.ast.SubquerySource
|
||||||
|
import kestrel.sql.ast.TableSource
|
||||||
|
import kestrel.sql.ast.TruncateTableStatement
|
||||||
|
import kestrel.sql.ast.TriggerEvent
|
||||||
|
import kestrel.sql.ast.TriggerTiming
|
||||||
import kestrel.sql.ast.UnaryExpression
|
import kestrel.sql.ast.UnaryExpression
|
||||||
import kestrel.sql.ast.UnaryOperator
|
import kestrel.sql.ast.UnaryOperator
|
||||||
import kestrel.sql.ast.UpdateStatement
|
import kestrel.sql.ast.UpdateStatement
|
||||||
|
import kestrel.sql.ast.WindowExpression
|
||||||
|
import kestrel.sql.ast.WindowFrame
|
||||||
|
import kestrel.sql.ast.WindowFunctionKind
|
||||||
|
import kestrel.sql.ast.WithQuery
|
||||||
import kestrel.sql.lexer.Token
|
import kestrel.sql.lexer.Token
|
||||||
import kestrel.sql.lexer.TokenType
|
import kestrel.sql.lexer.TokenType
|
||||||
|
import kestrel.storage.Collation
|
||||||
import kestrel.storage.ColumnType
|
import kestrel.storage.ColumnType
|
||||||
import kestrel.storage.Value
|
import kestrel.storage.Value
|
||||||
|
|
||||||
@@ -56,24 +137,52 @@ class Parser(private val tokens: List<Token>) {
|
|||||||
return when (token.type) {
|
return when (token.type) {
|
||||||
TokenType.Create -> parseCreate()
|
TokenType.Create -> parseCreate()
|
||||||
TokenType.Insert -> parseInsert()
|
TokenType.Insert -> parseInsert()
|
||||||
TokenType.Select -> parseSelect()
|
TokenType.Select -> parseQueryStatement()
|
||||||
|
TokenType.With -> parseQueryStatement()
|
||||||
TokenType.Delete -> parseDelete()
|
TokenType.Delete -> parseDelete()
|
||||||
TokenType.Update -> parseUpdate()
|
TokenType.Update -> parseUpdate()
|
||||||
TokenType.Drop -> parseDrop()
|
TokenType.Drop -> parseDrop()
|
||||||
|
TokenType.Truncate -> parseTruncate()
|
||||||
|
TokenType.Merge -> parseMerge()
|
||||||
|
TokenType.Alter -> parseAlter()
|
||||||
TokenType.Explain -> parseExplain()
|
TokenType.Explain -> parseExplain()
|
||||||
TokenType.Begin -> parseBegin()
|
TokenType.Begin -> parseBegin()
|
||||||
TokenType.Commit -> parseCommit()
|
TokenType.Commit -> parseCommit()
|
||||||
TokenType.Rollback -> parseRollback()
|
TokenType.Rollback -> parseRollback()
|
||||||
|
TokenType.Savepoint -> parseSavepoint()
|
||||||
|
TokenType.Release -> parseReleaseSavepoint()
|
||||||
|
TokenType.Prepare -> parsePrepare()
|
||||||
|
TokenType.Execute -> parseExecute()
|
||||||
|
TokenType.Deallocate -> parseDeallocate()
|
||||||
else -> throw error("expected a statement but found '${describe(token)}'", token)
|
else -> throw error("expected a statement but found '${describe(token)}'", token)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun parseCreate(): Statement {
|
private fun parseCreate(): Statement {
|
||||||
expect(TokenType.Create, "expected CREATE")
|
expect(TokenType.Create, "expected CREATE")
|
||||||
|
var orReplace = false
|
||||||
|
if (match(TokenType.Or)) {
|
||||||
|
expect(TokenType.Replace, "expected REPLACE after OR")
|
||||||
|
orReplace = true
|
||||||
|
}
|
||||||
|
if (orReplace && !check(TokenType.View)) {
|
||||||
|
throw error("OR REPLACE is only supported for VIEW but found '${describe(peek())}'", peek())
|
||||||
|
}
|
||||||
|
val temporary = match(TokenType.Temp) || match(TokenType.Temporary)
|
||||||
|
if (temporary && !check(TokenType.Table)) {
|
||||||
|
throw error("TEMP/TEMPORARY is only supported for TABLE but found '${describe(peek())}'", peek())
|
||||||
|
}
|
||||||
return when {
|
return when {
|
||||||
check(TokenType.Table) -> parseCreateTable()
|
check(TokenType.Table) -> parseCreateTable(temporary)
|
||||||
check(TokenType.Index) -> parseCreateIndex()
|
check(TokenType.Index) -> parseCreateIndex(unique = false)
|
||||||
else -> throw error("expected TABLE or INDEX after CREATE but found '${describe(peek())}'", peek())
|
check(TokenType.Unique) -> parseCreateUniqueIndex()
|
||||||
|
check(TokenType.View) -> parseCreateView(orReplace)
|
||||||
|
check(TokenType.Trigger) -> parseCreateTrigger()
|
||||||
|
check(TokenType.Sequence) -> parseCreateSequence()
|
||||||
|
else -> throw error(
|
||||||
|
"expected TABLE, INDEX, UNIQUE INDEX, VIEW, TRIGGER, or SEQUENCE after CREATE but found '${describe(peek())}'",
|
||||||
|
peek()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user