diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/SimplifyPlanWithEmptyInput.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/SimplifyPlanWithEmptyInput.java index fb0eccbe6c80e..6d84023e59695 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/SimplifyPlanWithEmptyInput.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/SimplifyPlanWithEmptyInput.java @@ -33,10 +33,12 @@ import com.facebook.presto.sql.planner.plan.GroupIdNode; import com.facebook.presto.sql.planner.plan.JoinNode; import com.facebook.presto.sql.planner.plan.OffsetNode; +import com.facebook.presto.sql.planner.plan.RowNumberNode; import com.facebook.presto.sql.planner.plan.SampleNode; import com.facebook.presto.sql.planner.plan.SemiJoinNode; import com.facebook.presto.sql.planner.plan.SimplePlanRewriter; import com.facebook.presto.sql.planner.plan.SortNode; +import com.facebook.presto.sql.planner.plan.TopNRowNumberNode; import com.facebook.presto.sql.planner.plan.UnnestNode; import com.facebook.presto.sql.planner.plan.WindowNode; import com.google.common.collect.ImmutableList; @@ -283,6 +285,18 @@ public PlanNode visitFilter(FilterNode node, RewriteContext context) return convertToEmptyNodeIfInputEmpty(node, context); } + @Override + public PlanNode visitRowNumber(RowNumberNode node, RewriteContext context) + { + return convertToEmptyNodeIfInputEmpty(node, context); + } + + @Override + public PlanNode visitTopNRowNumber(TopNRowNumberNode node, RewriteContext context) + { + return convertToEmptyNodeIfInputEmpty(node, context); + } + @Override public PlanNode visitLimit(LimitNode node, RewriteContext context) { diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/optimizations/TestSimplifyPlanWithEmptyInput.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/optimizations/TestSimplifyPlanWithEmptyInput.java index 67033c7da9e7e..fc7a8cdf7e511 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/optimizations/TestSimplifyPlanWithEmptyInput.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/optimizations/TestSimplifyPlanWithEmptyInput.java @@ -226,4 +226,24 @@ public void testQueryWithJoinWindowFilterLimitOrderby() ImmutableList.of("custkey", "name", "acctbal", "sum"), values("sum", "custkey", "name", "acctbal"))); } + + @Test + public void testRowNumberWithEmptyInput() + { + assertPlan("select orderkey, row_number() over (partition by orderpriority), orderpriority from (select orderkey, orderpriority from orders where false)", + enableOptimization(), + output( + ImmutableList.of("orderkey", "rownumber", "orderpriority"), + values(ImmutableList.of("orderkey", "orderpriority", "rownumber"), ImmutableList.of()))); + } + + @Test + public void testTopNRowNumberWithEmptyInput() + { + assertPlan("select * from (select orderkey, row_number() over (partition by orderpriority order by orderkey) row_number, orderpriority from (select orderkey, orderpriority from orders where false)) where row_number < 2", + enableOptimization(), + output( + ImmutableList.of("orderkey", "row_number", "orderpriority"), + values(ImmutableList.of("orderkey", "orderpriority", "row_number"), ImmutableList.of()))); + } } diff --git a/presto-tests/src/main/java/com/facebook/presto/tests/AbstractTestQueries.java b/presto-tests/src/main/java/com/facebook/presto/tests/AbstractTestQueries.java index 76eb9a06b4497..5e285b3bb424d 100644 --- a/presto-tests/src/main/java/com/facebook/presto/tests/AbstractTestQueries.java +++ b/presto-tests/src/main/java/com/facebook/presto/tests/AbstractTestQueries.java @@ -6675,6 +6675,8 @@ public void testQueryWithEmptyInput() assertQuery(enableOptimization, "WITH emptyorders as (select * from orders where false) SELECT p.name, l.orderkey, l.partkey, l.quantity, RANK() OVER (PARTITION BY p.name ORDER BY l.quantity DESC) AS rank_quantity " + "FROM lineitem l JOIN emptyorders o ON l.orderkey = o.orderkey JOIN part p ON l.partkey = p.partkey WHERE o.orderdate BETWEEN DATE '1995-03-01' AND DATE '1995-03-31' " + "AND l.shipdate BETWEEN DATE '1995-03-01' AND DATE '1995-03-31' AND p.size = 15 ORDER BY p.name, rank_quantity LIMIT 100"); + assertQuery(enableOptimization, "select orderkey, row_number() over (partition by orderpriority), orderpriority from (select orderkey, orderpriority from orders where false)"); + assertQuery(enableOptimization, "select * from (select orderkey, row_number() over (partition by orderpriority order by orderkey) row_number, orderpriority from (select orderkey, orderpriority from orders where false)) where row_number < 2"); emptyJoinQueries(enableOptimization); }