This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-28510 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit b1561d85d34a96c01676bdad202571a5cf0b2c5b Author: AMashenkov <[email protected]> AuthorDate: Fri Apr 10 13:47:42 2026 +0300 Add tests --- .../planner/hints/HintOverridingPlannerTest.java | 96 ++++++++++++++++++++++ .../engine/planner/hints/IndexHintPlannerTest.java | 16 ++-- .../planner/hints/NoIndexHintPlannerTest.java | 10 ++- 3 files changed, 114 insertions(+), 8 deletions(-) diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/HintOverridingPlannerTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/HintOverridingPlannerTest.java new file mode 100644 index 00000000000..3fe42a18151 --- /dev/null +++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/HintOverridingPlannerTest.java @@ -0,0 +1,96 @@ +package org.apache.ignite.internal.sql.engine.planner.hints; + +import java.util.function.UnaryOperator; +import org.apache.ignite.internal.sql.engine.framework.TestBuilders.TableBuilder; +import org.apache.ignite.internal.sql.engine.planner.AbstractPlannerTest; +import org.apache.ignite.internal.sql.engine.rel.AbstractIgniteJoin; +import org.apache.ignite.internal.sql.engine.rel.IgniteTableScan; +import org.apache.ignite.internal.sql.engine.schema.IgniteSchema; +import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions; +import org.apache.ignite.internal.type.NativeTypes; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +public class HintOverridingPlannerTest extends AbstractPlannerTest { + private static IgniteSchema SCHEMA; + + private static final String TBL1 = "TBL1"; + + private static final String TBL2 = "TBL2"; + + @BeforeAll + public static void setup() { + SCHEMA = createSchemaFrom( + createSimpleTable(TBL1, 100) + .andThen(addHashIndex("ID")) + .andThen(addSortIndex("VAL1")) + .andThen(addSortIndex("VAL2", "VAL3")) + .andThen(addSortIndex("VAL3")), + createSimpleTable(TBL2, 100_000) + .andThen(addHashIndex("ID")) + .andThen(addSortIndex("VAL1")) + .andThen(addSortIndex("VAL2")) + .andThen(addSortIndex("VAL3")) + ); + } + + @Test + public void usingDifferentIndexesForSameTable() throws Exception { + var sql = "SELECT * FROM" + + " (SELECT t1.val1, t1.val2, t1.val3 FROM tbl1 /*+ NO_INDEX */ as t1" + + " LEFT JOIN tbl2 /*+ FORCE_INDEX(idx_val3) */ as t2 ON (t1.val2 = t2.val2 AND t2.val2 > 'x')) as t" + + " LEFT JOIN tbl2 /*+ FORCE_INDEX(idx_val2) */ as t3 ON (t.val3 = t3.val3 AND t3.val3 < 'a')"; + + assertPlan(sql, SCHEMA, isInstanceOf(AbstractIgniteJoin.class) + .and(input(0, nodeOrAnyChild(isInstanceOf(AbstractIgniteJoin.class) + .and(input(0, nodeOrAnyChild(isInstanceOf(IgniteTableScan.class)))) + .and(input(1, nodeOrAnyChild(isIndexScan(TBL2, "IDX_VAL3") + .and(scan -> scan.searchBounds() == null) + .and(scan -> ">($t0, _UTF-8'x')".equals(scan.condition().toString())) + ))) + ))) + .and(input(1, nodeOrAnyChild(isIndexScan(TBL2, "IDX_VAL2") + .and(scan -> scan.searchBounds() == null) + .and(scan -> "<($t3, _UTF-8'a')".equals(scan.condition().toString())) + ))) + ); + } + + @Test + public void testHintOverriding() throws Exception { + var sql = "SELECT * FROM" + + " (SELECT /*+ NO_INDEX */ t1.val1, t1.val2, t1.val3 FROM tbl1 as t1 LEFT JOIN tbl2 as t2 ON (t1.val2 = t2.val2)) as t" + + " LEFT JOIN tbl2 /*+ FORCE_INDEX(idx_val2) */ as t3 ON (t.val3 = t3.val3)"; + + assertPlan(sql, SCHEMA, isInstanceOf(AbstractIgniteJoin.class) + .and(input(0, nodeOrAnyChild(isInstanceOf(AbstractIgniteJoin.class) + .and(input(0, nodeOrAnyChild(isInstanceOf(IgniteTableScan.class)))) + .and(input(1, nodeOrAnyChild(isInstanceOf(IgniteTableScan.class)))) + ))) + .and(input(1, nodeOrAnyChild(isIndexScan(TBL2, "IDX_VAL2")))) + ); + + sql = "SELECT * FROM" + + " (SELECT /*+ FORCE_INDEX(idx_val2) */ t1.val1, t1.val2, t1.val3 FROM tbl1 /*+ NO_INDEX */ as t1 " + + " LEFT JOIN tbl2 as t2 ON (t1.val2 = t2.val2)) as t" + + " LEFT JOIN tbl2 /*+ NO_INDEX */ as t3 ON (t.val3 = t3.val3)"; + + assertPlan(sql, SCHEMA, isInstanceOf(AbstractIgniteJoin.class) + .and(input(0, nodeOrAnyChild(isInstanceOf(AbstractIgniteJoin.class) + .and(input(0, nodeOrAnyChild(isInstanceOf(IgniteTableScan.class)))) + .and(input(1, nodeOrAnyChild(isIndexScan(TBL2, "IDX_VAL2")))) + ))) + .and(input(1, nodeOrAnyChild(isInstanceOf(IgniteTableScan.class)))) + ); + } + + private static UnaryOperator<TableBuilder> createSimpleTable(String name, int sz) { + return t -> t.name(name) + .size(sz) + .distribution(IgniteDistributions.single()) + .addKeyColumn("ID", NativeTypes.INT32) + .addColumn("VAL1", NativeTypes.INT32) + .addColumn("VAL2", NativeTypes.STRING) + .addColumn("VAL3", NativeTypes.STRING); + } +} diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/IndexHintPlannerTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/IndexHintPlannerTest.java index 3c1b662fb29..510a1b9c02f 100644 --- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/IndexHintPlannerTest.java +++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/IndexHintPlannerTest.java @@ -148,15 +148,21 @@ public class IndexHintPlannerTest extends AbstractPlannerTest { @Test public void testSingleTable() throws Exception { - var sql = "SELECT /*+ FORCE_INDEX({}) */ * FROM TBL1 WHERE val2 = 'v' AND val3 = 'v'"; + var sql1 = "SELECT /*+ FORCE_INDEX({}) */ * FROM TBL1 WHERE val2 = 'v' AND val3 = 'v'"; + var sql2 = "SELECT * FROM TBL1 /*+ FORCE_INDEX({}) */ WHERE val2 = 'v' AND val3 = 'v'"; - assertCertainIndex(format(sql, ""), TBL1, "IDX_VAL2_VAL3"); + assertCertainIndex(format(sql1, ""), TBL1, "IDX_VAL2_VAL3"); + assertCertainIndex(format(sql2, ""), TBL1, "IDX_VAL2_VAL3"); - assertPlan(format(sql, "IDX_VAL2_VAL3, IDX_VAL3"), SCHEMA, nodeOrAnyChild(isIndexScan(TBL1, "IDX_VAL2_VAL3") + assertPlan(format(sql1, "IDX_VAL1, IDX_VAL3"), SCHEMA, nodeOrAnyChild(isIndexScan(TBL1, "IDX_VAL1") + .or(isIndexScan(TBL1, "IDX_VAL3")))); + assertPlan(format(sql2, "IDX_VAL1, IDX_VAL3"), SCHEMA, nodeOrAnyChild(isIndexScan(TBL1, "IDX_VAL1") .or(isIndexScan(TBL1, "IDX_VAL3")))); - assertPlan("SELECT /*+ FORCE_INDEX(IDX_VAL2_VAL3), FORCE_INDEX(IDX_VAL3) */ * FROM TBL1 WHERE val2 = 'v' AND val3 = 'v'", SCHEMA, - nodeOrAnyChild(isIndexScan(TBL1, "IDX_VAL2_VAL3").or(isIndexScan(TBL1, "IDX_VAL3")))); + assertPlan("SELECT /*+ FORCE_INDEX(IDX_VAL1), FORCE_INDEX(IDX_VAL3) */ * FROM TBL1 WHERE val2 = 'v' AND val3 = 'v'", SCHEMA, + nodeOrAnyChild(isIndexScan(TBL1, "IDX_VAL1").or(isIndexScan(TBL1, "IDX_VAL3")))); + assertPlan("SELECT * FROM TBL1 /*+ FORCE_INDEX(IDX_VAL1), FORCE_INDEX(IDX_VAL3) */ WHERE val2 = 'v' AND val3 = 'v'", SCHEMA, + nodeOrAnyChild(isIndexScan(TBL1, "IDX_VAL1").or(isIndexScan(TBL1, "IDX_VAL3")))); } @Test diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/NoIndexHintPlannerTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/NoIndexHintPlannerTest.java index 313dd52ab5a..17a27a550e0 100644 --- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/NoIndexHintPlannerTest.java +++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/hints/NoIndexHintPlannerTest.java @@ -60,13 +60,17 @@ public class NoIndexHintPlannerTest extends AbstractPlannerTest { @Test public void testSingleTable() throws Exception { assertNoAnyIndex("SELECT /*+ NO_INDEX */ * FROM TBL1 WHERE id = 0"); + assertNoAnyIndex("SELECT * FROM TBL1 /*+ NO_INDEX */ WHERE id = 0"); - var sql = "SELECT /*+ NO_INDEX({}) */ * FROM TBL1 WHERE id = 0"; - - assertNoAnyIndex(format(sql, "")); + assertNoAnyIndex("SELECT /*+ NO_INDEX() */ * FROM TBL1 WHERE id = 0"); + assertNoAnyIndex("SELECT * FROM TBL1 /*+ NO_INDEX() */ WHERE id = 0"); assertNoAnyIndex("SELECT /*+ NO_INDEX(IDX_VAL1, IDX_VAL2_VAL3) */ * FROM TBL1 WHERE val1=1 and val2='v'"); assertNoAnyIndex("SELECT /*+ NO_INDEX(IDX_VAL1), NO_INDEX(IDX_VAL2_VAL3) */ * FROM TBL1 WHERE val1=1 and val2='v'"); + + assertNoAnyIndex(format("SELECT * FROM TBL1 /*+ NO_INDEX({}) */ WHERE id = 0", "")); + assertNoAnyIndex("SELECT * FROM TBL1 /*+ NO_INDEX(IDX_VAL1, IDX_VAL2_VAL3) */ WHERE val1=1 and val2='v'"); + assertNoAnyIndex("SELECT * FROM TBL1 /*+ NO_INDEX(IDX_VAL1), NO_INDEX(IDX_VAL2_VAL3) */ WHERE val1=1 and val2='v'"); } @Test
