diff --git a/src/main/kotlin/kestrel/engine/SelectRunner.kt b/src/main/kotlin/kestrel/engine/SelectRunner.kt index 6ce7ac9..39ead65 100644 --- a/src/main/kotlin/kestrel/engine/SelectRunner.kt +++ b/src/main/kotlin/kestrel/engine/SelectRunner.kt @@ -2,34 +2,76 @@ package kestrel.engine import kestrel.KestrelException import kestrel.catalog.Catalog +import kestrel.catalog.Column import kestrel.catalog.TableSchema +import kestrel.sql.ast.BetweenExpression import kestrel.sql.ast.BinaryExpression import kestrel.sql.ast.BinaryOperator +import kestrel.sql.ast.CallExpression +import kestrel.sql.ast.CaseExpression +import kestrel.sql.ast.CastExpression +import kestrel.sql.ast.CollateExpression import kestrel.sql.ast.ColumnExpression +import kestrel.sql.ast.CommonTableExpression +import kestrel.sql.ast.CurrentValueExpression +import kestrel.sql.ast.ExistsExpression import kestrel.sql.ast.Expression import kestrel.sql.ast.ExpressionProjection +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.InExpression +import kestrel.sql.ast.InSubqueryExpression +import kestrel.sql.ast.IsNullExpression import kestrel.sql.ast.JoinClause import kestrel.sql.ast.JoinType +import kestrel.sql.ast.LikeExpression import kestrel.sql.ast.LiteralExpression +import kestrel.sql.ast.MergeActionExpression +import kestrel.sql.ast.NextValueExpression +import kestrel.sql.ast.ParameterExpression +import kestrel.sql.ast.OrderKey +import kestrel.sql.ast.QueryStatement +import kestrel.sql.ast.ScalarSubqueryExpression import kestrel.sql.ast.SelectItem import kestrel.sql.ast.SelectStatement +import kestrel.sql.ast.SetOperationStatement +import kestrel.sql.ast.SetOperator import kestrel.sql.ast.StarProjection +import kestrel.sql.ast.SubquerySource +import kestrel.sql.ast.TableSource import kestrel.sql.ast.UnaryExpression +import kestrel.sql.ast.WindowExpression +import kestrel.sql.ast.WindowFrame +import kestrel.sql.ast.WindowFunctionKind +import kestrel.sql.ast.WithQuery +import kestrel.storage.Collation +import kestrel.storage.ColumnType import kestrel.storage.Row import kestrel.storage.Value -import kestrel.storage.ValueOrdering +import kestrel.storage.displayWith +import java.math.BigDecimal class SelectRunner(private val catalog: Catalog) { private val indexPlanner = IndexAccessPlanner(catalog) + private val subqueryRunner = SubqueryRunner { select, outer -> run(select, outer) } + private val expandingViews = mutableSetOf() + private val activeCtes = mutableListOf() - fun run(statement: SelectStatement): SelectResult { - val plan = buildPlan(statement) + fun run(statement: SelectStatement, outer: ColumnResolver? = null): SelectResult { + val plan = buildPlan(statement, outer) val combined = plan.materialize() return if (plan.aggregated) plan.aggregate(combined) else plan.projectRows(combined) } - fun explain(statement: SelectStatement): List = buildPlan(statement).describe() + fun runQuery(query: QueryStatement, outer: ColumnResolver? = null): SelectResult = when (query) { + is SelectStatement -> run(query, outer) + is SetOperationStatement -> runSetOperation(query, outer) + is WithQuery -> runWith(query, outer) + } private fun buildPlan(statement: SelectStatement): Plan { val sources = buildSources(statement)