From 7966ecba12b79aaf3fb591a6f9c23a0b01e8c201 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Mon, 24 Aug 2026 14:13:34 +0200 Subject: [PATCH] feat: define SQL AST node types --- src/main/kotlin/kestrel/sql/ast/Ast.kt | 103 +++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/main/kotlin/kestrel/sql/ast/Ast.kt diff --git a/src/main/kotlin/kestrel/sql/ast/Ast.kt b/src/main/kotlin/kestrel/sql/ast/Ast.kt new file mode 100644 index 0000000..3c9ec59 --- /dev/null +++ b/src/main/kotlin/kestrel/sql/ast/Ast.kt @@ -0,0 +1,103 @@ +package kestrel.sql.ast + +import kestrel.catalog.Column +import kestrel.storage.Value + +sealed interface Statement + +data class CreateTableStatement(val tableName: String, val columns: List) : Statement + +data class DropTableStatement(val tableName: String) : Statement + +data class CreateIndexStatement( + val indexName: String, + val tableName: String, + val columnName: String +) : Statement + +data class DropIndexStatement(val indexName: String) : Statement + +data class InsertStatement( + val tableName: String, + val columns: List?, + val rows: List> +) : Statement + +data class SelectStatement( + val projection: Projection, + val tableName: String, + val tableAlias: String? = null, + val joins: List = emptyList(), + val where: Expression? = null, + val groupBy: List = emptyList(), + val having: Expression? = null, + val orderBy: OrderBy? = null, + val limit: Int? = null +) : Statement + +data class DeleteStatement(val tableName: String, val where: Expression?) : Statement + +data class UpdateStatement( + val tableName: String, + val assignments: List, + val where: Expression? +) : Statement + +data class ExplainStatement(val select: SelectStatement) : Statement + +data object BeginStatement : Statement + +data object CommitStatement : Statement + +data object RollbackStatement : Statement + +data class Assignment(val columnName: String, val value: Expression) + +enum class JoinType { Inner, Left } + +data class JoinClause( + val type: JoinType, + val tableName: String, + val alias: String?, + val on: Expression +) + +sealed interface Projection + +data object StarProjection : Projection + +data class ExpressionProjection(val items: List) : Projection + +data class SelectItem(val expression: Expression, val alias: String?) + +data class OrderBy(val expression: Expression, val descending: Boolean) + +sealed interface Expression + +data class LiteralExpression(val value: Value) : Expression + +data class ColumnExpression(val name: String, val qualifier: String? = null) : Expression + +data class FunctionExpression( + val name: String, + val argument: Expression?, + val star: Boolean +) : Expression + +data class BinaryExpression( + val operator: BinaryOperator, + val left: Expression, + val right: Expression +) : Expression + +data class UnaryExpression(val operator: UnaryOperator, val operand: Expression) : Expression + +enum class BinaryOperator(val symbol: String) { + Add("+"), Subtract("-"), Multiply("*"), Divide("/"), + Equal("="), NotEqual("<>"), Less("<"), LessEqual("<="), + Greater(">"), GreaterEqual(">="), And("AND"), Or("OR") +} + +enum class UnaryOperator(val symbol: String) { + Negate("-"), Not("NOT") +}