/** As {@link #simplify(RexNode)}, but for a boolean expression * for which a result of UNKNOWN will be treated as FALSE. * * <p>Use this form for expressions on a WHERE, ON, HAVING or FILTER(WHERE) * clause. * * <p>This may allow certain additional simplifications. A result of UNKNOWN * may yield FALSE, however it may still yield UNKNOWN. (If the simplified * expression has type BOOLEAN NOT NULL, then of course it can only return * FALSE.) */ public final RexNode simplifyUnknownAsFalse(RexNode e) { return simplifyUnknownAs(e, FALSE); }
/** As {@link #simplify(RexNode)}, but for a boolean expression * for which a result of UNKNOWN will be treated as FALSE. * * <p>Use this form for expressions on a WHERE, ON, HAVING or FILTER(WHERE) * clause. * * <p>This may allow certain additional simplifications. A result of UNKNOWN * may yield FALSE, however it may still yield UNKNOWN. (If the simplified * expression has type BOOLEAN NOT NULL, then of course it can only return * FALSE.) */ public final RexNode simplifyUnknownAsFalse(RexNode e) { return simplifyUnknownAs(e, FALSE); }
@Override public RexNode visitCall(RexCall call) { RexNode node = visit(call); if (node != null) { return node; } node = super.visitCall(call); if (node != call) { node = simplify.simplifyUnknownAs(node, unknownAs); } return node; }
private RexNode simplifyPreservingType(RexNode e, RexUnknownAs unknownAs) { final RexNode e2 = simplifyUnknownAs(e, unknownAs); if (e2.getType() == e.getType()) { return e2; } final RexNode e3 = rexBuilder.makeCast(e.getType(), e2, true); if (e3.equals(e)) { return e; } return e3; }
private void checkSimplifyFilter(RexNode node, String expected) { final RexNode simplified = this.simplify.simplifyUnknownAs(node, RexUnknownAs.FALSE); assertThat(simplified.toString(), equalTo(expected)); }
private void checkSimplifyFilter(RexNode node, String expected) { final RexNode simplified = this.simplify.simplifyUnknownAs(node, RexUnknownAs.FALSE); assertThat(simplified.toString(), equalTo(expected)); }
private RexNode simplify(RexNode e) { final RexSimplify simplify = new RexSimplify(rexBuilder, RelOptPredicateList.EMPTY, RexUtil.EXECUTOR) .withParanoid(true); return simplify.simplifyUnknownAs(e, RexUnknownAs.UNKNOWN); }
public RexNode simplifyPreservingType(RexNode e, RexUnknownAs unknownAs, boolean matchNullability) { final RexNode e2 = simplifyUnknownAs(e, unknownAs); if (e2.getType() == e.getType()) { return e2; } final RexNode e3 = rexBuilder.makeCast(e.getType(), e2, matchNullability); if (e3.equals(e)) { return e; } return e3; }
private RexNode simplify(RexNode e) { final RexSimplify simplify = new RexSimplify(rexBuilder, RelOptPredicateList.EMPTY, RexUtil.EXECUTOR) .withParanoid(true); return simplify.simplifyUnknownAs(e, RexUnknownAs.UNKNOWN); }
private void checkSimplifyFilter(RexNode node, RelOptPredicateList predicates, String expected) { final RexNode simplified = simplify.withPredicates(predicates) .simplifyUnknownAs(node, RexUnknownAs.FALSE); assertThat(simplified.toString(), equalTo(expected)); }
private void checkSimplifyFilter(RexNode node, RelOptPredicateList predicates, String expected) { final RexNode simplified = simplify.withPredicates(predicates) .simplifyUnknownAs(node, RexUnknownAs.FALSE); assertThat(simplified.toString(), equalTo(expected)); }
private void checkNotSatisfiable(RexNode e) { assertFalse(SubstitutionVisitor.mayBeSatisfiable(e)); final RexNode simple = simplify.simplifyUnknownAs(e, RexUnknownAs.UNKNOWN); assertFalse(RexLiteral.booleanValue(simple)); }
private void checkSatisfiable(RexNode e, String s) { assertTrue(SubstitutionVisitor.mayBeSatisfiable(e)); final RexNode simple = simplify.simplifyUnknownAs(e, RexUnknownAs.UNKNOWN); assertEquals(s, simple.toString()); }
private void checkSatisfiable(RexNode e, String s) { assertTrue(SubstitutionVisitor.mayBeSatisfiable(e)); final RexNode simple = simplify.simplifyUnknownAs(e, RexUnknownAs.UNKNOWN); assertEquals(s, simple.toString()); }
private void checkNotSatisfiable(RexNode e) { assertFalse(SubstitutionVisitor.mayBeSatisfiable(e)); final RexNode simple = simplify.simplifyUnknownAs(e, RexUnknownAs.UNKNOWN); assertFalse(RexLiteral.booleanValue(simple)); }
/** Unit test for * <a href="https://issues.apache.org/jira/browse/CALCITE-1289">[CALCITE-1289] * RexUtil.simplifyCase() should account for nullability</a>. */ @Test public void testSimplifyCaseNotNullableBoolean() { RexNode condition = eq(vVarchar(), literal("S")); RexCall caseNode = (RexCall) case_(condition, trueLiteral, falseLiteral); final RexCall result = (RexCall) simplify.simplifyUnknownAs(caseNode, RexUnknownAs.UNKNOWN); assertThat("The case should be nonNullable", caseNode.getType().isNullable(), is(false)); assertThat("Expected a nonNullable type", result.getType().isNullable(), is(false)); assertThat(result.getType().getSqlTypeName(), is(SqlTypeName.BOOLEAN)); assertThat(result.getOperator(), is((SqlOperator) SqlStdOperatorTable.IS_TRUE)); assertThat(result.getOperands().get(0), is(condition)); }
@Test public void testSimplifyCaseNullableBoolean() { RexNode condition = eq(input(tVarchar(), 0), literal("S")); RexNode caseNode = case_(condition, trueLiteral, falseLiteral); RexCall result = (RexCall) simplify.simplifyUnknownAs(caseNode, RexUnknownAs.UNKNOWN); assertThat(result.getType().isNullable(), is(false)); assertThat(result.getType().getSqlTypeName(), is(SqlTypeName.BOOLEAN)); assertThat(result, is(condition)); }
@Test public void testRemovalOfNullabilityWideningCast() { RexNode expr = cast(isTrue(vBoolNotNull()), tBoolean(true)); assertThat(expr.getType().isNullable(), is(true)); RexNode result = simplify.simplifyUnknownAs(expr, RexUnknownAs.UNKNOWN); assertThat(result.getType().isNullable(), is(false)); }
@Test public void testSimplifyCaseNullableVarChar() { RexNode condition = eq(input(tVarchar(), 0), literal("S")); RexNode caseNode = case_(condition, literal("A"), literal("B")); RexCall result = (RexCall) simplify.simplifyUnknownAs(caseNode, RexUnknownAs.UNKNOWN); assertThat(result.getType().isNullable(), is(false)); assertThat(result.getType().getSqlTypeName(), is(SqlTypeName.CHAR)); assertThat(result, is(caseNode)); }
@Test public void testSimplifyCaseNullableVarChar() { RexNode condition = eq(input(tVarchar(), 0), literal("S")); RexNode caseNode = case_(condition, literal("A"), literal("B")); RexCall result = (RexCall) simplify.simplifyUnknownAs(caseNode, RexUnknownAs.UNKNOWN); assertThat(result.getType().isNullable(), is(false)); assertThat(result.getType().getSqlTypeName(), is(SqlTypeName.CHAR)); assertThat(result, is(caseNode)); }