Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -562,11 +562,11 @@ private static Instant getInstantWithTruncation(TimestampWithTimeZoneType type,

public static Expression falseIfNotNull(Expression argument)
{
return and(new IsNullPredicate(argument), new NullLiteral());
return and(new IsNullPredicate(argument), new Cast(new NullLiteral(), toSqlType(BOOLEAN), false, true));
}

public static Expression trueIfNotNull(Expression argument)
{
return or(new IsNotNullPredicate(argument), new NullLiteral());
return or(new IsNotNullPredicate(argument), new Cast(new NullLiteral(), toSqlType(BOOLEAN), false, true));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,28 @@ public void testTablePredicateIsExtracted()
ImmutableMap.of("ORDERSTATUS", "orderstatus"))))));
}

@Test
public void testOnlyNullPredicateIsPushDownThroughJoinFilters()
{
assertPlan(
"""
WITH test_table AS (
SELECT
custkey,
CASE
WHEN name = 'ABC' then 'ABC'
ELSE 'BCD'
END AS new_name
FROM customer)
SELECT orderstatus
FROM orders
JOIN test_table
ON orders.custkey = test_table.custkey
WHERE test_table.new_name = 'TESTING'
""",
output(values("orderstatus")));
}

private Session noSemiJoinRewrite()
{
return Session.builder(getQueryRunner().getDefaultSession())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,37 +38,37 @@ public void testEquals()
testUnwrap("bigint", "a = DOUBLE '1'", "a = BIGINT '1'");

// non-representable
testUnwrap("smallint", "a = DOUBLE '1.1'", "a IS NULL AND NULL");
testUnwrap("smallint", "a = DOUBLE '1.9'", "a IS NULL AND NULL");
testUnwrap("smallint", "a = DOUBLE '1.1'", "a IS NULL AND CAST(NULL AS BOOLEAN)");
testUnwrap("smallint", "a = DOUBLE '1.9'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

testUnwrap("bigint", "a = DOUBLE '1.1'", "a IS NULL AND NULL");
testUnwrap("bigint", "a = DOUBLE '1.1'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

// below top of range
testUnwrap("smallint", "a = DOUBLE '32766'", "a = SMALLINT '32766'");

// round to top of range
testUnwrap("smallint", "a = DOUBLE '32766.9'", "a IS NULL AND NULL");
testUnwrap("smallint", "a = DOUBLE '32766.9'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

// top of range
testUnwrap("smallint", "a = DOUBLE '32767'", "a = SMALLINT '32767'");

// above range
testUnwrap("smallint", "a = DOUBLE '32768.1'", "a IS NULL AND NULL");
testUnwrap("smallint", "a = DOUBLE '32768.1'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

// above bottom of range
testUnwrap("smallint", "a = DOUBLE '-32767'", "a = SMALLINT '-32767'");

// round to bottom of range
testUnwrap("smallint", "a = DOUBLE '-32767.9'", "a IS NULL AND NULL");
testUnwrap("smallint", "a = DOUBLE '-32767.9'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

// bottom of range
testUnwrap("smallint", "a = DOUBLE '-32768'", "a = SMALLINT '-32768'");

// below range
testUnwrap("smallint", "a = DOUBLE '-32768.1'", "a IS NULL AND NULL");
testUnwrap("smallint", "a = DOUBLE '-32768.1'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

// -2^64 constant
testUnwrap("bigint", "a = DOUBLE '-18446744073709551616'", "a IS NULL AND NULL");
testUnwrap("bigint", "a = DOUBLE '-18446744073709551616'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

// shorter varchar and char
testNoUnwrap("varchar(1)", "= CAST('abc' AS char(3))", "char(3)");
Expand All @@ -92,37 +92,37 @@ public void testNotEquals()
testUnwrap("bigint", "a <> DOUBLE '1'", "a <> BIGINT '1'");

// non-representable
testUnwrap("smallint", "a <> DOUBLE '1.1'", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a <> DOUBLE '1.9'", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a <> DOUBLE '1.1'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");
testUnwrap("smallint", "a <> DOUBLE '1.9'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

testUnwrap("bigint", "a <> DOUBLE '1.1'", "NOT (a IS NULL) OR NULL");
testUnwrap("bigint", "a <> DOUBLE '1.1'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

// below top of range
testUnwrap("smallint", "a <> DOUBLE '32766'", "a <> SMALLINT '32766'");

// round to top of range
testUnwrap("smallint", "a <> DOUBLE '32766.9'", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a <> DOUBLE '32766.9'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

// top of range
testUnwrap("smallint", "a <> DOUBLE '32767'", "a <> SMALLINT '32767'");

// above range
testUnwrap("smallint", "a <> DOUBLE '32768.1'", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a <> DOUBLE '32768.1'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

// 2^64 constant
testUnwrap("bigint", "a <> DOUBLE '18446744073709551616'", "NOT (a IS NULL) OR NULL");
testUnwrap("bigint", "a <> DOUBLE '18446744073709551616'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

// above bottom of range
testUnwrap("smallint", "a <> DOUBLE '-32767'", "a <> SMALLINT '-32767'");

// round to bottom of range
testUnwrap("smallint", "a <> DOUBLE '-32767.9'", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a <> DOUBLE '-32767.9'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

// bottom of range
testUnwrap("smallint", "a <> DOUBLE '-32768'", "a <> SMALLINT '-32768'");

// below range
testUnwrap("smallint", "a <> DOUBLE '-32768.1'", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a <> DOUBLE '-32768.1'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");
}

@Test
Expand Down Expand Up @@ -150,7 +150,7 @@ public void testLessThan()
testUnwrap("smallint", "a < DOUBLE '32767'", "a <> SMALLINT '32767'");

// above range
testUnwrap("smallint", "a < DOUBLE '32768.1'", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a < DOUBLE '32768.1'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

// above bottom of range
testUnwrap("smallint", "a < DOUBLE '-32767'", "a < SMALLINT '-32767'");
Expand All @@ -159,13 +159,13 @@ public void testLessThan()
testUnwrap("smallint", "a < DOUBLE '-32767.9'", "a = SMALLINT '-32768'");

// bottom of range
testUnwrap("smallint", "a < DOUBLE '-32768'", "a IS NULL AND NULL");
testUnwrap("smallint", "a < DOUBLE '-32768'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

// below range
testUnwrap("smallint", "a < DOUBLE '-32768.1'", "a IS NULL AND NULL");
testUnwrap("smallint", "a < DOUBLE '-32768.1'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

// -2^64 constant
testUnwrap("bigint", "a < DOUBLE '-18446744073709551616'", "a IS NULL AND NULL");
testUnwrap("bigint", "a < DOUBLE '-18446744073709551616'", "a IS NULL AND CAST(NULL AS BOOLEAN)");
}

@Test
Expand All @@ -190,13 +190,13 @@ public void testLessThanOrEqual()
testUnwrap("smallint", "a <= DOUBLE '32766.9'", "a < SMALLINT '32767'");

// top of range
testUnwrap("smallint", "a <= DOUBLE '32767'", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a <= DOUBLE '32767'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

// above range
testUnwrap("smallint", "a <= DOUBLE '32768.1'", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a <= DOUBLE '32768.1'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

// 2^64 constant
testUnwrap("bigint", "a <= DOUBLE '18446744073709551616'", "NOT (a IS NULL) OR NULL");
testUnwrap("bigint", "a <= DOUBLE '18446744073709551616'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

// above bottom of range
testUnwrap("smallint", "a <= DOUBLE '-32767'", "a <= SMALLINT '-32767'");
Expand All @@ -208,7 +208,7 @@ public void testLessThanOrEqual()
testUnwrap("smallint", "a <= DOUBLE '-32768'", "a = SMALLINT '-32768'");

// below range
testUnwrap("smallint", "a <= DOUBLE '-32768.1'", "a IS NULL AND NULL");
testUnwrap("smallint", "a <= DOUBLE '-32768.1'", "a IS NULL AND CAST(NULL AS BOOLEAN)");
}

@Test
Expand All @@ -233,13 +233,13 @@ public void testGreaterThan()
testUnwrap("smallint", "a > DOUBLE '32766.9'", "a = SMALLINT '32767'");

// top of range
testUnwrap("smallint", "a > DOUBLE '32767'", "a IS NULL AND NULL");
testUnwrap("smallint", "a > DOUBLE '32767'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

// above range
testUnwrap("smallint", "a > DOUBLE '32768.1'", "a IS NULL AND NULL");
testUnwrap("smallint", "a > DOUBLE '32768.1'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

// 2^64 constant
testUnwrap("bigint", "a > DOUBLE '18446744073709551616'", "a IS NULL AND NULL");
testUnwrap("bigint", "a > DOUBLE '18446744073709551616'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

// above bottom of range
testUnwrap("smallint", "a > DOUBLE '-32767'", "a > SMALLINT '-32767'");
Expand All @@ -251,7 +251,7 @@ public void testGreaterThan()
testUnwrap("smallint", "a > DOUBLE '-32768'", "a <> SMALLINT '-32768'");

// below range
testUnwrap("smallint", "a > DOUBLE '-32768.1'", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a > DOUBLE '-32768.1'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");
}

@Test
Expand Down Expand Up @@ -279,7 +279,7 @@ public void testGreaterThanOrEqual()
testUnwrap("smallint", "a >= DOUBLE '32767'", "a = SMALLINT '32767'");

// above range
testUnwrap("smallint", "a >= DOUBLE '32768.1'", "a IS NULL AND NULL");
testUnwrap("smallint", "a >= DOUBLE '32768.1'", "a IS NULL AND CAST(NULL AS BOOLEAN)");

// above bottom of range
testUnwrap("smallint", "a >= DOUBLE '-32767'", "a >= SMALLINT '-32767'");
Expand All @@ -288,13 +288,13 @@ public void testGreaterThanOrEqual()
testUnwrap("smallint", "a >= DOUBLE '-32767.9'", "a > SMALLINT '-32768' ");

// bottom of range
testUnwrap("smallint", "a >= DOUBLE '-32768'", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a >= DOUBLE '-32768'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

// below range
testUnwrap("smallint", "a >= DOUBLE '-32768.1'", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a >= DOUBLE '-32768.1'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

// -2^64 constant
testUnwrap("bigint", "a >= DOUBLE '-18446744073709551616'", "NOT (a IS NULL) OR NULL");
testUnwrap("bigint", "a >= DOUBLE '-18446744073709551616'", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");
}

@Test
Expand Down Expand Up @@ -365,23 +365,23 @@ public void testNull()
@Test
public void testNaN()
{
testUnwrap("smallint", "a = nan()", "a IS NULL AND NULL");
testUnwrap("smallint", "a = nan()", "a IS NULL AND CAST(NULL AS BOOLEAN)");

testUnwrap("bigint", "a = nan()", "a IS NULL AND NULL");
testUnwrap("bigint", "a = nan()", "a IS NULL AND CAST(NULL AS BOOLEAN)");

testUnwrap("smallint", "a < nan()", "a IS NULL AND NULL");
testUnwrap("smallint", "a < nan()", "a IS NULL AND CAST(NULL AS BOOLEAN)");

testUnwrap("smallint", "a <> nan()", "NOT (a IS NULL) OR NULL");
testUnwrap("smallint", "a <> nan()", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

testRemoveFilter("smallint", "a IS DISTINCT FROM nan()");

testRemoveFilter("bigint", "a IS DISTINCT FROM nan()");

testUnwrap("real", "a = nan()", "a IS NULL AND NULL");
testUnwrap("real", "a = nan()", "a IS NULL AND CAST(NULL AS BOOLEAN)");

testUnwrap("real", "a < nan()", "a IS NULL AND NULL");
testUnwrap("real", "a < nan()", "a IS NULL AND CAST(NULL AS BOOLEAN)");

testUnwrap("real", "a <> nan()", "NOT (a IS NULL) OR NULL");
testUnwrap("real", "a <> nan()", "NOT (a IS NULL) OR CAST(NULL AS BOOLEAN)");

testUnwrap("real", "a IS DISTINCT FROM nan()", "a IS DISTINCT FROM CAST(nan() AS REAL)");
}
Expand Down