|
38 | 38 | import io.trino.sql.planner.Plan; |
39 | 39 | import io.trino.sql.planner.assertions.PlanMatchPattern; |
40 | 40 | import io.trino.sql.planner.plan.AggregationNode; |
| 41 | +import io.trino.sql.planner.plan.ExchangeNode; |
41 | 42 | import io.trino.sql.planner.plan.FilterNode; |
| 43 | +import io.trino.sql.planner.plan.JoinNode; |
42 | 44 | import io.trino.sql.planner.plan.LimitNode; |
43 | 45 | import io.trino.sql.planner.plan.OutputNode; |
44 | 46 | import io.trino.sql.planner.plan.ProjectNode; |
@@ -495,6 +497,72 @@ public void testLimitPushdown() |
495 | 497 | topnOverTableScan); |
496 | 498 | } |
497 | 499 |
|
| 500 | + @Test |
| 501 | + public void testTopNPushdown() |
| 502 | + { |
| 503 | + if (!hasBehavior(SUPPORTS_TOPN_PUSHDOWN)) { |
| 504 | + assertThat(query("SELECT orderkey FROM orders ORDER BY orderkey LIMIT 10")) |
| 505 | + .ordered() |
| 506 | + .isNotFullyPushedDown(TopNNode.class); |
| 507 | + return; |
| 508 | + } |
| 509 | + |
| 510 | + assertThat(query("SELECT orderkey FROM orders ORDER BY orderkey LIMIT 10")) |
| 511 | + .ordered() |
| 512 | + .isFullyPushedDown(); |
| 513 | + |
| 514 | + assertThat(query("SELECT orderkey FROM orders ORDER BY orderkey DESC LIMIT 10")) |
| 515 | + .ordered() |
| 516 | + .isFullyPushedDown(); |
| 517 | + |
| 518 | + // multiple sort columns with different orders |
| 519 | + assertThat(query("SELECT * FROM orders ORDER BY shippriority DESC, totalprice ASC LIMIT 10")) |
| 520 | + .ordered() |
| 521 | + .isFullyPushedDown(); |
| 522 | + |
| 523 | + // TopN over aggregation column |
| 524 | + if (hasBehavior(SUPPORTS_AGGREGATION_PUSHDOWN)) { |
| 525 | + assertThat(query("SELECT sum(totalprice) AS total FROM orders GROUP BY custkey ORDER BY total DESC LIMIT 10")) |
| 526 | + .ordered() |
| 527 | + .isFullyPushedDown(); |
| 528 | + } |
| 529 | + |
| 530 | + // TopN over TopN |
| 531 | + assertThat(query("SELECT orderkey, totalprice FROM (SELECT orderkey, totalprice FROM orders ORDER BY 1, 2 LIMIT 10) ORDER BY 2, 1 LIMIT 5")) |
| 532 | + .ordered() |
| 533 | + .isFullyPushedDown(); |
| 534 | + |
| 535 | + assertThat(query("" + |
| 536 | + "SELECT orderkey, totalprice " + |
| 537 | + "FROM (SELECT orderkey, totalprice FROM (SELECT orderkey, totalprice FROM orders ORDER BY 1, 2 LIMIT 10) " + |
| 538 | + "ORDER BY 2, 1 LIMIT 5) ORDER BY 1, 2 LIMIT 3")) |
| 539 | + .ordered() |
| 540 | + .isFullyPushedDown(); |
| 541 | + |
| 542 | + // TopN over limit - use high limit for deterministic result |
| 543 | + assertThat(query("SELECT orderkey, totalprice FROM (SELECT orderkey, totalprice FROM orders LIMIT 15000) ORDER BY totalprice ASC LIMIT 5")) |
| 544 | + .ordered() |
| 545 | + .isFullyPushedDown(); |
| 546 | + |
| 547 | + // TopN over limit with filter |
| 548 | + assertThat(query("" + |
| 549 | + "SELECT orderkey, totalprice " + |
| 550 | + "FROM (SELECT orderkey, totalprice FROM orders WHERE orderdate = DATE '1995-09-16' LIMIT 20) " + |
| 551 | + "ORDER BY totalprice ASC LIMIT 5")) |
| 552 | + .ordered() |
| 553 | + .isFullyPushedDown(); |
| 554 | + |
| 555 | + // TopN over aggregation with filter |
| 556 | + if (hasBehavior(SUPPORTS_AGGREGATION_PUSHDOWN)) { |
| 557 | + assertThat(query("" + |
| 558 | + "SELECT * " + |
| 559 | + "FROM (SELECT SUM(totalprice) as sum, custkey AS total FROM orders GROUP BY custkey HAVING COUNT(*) > 3) " + |
| 560 | + "ORDER BY sum DESC LIMIT 10")) |
| 561 | + .ordered() |
| 562 | + .isFullyPushedDown(); |
| 563 | + } |
| 564 | + } |
| 565 | + |
498 | 566 | @Test |
499 | 567 | public void testAggregation() |
500 | 568 | { |
|
0 commit comments