You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2026/04/10 10:48:37 UTC
(ignite-3) branch ignite-28510 created (now 02ea4b08305)
This is an automated email from the ASF dual-hosted git repository.
amashenkov pushed a change to branch ignite-28510
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
at 02ea4b08305 fix
This branch includes the following new commits:
new b1561d85d34 Add tests
new 02ea4b08305 fix
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(ignite-3) 01/02: Add tests
Posted by am...@apache.org.
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 <am...@apache.org>
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
(ignite-3) 02/02: fix
Posted by am...@apache.org.
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 02ea4b0830515d3e73fbae9f62428626a11f5b5d
Author: AMashenkov <am...@apache.org>
AuthorDate: Fri Apr 10 13:48:17 2026 +0300
fix
---
.../java/org/apache/ignite/internal/sql/engine/util/Commons.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
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 1fde9c85a07..e2bfc2e02fc 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
@@ -55,6 +55,7 @@ import org.apache.calcite.plan.RelTraitSet;
import org.apache.calcite.rel.RelCollationTraitDef;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.JoinInfo;
+import org.apache.calcite.rel.core.TableScan;
import org.apache.calcite.rel.hint.HintStrategyTable;
import org.apache.calcite.rel.logical.LogicalJoin;
import org.apache.calcite.rel.type.RelDataType;
@@ -93,7 +94,6 @@ import org.apache.ignite.internal.sql.engine.prepare.IgniteConvertletTable;
import org.apache.ignite.internal.sql.engine.prepare.IgniteTypeCoercion;
import org.apache.ignite.internal.sql.engine.prepare.PlanningContext;
import org.apache.ignite.internal.sql.engine.rel.IgniteProject;
-import org.apache.ignite.internal.sql.engine.rel.logical.IgniteLogicalTableScan;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlCommitTransaction;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlConformance;
import org.apache.ignite.internal.sql.engine.sql.IgniteSqlKill;
@@ -164,8 +164,8 @@ public final class Commons {
.hintStrategy(IgniteHint.ENFORCE_JOIN_ORDER.name(), JOIN)
.hintStrategy(IgniteHint.DISABLE_RULE.name(), (hint, rel) -> true)
.hintStrategy(IgniteHint.EXPAND_DISTINCT_AGG.name(), AGGREGATE)
- .hintStrategy(IgniteHint.NO_INDEX.name(), (hint, rel) -> rel instanceof IgniteLogicalTableScan)
- .hintStrategy(IgniteHint.FORCE_INDEX.name(), (hint, rel) -> rel instanceof IgniteLogicalTableScan)
+ .hintStrategy(IgniteHint.NO_INDEX.name(), (hint, rel) -> rel instanceof TableScan)
+ .hintStrategy(IgniteHint.FORCE_INDEX.name(), (hint, rel) -> rel instanceof TableScan)
.hintStrategy(IgniteHint.DISABLE_DECORRELATION.name(), (hint, rel) -> true)
.build()
)