@@ -62,6 +62,12 @@ import org.partiql.planner.internal.ir.builder.RexOpTupleUnionBuilder
6262import org.partiql.planner.internal.ir.builder.RexOpVarGlobalBuilder
6363import org.partiql.planner.internal.ir.builder.RexOpVarLocalBuilder
6464import org.partiql.planner.internal.ir.builder.RexOpVarUnresolvedBuilder
65+ import org.partiql.planner.internal.ir.builder.StatementDdlAttributeBuilder
66+ import org.partiql.planner.internal.ir.builder.StatementDdlBuilder
67+ import org.partiql.planner.internal.ir.builder.StatementDdlCommandCreateTableBuilder
68+ import org.partiql.planner.internal.ir.builder.StatementDdlConstraintCheckBuilder
69+ import org.partiql.planner.internal.ir.builder.StatementDdlPartitionByAttrListBuilder
70+ import org.partiql.planner.internal.ir.builder.StatementDdlTablePropertyBuilder
6571import org.partiql.planner.internal.ir.builder.StatementQueryBuilder
6672import org.partiql.planner.internal.ir.visitor.PlanVisitor
6773import org.partiql.planner.internal.typer.CompilerType
@@ -73,6 +79,7 @@ import org.partiql.spi.function.Function
7379import org.partiql.value.PartiQLValue
7480import org.partiql.value.PartiQLValueExperimental
7581import kotlin.random.Random
82+ import org.partiql.types.shape.PShape
7683
7784internal abstract class PlanNode {
7885 @JvmField
@@ -177,6 +184,7 @@ internal sealed class Ref : PlanNode() {
177184internal sealed class Statement : PlanNode () {
178185 public override fun <R , C > accept (visitor : PlanVisitor <R , C >, ctx : C ): R = when (this ) {
179186 is Query -> visitor.visitStatementQuery(this , ctx)
187+ is DDL -> visitor.visitStatementDDL(this , ctx)
180188 }
181189
182190 internal data class Query (
@@ -195,6 +203,169 @@ internal sealed class Statement : PlanNode() {
195203 internal fun builder (): StatementQueryBuilder = StatementQueryBuilder ()
196204 }
197205 }
206+
207+ internal data class DDL (
208+ @JvmField
209+ internal val command : Command ,
210+ ) : Statement() {
211+ override val children: List <PlanNode > by lazy {
212+ val kids = mutableListOf<PlanNode ?>()
213+ kids.add(command)
214+ kids.filterNotNull()
215+ }
216+
217+
218+ override fun <R , C > accept (visitor : PlanVisitor <R , C >, ctx : C ): R =
219+ visitor.visitStatementDDL(this , ctx)
220+
221+ sealed class Command : PlanNode () {
222+ override fun <R , C > accept (visitor : PlanVisitor <R , C >, ctx : C ): R = when (this ) {
223+ is CreateTable -> visitor.visitStatementDDLCommandCreateTable(this , ctx)
224+ }
225+
226+ internal data class CreateTable (
227+ @JvmField
228+ internal val name : Identifier ,
229+ @JvmField
230+ internal val attributes : List <Attribute >,
231+ @JvmField
232+ internal val tblConstraints : List <Constraint >,
233+ @JvmField
234+ internal val partitionBy : PartitionBy ? ,
235+ @JvmField
236+ internal val tableProperties : List <TableProperty >,
237+ @JvmField
238+ internal val primaryKey : List <Identifier >,
239+ @JvmField
240+ internal val unique : List <Identifier >,
241+ ) : Command() {
242+ override val children: List <PlanNode > by lazy {
243+ val kids = mutableListOf<PlanNode ?>()
244+ kids.addAll(attributes)
245+ kids.addAll(tblConstraints)
246+ partitionBy?.let { kids.add(it) }
247+ kids.addAll(tableProperties)
248+ kids.filterNotNull()
249+ }
250+
251+
252+ override fun <R , C > accept (visitor : PlanVisitor <R , C >, ctx : C ): R =
253+ visitor.visitStatementDDLCommandCreateTable(this , ctx)
254+
255+ internal companion object {
256+ @JvmStatic
257+ internal fun builder (): StatementDdlCommandCreateTableBuilder =
258+ StatementDdlCommandCreateTableBuilder ()
259+ }
260+ }
261+ }
262+
263+ internal data class Attribute (
264+ @JvmField
265+ internal val name : Identifier ,
266+ @JvmField
267+ internal val type : PShape ,
268+ @JvmField
269+ internal val isNullable : Boolean ,
270+ @JvmField
271+ internal val isOptional : Boolean ,
272+ @JvmField
273+ internal val isPrimaryKey : Boolean ,
274+ @JvmField
275+ internal val isUnique : Boolean ,
276+ @JvmField
277+ internal val constraints : List <Constraint >,
278+ @JvmField
279+ val comment : String?
280+ ) : PlanNode() {
281+ override val children: List <PlanNode > by lazy {
282+ val kids = mutableListOf<PlanNode ?>()
283+ kids.addAll(constraints)
284+ kids.filterNotNull()
285+ }
286+
287+ override fun <R , C > accept (visitor : PlanVisitor <R , C >, ctx : C ): R =
288+ visitor.visitStatementDDLAttribute(this , ctx)
289+
290+ internal companion object {
291+ @JvmStatic
292+ internal fun builder (): StatementDdlAttributeBuilder = StatementDdlAttributeBuilder ()
293+ }
294+ }
295+
296+ internal sealed class Constraint : PlanNode () {
297+ override fun <R , C > accept (visitor : PlanVisitor <R , C >, ctx : C ): R = when (this ) {
298+ is Check -> visitor.visitStatementDDLConstraintCheck(this , ctx)
299+ }
300+
301+ internal data class Check (
302+ @JvmField
303+ internal val expression : Rex ,
304+ @JvmField
305+ val sql : String
306+ ) : Constraint() {
307+ override val children: List <PlanNode > by lazy {
308+ val kids = mutableListOf<PlanNode ?>()
309+ kids.add(expression)
310+ kids.filterNotNull()
311+ }
312+
313+
314+ override fun <R , C > accept (visitor : PlanVisitor <R , C >, ctx : C ): R =
315+ visitor.visitStatementDDLConstraintCheck(this , ctx)
316+
317+ internal companion object {
318+ @JvmStatic
319+ internal fun builder (): StatementDdlConstraintCheckBuilder =
320+ StatementDdlConstraintCheckBuilder ()
321+ }
322+ }
323+ }
324+
325+ internal sealed class PartitionBy : PlanNode () {
326+ override fun <R , C > accept (visitor : PlanVisitor <R , C >, ctx : C ): R = when (this ) {
327+ is AttrList -> visitor.visitStatementDDLPartitionByAttrList(this , ctx)
328+ }
329+
330+ internal data class AttrList (
331+ @JvmField
332+ internal val attrs : List <Identifier >,
333+ ) : PartitionBy() {
334+ override val children: List <PlanNode > = emptyList()
335+
336+ override fun <R , C > accept (visitor : PlanVisitor <R , C >, ctx : C ): R =
337+ visitor.visitStatementDDLPartitionByAttrList(this , ctx)
338+
339+ internal companion object {
340+ @JvmStatic
341+ internal fun builder (): StatementDdlPartitionByAttrListBuilder =
342+ StatementDdlPartitionByAttrListBuilder ()
343+ }
344+ }
345+ }
346+
347+ internal data class TableProperty (
348+ @JvmField
349+ internal val name : String ,
350+ @JvmField
351+ internal val `value`: String ,
352+ ) : PlanNode() {
353+ override val children: List <PlanNode > = emptyList()
354+
355+ override fun <R , C > accept (visitor : PlanVisitor <R , C >, ctx : C ): R =
356+ visitor.visitStatementDDLTableProperty(this , ctx)
357+
358+ internal companion object {
359+ @JvmStatic
360+ internal fun builder (): StatementDdlTablePropertyBuilder = StatementDdlTablePropertyBuilder ()
361+ }
362+ }
363+
364+ internal companion object {
365+ @JvmStatic
366+ internal fun builder (): StatementDdlBuilder = StatementDdlBuilder ()
367+ }
368+ }
198369}
199370
200371internal data class Rex (
0 commit comments