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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 08668c56746b CAMEL-23481: Replace retired Apache Derby with HSQL and 
MariaDB in camel-sql
08668c56746b is described below

commit 08668c56746b1943e31835f18ebe621e409b8b69
Author: Torsten Mielke <[email protected]>
AuthorDate: Sat May 30 08:24:17 2026 +0200

    CAMEL-23481: Replace retired Apache Derby with HSQL and MariaDB in camel-sql
    
    Replace Apache Derby (retired) with HSQL for stored procedure tests and
    MariaDB4j for stored function tests in camel-sql. HSQL does not support
    SQL stored functions, so MariaDB4j is used for SqlFunctionDataSourceTest
    only, with platform restrictions to skip on architectures without native
    MariaDB binaries (ppc64le, s390x, Linux ARM64).
    
    Closes #23597
---
 components/camel-sql/pom.xml                       |  41 ++++---
 .../sql/SqlConsumerMaxMessagesPerPollTest.java     |   8 +-
 .../camel/component/sql/SqlGeneratedKeysTest.java  |   1 -
 .../sql/stored/CallableStatementWrapperTest.java   |  44 +++----
 .../sql/stored/ProducerBatchInvalidTest.java       |   2 +-
 .../component/sql/stored/ProducerBatchTest.java    |   2 +-
 .../sql/stored/ProducerBodyArrayTest.java          |   2 +-
 .../component/sql/stored/ProducerInOutTest.java    |  16 ++-
 .../sql/stored/ProducerNamedParameterTest.java     |   2 +-
 .../camel/component/sql/stored/ProducerTest.java   |  21 +++-
 .../ProducerUseMessageBodyForTemplateTest.java     |   2 +-
 .../sql/stored/SqlFunctionDataSourceTest.java      | 126 ++++++++++++++++++---
 .../sql/stored/SqlStoredDataSourceTest.java        |   2 +-
 .../component/sql/stored/TemplateCacheTest.java    |   2 +-
 .../component/sql/stored/TestStoredFunction.java   |   7 +-
 .../component/sql/stored/TestStoredProcedure.java  |   8 +-
 .../JdbcLoopTransactedSplitterStackSizeTest.java   |  37 +++---
 .../processor/idempotent/jdbc/cached-spring.xml    |  36 +++---
 .../idempotent/jdbc/customized-spring.xml          |  42 +++----
 .../jdbc/customized-tablename-spring.xml           |  34 +++---
 .../camel/processor/idempotent/jdbc/spring.xml     |  36 +++---
 .../resources/sql/createAndPopulateDatabase3.sql   |   5 +-
 .../resources/sql/createAndPopulateDatabase4.sql   |   4 +-
 ...lateDatabase4.sql => storedFunctionMariaDB.sql} |  11 +-
 .../src/test/resources/sql/storedProcedureTest.sql |  48 ++++----
 parent/pom.xml                                     |   2 +
 26 files changed, 320 insertions(+), 221 deletions(-)

diff --git a/components/camel-sql/pom.xml b/components/camel-sql/pom.xml
index cdb0227c310a..abac5452be81 100644
--- a/components/camel-sql/pom.xml
+++ b/components/camel-sql/pom.xml
@@ -36,7 +36,6 @@
     </properties>
 
     <dependencies>
-
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-support</artifactId>
@@ -70,17 +69,10 @@
             <version>${hamcrest-version}</version>
             <scope>test</scope>
         </dependency>
-        <!-- derby used for stored procedure tests -->
-        <dependency>
-            <groupId>org.apache.derby</groupId>
-            <artifactId>derby</artifactId>
-            <version>${derby-version}</version>
-            <scope>test</scope>
-        </dependency>
         <dependency>
