This is an automated email from the ASF dual-hosted git repository.
ppa pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new 56f11fa3046 IGNITE-26471 Sql. Fixed NPE when building multibounds for
hash index (#6622)
56f11fa3046 is described below
commit 56f11fa3046034efcf9ddf67b7817a26d620c46d
Author: Pavel Pereslegin <[email protected]>
AuthorDate: Fri Sep 19 12:31:29 2025 +0300
IGNITE-26471 Sql. Fixed NPE when building multibounds for hash index (#6622)
---
.../apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java | 9 +++++++++
.../org/apache/ignite/internal/sql/engine/util/RexUtils.java | 9 ++++++++-
.../sql/engine/planner/IndexSearchBoundsPlannerTest.java | 9 ++++++++-
3 files changed, 25 insertions(+), 2 deletions(-)
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
index c6b0364d4ac..4b946424b34 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSecondaryIndexTest.java
@@ -1275,5 +1275,14 @@ public class ItSecondaryIndexTest extends
BaseSqlIntegrationTest {
.returns(3, 3)
.returns(17, 3)
.check();
+
+ // Ensure that attempting to use range multi-bounds on a hash index
doesn't produce errors.
+ assertQuery(format("SELECT /*+ FORCE_INDEX(TT_{}_PK) */ id, val1 "
+ + " FROM tt_{} WHERE id < 2 OR id = 3", id, id))
+ .matches(containsTableScan("PUBLIC", "T"))
+ .returns(-38, 7)
+ .returns(1, 1)
+ .returns(3, 3)
+ .check();
}
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/RexUtils.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/RexUtils.java
index 0bc4b08fe66..38ec6fa6666 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/RexUtils.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/RexUtils.java
@@ -719,7 +719,14 @@ public class RexUtils {
}
}
- bounds.add(createBounds(fc, calls, cluster, fldType, complexity,
allowRange));
+ SearchBounds searchBounds = createBounds(fc, calls, cluster,
fldType, complexity, allowRange);
+
+ if (searchBounds == null) {
+ // The bounds do not completely cover the search predicate.
+ return null;
+ }
+
+ bounds.add(searchBounds);
}
return bounds;
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/IndexSearchBoundsPlannerTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/IndexSearchBoundsPlannerTest.java
index b3f42f6b719..06df65c41b6 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/IndexSearchBoundsPlannerTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/IndexSearchBoundsPlannerTest.java
@@ -728,6 +728,14 @@ public class IndexSearchBoundsPlannerTest extends
AbstractPlannerTest {
void testHashIndexBounds() throws Exception {
publicSchema = createSchemaFrom(tableWithHashIndex("TEST"));
+ // Ensure that attempting to use range bounds on a hash index doesn't
produce any exceptions.
+ assertPlan("SELECT /*+ FORCE_INDEX(c1c2c3)*/ * FROM TEST WHERE (c1<1
OR c1>10) AND c2='2' AND c3=3",
+ publicSchema, isTableScan("TEST"));
+ assertPlan("SELECT /*+ FORCE_INDEX(c1c2c3)*/ * FROM TEST WHERE (c1<1
OR c1=10) AND c2='2' AND c3=3",
+ publicSchema, isTableScan("TEST"));
+ assertPlan("SELECT /*+ FORCE_INDEX(c1c2c3)*/ * FROM TEST WHERE c1<1
AND c2='2' AND c3=3",
+ publicSchema, isTableScan("TEST"));
+
// Index is not used when predicate covers only prefix of search key.
assertPlan("SELECT /*+ FORCE_INDEX(c1c2c3)*/ * FROM test WHERE c1=1",
publicSchema, isTableScan("TEST"));
assertPlan("SELECT /*+ FORCE_INDEX(c1c2c3)*/ * FROM test WHERE c1=1
AND c2='2'", publicSchema, isTableScan("TEST"));
@@ -870,7 +878,6 @@ public class IndexSearchBoundsPlannerTest extends
AbstractPlannerTest {
private static UnaryOperator<TableBuilder> tableA(String tableName) {
return tableBuilder -> tableBuilder
.name(tableName)
- .name("TEST")
.addColumn("C1", NativeTypes.INT32)
.addColumn("C2", NativeTypes.STRING)
.addColumn("C3", NativeTypes.INT32)