Skip to content

Commit

Permalink
Fix byte[] instantiation on MariaDB
Browse files Browse the repository at this point in the history
Closes #54
  • Loading branch information
komu committed May 6, 2024
1 parent 722e2bd commit f8fb748
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 0 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<String>::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<String>) : ResultSetMetaData by unimplemented() {
override fun getColumnCount() = classNames.size
override fun getColumnClassName(column: Int) = classNames[column - 1]
}
}

0 comments on commit f8fb748

Please sign in to comment.