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)

Reply via email to