-            <groupId>org.apache.derby</groupId>
-            <artifactId>derbytools</artifactId>
-            <version>${derby-version}</version>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <version>${h2-version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -89,17 +81,25 @@
             <version>${hsqldb-version}</version>
             <scope>test</scope>
         </dependency>
+        <!-- MariaDB4j only used for SQL stored function tests -->
         <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <version>2.4.240</version>
+            <groupId>ch.vorburger.mariaDB4j</groupId>
+            <artifactId>mariaDB4j</artifactId>
+            <version>${mariadb4j-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mariadb.jdbc</groupId>
+            <artifactId>mariadb-java-client</artifactId>
+            <version>${mariadb-version}</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
 
     <build>
+        <!-- This is necessary when debugging tests to enable HSQLDB to find
+             the classes in the classpath. -->
         <plugins>
-
             <!-- generate source code from grammar for the stored procedure 
component -->
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
@@ -120,7 +120,16 @@
                     </execution>
                 </executions>
             </plugin>
-
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <systemPropertyVariables>
+                        <!-- This is necessary when debugging tests to enable 
HSQLDB to find
+                             the classes in the classpath. -->
+                        
<hsqldb.method_class_names>org.apache.camel.component.sql.stored.*</hsqldb.method_class_names>
+                    </systemPropertyVariables>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlConsumerMaxMessagesPerPollTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlConsumerMaxMessagesPerPollTest.java
index 60f3116567f7..9cadb24d0a8d 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlConsumerMaxMessagesPerPollTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlConsumerMaxMessagesPerPollTest.java
@@ -39,7 +39,7 @@ public class SqlConsumerMaxMessagesPerPollTest extends 
CamelTestSupport {
     public void doPreSetup() throws Exception {
         db = new EmbeddedDatabaseBuilder()
                 .setName(getClass().getSimpleName())
-                .setType(EmbeddedDatabaseType.DERBY)
+                .setType(EmbeddedDatabaseType.HSQL)
                 .addScript("sql/createAndPopulateDatabase4.sql")
                 .build();
 
@@ -60,19 +60,19 @@ public class SqlConsumerMaxMessagesPerPollTest extends 
CamelTestSupport {
         MockEndpoint.assertIsSatisfied(context);
 
         List<Exchange> exchanges = mock.getReceivedExchanges();
-        assertBodyMapValue(1, "ID", exchanges.get(0));
+        assertBodyMapValue(0, "ID", exchanges.get(0));
         assertBodyMapValue("Camel", "PROJECT", exchanges.get(0));
         assertProperty(0, "CamelBatchIndex", exchanges.get(0));
         assertProperty(2, "CamelBatchSize", exchanges.get(0));
         assertProperty(Boolean.FALSE, "CamelBatchComplete", exchanges.get(0));
 
-        assertBodyMapValue(2, "ID", exchanges.get(1));
+        assertBodyMapValue(1, "ID", exchanges.get(1));
         assertBodyMapValue("AMQ", "PROJECT", exchanges.get(1));
         assertProperty(1, "CamelBatchIndex", exchanges.get(1));
         assertProperty(2, "CamelBatchSize", exchanges.get(1));
         assertProperty(Boolean.TRUE, "CamelBatchComplete", exchanges.get(1)); 
// end of the first batch
 
-        assertBodyMapValue(3, "ID", exchanges.get(2));
+        assertBodyMapValue(2, "ID", exchanges.get(2));
         assertBodyMapValue("Linux", "PROJECT", exchanges.get(2));
         assertProperty(0, "CamelBatchIndex", exchanges.get(2)); // the second 
batch
         assertProperty(1, "CamelBatchSize", exchanges.get(2)); // only one 
entry in this batch
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlGeneratedKeysTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlGeneratedKeysTest.java
index 5d4445df24ac..7ecb0b3ec97e 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlGeneratedKeysTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlGeneratedKeysTest.java
@@ -163,7 +163,6 @@ public class SqlGeneratedKeysTest extends CamelTestSupport {
         List<Map<String, Object>> generatedKeys = 
out.getMessage().getHeader(SqlConstants.SQL_GENERATED_KEYS_DATA, List.class);
         assertNotNull(generatedKeys, "out body could not be converted to a 
List - was: " + out.getMessage().getBody());
 
-        // it seems not to work with Derby...
         assertEquals(4, generatedKeys.size());
 
         int id = 3;
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CallableStatementWrapperTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CallableStatementWrapperTest.java
index c8cf78b53708..f54841dd6892 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CallableStatementWrapperTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CallableStatementWrapperTest.java
@@ -35,17 +35,28 @@ import static 
org.junit.jupiter.api.Assertions.assertNotNull;
 
 public class CallableStatementWrapperTest extends CamelTestSupport {
 
+    /* This is necessary when debugging tests to enable HSQLDB to find
+       the classes in the classpath. */
+    /*
+    static {
+        if (System.getProperty("hsqldb.method_class_names") == null) {
+            System.setProperty(
+                    "hsqldb.method_class_names",
+                    "org.apache.camel.component.sql.stored.*");
+        }
+    }
+    */
+
     private TemplateParser templateParser;
     private EmbeddedDatabase db;
     private JdbcTemplate jdbcTemplate;
     private CallableStatementWrapperFactory factory;
 
     @Override
-
     public void doPreSetup() throws Exception {
         db = new EmbeddedDatabaseBuilder()
                 .setName(getClass().getSimpleName())
-                .setType(EmbeddedDatabaseType.DERBY)
+                .setType(EmbeddedDatabaseType.HSQL)
                 .addScript("sql/storedProcedureTest.sql").build();
         jdbcTemplate = new JdbcTemplate(db);
 
@@ -60,32 +71,7 @@ public class CallableStatementWrapperTest extends 
CamelTestSupport {
     @Test
     public void shouldExecuteStoredProcedure() throws Exception {
         CallableStatementWrapper wrapper = new CallableStatementWrapper(
-                "SUBNUMBERS"
-                                                                        + 
"(INTEGER ${header.v1},INTEGER ${header.v2},OUT INTEGER resultofsub)",
-                factory);
-
-        final Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader("v1", 1);
-        exchange.getIn().setHeader("v2", 2);
-
-        wrapper.call(new WrapperExecuteCallback() {
-            @Override
-            public void execute(StatementWrapper statementWrapper) throws 
SQLException, DataAccessException {
-                statementWrapper.populateStatement(null, exchange);
-
-                Map resultOfQuery = (Map) statementWrapper.executeStatement();
-                assertEquals(-1, resultOfQuery.get("resultofsub"));
-            }
-        });
-    }
-
-    @Test
-    public void shouldExecuteStoredFunction() throws Exception {
-        CallableStatementWrapperFactory factory = new 
CallableStatementWrapperFactory(jdbcTemplate, templateParser, true);
-
-        CallableStatementWrapper wrapper = new CallableStatementWrapper(
-                "SUBNUMBERS_FUNCTION"
-                                                                        + 
"(OUT INTEGER resultofsub, INTEGER ${header.v1},INTEGER ${header.v2})",
+                "SUBNUMBERS(INTEGER ${header.v1},INTEGER ${header.v2},OUT 
INTEGER resultofsub)",
                 factory);
 
         final Exchange exchange = createExchangeWithBody(null);
@@ -116,7 +102,6 @@ public class CallableStatementWrapperTest extends 
CamelTestSupport {
                 //no output parameter in stored procedure NILADIC()
                 //Spring sets #update-count-1
                 assertNotNull(result.get("#update-count-1"));
-
             }
         });
     }
@@ -127,5 +112,4 @@ public class CallableStatementWrapperTest extends 
CamelTestSupport {
             db.shutdown();
         }
     }
-
 }
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchInvalidTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchInvalidTest.java
index c2cb662cb5f1..34d5db7ed481 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchInvalidTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchInvalidTest.java
@@ -40,7 +40,7 @@ public class ProducerBatchInvalidTest extends 
CamelTestSupport {
     public void doPreSetup() throws Exception {
         db = new EmbeddedDatabaseBuilder()
                 .setName(getClass().getSimpleName())
-                .setType(EmbeddedDatabaseType.DERBY)
+                .setType(EmbeddedDatabaseType.HSQL)
                 .addScript("sql/storedProcedureTest.sql").build();
 
     }
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchTest.java
index 53324b58a66c..6bb13ffa3136 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchTest.java
@@ -42,7 +42,7 @@ public class ProducerBatchTest extends CamelTestSupport {
     public void doPreSetup() throws Exception {
         db = new EmbeddedDatabaseBuilder()
                 .setName(getClass().getSimpleName())
-                .setType(EmbeddedDatabaseType.DERBY)
+                .setType(EmbeddedDatabaseType.HSQL)
                 .addScript("sql/storedProcedureTest.sql").build();
 
     }
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBodyArrayTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBodyArrayTest.java
index 5cae4169500f..58bb109b8d62 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBodyArrayTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBodyArrayTest.java
@@ -39,7 +39,7 @@ public class ProducerBodyArrayTest extends CamelTestSupport {
     public void doPreSetup() throws Exception {
         db = new EmbeddedDatabaseBuilder()
                 .setName(getClass().getSimpleName())
-                .setType(EmbeddedDatabaseType.DERBY)
+                .setType(EmbeddedDatabaseType.HSQL)
                 .addScript("sql/storedProcedureTest.sql").build();
 
     }
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerInOutTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerInOutTest.java
index 6f783b847645..79915cfb6408 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerInOutTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerInOutTest.java
@@ -33,6 +33,18 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 public class ProducerInOutTest extends CamelTestSupport {
 
+    /* This is necessary when debugging tests to enable HSQLDB to find
+       the classes in the classpath. */
+    /*
+    static {
+        if (System.getProperty("hsqldb.method_class_names") == null) {
+            System.setProperty(
+                    "hsqldb.method_class_names",
+                    "org.apache.camel.component.sql.stored.*");
+        }
+    }
+    */
+
     EmbeddedDatabase db;
 
     @Override
@@ -40,7 +52,7 @@ public class ProducerInOutTest extends CamelTestSupport {
     public void doPreSetup() throws Exception {
         db = new EmbeddedDatabaseBuilder()
                 .setName(getClass().getSimpleName())
-                .setType(EmbeddedDatabaseType.DERBY)
+                .setType(EmbeddedDatabaseType.HSQL)
                 .addScript("sql/storedProcedureTest.sql").build();
 
     }
@@ -81,7 +93,7 @@ public class ProducerInOutTest extends CamelTestSupport {
                 getContext().getComponent("sql-stored", 
SqlStoredComponent.class).setDataSource(db);
 
                 from("direct:query")
-                        .to("sql-stored:INOUTDEMO(INTEGER ${headers.in1},INOUT 
INTEGER ${headers.in2} out1,OUT INTEGER out2)")
+                        .to("sql-stored:INOUTDEMO(INTEGER ${headers.in1}, 
INOUT INTEGER ${headers.in2} out1, OUT INTEGER out2)")
                         .to("mock:query");
             }
         };
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerNamedParameterTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerNamedParameterTest.java
index 5f2292000c66..180cc7beb4af 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerNamedParameterTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerNamedParameterTest.java
@@ -40,7 +40,7 @@ public class ProducerNamedParameterTest extends 
CamelTestSupport {
     public void doPreSetup() throws Exception {
         db = new EmbeddedDatabaseBuilder()
                 .setName(getClass().getSimpleName())
-                .setType(EmbeddedDatabaseType.DERBY)
+                .setType(EmbeddedDatabaseType.HSQL)
                 .addScript("sql/storedProcedureTest.sql").build();
 
     }
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java
index fc62fb7f8530..7783188a2460 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java
@@ -33,16 +33,26 @@ import static 
org.junit.jupiter.api.Assertions.assertNotNull;
 
 public class ProducerTest extends CamelTestSupport {
 
+    /* This is necessary when debugging tests to enable HSQLDB to find
+       the classes in the classpath. */
+    /*
+    static {
+        if (System.getProperty("hsqldb.method_class_names") == null) {
+            System.setProperty(
+                    "hsqldb.method_class_names",
+                    "org.apache.camel.component.sql.stored.*");
+        }
+    }
+    */
+
     EmbeddedDatabase db;
 
     @Override
-
     public void doPreSetup() throws Exception {
         db = new EmbeddedDatabaseBuilder()
                 .setName(getClass().getSimpleName())
-                .setType(EmbeddedDatabaseType.DERBY)
+                .setType(EmbeddedDatabaseType.HSQL)
                 .addScript("sql/storedProcedureTest.sql").build();
-
     }
 
     @Override
@@ -78,8 +88,9 @@ public class ProducerTest extends CamelTestSupport {
                 // required for the sql component
                 getContext().getComponent("sql-stored", 
SqlStoredComponent.class).setDataSource(db);
 
-                from("direct:query").to("sql-stored:SUBNUMBERS(INTEGER 
${headers.num1},INTEGER ${headers"
-                                        + ".num2},OUT INTEGER resultofsub)")
+                from("direct:query")
+                        .to("sql-stored:SUBNUMBERS(INTEGER 
${headers.num1},INTEGER ${headers"
+                            + ".num2},OUT INTEGER resultofsub)")
                         .to("mock:query");
             }
         };
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerUseMessageBodyForTemplateTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerUseMessageBodyForTemplateTest.java
index 1ce48a217f25..3165d28f73a3 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerUseMessageBodyForTemplateTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerUseMessageBodyForTemplateTest.java
@@ -39,7 +39,7 @@ public class ProducerUseMessageBodyForTemplateTest extends 
CamelTestSupport {
     public void doPreSetup() throws Exception {
         db = new EmbeddedDatabaseBuilder()
                 .setName(getClass().getSimpleName())
-                .setType(EmbeddedDatabaseType.DERBY)
+                .setType(EmbeddedDatabaseType.HSQL)
                 .addScript("sql/storedProcedureTest.sql").build();
 
     }
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlFunctionDataSourceTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlFunctionDataSourceTest.java
index eab747df4ec9..e8ffe8bab1c3 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlFunctionDataSourceTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlFunctionDataSourceTest.java
@@ -16,56 +16,147 @@
  */
 package org.apache.camel.component.sql.stored;
 
+import java.sql.SQLException;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.sql.DataSource;
+
+import ch.vorburger.mariadb4j.DB;
+import ch.vorburger.mariadb4j.DBConfigurationBuilder;
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.component.sql.stored.template.TemplateParser;
 import org.apache.camel.test.junit6.CamelTestSupport;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
-import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
-import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.EnabledOnOs;
+import org.junit.jupiter.api.condition.OS;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+/**
+ * This test evaluates SQL stored function call with sql-stored component 
against a MariaDB database because HSQLDB
+ * doesn't support SQL stored functions.
+ */
+@EnabledOnOs(value = { OS.LINUX, OS.WINDOWS, OS.MAC },
+             architectures = { "amd64", "x86_64", "aarch64", "aarch_64" })
+@DisabledOnOs(value = OS.LINUX, architectures = { "aarch64", "aarch_64" },
+              disabledReason = "MariaDB4j has no Linux ARM64 native binary 
(mariadb4j-db-linux64 is x86_64 only)")
 public class SqlFunctionDataSourceTest extends CamelTestSupport {
 
-    private EmbeddedDatabase db;
+    private static final String DB_NAME = "test";
+    private static final Object DB_LOCK = new Object();
+    private static DB sharedMariaDb;
+    private static DataSource sharedDataSource;
+
+    private DataSource db;
+    private static JdbcTemplate jdbcTemplate;
+    private TemplateParser templateParser;
+
+    /** Initialize the shared MariaDB database for the tests. */
+    private static void initSharedMariaDb() throws Exception {
+        DBConfigurationBuilder config = DBConfigurationBuilder.newBuilder();
+        config.setPort(0);
+        sharedMariaDb = DB.newEmbeddedDB(config.build());
+        sharedMariaDb.start();
+
+        DriverManagerDataSource dataSource = new DriverManagerDataSource();
+        dataSource.setDriverClassName("org.mariadb.jdbc.Driver");
+        dataSource.setUrl(sharedMariaDb.getConfiguration().getURL(DB_NAME));
+        dataSource.setUsername("root");
+        dataSource.setPassword("");
+        sharedDataSource = dataSource;
+
+        ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
+        populator.addScript(new 
ClassPathResource("sql/storedFunctionMariaDB.sql"));
+        populator.setSeparator("$$");
+        populator.execute(sharedDataSource);
+
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+            if (sharedMariaDb != null) {
+                try {
+                    sharedMariaDb.stop();
+                } catch (Exception e) {
+                    // best-effort cleanup on JVM shutdown
+                }
+            }
+        }));
+        jdbcTemplate = new JdbcTemplate(sharedDataSource);
+    }
 
+    /** Initialize the database for the tests. */
     @Override
-
     public void doPreSetup() throws Exception {
-        db = new EmbeddedDatabaseBuilder()
-                .setName(getClass().getSimpleName())
-                .setType(EmbeddedDatabaseType.DERBY)
-                .addScript("sql/storedProcedureTest.sql").build();
-
+        synchronized (DB_LOCK) {
+            if (sharedMariaDb == null) {
+                initSharedMariaDb();
+            }
+        }
+        db = sharedDataSource;
     }
 
     @Override
     public void doPostTearDown() throws Exception {
-        if (db != null) {
-            db.shutdown();
-        }
+        db = null;
     }
 
+    @BeforeEach
+    void setupTest() {
+        templateParser = new TemplateParser(context().getClassResolver());
+    }
+
+    /* Testing SQL stored function call with sql-stored component against
+       MariaDB database.
+    */
     @Test
-    public void shouldExecuteStoredProcedure() throws InterruptedException {
+    public void shouldExecuteStoredFunction() throws InterruptedException {
         MockEndpoint mock = getMockEndpoint("mock:query");
         mock.expectedMessageCount(1);
 
         Map<String, Object> headers = new HashMap<>();
-        headers.put("num1", 1);
-        headers.put("num2", 2);
+        headers.put("num1", 11);
+        headers.put("num2", 3);
         template.requestBodyAndHeaders("direct:query", null, headers);
 
         MockEndpoint.assertIsSatisfied(context);
 
         Exchange exchange = mock.getExchanges().get(0);
+        assertEquals(Integer.valueOf(8), 
exchange.getIn().getBody(Map.class).get("resultofsub"));
+    }
+
+    /* Test moved from CallableStatementWrapperTest to here as HSQLDB doesn't
+       support SQL stored functions. This test evaluates SQL stored function
+       call using CallableStatementWrapper against a MariaDB database.
+    */
+    @Test
+    public void shouldExecuteStoredFunctionDirect() throws Exception {
+        CallableStatementWrapperFactory factory = new 
CallableStatementWrapperFactory(jdbcTemplate, templateParser, true);
+
+        CallableStatementWrapper wrapper = new CallableStatementWrapper(
+                "SUBNUMBERS_FUNCTION(OUT INTEGER resultofsub, INTEGER 
${header.v1},INTEGER ${header.v2})",
+                factory);
 
-        assertEquals(Integer.valueOf(-1), 
exchange.getIn().getBody(Map.class).get("resultofsub"));
+        final Exchange exchange = createExchangeWithBody(null);
+        exchange.getIn().setHeader("v1", 12);
+        exchange.getIn().setHeader("v2", 5);
+
+        wrapper.call(new WrapperExecuteCallback() {
+            @Override
+            public void execute(StatementWrapper statementWrapper) throws 
SQLException, DataAccessException {
+                statementWrapper.populateStatement(null, exchange);
+
+                Map resultOfQuery = (Map) statementWrapper.executeStatement();
+                assertEquals(7, resultOfQuery.get("resultofsub"));
+            }
+        });
     }
 
     @Override
@@ -73,7 +164,6 @@ public class SqlFunctionDataSourceTest extends 
CamelTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() {
-                // required for the sql component
                 getContext().getComponent("sql-stored", 
SqlStoredComponent.class).setDataSource(db);
 
                 from("direct:query")
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlStoredDataSourceTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlStoredDataSourceTest.java
index 5ee3c6158d78..7f0a946afa84 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlStoredDataSourceTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlStoredDataSourceTest.java
@@ -38,7 +38,7 @@ public class SqlStoredDataSourceTest extends CamelTestSupport 
{
         // this is the database we create with some initial data for our unit 
test
         db = new EmbeddedDatabaseBuilder()
                 .setName(getClass().getSimpleName())
-                .setType(EmbeddedDatabaseType.DERBY)
+                .setType(EmbeddedDatabaseType.HSQL)
                 .addScript("sql/storedProcedureTest.sql").build();
         // END SNIPPET: e2
 
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateCacheTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateCacheTest.java
index 5796f7951b75..b36b94a8b0e2 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateCacheTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateCacheTest.java
@@ -37,7 +37,7 @@ public class TemplateCacheTest extends CamelTestSupport {
     public void doPreSetup() throws Exception {
         db = new EmbeddedDatabaseBuilder()
                 .setName(getClass().getSimpleName())
-                .setType(EmbeddedDatabaseType.DERBY)
+                .setType(EmbeddedDatabaseType.HSQL)
                 .addScript("sql/storedProcedureTest.sql").build();
 
     }
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredFunction.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredFunction.java
index 03b7acb69648..48f4303a48ff 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredFunction.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredFunction.java
@@ -26,8 +26,9 @@ public final class TestStoredFunction {
     private TestStoredFunction() {
     }
 
-    public static int subnumbers(int val1, int val2) {
-        LOG.info("calling subnumbers:{} - {}", val1, val2);
-        return val1 - val2;
+    /* HSQLDB style requires Integer instead of int for any out parameters. */
+    public static void subnumbers(Integer[] result, int val1, int val2) {
+        LOG.info("calling subnumbers: {} - {}", val1, val2);
+        result[0] = val1 - val2;
     }
 }
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java
index 50e100a327fc..d691f8a50db2 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java
@@ -30,8 +30,9 @@ public final class TestStoredProcedure {
     private TestStoredProcedure() {
     }
 
-    public static void subnumbers(int val1, int val2, int[] ret) {
-        LOG.info("calling addnumbers:{} + {}", val1, val2);
+    /** HSQLDB style requires Integer instead of int for the return value. */
+    public static void subnumbers(int val1, int val2, Integer[] ret) {
+        LOG.info("calling subnumbers:{} - {}", val1, val2);
         ret[0] = val1 - val2;
     }
 
@@ -47,7 +48,8 @@ public final class TestStoredProcedure {
         LOG.info("nilacid called");
     }
 
-    public static void inoutdemo(int in1, int[] inout1, int[] out1) {
+    /** HSQLDB style requires Integer instead of int for the out parameters. */
+    public static void inoutdemo(int in1, Integer[] inout1, Integer[] out1) {
         LOG.info("calling inoutdemo: {}, {}", inout1[0], out1[0]);
         inout1[0] = 1;
         out1[0] = 2;
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/JdbcLoopTransactedSplitterStackSizeTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/JdbcLoopTransactedSplitterStackSizeTest.java
index 0222eec494e7..d0121ebf2d5f 100644
--- 
a/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/JdbcLoopTransactedSplitterStackSizeTest.java
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/JdbcLoopTransactedSplitterStackSizeTest.java
@@ -16,14 +16,10 @@
  */
 package org.apache.camel.processor.aggregate.jdbc;
 
-import java.io.File;
-import java.sql.DriverManager;
-
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.util.FileUtil;
-import org.apache.derby.jdbc.EmbeddedDataSource;
+import org.hsqldb.jdbc.JDBCDataSource;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -45,7 +41,7 @@ public class JdbcLoopTransactedSplitterStackSizeTest extends 
AbstractJdbcAggrega
     private int total = 500;
 
     private static final String DSNAME = "ds";
-    private static EmbeddedDataSource ds;
+    private static JDBCDataSource ds;
     private static PlatformTransactionManager txManager;
     private static SpringTransactionPolicy txPolicy;
 
@@ -61,7 +57,7 @@ public class JdbcLoopTransactedSplitterStackSizeTest extends 
AbstractJdbcAggrega
 
     @Override
     protected void bindToRegistry(Registry registry) throws Exception {
-        ds = Derby.init(DSNAME);
+        ds = HsqlDb.init(DSNAME);
 
         txManager = new DataSourceTransactionManager(ds);
 
@@ -79,7 +75,7 @@ public class JdbcLoopTransactedSplitterStackSizeTest extends 
AbstractJdbcAggrega
 
     @AfterAll
     public static void tearDownOnce() {
-        Derby.close("ds");
+        HsqlDb.close("ds");
     }
 
     @Test
@@ -145,30 +141,23 @@ public class JdbcLoopTransactedSplitterStackSizeTest 
extends AbstractJdbcAggrega
         return depth;
     }
 
-    private static class Derby {
+    private static class HsqlDb {
 
-        public static EmbeddedDataSource init(String db) {
-            deleteDatabaseFiles(db);
-            EmbeddedDataSource ds = new EmbeddedDataSource();
-            ds.setDataSourceName(db);
-            ds.setDatabaseName(db);
-            ds.setConnectionAttributes("create=true");
+        public static JDBCDataSource init(String db) {
+            JDBCDataSource ds = new JDBCDataSource();
+            ds.setUrl("jdbc:hsqldb:mem:" + db);
+            ds.setUser("sa");
+            ds.setPassword("");
             return ds;
         }
 
         public static void close(String dbName) {
-            // unload the driver
-            try {
-                DriverManager.getConnection("jdbc:derby:;shutdown=true");
-            } catch (Exception e) {
-                // ignore
-            }
-            deleteDatabaseFiles(dbName);
+            // HSQLDB in-memory databases are automatically cleaned up
+            // when all connections are closed
         }
 
         private static void deleteDatabaseFiles(String dbName) {
-            FileUtil.deleteFile(new File("derby.log"));
-            FileUtil.removeDir(new File(dbName));
+            // No files to delete for in-memory HSQLDB
         }
     }
 }
diff --git 
a/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/cached-spring.xml
 
b/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/cached-spring.xml
index 7a32a81db61a..29ffb855c242 100644
--- 
a/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/cached-spring.xml
+++ 
b/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/cached-spring.xml
@@ -26,28 +26,28 @@
            http://www.springframework.org/schema/jdbc 
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
            http://camel.apache.org/schema/spring 
http://camel.apache.org/schema/spring/camel-spring.xsd";>
 
-       <!-- START SNIPPET: e1 -->
-       <jdbc:embedded-database id="dataSource" type="H2" />
+    <!-- START SNIPPET: e1 -->
+    <jdbc:embedded-database id="dataSource" type="H2" />
     <!-- END SNIPPET: e1 -->
-    
+
     <!-- START SNIPPET: e2 -->
     <bean id="messageIdRepository" 
class="org.apache.camel.processor.idempotent.jdbc.JdbcCachedMessageIdRepository">
-       <constructor-arg ref="dataSource" />
-       <constructor-arg value="myProcessorName" />
+        <constructor-arg ref="dataSource" />
+        <constructor-arg value="myProcessorName" />
     </bean>
-    
+
     <camel:camelContext>
-       <camel:errorHandler id="deadLetterChannel" type="DeadLetterChannel" 
deadLetterUri="mock:error">
-               <camel:redeliveryPolicy maximumRedeliveries="0" 
maximumRedeliveryDelay="0" logStackTrace="false" />
-       </camel:errorHandler>
-       
-       <camel:route id="JdbcCachedMessageIdRepositoryTest" 
errorHandlerRef="deadLetterChannel">
-               <camel:from uri="direct:start" />
-               <camel:idempotentConsumer 
idempotentRepository="messageIdRepository">
-                       <camel:header>messageId</camel:header>
-                       <camel:to uri="mock:result" />
-               </camel:idempotentConsumer>
-       </camel:route>
+        <camel:errorHandler id="deadLetterChannel" type="DeadLetterChannel" 
deadLetterUri="mock:error">
+            <camel:redeliveryPolicy maximumRedeliveries="0" 
maximumRedeliveryDelay="0" logStackTrace="false" />
+        </camel:errorHandler>
+
+        <camel:route id="JdbcCachedMessageIdRepositoryTest" 
errorHandlerRef="deadLetterChannel">
+            <camel:from uri="direct:start" />
+            <camel:idempotentConsumer 
idempotentRepository="messageIdRepository">
+                <camel:header>messageId</camel:header>
+                <camel:to uri="mock:result" />
+            </camel:idempotentConsumer>
+        </camel:route>
     </camel:camelContext>
     <!-- END SNIPPET: e2 -->
-</beans>
\ No newline at end of file
+</beans>
diff --git 
a/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/customized-spring.xml
 
b/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/customized-spring.xml
index 0ef71e927a5d..ec9964148af6 100644
--- 
a/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/customized-spring.xml
+++ 
b/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/customized-spring.xml
@@ -27,30 +27,30 @@
            http://camel.apache.org/schema/spring 
http://camel.apache.org/schema/spring/camel-spring.xsd";>
 
     <jdbc:embedded-database id="dataSource" type="H2" />
-    
+
     <!-- START SNIPPET: e1 -->
     <bean id="messageIdRepository" 
class="org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository">
-       <constructor-arg ref="dataSource" />
-       <constructor-arg value="myProcessorName" />
-       <property name="tableExistsString" value="SELECT 1 FROM 
CUSTOMIZED_MESSAGE_REPOSITORY WHERE 1 = 0" />
-       <property name="createString" value="CREATE TABLE 
CUSTOMIZED_MESSAGE_REPOSITORY (processorName VARCHAR(255), messageId 
VARCHAR(100), createdAt TIMESTAMP)" />
-       <property name="queryString" value="SELECT COUNT(*) FROM 
CUSTOMIZED_MESSAGE_REPOSITORY WHERE processorName = ? AND messageId = ?" />
-       <property name="insertString" value="INSERT INTO 
CUSTOMIZED_MESSAGE_REPOSITORY (processorName, messageId, createdAt) VALUES (?, 
?, ?)" />
-       <property name="deleteString" value="DELETE FROM 
CUSTOMIZED_MESSAGE_REPOSITORY WHERE processorName = ? AND messageId = ?" />
+        <constructor-arg ref="dataSource" />
+        <constructor-arg value="myProcessorName" />
+        <property name="tableExistsString" value="SELECT 1 FROM 
CUSTOMIZED_MESSAGE_REPOSITORY WHERE 1 = 0" />
+        <property name="createString" value="CREATE TABLE 
CUSTOMIZED_MESSAGE_REPOSITORY (processorName VARCHAR(255), messageId 
VARCHAR(100), createdAt TIMESTAMP)" />
+        <property name="queryString" value="SELECT COUNT(*) FROM 
CUSTOMIZED_MESSAGE_REPOSITORY WHERE processorName = ? AND messageId = ?" />
+        <property name="insertString" value="INSERT INTO 
CUSTOMIZED_MESSAGE_REPOSITORY (processorName, messageId, createdAt) VALUES (?, 
?, ?)" />
+        <property name="deleteString" value="DELETE FROM 
CUSTOMIZED_MESSAGE_REPOSITORY WHERE processorName = ? AND messageId = ?" />
     </bean>
     <!-- END SNIPPET: e1 -->
-    
+
     <camel:camelContext>
-       <camel:errorHandler id="deadLetterChannel" type="DeadLetterChannel" 
deadLetterUri="mock:error">
-               <camel:redeliveryPolicy maximumRedeliveries="0" 
maximumRedeliveryDelay="0" logStackTrace="false" />
-       </camel:errorHandler>
-       
-       <camel:route id="JdbcMessageIdRepositoryTest" 
errorHandlerRef="deadLetterChannel">
-               <camel:from uri="direct:start" />
-               <camel:idempotentConsumer 
idempotentRepository="messageIdRepository">
-                       <camel:header>messageId</camel:header>
-                       <camel:to uri="mock:result" />
-               </camel:idempotentConsumer>
-       </camel:route>
+        <camel:errorHandler id="deadLetterChannel" type="DeadLetterChannel" 
deadLetterUri="mock:error">
+            <camel:redeliveryPolicy maximumRedeliveries="0" 
maximumRedeliveryDelay="0" logStackTrace="false" />
+        </camel:errorHandler>
+
+        <camel:route id="JdbcMessageIdRepositoryTest" 
errorHandlerRef="deadLetterChannel">
+            <camel:from uri="direct:start" />
+            <camel:idempotentConsumer 
idempotentRepository="messageIdRepository">
+                <camel:header>messageId</camel:header>
+                <camel:to uri="mock:result" />
+            </camel:idempotentConsumer>
+        </camel:route>
     </camel:camelContext>
-</beans>
\ No newline at end of file
+</beans>
diff --git 
a/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/customized-tablename-spring.xml
 
b/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/customized-tablename-spring.xml
index b5d255f3f4f5..053660685304 100644
--- 
a/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/customized-tablename-spring.xml
+++ 
b/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/customized-tablename-spring.xml
@@ -27,26 +27,26 @@
            http://camel.apache.org/schema/spring 
http://camel.apache.org/schema/spring/camel-spring.xsd";>
 
     <jdbc:embedded-database id="dataSource" type="H2" />
-    
+
     <!-- START SNIPPET: e1 -->
     <bean id="messageIdRepository" 
class="org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository">
-       <constructor-arg ref="dataSource" />
-       <constructor-arg value="myProcessorName" />
-       <property name="tableName" value="FOOBAR" />
+        <constructor-arg ref="dataSource" />
+        <constructor-arg value="myProcessorName" />
+        <property name="tableName" value="FOOBAR" />
     </bean>
     <!-- END SNIPPET: e1 -->
-    
+
     <camel:camelContext>
-       <camel:errorHandler id="deadLetterChannel" type="DeadLetterChannel" 
deadLetterUri="mock:error">
-               <camel:redeliveryPolicy maximumRedeliveries="0" 
maximumRedeliveryDelay="0" logStackTrace="false" />
-       </camel:errorHandler>
-       
-       <camel:route id="JdbcMessageIdRepositoryTest" 
errorHandlerRef="deadLetterChannel">
-               <camel:from uri="direct:start" />
-               <camel:idempotentConsumer 
idempotentRepository="messageIdRepository">
-                       <camel:header>messageId</camel:header>
-                       <camel:to uri="mock:result" />
-               </camel:idempotentConsumer>
-       </camel:route>
+        <camel:errorHandler id="deadLetterChannel" type="DeadLetterChannel" 
deadLetterUri="mock:error">
+            <camel:redeliveryPolicy maximumRedeliveries="0" 
maximumRedeliveryDelay="0" logStackTrace="false" />
+        </camel:errorHandler>
+
+        <camel:route id="JdbcMessageIdRepositoryTest" 
errorHandlerRef="deadLetterChannel">
+            <camel:from uri="direct:start" />
+            <camel:idempotentConsumer 
idempotentRepository="messageIdRepository">
+                <camel:header>messageId</camel:header>
+                <camel:to uri="mock:result" />
+            </camel:idempotentConsumer>
+        </camel:route>
     </camel:camelContext>
-</beans>
\ No newline at end of file
+</beans>
diff --git 
a/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/spring.xml
 
b/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/spring.xml
index 4175f44ae67a..c18e08d62747 100644
--- 
a/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/spring.xml
+++ 
b/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/spring.xml
@@ -26,28 +26,28 @@
            http://www.springframework.org/schema/jdbc 
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
            http://camel.apache.org/schema/spring 
http://camel.apache.org/schema/spring/camel-spring.xsd";>
 
-       <!-- START SNIPPET: e1 -->
-       <jdbc:embedded-database id="dataSource" type="H2" />
+    <!-- START SNIPPET: e1 -->
+    <jdbc:embedded-database id="dataSource" type="H2" />
     <!-- END SNIPPET: e1 -->
-    
+
     <!-- START SNIPPET: e2 -->
     <bean id="messageIdRepository" 
class="org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository">
-       <constructor-arg ref="dataSource" />
-       <constructor-arg value="myProcessorName" />
+        <constructor-arg ref="dataSource" />
+        <constructor-arg value="myProcessorName" />
     </bean>
-    
+
     <camel:camelContext>
-       <camel:errorHandler id="deadLetterChannel" type="DeadLetterChannel" 
deadLetterUri="mock:error">
-               <camel:redeliveryPolicy maximumRedeliveries="0" 
maximumRedeliveryDelay="0" logStackTrace="false" />
-       </camel:errorHandler>
-       
-       <camel:route id="JdbcMessageIdRepositoryTest" 
errorHandlerRef="deadLetterChannel">
-               <camel:from uri="direct:start" />
-               <camel:idempotentConsumer 
idempotentRepository="messageIdRepository">
-                       <camel:header>messageId</camel:header>
-                       <camel:to uri="mock:result" />
-               </camel:idempotentConsumer>
-       </camel:route>
+        <camel:errorHandler id="deadLetterChannel" type="DeadLetterChannel" 
deadLetterUri="mock:error">
+            <camel:redeliveryPolicy maximumRedeliveries="0" 
maximumRedeliveryDelay="0" logStackTrace="false" />
+        </camel:errorHandler>
+
+        <camel:route id="JdbcMessageIdRepositoryTest" 
errorHandlerRef="deadLetterChannel">
+            <camel:from uri="direct:start" />
+            <camel:idempotentConsumer 
idempotentRepository="messageIdRepository">
+                <camel:header>messageId</camel:header>
+                <camel:to uri="mock:result" />
+            </camel:idempotentConsumer>
+        </camel:route>
     </camel:camelContext>
     <!-- END SNIPPET: e2 -->
-</beans>
\ No newline at end of file
+</beans>
diff --git 
a/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase3.sql 
b/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase3.sql
index 2499f1cd7902..88443226e602 100644
--- a/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase3.sql
+++ b/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase3.sql
@@ -16,12 +16,13 @@
 --
 
 -- START SNIPPET: e1
-create table projects (id integer primary key GENERATED ALWAYS AS IDENTITY, 
project varchar(10), license varchar(5), description varchar(1000) default 
null);
+create table projects (id integer primary key IDENTITY, project varchar(10), 
license varchar(5), description varchar(1000) default null);
 insert into projects (project, license, description) values ('Camel', 'ASF', 
'');
 insert into projects (project, license, description) values ('AMQ', 'ASF', '');
 insert into projects (project, license, description) values ('Linux', 'XXX', 
'');
 -- END SNIPPET: e1
 
 -- START SNIPPET: e2
-create table developers (id1 integer primary key GENERATED ALWAYS AS IDENTITY 
(START WITH 5), name varchar(20), position varchar(20), id2 integer GENERATED 
ALWAYS AS (id1+1));
+create table developers (id1 integer IDENTITY primary key, name varchar(20), 
position varchar(20), id2 integer GENERATED ALWAYS AS (id1+1));
+ALTER TABLE developers ALTER COLUMN id1 RESTART WITH 5;
 -- END SNIPPET: e2
\ No newline at end of file
diff --git 
a/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase4.sql 
b/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase4.sql
index e62a4e082011..7eda67af0559 100644
--- a/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase4.sql
+++ b/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase4.sql
@@ -15,7 +15,7 @@
 -- limitations under the License.
 --
 
-create table projects (id integer primary key GENERATED ALWAYS AS IDENTITY, 
project varchar(10), license varchar(5), description varchar(1000) default 
null, processed boolean);
+create table projects (id integer primary key IDENTITY, project varchar(10), 
license varchar(5), description varchar(1000) default null, processed boolean);
 insert into projects (project, license, description, processed) values 
('Camel', 'ASF', '', false);
 insert into projects (project, license, description, processed) values ('AMQ', 
'ASF', '', false);
-insert into projects (project, license, description, processed) values 
('Linux', 'XXX', '', false);
+insert into projects (project, license, description, processed) values 
('Linux', 'XXX', '', false);
\ No newline at end of file
diff --git 
a/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase4.sql 
b/components/camel-sql/src/test/resources/sql/storedFunctionMariaDB.sql
similarity index 62%
copy from 
components/camel-sql/src/test/resources/sql/createAndPopulateDatabase4.sql
copy to components/camel-sql/src/test/resources/sql/storedFunctionMariaDB.sql
index e62a4e082011..24d5962b3d1a 100644
--- a/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase4.sql
+++ b/components/camel-sql/src/test/resources/sql/storedFunctionMariaDB.sql
@@ -15,7 +15,10 @@
 -- limitations under the License.
 --
 
-create table projects (id integer primary key GENERATED ALWAYS AS IDENTITY, 
project varchar(10), license varchar(5), description varchar(1000) default 
null, processed boolean);
-insert into projects (project, license, description, processed) values 
('Camel', 'ASF', '', false);
-insert into projects (project, license, description, processed) values ('AMQ', 
'ASF', '', false);
-insert into projects (project, license, description, processed) values 
('Linux', 'XXX', '', false);
+-- MariaDB/MySQL stored procedures and functions (SQL-based; no Java EXTERNAL 
NAME)
+-- Statement separator is $$ (see SqlFunctionDataSourceTest 
ResourceDatabasePopulator)
+-- MariaDB4J does not support calling Java methods from the SQL stored 
procedure or function.
+DROP FUNCTION IF EXISTS SUBNUMBERS_FUNCTION$$
+CREATE FUNCTION SUBNUMBERS_FUNCTION(param1 INT, param2 INT) RETURNS INT
+DETERMINISTIC
+  RETURN param1 - param2$$
diff --git 
a/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql 
b/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql
index a6316d04d054..d90725fcabc3 100644
--- a/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql
+++ b/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql
@@ -15,33 +15,29 @@
 -- limitations under the License.
 --
 
-CREATE PROCEDURE SUBNUMBERS(VALUE1 INTEGER, VALUE2 INTEGER,OUT RESULT INTEGER)
- PARAMETER STYLE JAVA
- LANGUAGE JAVA
- EXTERNAL NAME
-'org.apache.camel.component.sql.stored.TestStoredProcedure.subnumbers';
+-- HSQLDB stored procedures using PARAMETER STYLE JAVA with OUT parameters
+-- These reference Java methods from TestStoredProcedure class
 
-CREATE PROCEDURE NILADIC()
- PARAMETER STYLE JAVA
- LANGUAGE JAVA
- EXTERNAL NAME
-'org.apache.camel.component.sql.stored.TestStoredProcedure.niladic';
+CREATE PROCEDURE SUBNUMBERS(IN param1 INTEGER, IN param2 INTEGER, OUT param3 
INTEGER)
+LANGUAGE JAVA
+PARAMETER STYLE JAVA
+NO SQL
+EXTERNAL NAME 
'CLASSPATH:org.apache.camel.component.sql.stored.TestStoredProcedure.subnumbers';
 
-CREATE PROCEDURE BATCHFN(VALUE1 CHAR(10))
- PARAMETER STYLE JAVA
- LANGUAGE JAVA
- EXTERNAL NAME
-'org.apache.camel.component.sql.stored.TestStoredProcedure.batchfn';
+CREATE PROCEDURE NILADIC()
+LANGUAGE JAVA
+PARAMETER STYLE JAVA
+NO SQL
+EXTERNAL NAME 
'CLASSPATH:org.apache.camel.component.sql.stored.TestStoredProcedure.niladic';
 
-CREATE PROCEDURE INOUTDEMO(IN1 INTEGER, INOUT IN2 INTEGER, OUT OUT1 INTEGER)
- PARAMETER STYLE JAVA
- LANGUAGE JAVA
- EXTERNAL NAME
-'org.apache.camel.component.sql.stored.TestStoredProcedure.inoutdemo';
+CREATE PROCEDURE BATCHFN(IN param1 VARCHAR(100))
+LANGUAGE JAVA
+PARAMETER STYLE JAVA
+NO SQL
+EXTERNAL NAME 
'CLASSPATH:org.apache.camel.component.sql.stored.TestStoredProcedure.batchfn';
 
-CREATE FUNCTION SUBNUMBERS_FUNCTION(VALUE1 INTEGER, VALUE2 INTEGER)
- RETURNS INTEGER
- PARAMETER STYLE JAVA
- LANGUAGE JAVA
- EXTERNAL NAME
-'org.apache.camel.component.sql.stored.TestStoredFunction.subnumbers';
+CREATE PROCEDURE INOUTDEMO(IN param1 INTEGER, INOUT param2 INTEGER, OUT param3 
INTEGER)
+LANGUAGE JAVA
+PARAMETER STYLE JAVA
+NO SQL
+EXTERNAL NAME 
'CLASSPATH:org.apache.camel.component.sql.stored.TestStoredProcedure.inoutdemo';
\ No newline at end of file
diff --git a/parent/pom.xml b/parent/pom.xml
index a7559b181cae..c0df39431ba8 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -226,6 +226,8 @@
         <hibernate-validator-version>9.1.0.Final</hibernate-validator-version>
         <hibernate-version>6.3.2.Final</hibernate-version>
         <hsqldb-version>2.7.4</hsqldb-version>
+        <mariadb-version>3.5.8</mariadb-version>
+        <mariadb4j-version>3.3.1</mariadb4j-version>
         <httpcore-version>5.4.2</httpcore-version>
         <httpclient-version>5.5.2</httpclient-version>
         <httpcore4-version>4.4.16</httpcore4-version>

Reply via email to