From c87aa1e7bd17659205034f2c05e59c1cc899b518 Mon Sep 17 00:00:00 2001 From: "R. C. Howell" Date: Thu, 18 Apr 2024 17:36:03 -0700 Subject: [PATCH] Promote Rex.Op.Missing to compile time error in strict --- .../org/partiql/eval/internal/Compiler.kt | 15 +++++++++++++++ .../eval/internal/operator/rex/ExprMissing.kt | 17 +++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 partiql-eval/src/main/kotlin/org/partiql/eval/internal/operator/rex/ExprMissing.kt diff --git a/partiql-eval/src/main/kotlin/org/partiql/eval/internal/Compiler.kt b/partiql-eval/src/main/kotlin/org/partiql/eval/internal/Compiler.kt index d096a765c7..830cd18308 100644 --- a/partiql-eval/src/main/kotlin/org/partiql/eval/internal/Compiler.kt +++ b/partiql-eval/src/main/kotlin/org/partiql/eval/internal/Compiler.kt @@ -26,6 +26,7 @@ import org.partiql.eval.internal.operator.rex.ExprCast import org.partiql.eval.internal.operator.rex.ExprCoalesce import org.partiql.eval.internal.operator.rex.ExprCollection import org.partiql.eval.internal.operator.rex.ExprLiteral +import org.partiql.eval.internal.operator.rex.ExprMissing import org.partiql.eval.internal.operator.rex.ExprNullIf import org.partiql.eval.internal.operator.rex.ExprPathIndex import org.partiql.eval.internal.operator.rex.ExprPathKey @@ -47,6 +48,7 @@ import org.partiql.plan.Rel import org.partiql.plan.Rex import org.partiql.plan.Statement import org.partiql.plan.debug.PlanPrinter +import org.partiql.plan.rexOpErr import org.partiql.plan.visitor.PlanBaseVisitor import org.partiql.spi.fn.Agg import org.partiql.spi.fn.FnExperimental @@ -233,6 +235,19 @@ internal class Compiler( return ExprCast(visitRex(node.arg, ctx), node.cast) } + override fun visitRexOpMissing(node: Rex.Op.Missing, ctx: StaticType?): Operator { + return when (session.mode) { + PartiQLEngine.Mode.PERMISSIVE -> { + // Make a runtime TypeCheckException. + ExprMissing(node.message) + } + PartiQLEngine.Mode.STRICT -> { + // Promote to error. + visitRexOpErr(rexOpErr(node.message, node.causes), null) + } + } + } + // REL override fun visitRel(node: Rel, ctx: StaticType?): Operator.Relation { return super.visitRelOp(node.op, ctx) as Operator.Relation diff --git a/partiql-eval/src/main/kotlin/org/partiql/eval/internal/operator/rex/ExprMissing.kt b/partiql-eval/src/main/kotlin/org/partiql/eval/internal/operator/rex/ExprMissing.kt new file mode 100644 index 0000000000..b516276645 --- /dev/null +++ b/partiql-eval/src/main/kotlin/org/partiql/eval/internal/operator/rex/ExprMissing.kt @@ -0,0 +1,17 @@ +package org.partiql.eval.internal.operator.rex + +import org.partiql.errors.TypeCheckException +import org.partiql.eval.internal.Environment +import org.partiql.eval.internal.operator.Operator +import org.partiql.value.PartiQLValue +import org.partiql.value.PartiQLValueExperimental + +internal class ExprMissing( + private val message: String, +) : Operator.Expr { + + @OptIn(PartiQLValueExperimental::class) + override fun eval(env: Environment): PartiQLValue { + throw TypeCheckException(message) + } +}