From c30284efa973d42528752939ffe726473a8cceed Mon Sep 17 00:00:00 2001 From: Sanjula Ganepola Date: Wed, 14 Jan 2026 11:46:11 -0500 Subject: [PATCH 1/2] Add IN OUT CLOB parameter tests Signed-off-by: Sanjula Ganepola --- .../github/mapepire_ibmi/ProcedureTest.java | 460 ++++++++++-------- 1 file changed, 261 insertions(+), 199 deletions(-) diff --git a/src/test/java/io/github/mapepire_ibmi/ProcedureTest.java b/src/test/java/io/github/mapepire_ibmi/ProcedureTest.java index 747f535..23ccfb3 100644 --- a/src/test/java/io/github/mapepire_ibmi/ProcedureTest.java +++ b/src/test/java/io/github/mapepire_ibmi/ProcedureTest.java @@ -1,199 +1,261 @@ -package io.github.mapepire_ibmi; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import io.github.mapepire_ibmi.types.QueryOptions; -import io.github.mapepire_ibmi.types.QueryResult; - -class ProcedureTest extends MapepireTest { - @BeforeAll - public static void beforeAll() throws Exception { - MapepireTest.setupCreds(); - MapepireTest.setupTestSchema(); - } - - @Test - void numberParameters() throws Exception { - SqlJob job = new SqlJob(); - job.connect(MapepireTest.getCreds()).get(); - - String testProc = String.join("\n", Arrays.asList( - "CREATE OR REPLACE PROCEDURE " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST(" - + " IN P1 INTEGER," - + " INOUT P2 INTEGER," - + " OUT P3 INTEGER" - + ")" - + "BEGIN" - + " SET P3 = P1 + P2;" - + " SET P2 = 0;" - + "END")); - Query queryA = job.query(testProc); - queryA.execute().get(); - queryA.close().get(); - - QueryOptions options = new QueryOptions(false, false, Arrays.asList(6, 4, 0)); - Query queryB = job.query("CALL " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST(?, ?, ?)", options); - QueryResult result = queryB.execute().get(); - queryB.close().get(); - - job.close(); - - assertNotNull(result.getMetadata().getParameters()); - assertEquals(3, result.getMetadata().getParameters().size()); - List inParmNames = result.getMetadata().getParameters().stream().map(p -> p.getName()) - .collect(Collectors.toList()); - List inParmTypes = result.getMetadata().getParameters().stream().map(p -> p.getType()) - .collect(Collectors.toList()); - assertArrayEquals(Arrays.asList("P1", "P2", "P3").toArray(), inParmNames.toArray()); - assertArrayEquals(Arrays.asList("INTEGER", "INTEGER", "INTEGER").toArray(), inParmTypes.toArray()); - - assertTrue(result.getSuccess()); - assertFalse(result.getHasResults()); - assertEquals(3, result.getParameterCount()); - assertEquals(0, result.getUpdateCount()); - assertEquals(0, result.getData().size()); - - assertNotNull(result.getOutputParms()); - assertEquals(3, result.getOutputParms().size()); - List outParmNames = result.getOutputParms().stream().map(p -> p.getName()) - .collect(Collectors.toList()); - List outParmTypes = result.getOutputParms().stream().map(p -> p.getType()) - .collect(Collectors.toList()); - List outParmValues = result.getOutputParms().stream().map(p -> p.getValue()) - .collect(Collectors.toList()); - assertArrayEquals(Arrays.asList("P1", "P2", "P3").toArray(), outParmNames.toArray()); - assertArrayEquals(Arrays.asList("INTEGER", "INTEGER", "INTEGER").toArray(), outParmTypes.toArray()); - assertArrayEquals(Arrays.asList(null, 0, 10).toArray(), outParmValues.toArray()); - } - - @Test - void charParameters() throws Exception { - SqlJob job = new SqlJob(); - job.connect(MapepireTest.getCreds()).get(); - - String testProc = String.join("\n", Arrays.asList( - "CREATE OR REPLACE PROCEDURE " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST_CHAR(" - + " IN P1 CHAR(5)," - + " INOUT P2 CHAR(6)," - + " OUT P3 CHAR(7)" - + ")" - + "BEGIN" - + " SET P3 = RTRIM(P1) concat RTRIM(P2);" - + " SET P2 = '';" - + "END")); - Query queryA = job.query(testProc); - queryA.execute().get(); - queryA.close().get(); - - QueryOptions options = new QueryOptions(false, false, Arrays.asList("a", "b", "")); - Query queryB = job.query("CALL " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST_CHAR(?, ?, ?)", options); - QueryResult result = queryB.execute().get(); - queryB.close().get(); - - job.close(); - - assertNotNull(result.getMetadata().getParameters()); - assertEquals(3, result.getMetadata().getParameters().size()); - List inParmNames = result.getMetadata().getParameters().stream().map(p -> p.getName()) - .collect(Collectors.toList()); - List inParmTypes = result.getMetadata().getParameters().stream().map(p -> p.getType()) - .collect(Collectors.toList()); - List inParmPrecisions = result.getMetadata().getParameters().stream().map(p -> p.getPrecision()) - .collect(Collectors.toList()); - assertArrayEquals(Arrays.asList("P1", "P2", "P3").toArray(), inParmNames.toArray()); - assertArrayEquals(Arrays.asList("CHAR", "CHAR", "CHAR").toArray(), inParmTypes.toArray()); - assertArrayEquals(Arrays.asList(5, 6, 7).toArray(), inParmPrecisions.toArray()); - - assertTrue(result.getSuccess()); - assertFalse(result.getHasResults()); - assertEquals(3, result.getParameterCount()); - assertEquals(0, result.getUpdateCount()); - assertEquals(0, result.getData().size()); - - assertNotNull(result.getOutputParms()); - assertEquals(3, result.getOutputParms().size()); - List outParmNames = result.getOutputParms().stream().map(p -> p.getName()) - .collect(Collectors.toList()); - List outParmTypes = result.getOutputParms().stream().map(p -> p.getType()) - .collect(Collectors.toList()); - List outParmValues = result.getOutputParms().stream().map(p -> p.getValue()) - .collect(Collectors.toList()); - List outParmPrecisions = result.getOutputParms().stream().map(p -> p.getPrecision()) - .collect(Collectors.toList()); - assertArrayEquals(Arrays.asList("P1", "P2", "P3").toArray(), outParmNames.toArray()); - assertArrayEquals(Arrays.asList("CHAR", "CHAR", "CHAR").toArray(), outParmTypes.toArray()); - assertArrayEquals(Arrays.asList(null, "", "ab").toArray(), outParmValues.toArray()); - assertArrayEquals(Arrays.asList(5, 6, 7).toArray(), outParmPrecisions.toArray()); - } - - @Test - void varcharParameters() throws Exception { - SqlJob job = new SqlJob(); - job.connect(MapepireTest.getCreds()).get(); - - String testProc = String.join("\n", Arrays.asList( - "CREATE OR REPLACE PROCEDURE " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST_VARCHAR(" - + " IN P1 VARCHAR(5)," - + " INOUT P2 VARCHAR(6)," - + " OUT P3 VARCHAR(7)" - + ")" - + "BEGIN" - + " SET P3 = P1 concat P2;" - + " SET P2 = '';" - + "END")); - Query queryA = job.query(testProc); - queryA.execute().get(); - queryA.close().get(); - - QueryOptions options = new QueryOptions(false, false, Arrays.asList("a", "b", "c")); - Query queryB = job.query("CALL " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST_VARCHAR(?, ?, ?)", options); - QueryResult result = queryB.execute().get(); - queryB.close().get(); - - job.close(); - - assertNotNull(result.getMetadata().getParameters()); - assertEquals(3, result.getMetadata().getParameters().size()); - List inParmNames = result.getMetadata().getParameters().stream().map(p -> p.getName()) - .collect(Collectors.toList()); - List inParmTypes = result.getMetadata().getParameters().stream().map(p -> p.getType()) - .collect(Collectors.toList()); - List inParmPrecisions = result.getMetadata().getParameters().stream().map(p -> p.getPrecision()) - .collect(Collectors.toList()); - assertArrayEquals(Arrays.asList("P1", "P2", "P3").toArray(), inParmNames.toArray()); - assertArrayEquals(Arrays.asList("VARCHAR", "VARCHAR", "VARCHAR").toArray(), inParmTypes.toArray()); - assertArrayEquals(Arrays.asList(5, 6, 7).toArray(), inParmPrecisions.toArray()); - - assertTrue(result.getSuccess()); - assertFalse(result.getHasResults()); - assertEquals(3, result.getParameterCount()); - assertEquals(0, result.getUpdateCount()); - assertEquals(0, result.getData().size()); - - assertNotNull(result.getOutputParms()); - assertEquals(3, result.getOutputParms().size()); - List outParmNames = result.getOutputParms().stream().map(p -> p.getName()) - .collect(Collectors.toList()); - List outParmTypes = result.getOutputParms().stream().map(p -> p.getType()) - .collect(Collectors.toList()); - List outParmValues = result.getOutputParms().stream().map(p -> p.getValue()) - .collect(Collectors.toList()); - List outParmPrecisions = result.getOutputParms().stream().map(p -> p.getPrecision()) - .collect(Collectors.toList()); - assertArrayEquals(Arrays.asList("P1", "P2", "P3").toArray(), outParmNames.toArray()); - assertArrayEquals(Arrays.asList("VARCHAR", "VARCHAR", "VARCHAR").toArray(), outParmTypes.toArray()); - assertArrayEquals(Arrays.asList(null, "", "ab").toArray(), outParmValues.toArray()); - assertArrayEquals(Arrays.asList(5, 6, 7).toArray(), outParmPrecisions.toArray()); - } -} +package io.github.mapepire_ibmi; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import io.github.mapepire_ibmi.types.QueryOptions; +import io.github.mapepire_ibmi.types.QueryResult; + +class ProcedureTest extends MapepireTest { + @BeforeAll + public static void beforeAll() throws Exception { + MapepireTest.setupCreds(); + MapepireTest.setupTestSchema(); + } + + @Test + void numberParameters() throws Exception { + SqlJob job = new SqlJob(); + job.connect(MapepireTest.getCreds()).get(); + + String testProc = String.join("\n", Arrays.asList( + "CREATE OR REPLACE PROCEDURE " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST(" + + " IN P1 INTEGER," + + " INOUT P2 INTEGER," + + " OUT P3 INTEGER" + + ")" + + "BEGIN" + + " SET P3 = P1 + P2;" + + " SET P2 = 0;" + + "END")); + Query queryA = job.query(testProc); + queryA.execute().get(); + queryA.close().get(); + + QueryOptions options = new QueryOptions(false, false, Arrays.asList(6, 4, 0)); + Query queryB = job.query("CALL " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST(?, ?, ?)", options); + QueryResult result = queryB.execute().get(); + queryB.close().get(); + + job.close(); + + assertNotNull(result.getMetadata().getParameters()); + assertEquals(3, result.getMetadata().getParameters().size()); + List inParmNames = result.getMetadata().getParameters().stream().map(p -> p.getName()) + .collect(Collectors.toList()); + List inParmTypes = result.getMetadata().getParameters().stream().map(p -> p.getType()) + .collect(Collectors.toList()); + assertArrayEquals(Arrays.asList("P1", "P2", "P3").toArray(), inParmNames.toArray()); + assertArrayEquals(Arrays.asList("INTEGER", "INTEGER", "INTEGER").toArray(), inParmTypes.toArray()); + + assertTrue(result.getSuccess()); + assertFalse(result.getHasResults()); + assertEquals(3, result.getParameterCount()); + assertEquals(0, result.getUpdateCount()); + assertEquals(0, result.getData().size()); + + assertNotNull(result.getOutputParms()); + assertEquals(3, result.getOutputParms().size()); + List outParmNames = result.getOutputParms().stream().map(p -> p.getName()) + .collect(Collectors.toList()); + List outParmTypes = result.getOutputParms().stream().map(p -> p.getType()) + .collect(Collectors.toList()); + List outParmValues = result.getOutputParms().stream().map(p -> p.getValue()) + .collect(Collectors.toList()); + assertArrayEquals(Arrays.asList("P1", "P2", "P3").toArray(), outParmNames.toArray()); + assertArrayEquals(Arrays.asList("INTEGER", "INTEGER", "INTEGER").toArray(), outParmTypes.toArray()); + assertArrayEquals(Arrays.asList(null, 0, 10).toArray(), outParmValues.toArray()); + } + + @Test + void charParameters() throws Exception { + SqlJob job = new SqlJob(); + job.connect(MapepireTest.getCreds()).get(); + + String testProc = String.join("\n", Arrays.asList( + "CREATE OR REPLACE PROCEDURE " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST_CHAR(" + + " IN P1 CHAR(5)," + + " INOUT P2 CHAR(6)," + + " OUT P3 CHAR(7)" + + ")" + + "BEGIN" + + " SET P3 = RTRIM(P1) concat RTRIM(P2);" + + " SET P2 = '';" + + "END")); + Query queryA = job.query(testProc); + queryA.execute().get(); + queryA.close().get(); + + QueryOptions options = new QueryOptions(false, false, Arrays.asList("a", "b", "")); + Query queryB = job.query("CALL " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST_CHAR(?, ?, ?)", options); + QueryResult result = queryB.execute().get(); + queryB.close().get(); + + job.close(); + + assertNotNull(result.getMetadata().getParameters()); + assertEquals(3, result.getMetadata().getParameters().size()); + List inParmNames = result.getMetadata().getParameters().stream().map(p -> p.getName()) + .collect(Collectors.toList()); + List inParmTypes = result.getMetadata().getParameters().stream().map(p -> p.getType()) + .collect(Collectors.toList()); + List inParmPrecisions = result.getMetadata().getParameters().stream().map(p -> p.getPrecision()) + .collect(Collectors.toList()); + assertArrayEquals(Arrays.asList("P1", "P2", "P3").toArray(), inParmNames.toArray()); + assertArrayEquals(Arrays.asList("CHAR", "CHAR", "CHAR").toArray(), inParmTypes.toArray()); + assertArrayEquals(Arrays.asList(5, 6, 7).toArray(), inParmPrecisions.toArray()); + + assertTrue(result.getSuccess()); + assertFalse(result.getHasResults()); + assertEquals(3, result.getParameterCount()); + assertEquals(0, result.getUpdateCount()); + assertEquals(0, result.getData().size()); + + assertNotNull(result.getOutputParms()); + assertEquals(3, result.getOutputParms().size()); + List outParmNames = result.getOutputParms().stream().map(p -> p.getName()) + .collect(Collectors.toList()); + List outParmTypes = result.getOutputParms().stream().map(p -> p.getType()) + .collect(Collectors.toList()); + List outParmValues = result.getOutputParms().stream().map(p -> p.getValue()) + .collect(Collectors.toList()); + List outParmPrecisions = result.getOutputParms().stream().map(p -> p.getPrecision()) + .collect(Collectors.toList()); + assertArrayEquals(Arrays.asList("P1", "P2", "P3").toArray(), outParmNames.toArray()); + assertArrayEquals(Arrays.asList("CHAR", "CHAR", "CHAR").toArray(), outParmTypes.toArray()); + assertArrayEquals(Arrays.asList(null, "", "ab").toArray(), outParmValues.toArray()); + assertArrayEquals(Arrays.asList(5, 6, 7).toArray(), outParmPrecisions.toArray()); + } + + @Test + void varcharParameters() throws Exception { + SqlJob job = new SqlJob(); + job.connect(MapepireTest.getCreds()).get(); + + String testProc = String.join("\n", Arrays.asList( + "CREATE OR REPLACE PROCEDURE " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST_VARCHAR(" + + " IN P1 VARCHAR(5)," + + " INOUT P2 VARCHAR(6)," + + " OUT P3 VARCHAR(7)" + + ")" + + "BEGIN" + + " SET P3 = P1 concat P2;" + + " SET P2 = '';" + + "END")); + Query queryA = job.query(testProc); + queryA.execute().get(); + queryA.close().get(); + + QueryOptions options = new QueryOptions(false, false, Arrays.asList("a", "b", "c")); + Query queryB = job.query("CALL " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST_VARCHAR(?, ?, ?)", options); + QueryResult result = queryB.execute().get(); + queryB.close().get(); + + job.close(); + + assertNotNull(result.getMetadata().getParameters()); + assertEquals(3, result.getMetadata().getParameters().size()); + List inParmNames = result.getMetadata().getParameters().stream().map(p -> p.getName()) + .collect(Collectors.toList()); + List inParmTypes = result.getMetadata().getParameters().stream().map(p -> p.getType()) + .collect(Collectors.toList()); + List inParmPrecisions = result.getMetadata().getParameters().stream().map(p -> p.getPrecision()) + .collect(Collectors.toList()); + assertArrayEquals(Arrays.asList("P1", "P2", "P3").toArray(), inParmNames.toArray()); + assertArrayEquals(Arrays.asList("VARCHAR", "VARCHAR", "VARCHAR").toArray(), inParmTypes.toArray()); + assertArrayEquals(Arrays.asList(5, 6, 7).toArray(), inParmPrecisions.toArray()); + + assertTrue(result.getSuccess()); + assertFalse(result.getHasResults()); + assertEquals(3, result.getParameterCount()); + assertEquals(0, result.getUpdateCount()); + assertEquals(0, result.getData().size()); + + assertNotNull(result.getOutputParms()); + assertEquals(3, result.getOutputParms().size()); + List outParmNames = result.getOutputParms().stream().map(p -> p.getName()) + .collect(Collectors.toList()); + List outParmTypes = result.getOutputParms().stream().map(p -> p.getType()) + .collect(Collectors.toList()); + List outParmValues = result.getOutputParms().stream().map(p -> p.getValue()) + .collect(Collectors.toList()); + List outParmPrecisions = result.getOutputParms().stream().map(p -> p.getPrecision()) + .collect(Collectors.toList()); + assertArrayEquals(Arrays.asList("P1", "P2", "P3").toArray(), outParmNames.toArray()); + assertArrayEquals(Arrays.asList("VARCHAR", "VARCHAR", "VARCHAR").toArray(), outParmTypes.toArray()); + assertArrayEquals(Arrays.asList(null, "", "ab").toArray(), outParmValues.toArray()); + assertArrayEquals(Arrays.asList(5, 6, 7).toArray(), outParmPrecisions.toArray()); + } + + @Test + void clobParameters() throws Exception { + SqlJob job = new SqlJob(); + job.connect(MapepireTest.getCreds()).get(); + + String testProc = String.join("\n", Arrays.asList( + "CREATE OR REPLACE PROCEDURE " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST_CLOB(" + + " IN IN1 CLOB(1M)," + + " OUT OUT1 CLOB(1M)" + + ")" + + "BEGIN" + + " SET OUT1 = UPPER(IN1);" + + "END")); + Query queryA = job.query(testProc); + queryA.execute().get(); + queryA.close().get(); + + StringBuilder sb = new StringBuilder("test".length() * 262144); + for (int i = 0; i < 262144; i++) { + sb.append("test"); + } + QueryOptions options = new QueryOptions(false, false, Arrays.asList(sb.toString(), "")); + Query queryB = job.query("CALL " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST_CLOB(?, ?)", options); + QueryResult result = queryB.execute().get(); + queryB.close().get(); + + job.close(); + + assertNotNull(result.getMetadata().getParameters()); + assertEquals(2, result.getMetadata().getParameters().size()); + List inParmNames = result.getMetadata().getParameters().stream().map(p -> p.getName()) + .collect(Collectors.toList()); + List inParmTypes = result.getMetadata().getParameters().stream().map(p -> p.getType()) + .collect(Collectors.toList()); + List inParmPrecisions = result.getMetadata().getParameters().stream().map(p -> p.getPrecision()) + .collect(Collectors.toList()); + assertArrayEquals(Arrays.asList("IN1", "OUT1").toArray(), inParmNames.toArray()); + assertArrayEquals(Arrays.asList("CLOB", "CLOB").toArray(), inParmTypes.toArray()); + assertArrayEquals(Arrays.asList(1048576, 1048576).toArray(), inParmPrecisions.toArray()); + + assertTrue(result.getSuccess()); + assertFalse(result.getHasResults()); + assertEquals(2, result.getParameterCount()); + assertEquals(0, result.getUpdateCount()); + assertEquals(0, result.getData().size()); + + assertNotNull(result.getOutputParms()); + assertEquals(2, result.getOutputParms().size()); + List outParmNames = result.getOutputParms().stream().map(p -> p.getName()) + .collect(Collectors.toList()); + List outParmTypes = result.getOutputParms().stream().map(p -> p.getType()) + .collect(Collectors.toList()); + List outParmValues = result.getOutputParms().stream().map(p -> p.getValue()) + .collect(Collectors.toList()); + List outParmPrecisions = result.getOutputParms().stream().map(p -> p.getPrecision()) + .collect(Collectors.toList()); + assertArrayEquals(Arrays.asList("IN1", "OUT1").toArray(), outParmNames.toArray()); + assertArrayEquals(Arrays.asList("CLOB", "CLOB").toArray(), outParmTypes.toArray()); + assertArrayEquals(Arrays.asList(null, sb.toString().toUpperCase()).toArray(), outParmValues.toArray()); + assertArrayEquals(Arrays.asList(1048576, 1048576).toArray(), outParmPrecisions.toArray()); + } +} From bcb031cadc3a67177cfd6a42141ed0c1fc33530b Mon Sep 17 00:00:00 2001 From: Sanjula Ganepola Date: Wed, 14 Jan 2026 11:50:30 -0500 Subject: [PATCH 2/2] Fix checkstyle indention error Signed-off-by: Sanjula Ganepola --- src/test/java/io/github/mapepire_ibmi/ProcedureTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/io/github/mapepire_ibmi/ProcedureTest.java b/src/test/java/io/github/mapepire_ibmi/ProcedureTest.java index 23ccfb3..f7740db 100644 --- a/src/test/java/io/github/mapepire_ibmi/ProcedureTest.java +++ b/src/test/java/io/github/mapepire_ibmi/ProcedureTest.java @@ -216,7 +216,7 @@ void clobParameters() throws Exception { StringBuilder sb = new StringBuilder("test".length() * 262144); for (int i = 0; i < 262144; i++) { - sb.append("test"); + sb.append("test"); } QueryOptions options = new QueryOptions(false, false, Arrays.asList(sb.toString(), "")); Query queryB = job.query("CALL " + MapepireTest.getTestSchema() + ".PROCEDURE_TEST_CLOB(?, ?)", options);