From f8fb748081487142ada0d5f115dcad982cc7fccc Mon Sep 17 00:00:00 2001 From: Juha Komulainen Date: Mon, 6 May 2024 10:02:18 +0300 Subject: [PATCH] Fix byte[] instantiation on MariaDB Closes #54 --- CHANGELOG.md | 6 ++++ .../internal/jdbc/ResultSetUtils.java | 5 ++++ .../internal/jdbc/ResultSetUtilsTest.kt | 30 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 dalesbred/src/test/kotlin/org/dalesbred/internal/jdbc/ResultSetUtilsTest.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 63ee243b..b37309c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## Unreleased + +### Changes + +- Fix byte[] instantiation on MariaDB Connector/J 3.x ([#54](https://github.com/EvidentSolutions/dalesbred/pull/54)) + ## 1.3.5 (2022-03-02) ### Changes diff --git a/dalesbred/src/main/java/org/dalesbred/internal/jdbc/ResultSetUtils.java b/dalesbred/src/main/java/org/dalesbred/internal/jdbc/ResultSetUtils.java index 04bbc0a7..f33f1f83 100644 --- a/dalesbred/src/main/java/org/dalesbred/internal/jdbc/ResultSetUtils.java +++ b/dalesbred/src/main/java/org/dalesbred/internal/jdbc/ResultSetUtils.java @@ -50,6 +50,11 @@ private ResultSetUtils() { } public static @NotNull Type getColumnType(@NotNull ResultSetMetaData metaData, int column) throws SQLException { String className = metaData.getColumnClassName(column); + + // MariaDB Connector/J 3.x encodes byte array types in a way that is incompatible with Class.forName + if (className.equals("byte[]")) + return byte[].class; + try { return Class.forName(className); } catch (ClassNotFoundException e) { diff --git a/dalesbred/src/test/kotlin/org/dalesbred/internal/jdbc/ResultSetUtilsTest.kt b/dalesbred/src/test/kotlin/org/dalesbred/internal/jdbc/ResultSetUtilsTest.kt new file mode 100644 index 00000000..a2d1a715 --- /dev/null +++ b/dalesbred/src/test/kotlin/org/dalesbred/internal/jdbc/ResultSetUtilsTest.kt @@ -0,0 +1,30 @@ +package org.dalesbred.internal.jdbc + +import org.dalesbred.testutils.unimplemented +import org.junit.Test +import java.sql.ResultSetMetaData +import kotlin.test.assertEquals + +class ResultSetUtilsTest { + + @Test + fun `column type resolution`() { + val metadata = MockResultSetMetaData( + classNames = listOf("java.lang.String", "[Ljava.lang.String;", "[B") + ) + assertEquals(String::class.java, ResultSetUtils.getColumnType(metadata, 1)) + assertEquals(Array::class.java, ResultSetUtils.getColumnType(metadata, 2)) + assertEquals(ByteArray::class.java, ResultSetUtils.getColumnType(metadata, 3)) + } + + @Test + fun `resolving byte array types for MariaDB`() { + val metadata = MockResultSetMetaData(classNames = listOf("byte[]")) + assertEquals(ByteArray::class.java, ResultSetUtils.getColumnType(metadata, 1)) + } + + class MockResultSetMetaData(val classNames: List) : ResultSetMetaData by unimplemented() { + override fun getColumnCount() = classNames.size + override fun getColumnClassName(column: Int) = classNames[column - 1] + } +}