From 3a7e9a6e93b74a60798cd28e821c301e65b2aef6 Mon Sep 17 00:00:00 2001 From: Max Zhuravkov Date: Fri, 10 May 2024 10:20:26 +0300 Subject: [PATCH] IGNITE-21946: Cover SQL F863(Nested in ) feature by tests --- .../sql/order/test_primary_offset.test | 21 ++++++++++++ .../prepare/IgniteSqlToRelConvertor.java | 2 ++ .../internal/sql/engine/util/Commons.java | 21 ++++++++++++ .../planner/LimitOffsetPlannerTest.java | 34 +++++++++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 modules/sql-engine/src/integrationTest/sql/order/test_primary_offset.test diff --git a/modules/sql-engine/src/integrationTest/sql/order/test_primary_offset.test b/modules/sql-engine/src/integrationTest/sql/order/test_primary_offset.test new file mode 100644 index 000000000000..2668347416ed --- /dev/null +++ b/modules/sql-engine/src/integrationTest/sql/order/test_primary_offset.test @@ -0,0 +1,21 @@ +# name: test/sql/order/test_primary_offset.test +# description: F863: Nested . Top-level in +# group: [order] + +statement ok +CREATE TABLE test (a INTEGER); + +statement ok +INSERT INTO test VALUES (1), (2), (3), (4) + +query I +SELECT a FROM (SELECT a FROM test ORDER BY a OFFSET 2) t(a) UNION ALL SELECT a FROM test ORDER BY a +---- +1 +2 +3 +3 +4 +4 + + diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlToRelConvertor.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlToRelConvertor.java index 74c6f49bc121..c684d1948bf4 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlToRelConvertor.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlToRelConvertor.java @@ -87,6 +87,8 @@ public class IgniteSqlToRelConvertor extends SqlToRelConverter { } } + + @Override protected RexNode convertExtendedExpression( SqlNode expr, diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java index a81ca55586e8..2e957eebb949 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java @@ -154,6 +154,27 @@ public final class Commons { .executor(new RexExecutorImpl(DataContexts.EMPTY)) .sqlToRelConverterConfig(SqlToRelConverter.config() .withTrimUnusedFields(true) + + // Disable buggy `RemoveSortInSubQuery` hint, because a query such as + // + // SELECT a FROM (SELECT a FROM test ORDER BY a OFFSET 2) t(a) UNION ALL SELECT a FROM test ORDER BY a + // + // Is written to: + // + // Sort(sort0=[$0], dir0=[ASC]) + // UnionAll + // TableScan + // TableScan + // + // Instead of: + // + // UnionAll + // Limit(offset=[2]) + // Sort(sort0=[$0], dir0=[ASC]) + // TableScan + // TableScan + .withRemoveSortInSubQuery(false) + // currently SqlToRelConverter creates not optimal plan for both optimization and execution // so it's better to disable such rewriting right now // TODO: remove this after IGNITE-14277 diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/LimitOffsetPlannerTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/LimitOffsetPlannerTest.java index fe8a0ad364d8..4d725fee8764 100644 --- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/LimitOffsetPlannerTest.java +++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/LimitOffsetPlannerTest.java @@ -193,6 +193,40 @@ public void testOrderOfRels() throws Exception { .and(hasChildThat(isInstanceOf(IgniteExchange.class)).negate())); } + @Test + public void testNestedOffset() throws Exception { + TableBuilder builder = TestBuilders.table() + .name("TEST") + .addColumn("A", NativeTypes.INT32) + .size(ROW_CNT) + .distribution(IgniteDistributions.random()); + + IgniteSchema schema = createSchema(builder.build()); + + assertPlan("SELECT a FROM (SELECT a FROM test ORDER BY a OFFSET 2)", schema, + isInstanceOf(IgniteLimit.class) + .and(s -> doubleFromRex(s.offset(), -1) == 2.0) + .and(input(isInstanceOf(IgniteExchange.class)) + .and(hasChildThat(isInstanceOf(IgniteSort.class) + )))); + + assertPlan("SELECT a FROM (SELECT a FROM test ORDER BY a OFFSET 2) t(a) UNION ALL SELECT a FROM test ORDER BY a", + schema, isInstanceOf(IgniteSort.class) + .and(s -> s.offset == null && s.fetch == null) + .and(hasChildThat(isInstanceOf(IgniteUnionAll.class) + .and(hasChildThat(isInstanceOf(IgniteLimit.class) + .and(s -> doubleFromRex(s.offset(), -1) == 2.0) + .and(input(isInstanceOf(IgniteExchange.class)) + .and(hasChildThat(isInstanceOf(IgniteSort.class) + .and(s -> s.offset == null))))) + ) + .and(hasChildThat(isInstanceOf(IgniteExchange.class) + .and(input(isInstanceOf(IgniteTableScan.class)))) + ) + )) + ); + } + /** * Creates PUBLIC schema with one TEST table. */