Skip to content

Commit

Permalink
fix issue with SQL boolean constants not respecting nulls when strict…
Browse files Browse the repository at this point in the history
… booleans and sql compatible null handling are enabled (#15135)
  • Loading branch information
clintropolis authored Oct 12, 2023
1 parent d0f6460 commit a0fd9ec
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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()
{
Expand Down

0 comments on commit a0fd9ec

Please sign in to comment.