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

Reply via email to