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

zstan pushed a commit to branch ignite-2.18
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/ignite-2.18 by this push:
     new ad8ccf7d4b8 IGNITE-27412 SQL Calcite: Fix function with schema 
serialization - Fixes #12665.
ad8ccf7d4b8 is described below

commit ad8ccf7d4b869d9e9e1900833db30660afa549dc
Author: Aleksey Plekhanov <[email protected]>
AuthorDate: Tue Feb 3 10:32:38 2026 +0300

    IGNITE-27412 SQL Calcite: Fix function with schema serialization - Fixes 
#12665.
    
    Signed-off-by: Aleksey Plekhanov <[email protected]>
    (cherry picked from commit 8da974f6abd9c894546cc76fbd7922ffb5e6c5ee)
---
 .../query/calcite/externalize/RelJson.java          |  4 ++--
 .../UserDefinedFunctionsIntegrationTest.java        | 18 ++++++++++++++++++
 .../calcite/planner/SerializationPlannerTest.java   | 21 +++++++++++++++++++++
 3 files changed, 41 insertions(+), 2 deletions(-)

diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
index df348933cf9..0460fb49da0 100644
--- 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
@@ -574,7 +574,7 @@ class RelJson {
         List<SqlOperator> operators = new ArrayList<>();
 
         qctx.opTable().lookupOperatorOverloads(
-            new SqlIdentifier(name, new SqlParserPos(0, 0)),
+            new SqlIdentifier(List.of(name.split("\\.")), new SqlParserPos(0, 
0)),
             null,
             sqlSyntax,
             operators,
@@ -995,7 +995,7 @@ class RelJson {
     private Object toJson(SqlOperator operator) {
         // User-defined operators are not yet handled.
         Map map = map();
-        map.put("name", operator.getName());
+        map.put("name", operator.getNameAsId().toString());
         map.put("kind", toJson(operator.kind));
         map.put("syntax", toJson(operator.getSyntax()));
         return map;
diff --git 
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/UserDefinedFunctionsIntegrationTest.java
 
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/UserDefinedFunctionsIntegrationTest.java
index ac2e9acecc3..41aef299596 100644
--- 
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/UserDefinedFunctionsIntegrationTest.java
+++ 
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/UserDefinedFunctionsIntegrationTest.java
@@ -229,6 +229,24 @@ public class UserDefinedFunctionsIntegrationTest extends 
AbstractBasicIntegratio
         assertQuery("SELECT sq(4)").returns(16d).check();
     }
 
+    /** */
+    @Test
+    public void testUdfAnotherSchema() {
+        client.getOrCreateCache(new CacheConfiguration<Integer, Object>("emp")
+            .setSqlSchema("EMP")
+            .setIndexedTypes(Integer.class, Employer.class));
+
+        client.getOrCreateCache(new CacheConfiguration<Integer, Object>("udf")
+            .setSqlSchema("UDF")
+            .setSqlFunctionClasses(MulFunctionsLibrary.class));
+
+        for (int i = 0; i < 3; i++)
+            client.cache("emp").put(i, new Employer("emp" + i, (double)i));
+
+        assertQuery("SELECT udf.mul(_key, _key) FROM emp.Employer")
+            .returns(0).returns(1).returns(4).check();
+    }
+
     /** */
     @Test
     public void testTableFunctions() throws Exception {
diff --git 
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/SerializationPlannerTest.java
 
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/SerializationPlannerTest.java
index 15661476be0..8e3528dfb9b 100644
--- 
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/SerializationPlannerTest.java
+++ 
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/SerializationPlannerTest.java
@@ -17,8 +17,11 @@
 
 package org.apache.ignite.internal.processors.query.calcite.planner;
 
+import java.util.List;
+import org.apache.calcite.linq4j.tree.Types;
 import org.apache.calcite.rel.core.Aggregate;
 import org.apache.calcite.sql.SqlKind;
+import 
org.apache.ignite.internal.processors.query.calcite.exec.exp.IgniteScalarFunction;
 import org.apache.ignite.internal.processors.query.calcite.rel.IgniteRel;
 import org.apache.ignite.internal.processors.query.calcite.schema.IgniteSchema;
 import 
org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistributions;
@@ -90,4 +93,22 @@ public class SerializationPlannerTest extends 
AbstractPlannerTest {
             )
         );
     }
+
+    /** */
+    @Test
+    public void testUdfWithSchemaSerialization() throws Exception {
+        IgniteSchema publicSchema = createSchema(createTable("ORDERS", 
single(), "ID", Integer.class));
+        IgniteSchema funcSchema = new IgniteSchema("FUNC");
+
+        funcSchema.addFunction("ECHO", IgniteScalarFunction.create(
+            Types.lookupMethod(SerializationPlannerTest.class, "echo", 
int.class)));
+
+        assertPlan("SELECT func.echo(id) FROM orders", List.of(publicSchema, 
funcSchema),
+            isTableScan("ORDERS"));
+    }
+
+    /** */
+    public static int echo(int val) {
+        return val;
+    }
 }

Reply via email to