From af7b7458434c9a571f729604ecb7f870bbd47ec8 Mon Sep 17 00:00:00 2001 From: zstan Date: Mon, 16 Feb 2026 08:53:08 +0300 Subject: [PATCH 1/8] IGNITE-27836 Fix documentation for QuerySqlTableFunction --- .../java/src/main/java/org/apache/ignite/snippets/SqlAPI.java | 2 +- .../ignite/cache/query/annotations/QuerySqlTableFunction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java index 9de660bf2dbf3..6c299cce8ef13 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java @@ -202,7 +202,7 @@ IgniteCache testSqlTableFunction(Ignite ignite) { IgniteCache cache = ignite.createCache(cfg); - SqlFieldsQuery query = new SqlFieldsQuery("SELECT STR_COL FROM TABLE_FUNCTION(10) WHERE INT_COL > 50"); + SqlFieldsQuery query = new SqlFieldsQuery("SELECT STR_COL FROM TABLE(TABLE_FUNCTION(10)) WHERE INT_COL > 50"); cache.query(query).getAll(); // end::sql-table-function-config-query[] diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlTableFunction.java b/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlTableFunction.java index 7c41bf954ef22..bceae02916c08 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlTableFunction.java +++ b/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlTableFunction.java @@ -45,7 +45,7 @@ * cacheCfg.setSqlFunctionClasses(MyTableFunctions.class); * * // And use in queries. - * cache.query(new SqlFieldsQuery("select S_VAL from MY_TABLE(1, 5.0f, "ext") where F_VAL is not null")); + * cache.query(new SqlFieldsQuery("select S_VAL from TABLE(MY_TABLE(1, 5.0f, "ext")) where F_VAL is not null")); * *

* Table function must return an {@code Iterable} as a row set. Each row can be represented by an {@code Object[]} or From d93c03dff1f77072e149e953f8ca86bff85bd34c Mon Sep 17 00:00:00 2001 From: zstan Date: Mon, 16 Feb 2026 14:28:47 +0300 Subject: [PATCH 2/8] fix after review --- .../org/apache/ignite/snippets/SqlAPI.java | 12 +++++ .../UserDefinedFunctionsIntegrationTest.java | 52 +++++++++++++++---- .../query/calcite/jdbc/JdbcQueryTest.java | 26 +++++++++- .../ignite/testframework/GridTestUtils.java | 10 ++++ .../processors/query/h2/H2SchemaManager.java | 9 +++- 5 files changed, 97 insertions(+), 12 deletions(-) diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java index 6c299cce8ef13..07b6c575d2df0 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java @@ -174,6 +174,14 @@ public static Iterable table_function(int i) { new Object[] {i * 10, "empty"} ); } + + @QuerySqlTableFunction(alias = "TABLE_FUNC_WITH_ARRAY", columnTypes = {String.class}, columnNames = {"RES_COL"}) + public static Iterable table_function_with_arr(List array) { + return array.stream() + .map(Object::toString) + .map(str -> new Object[]{str}) + .toList(); + } } // end::sql-table-function-example[] @@ -204,6 +212,10 @@ IgniteCache testSqlTableFunction(Ignite ignite) { SqlFieldsQuery query = new SqlFieldsQuery("SELECT STR_COL FROM TABLE(TABLE_FUNCTION(10)) WHERE INT_COL > 50"); + cache.query(query).getAll(); + + query = new SqlFieldsQuery("SELECT RES_COL FROM TABLE(TABLE_FUNC_WITH_ARRAY(?))").setArgs(List.of("row1", "row2")); + cache.query(query).getAll(); // end::sql-table-function-config-query[] 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 41aef29959634..237166069fc30 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 @@ -92,7 +92,6 @@ public void testSameSignatureNotRegistered() throws Exception { assertEquals(1, schema.getFunctions("SAMESIGN").size()); } - /** */ @Test public void testSystemFunctionOverriding() throws Exception { @@ -105,18 +104,25 @@ public void testSystemFunctionOverriding() throws Exception { // Make sure that the new functions didn't affect schema 'PUBLIC'. assertQuery("SELECT UPPER(?)").withParams("abc").returns("ABC").check(); - assertQuery("select UNIX_SECONDS(TIMESTAMP '2021-01-01 00:00:00')").returns(1609459200L).check(); - assertQuery("select * from table(SYSTEM_RANGE(1, 2))").returns(1L).returns(2L).check(); - assertQuery("select TYPEOF(?)").withParams(1L).returns("BIGINT").check(); - assertQuery("select ? + ?").withParams(1, 2).returns(3).check(); - assertThrows("select PLUS(?, ?)", SqlValidatorException.class, "No match found for function signature", 1, 2); + assertQuery("SELECT UNIX_SECONDS(TIMESTAMP '2021-01-01 00:00:00')").returns(1609459200L).check(); + assertQuery("SELECT * FROM TABLE(SYSTEM_RANGE(1, 2))").returns(1L).returns(2L).check(); + assertQuery("SELECT TYPEOF(?)").withParams(1L).returns("BIGINT").check(); + assertQuery("SELECT ? + ?").withParams(1, 2).returns(3).check(); + assertThrows("SELECT PLUS(?, ?)", SqlValidatorException.class, "No match found for function signature", 1, 2); // Ensure that new functions are successfully created in a custom schema. assertQuery("SELECT \"OWN_SCHEMA\".UPPER(?)").withParams("abc").returns(3).check(); - assertQuery("select \"OWN_SCHEMA\".UNIX_SECONDS(TIMESTAMP '2021-01-01 00:00:00')").returns(1).check(); - assertQuery("select * from table(\"OWN_SCHEMA\".SYSTEM_RANGE(1, 2))").returns(100L).check(); - assertQuery("select \"OWN_SCHEMA\".TYPEOF('ABC')").returns(1).check(); - assertQuery("select \"OWN_SCHEMA\".PLUS(?, ?)").withParams(1, 2).returns(100).check(); + assertQuery("SELECT \"OWN_SCHEMA\".UNIX_SECONDS(TIMESTAMP '2021-01-01 00:00:00')").returns(1).check(); + assertQuery("SELECT * FROM TABLE(\"OWN_SCHEMA\".SYSTEM_RANGE(1, 2))").returns(100L).check(); + assertQuery("SELECT \"OWN_SCHEMA\".TYPEOF('ABC')").returns(1).check(); + assertQuery("SELECT \"OWN_SCHEMA\".PLUS(?, ?)").withParams(1, 2).returns(100).check(); + + assertQuery("SELECT * FROM TABLE(\"OWN_SCHEMA\".STR_ARRAY_CONSUME_TABLE(?)) as t").withParams(List.of("row1", "row2")) + .returns("row1").returns( "row2").check(); + assertQuery("SELECT * FROM TABLE(\"OWN_SCHEMA\".OBJ_ARRAY_CONSUME_TABLE(?)) as t").withParams(List.of(new CustomClass(), "row2")) + .returns("CustomClass.toString").returns( "row2").check(); + assertThrows("SELECT * FROM TABLE(\"OWN_SCHEMA\".STR_ARRAY_CONSUME_TABLE(?)) as t", IgniteSQLException.class, + "An error occurred while query executing", List.of(new CustomClass(), "row2")); LogListener logChecker0 = LogListener.matches("Unable to add user-defined SQL function 'upper'") .andMatches("Unable to add user-defined SQL function 'unix_seconds'") @@ -713,6 +719,24 @@ public static int typeof(Object o) { public static int plus(int x, int y) { return 100; } + + /** Table function with String array as input. */ + @QuerySqlTableFunction(alias = "STR_ARRAY_CONSUME_TABLE", columnTypes = {String.class}, columnNames = {"RESULT"}) + public static Iterable strArrConsumeTable(List array) { + return array.stream() + .map(Object::toString) + .map(str -> new Object[]{str}) + .toList(); + } + + /** Table function with Object array as input. */ + @QuerySqlTableFunction(alias = "OBJ_ARRAY_CONSUME_TABLE", columnTypes = {String.class}, columnNames = {"RESULT"}) + public static Iterable objArrConsumeTable(List array) { + return array.stream() + .map(Object::toString) + .map(str -> new Object[]{str}) + .toList(); + } } /** */ @@ -726,4 +750,12 @@ public static double salary(String ignite, int key) { .getAll().get(0).get(0); } } + + /** */ + private static class CustomClass { + /** */ + @Override public String toString() { + return "CustomClass.toString"; + } + } } diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java index cd457f62a38f0..36ed8759c9d9c 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java @@ -41,9 +41,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import org.apache.ignite.calcite.CalciteQueryEngineConfiguration; +import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.SqlConfiguration; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; +import org.apache.ignite.internal.processors.query.calcite.integration.AbstractBasicIntegrationTest; +import org.apache.ignite.internal.processors.query.calcite.integration.UserDefinedFunctionsIntegrationTest; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.WithSystemProperty; @@ -69,8 +72,14 @@ public class JdbcQueryTest extends GridCommonAbstractTest { /** {@inheritDoc} */ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + CacheConfiguration ccfg = new CacheConfiguration<>("TEST_CACHE_OWN") + .setSqlSchema("OWN_SCHEMA") + .setSqlFunctionClasses(GridTestUtils.SqlTestFunctions.class); + return super.getConfiguration(igniteInstanceName).setSqlConfiguration( - new SqlConfiguration().setQueryEnginesConfiguration(new CalciteQueryEngineConfiguration())); + new SqlConfiguration() + .setQueryEnginesConfiguration(new CalciteQueryEngineConfiguration())) + .setCacheConfiguration(ccfg); } /** {@inheritDoc} */ @@ -113,6 +122,21 @@ private void connect(String url) throws Exception { stopAllGrids(); } + /** Test user defined table through jdbc. */ + @Test + public void testUdt() throws Exception { + try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM TABLE(\"OWN_SCHEMA\".STR_ARRAY_CONSUME_TABLE(?))")) { + ps.setObject(1, List.of("row1", "row2")); + ResultSet rs = ps.executeQuery(); + + assertTrue(rs.next()); + assertEquals("row1", rs.getString(1)); + + assertTrue(rs.next()); + assertEquals("row2", rs.getString(1)); + } + } + /** * @throws SQLException If failed. */ diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java index 62e450ee10c39..8d990c61a54b6 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java @@ -87,6 +87,7 @@ import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.Ignition; import org.apache.ignite.cache.query.annotations.QuerySqlFunction; +import org.apache.ignite.cache.query.annotations.QuerySqlTableFunction; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.internal.IgniteEx; @@ -2639,6 +2640,15 @@ public static long sleep_and_can_fail(long sleepMs, boolean fail) { return sleep; } + + /** Function consume String array and output it row by row. */ + @QuerySqlTableFunction(alias = "STR_ARRAY_CONSUME_TABLE", columnTypes = {String.class}, columnNames = {"RESULT"}) + public static Iterable strArrConsumeTable(List array) { + return array.stream() + .map(Object::toString) + .map(str -> new Object[]{str}) + .toList(); + } } /** diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java index 5031345ab4392..097b521a9df6b 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java @@ -27,6 +27,8 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; +import org.apache.ignite.configuration.QueryEngineConfiguration; +import org.apache.ignite.indexing.IndexingQueryEngineConfiguration; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.processors.cache.GridCacheContextInfo; import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode; @@ -98,7 +100,12 @@ public H2SchemaManager(GridKernalContext ctx, IgniteH2Indexing idx, ConnectionMa public void start() throws IgniteCheckedException { schemaMgr = ctx.query().schemaManager(); - ctx.internalSubscriptionProcessor().registerSchemaChangeListener(this); + QueryEngineConfiguration[] queryEnginesCfg = ctx.config().getSqlConfiguration().getQueryEnginesConfiguration(); + QueryEngineConfiguration idxEngine = F.find(List.of(queryEnginesCfg), null, + it -> it instanceof IndexingQueryEngineConfiguration); + + if (idxEngine != null) + ctx.internalSubscriptionProcessor().registerSchemaChangeListener(this); // Register predefined system functions. createSqlFunction(QueryUtils.DFLT_SCHEMA, "QUERY_ENGINE", true, From a4e0ef241b25839f9737d11df5d1f6f47c6aae8b Mon Sep 17 00:00:00 2001 From: zstan Date: Mon, 16 Feb 2026 14:36:01 +0300 Subject: [PATCH 3/8] fix 11 jdk --- .../src/main/java/org/apache/ignite/snippets/SqlAPI.java | 2 +- .../integration/UserDefinedFunctionsIntegrationTest.java | 5 +++-- .../java/org/apache/ignite/testframework/GridTestUtils.java | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java index 07b6c575d2df0..eff7d0376767a 100644 --- a/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java +++ b/docs/_docs/code-snippets/java/src/main/java/org/apache/ignite/snippets/SqlAPI.java @@ -180,7 +180,7 @@ public static Iterable table_function_with_arr(List array) { return array.stream() .map(Object::toString) .map(str -> new Object[]{str}) - .toList(); + .collect(Collectors.toList()); } } // end::sql-table-function-example[] 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 237166069fc30..278b3bac52f7d 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 @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; import org.apache.calcite.schema.SchemaPlus; import org.apache.calcite.sql.validate.SqlValidatorException; import org.apache.ignite.IgniteCache; @@ -726,7 +727,7 @@ public static Iterable strArrConsumeTable(List array) { return array.stream() .map(Object::toString) .map(str -> new Object[]{str}) - .toList(); + .collect(Collectors.toList()); } /** Table function with Object array as input. */ @@ -735,7 +736,7 @@ public static Iterable objArrConsumeTable(List array) { return array.stream() .map(Object::toString) .map(str -> new Object[]{str}) - .toList(); + .collect(Collectors.toList()); } } diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java index 8d990c61a54b6..b20c015f14823 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java @@ -2647,7 +2647,7 @@ public static Iterable strArrConsumeTable(List array) { return array.stream() .map(Object::toString) .map(str -> new Object[]{str}) - .toList(); + .collect(Collectors.toList()); } } From f36192d64288da47aeaa834a39622e3c480606cb Mon Sep 17 00:00:00 2001 From: zstan Date: Mon, 16 Feb 2026 14:48:26 +0300 Subject: [PATCH 4/8] fix --- .../internal/processors/query/calcite/jdbc/JdbcQueryTest.java | 2 -- .../ignite/internal/processors/query/h2/H2SchemaManager.java | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java index 36ed8759c9d9c..37a5597afc0ef 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java @@ -45,8 +45,6 @@ import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.SqlConfiguration; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; -import org.apache.ignite.internal.processors.query.calcite.integration.AbstractBasicIntegrationTest; -import org.apache.ignite.internal.processors.query.calcite.integration.UserDefinedFunctionsIntegrationTest; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.WithSystemProperty; diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java index 097b521a9df6b..454d359a0ddad 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java @@ -100,8 +100,8 @@ public H2SchemaManager(GridKernalContext ctx, IgniteH2Indexing idx, ConnectionMa public void start() throws IgniteCheckedException { schemaMgr = ctx.query().schemaManager(); - QueryEngineConfiguration[] queryEnginesCfg = ctx.config().getSqlConfiguration().getQueryEnginesConfiguration(); - QueryEngineConfiguration idxEngine = F.find(List.of(queryEnginesCfg), null, + QueryEngineConfiguration[] qryEnginesCfg = ctx.config().getSqlConfiguration().getQueryEnginesConfiguration(); + QueryEngineConfiguration idxEngine = F.find(List.of(qryEnginesCfg), null, it -> it instanceof IndexingQueryEngineConfiguration); if (idxEngine != null) From f82b9fc34428d18533b4459d67dc4c3189c19181 Mon Sep 17 00:00:00 2001 From: zstan Date: Mon, 16 Feb 2026 16:55:03 +0300 Subject: [PATCH 5/8] empty check --- .../ignite/internal/processors/query/h2/H2SchemaManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java index 454d359a0ddad..02c793262508e 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java @@ -101,7 +101,7 @@ public void start() throws IgniteCheckedException { schemaMgr = ctx.query().schemaManager(); QueryEngineConfiguration[] qryEnginesCfg = ctx.config().getSqlConfiguration().getQueryEnginesConfiguration(); - QueryEngineConfiguration idxEngine = F.find(List.of(qryEnginesCfg), null, + QueryEngineConfiguration idxEngine = F.isEmpty(qryEnginesCfg) ? null : F.find(List.of(qryEnginesCfg), null, it -> it instanceof IndexingQueryEngineConfiguration); if (idxEngine != null) From 2be4401d31828545c28e1291a8946865e93f92a5 Mon Sep 17 00:00:00 2001 From: zstan Date: Tue, 17 Feb 2026 08:47:11 +0300 Subject: [PATCH 6/8] fix after review --- .../query/calcite/jdbc/JdbcQueryTest.java | 15 ++++++++++++++- .../ignite/testframework/GridTestUtils.java | 10 ---------- .../processors/query/h2/H2SchemaManager.java | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java index 37a5597afc0ef..c7d39bfa20876 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcQueryTest.java @@ -40,6 +40,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.ignite.cache.query.annotations.QuerySqlTableFunction; import org.apache.ignite.calcite.CalciteQueryEngineConfiguration; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; @@ -72,7 +73,7 @@ public class JdbcQueryTest extends GridCommonAbstractTest { @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { CacheConfiguration ccfg = new CacheConfiguration<>("TEST_CACHE_OWN") .setSqlSchema("OWN_SCHEMA") - .setSqlFunctionClasses(GridTestUtils.SqlTestFunctions.class); + .setSqlFunctionClasses(FunctionsLibrary.class); return super.getConfiguration(igniteInstanceName).setSqlConfiguration( new SqlConfiguration() @@ -512,4 +513,16 @@ public ObjectToStore(int id, String name, double val) { return Objects.hash(id, name, val); } } + + /** User defined functions. */ + public static class FunctionsLibrary { + /** Function consume String array and output it row by row. */ + @QuerySqlTableFunction(alias = "STR_ARRAY_CONSUME_TABLE", columnTypes = {String.class}, columnNames = {"RESULT"}) + public static Iterable strArrConsumeTable(List array) { + return array.stream() + .map(Object::toString) + .map(str -> new Object[]{str}) + .collect(Collectors.toList()); + } + } } diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java index b20c015f14823..62e450ee10c39 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java @@ -87,7 +87,6 @@ import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.Ignition; import org.apache.ignite.cache.query.annotations.QuerySqlFunction; -import org.apache.ignite.cache.query.annotations.QuerySqlTableFunction; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.internal.IgniteEx; @@ -2640,15 +2639,6 @@ public static long sleep_and_can_fail(long sleepMs, boolean fail) { return sleep; } - - /** Function consume String array and output it row by row. */ - @QuerySqlTableFunction(alias = "STR_ARRAY_CONSUME_TABLE", columnTypes = {String.class}, columnNames = {"RESULT"}) - public static Iterable strArrConsumeTable(List array) { - return array.stream() - .map(Object::toString) - .map(str -> new Object[]{str}) - .collect(Collectors.toList()); - } } /** diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java index 02c793262508e..4fe2160be4cf6 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java @@ -104,7 +104,7 @@ public void start() throws IgniteCheckedException { QueryEngineConfiguration idxEngine = F.isEmpty(qryEnginesCfg) ? null : F.find(List.of(qryEnginesCfg), null, it -> it instanceof IndexingQueryEngineConfiguration); - if (idxEngine != null) + if (F.isEmpty(qryEnginesCfg) || idxEngine != null) ctx.internalSubscriptionProcessor().registerSchemaChangeListener(this); // Register predefined system functions. From 2041ee5fe5452b99096438b43523b7d0bb205f7a Mon Sep 17 00:00:00 2001 From: zstan Date: Tue, 17 Feb 2026 15:53:39 +0300 Subject: [PATCH 7/8] fix --- .../internal/processors/query/h2/H2SchemaManager.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java index 4fe2160be4cf6..1f98519db9618 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java @@ -100,12 +100,7 @@ public H2SchemaManager(GridKernalContext ctx, IgniteH2Indexing idx, ConnectionMa public void start() throws IgniteCheckedException { schemaMgr = ctx.query().schemaManager(); - QueryEngineConfiguration[] qryEnginesCfg = ctx.config().getSqlConfiguration().getQueryEnginesConfiguration(); - QueryEngineConfiguration idxEngine = F.isEmpty(qryEnginesCfg) ? null : F.find(List.of(qryEnginesCfg), null, - it -> it instanceof IndexingQueryEngineConfiguration); - - if (F.isEmpty(qryEnginesCfg) || idxEngine != null) - ctx.internalSubscriptionProcessor().registerSchemaChangeListener(this); + ctx.internalSubscriptionProcessor().registerSchemaChangeListener(this); // Register predefined system functions. createSqlFunction(QueryUtils.DFLT_SCHEMA, "QUERY_ENGINE", true, From 88e2b1215e3408300ad03952fdfcb99b41e275bc Mon Sep 17 00:00:00 2001 From: zstan Date: Wed, 18 Feb 2026 07:50:59 +0300 Subject: [PATCH 8/8] fix --- .../ignite/internal/processors/query/h2/H2SchemaManager.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java index 1f98519db9618..5031345ab4392 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2SchemaManager.java @@ -27,8 +27,6 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; -import org.apache.ignite.configuration.QueryEngineConfiguration; -import org.apache.ignite.indexing.IndexingQueryEngineConfiguration; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.processors.cache.GridCacheContextInfo; import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;