diff --git a/presto-native-execution/presto_cpp/main/types/PrestoToVeloxQueryPlan.cpp b/presto-native-execution/presto_cpp/main/types/PrestoToVeloxQueryPlan.cpp index e460a641f4dc6..1b2293ea57088 100644 --- a/presto-native-execution/presto_cpp/main/types/PrestoToVeloxQueryPlan.cpp +++ b/presto-native-execution/presto_cpp/main/types/PrestoToVeloxQueryPlan.cpp @@ -1855,12 +1855,14 @@ VeloxQueryPlanConverter::toVeloxQueryPlan( std::vector sortFields; std::vector sortOrders; - auto nodeSpecOrdering = node->specification.orderingScheme->orderBy; - sortFields.reserve(nodeSpecOrdering.size()); - sortOrders.reserve(nodeSpecOrdering.size()); - for (const auto& spec : nodeSpecOrdering) { - sortFields.emplace_back(exprConverter_.toVeloxExpr(spec.variable)); - sortOrders.emplace_back(toVeloxSortOrder(spec.sortOrder)); + if (node->specification.orderingScheme) { + auto nodeSpecOrdering = node->specification.orderingScheme->orderBy; + sortFields.reserve(nodeSpecOrdering.size()); + sortOrders.reserve(nodeSpecOrdering.size()); + for (const auto& spec : nodeSpecOrdering) { + sortFields.emplace_back(exprConverter_.toVeloxExpr(spec.variable)); + sortOrders.emplace_back(toVeloxSortOrder(spec.sortOrder)); + } } std::vector windowNames; diff --git a/presto-native-execution/src/test/java/com/facebook/presto/nativeworker/TestHiveWindowQueries.java b/presto-native-execution/src/test/java/com/facebook/presto/nativeworker/TestHiveWindowQueries.java index 2f46b815b66e1..daf0a5181ffff 100644 --- a/presto-native-execution/src/test/java/com/facebook/presto/nativeworker/TestHiveWindowQueries.java +++ b/presto-native-execution/src/test/java/com/facebook/presto/nativeworker/TestHiveWindowQueries.java @@ -22,22 +22,33 @@ public class TestHiveWindowQueries extends AbstractTestHiveQueries { + private static final List OVER_CLAUSES_WITH_ORDER_BY = Arrays.asList( + "PARTITION BY orderkey ORDER BY totalprice", + "PARTITION BY custkey, orderkey ORDER BY totalprice", + "PARTITION BY orderdate ORDER BY orderkey asc, totalprice desc", + "PARTITION BY orderkey, custkey ORDER BY orderdate asc nulls first, totalprice asc, shippriority desc", + "PARTITION BY custkey, orderkey, shippriority ORDER BY orderdate, totalprice asc nulls first", + "PARTITION BY orderkey, orderdate ORDER BY totalprice asc nulls first", + "ORDER BY orderdate desc, totalprice asc, shippriority desc nulls first"); + + private static final List OVER_CLAUSES_WITHOUT_ORDER_BY = Arrays.asList( + "PARTITION BY orderkey", + "PARTITION BY custkey, orderkey", + "PARTITION BY orderdate", + "PARTITION BY orderkey, orderdate", + "PARTITION BY custkey, orderkey, shippriority", + "PARTITION BY orderkey, custkey"); + public TestHiveWindowQueries() { super(true); } - protected List getRankingQueries(String rankingFunction) + protected List getRankingQueries(String rankingFunction, boolean orderBy) { ImmutableList.Builder queries = ImmutableList.builder(); List columnProjections = Arrays.asList("orderkey, orderdate, totalprice"); - List overClauses = Arrays.asList("PARTITION BY orderkey ORDER BY totalprice", - "PARTITION BY custkey, orderkey ORDER BY totalprice", - "PARTITION BY orderdate ORDER BY orderkey asc, totalprice desc", - "PARTITION BY orderkey, orderdate ORDER BY totalprice asc nulls first", - "PARTITION BY orderkey, custkey ORDER BY orderdate asc nulls first, totalprice asc, shippriority desc", - "PARTITION BY custkey, orderkey, shippriority ORDER BY orderdate, totalprice asc nulls first", - "ORDER BY orderdate desc, totalprice asc, shippriority desc nulls first"); + List overClauses = orderBy ? OVER_CLAUSES_WITH_ORDER_BY : OVER_CLAUSES_WITHOUT_ORDER_BY; for (String columnProjection : columnProjections) { for (String overClause : overClauses) { @@ -47,9 +58,9 @@ protected List getRankingQueries(String rankingFunction) return queries.build(); } - protected void testRankingFunction(String functionName) + protected void testRankingFunction(String functionName, boolean orderBy) { - List queries = getRankingQueries(functionName); + List queries = getRankingQueries(functionName, orderBy); for (String query : queries) { assertQuery(query); } @@ -58,30 +69,35 @@ protected void testRankingFunction(String functionName) @Test public void testCumeDist() { - testRankingFunction("cume_dist()"); + testRankingFunction("cume_dist()", true); + testRankingFunction("cume_dist()", false); } @Test public void testDenseRank() { - testRankingFunction("dense_rank()"); + testRankingFunction("dense_rank()", true); + testRankingFunction("dense_rank()", false); } @Test public void testPercentRank() { - testRankingFunction("percent_rank()"); + testRankingFunction("percent_rank()", true); + testRankingFunction("percent_rank()", false); } @Test public void testRank() { - testRankingFunction("rank()"); + testRankingFunction("rank()", true); + testRankingFunction("rank()", false); } @Test public void testRowNumber() { - testRankingFunction("row_number()"); + // `row_number() over (partition by key1)` will use `RowNumberNode` which hasn't been implemented yet. + testRankingFunction("row_number()", true); } }