This is an automated email from the ASF dual-hosted git repository.

namelchev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new d3af1fabf2d IGNITE-26404 Fixed H2QueryInfo#planWithoutScanCount for 
UNION queries. (#12337)
d3af1fabf2d is described below

commit d3af1fabf2d520209b646d2af5355e2f4aba5ca5
Author: Aleksandr Chesnokov <[email protected]>
AuthorDate: Wed Oct 1 09:55:19 2025 +0300

    IGNITE-26404 Fixed H2QueryInfo#planWithoutScanCount for UNION queries. 
(#12337)
---
 .../integration/SqlPlanHistoryIntegrationTest.java | 16 ++++++++++-
 .../internal/processors/query/h2/H2QueryInfo.java  | 32 +++++++++++++++++-----
 2 files changed, 40 insertions(+), 8 deletions(-)

diff --git 
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/SqlPlanHistoryIntegrationTest.java
 
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/SqlPlanHistoryIntegrationTest.java
index 179971ca7b6..0d30c3d8863 100644
--- 
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/SqlPlanHistoryIntegrationTest.java
+++ 
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/SqlPlanHistoryIntegrationTest.java
@@ -537,6 +537,20 @@ public class SqlPlanHistoryIntegrationTest extends 
GridCommonAbstractTest {
         checkSqlPlanHistory(3);
     }
 
+    /** Tests that H2 query plans for UNION operations do not contain 
'scanCount' suffix. */
+    @Test
+    public void testNoScanCountSuffixForUNION() throws Exception {
+        assumeTrue("ScanCount suffix can only be present in H2 local query 
plans",
+            IndexingQueryEngineConfiguration.ENGINE_NAME.equals(sqlEngine) && 
loc);
+
+        startTestGrid();
+
+        for (int i = 0; i < 10; i++)
+            cacheQuery(new SqlFieldsQuery("SELECT * FROM A.String UNION ALL 
SELECT * FROM B.String"), "A");
+
+        checkMetrics(getSqlPlanHistory());
+    }
+
     /**
      * @param qry Query.
      */
@@ -740,7 +754,7 @@ public class SqlPlanHistoryIntegrationTest extends 
GridCommonAbstractTest {
             assertTrue(plan.lastStartTime().getTime() > 0);
 
             if (loc)
-                assertFalse(plan.plan().contains("/* scanCount"));
+                assertFalse(plan.plan().contains("scanCount"));
         }
     }
 
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2QueryInfo.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2QueryInfo.java
index 53d720326a2..a94d7a63861 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2QueryInfo.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2QueryInfo.java
@@ -236,17 +236,35 @@ public class H2QueryInfo implements TrackableQuery {
      * @return SQL plan without the scanCount suffix.
      */
     public String planWithoutScanCount(String plan) {
-        String res = null;
+        if (plan == null || !plan.contains("scanCount:"))
+            return plan;
 
-        int start = plan.indexOf("\n    /* scanCount");
+        StringBuilder res = new StringBuilder(plan);
 
-        if (start != -1) {
-            int end = plan.indexOf("*/", start);
+        removePattern(res, "\n    /* scanCount:", "*/");
+        removePattern(res, "\n    /++ scanCount:", "++/");
 
-            res = plan.substring(0, start) + plan.substring(end + 2);
-        }
+        return res.toString();
+    }
+
+    /**
+     * @param sb StringBuilder.
+     * @param startPattern Start pattern.
+     * @param endMarker End marker.
+     */
+    private void removePattern(StringBuilder sb, String startPattern, String 
endMarker) {
+        int start = sb.lastIndexOf(startPattern);
 
-        return (res == null) ? plan : res;
+        while (start != -1) {
+            int end = sb.indexOf(endMarker, start);
+
+            if (end == -1)
+                break;
+
+            sb.delete(start, end + endMarker.length());
+
+            start = sb.lastIndexOf(startPattern);
+        }
     }
 
     /**

Reply via email to