|
34 | 34 | import org.apache.calcite.rex.RexSimplify;
|
35 | 35 | import org.apache.calcite.rex.RexUtil;
|
36 | 36 | import org.apache.calcite.sql.fun.SqlStdOperatorTable;
|
| 37 | +import org.apache.calcite.sql.type.SqlTypeName; |
37 | 38 | import org.apache.calcite.util.Pair;
|
38 | 39 |
|
39 | 40 | import com.google.common.collect.ImmutableList;
|
@@ -1646,11 +1647,14 @@ protected final MaterializedViewFixture sql(String materialize,
|
1646 | 1647 | final RexBuilder rexBuilder = f.rexBuilder;
|
1647 | 1648 | final RexSimplify simplify = f.simplify;
|
1648 | 1649 |
|
| 1650 | + final RelDataType intType = f.typeFactory.createType(int.class); |
| 1651 | + final RelDataType booleanType = f.typeFactory.createSqlType(SqlTypeName.BOOLEAN); |
1649 | 1652 | final RexLiteral i1 = rexBuilder.makeExactLiteral(BigDecimal.ONE);
|
1650 | 1653 | final RexLiteral i2 = rexBuilder.makeExactLiteral(BigDecimal.valueOf(2));
|
1651 | 1654 | final RexLiteral i3 = rexBuilder.makeExactLiteral(BigDecimal.valueOf(3));
|
| 1655 | + final RexLiteral nullIntLiteral = rexBuilder.makeNullLiteral(intType); |
| 1656 | + final RexLiteral nullBooleanLiteral = rexBuilder.makeNullLiteral(booleanType); |
1652 | 1657 |
|
1653 |
| - final RelDataType intType = f.typeFactory.createType(int.class); |
1654 | 1658 | final RexInputRef x = rexBuilder.makeInputRef(intType, 0); // $0
|
1655 | 1659 | final RexInputRef y = rexBuilder.makeInputRef(intType, 1); // $1
|
1656 | 1660 | final RexInputRef z = rexBuilder.makeInputRef(intType, 2); // $2
|
@@ -1695,6 +1699,15 @@ protected final MaterializedViewFixture sql(String materialize,
|
1695 | 1699 | rexBuilder.makeCall(SqlStdOperatorTable.PLUS, x, y),
|
1696 | 1700 | i2);
|
1697 | 1701 |
|
| 1702 | + // x in (null:int) |
| 1703 | + final RexNode x_in_null = rexBuilder.makeIn(x, ImmutableList.of(nullIntLiteral)); |
| 1704 | + // x in (null:int) and x = 1 |
| 1705 | + final RexNode x_in_null_and_x_eq_1 = |
| 1706 | + rexBuilder.makeCall(SqlStdOperatorTable.AND, x_in_null, x_eq_1); |
| 1707 | + // x = 1 and null:boolean |
| 1708 | + final RexNode x_eq_1_and_null = |
| 1709 | + rexBuilder.makeCall(SqlStdOperatorTable.AND, x_eq_1, nullBooleanLiteral); |
| 1710 | + |
1698 | 1711 | RexNode newFilter;
|
1699 | 1712 |
|
1700 | 1713 | // Example 1.
|
@@ -1853,6 +1866,28 @@ protected final MaterializedViewFixture sql(String materialize,
|
1853 | 1866 | SubstitutionVisitor.splitFilter(simplify, x_times_y_gt, y_times_x_gt);
|
1854 | 1867 | assertThat(newFilter, notNullValue());
|
1855 | 1868 | assertThat(newFilter.isAlwaysTrue(), equalTo(true));
|
| 1869 | + |
| 1870 | + // Example 11. |
| 1871 | + // condition: x in (null:int) and x = 1 |
| 1872 | + // target: true |
| 1873 | + // yields |
| 1874 | + // residue: x = 1 and null:boolean |
| 1875 | + newFilter = |
| 1876 | + SubstitutionVisitor.splitFilter(simplify, x_in_null_and_x_eq_1, |
| 1877 | + rexBuilder.makeLiteral(true)); |
| 1878 | + assertThat(newFilter, notNullValue()); |
| 1879 | + assertThat(newFilter, equalTo(x_eq_1_and_null)); |
| 1880 | + |
| 1881 | + // Example 12. |
| 1882 | + // condition: x in (null:int) and x = 1 |
| 1883 | + // target: x = 1 |
| 1884 | + // yields |
| 1885 | + // residue: null:boolean |
| 1886 | + newFilter = |
| 1887 | + SubstitutionVisitor.splitFilter(simplify, x_in_null_and_x_eq_1, |
| 1888 | + x_eq_1); |
| 1889 | + assertThat(newFilter, notNullValue()); |
| 1890 | + assertThat(newFilter, equalTo(nullBooleanLiteral)); |
1856 | 1891 | }
|
1857 | 1892 |
|
1858 | 1893 | @Test void testSubQuery() {
|
|
0 commit comments