diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rule/DruidLogicalValuesRule.java b/sql/src/main/java/org/apache/druid/sql/calcite/rule/DruidLogicalValuesRule.java index 614ffddf5667..97fa5b86a6a1 100644 --- a/sql/src/main/java/org/apache/druid/sql/calcite/rule/DruidLogicalValuesRule.java +++ b/sql/src/main/java/org/apache/druid/sql/calcite/rule/DruidLogicalValuesRule.java @@ -25,7 +25,9 @@ import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.rel.logical.LogicalValues; import org.apache.calcite.rex.RexLiteral; +import org.apache.druid.common.config.NullHandling; import org.apache.druid.error.InvalidSqlInput; +import org.apache.druid.math.expr.ExpressionProcessing; import org.apache.druid.query.InlineDataSource; import org.apache.druid.segment.column.RowSignature; import org.apache.druid.sql.calcite.planner.Calcites; @@ -120,6 +122,9 @@ public static Object getValueFromLiteral(RexLiteral literal, PlannerContext plan } return ((Number) RexLiteral.value(literal)).longValue(); case BOOLEAN: + if (ExpressionProcessing.useStrictBooleans() && NullHandling.sqlCompatible() && literal.isNull()) { + return null; + } return literal.isAlwaysTrue() ? 1L : 0L; case TIMESTAMP: case DATE: diff --git a/sql/src/test/java/org/apache/druid/sql/calcite/rule/DruidLogicalValuesRuleTest.java b/sql/src/test/java/org/apache/druid/sql/calcite/rule/DruidLogicalValuesRuleTest.java index ee2e4273f83b..2ad83563e9ef 100644 --- a/sql/src/test/java/org/apache/druid/sql/calcite/rule/DruidLogicalValuesRuleTest.java +++ b/sql/src/test/java/org/apache/druid/sql/calcite/rule/DruidLogicalValuesRuleTest.java @@ -28,8 +28,10 @@ import org.apache.calcite.util.DateString; import org.apache.calcite.util.TimeString; import org.apache.calcite.util.TimestampString; +import org.apache.druid.common.config.NullHandling; import org.apache.druid.error.DruidExceptionMatcher; import org.apache.druid.java.util.common.DateTimes; +import org.apache.druid.math.expr.ExpressionProcessing; import org.apache.druid.sql.calcite.planner.DruidTypeSystem; import org.apache.druid.sql.calcite.planner.PlannerContext; import org.apache.druid.testing.InitializedNullHandlingTest; @@ -139,6 +141,21 @@ public void testGetValueFromFalseLiteral() Assert.assertEquals(0L, fromLiteral); } + @Test + public void testGetValueFromNullBooleanLiteral() + { + RexLiteral literal = REX_BUILDER.makeLiteral(null, REX_BUILDER.getTypeFactory().createSqlType(SqlTypeName.BOOLEAN)); + + if (NullHandling.sqlCompatible() && ExpressionProcessing.useStrictBooleans()) { + final Object fromLiteral = DruidLogicalValuesRule.getValueFromLiteral(literal, DEFAULT_CONTEXT); + Assert.assertNull(fromLiteral); + } else { + final Object fromLiteralNonStrict = DruidLogicalValuesRule.getValueFromLiteral(literal, DEFAULT_CONTEXT); + Assert.assertSame(Long.class, fromLiteralNonStrict.getClass()); + Assert.assertEquals(0L, fromLiteralNonStrict); + } + } + @Test public void testGetValueFromTimestampLiteral() {