From c0fae0d3f7765243d9f6bf5430178201d4f3828f Mon Sep 17 00:00:00 2001 From: Magnus Persson <1431685+magnusp@users.noreply.github.com> Date: Thu, 22 Oct 2026 20:14:21 +0200 Subject: [PATCH] fix(jdbc): return canonical REAL text from getBytes (#74) getBytes encoded REAL values with Double.toString, which produced 1.0E-4 for 0.0001 and disagreed with getString. Route REAL through the existing sqliteRealText helper so getBytes returns the same SQLite canonical text bytes as getString and CAST(value AS TEXT). Fixes #74 --- .../github/magnusp/libsql/jdbc/LibsqlResultSet.java | 2 +- .../libsql/jdbc/LibsqlResultSetRealTextTest.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlResultSet.java b/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlResultSet.java index cda4b2c..a567f41 100644 --- a/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlResultSet.java +++ b/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlResultSet.java @@ -626,7 +626,7 @@ public byte[] getBytes(int columnIndex) throws SQLException { case Value.Blob b -> b.bytes(); case Value.Text t -> t.value().getBytes(java.nio.charset.StandardCharsets.UTF_8); case Value.Integer i -> Long.toString(i.value()).getBytes(java.nio.charset.StandardCharsets.UTF_8); - case Value.Float f -> Double.toString(f.value()).getBytes(java.nio.charset.StandardCharsets.UTF_8); + case Value.Float f -> sqliteRealText(f.value()).getBytes(java.nio.charset.StandardCharsets.UTF_8); }; } diff --git a/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlResultSetRealTextTest.java b/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlResultSetRealTextTest.java index f9a2121..67308f8 100644 --- a/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlResultSetRealTextTest.java +++ b/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlResultSetRealTextTest.java @@ -10,6 +10,7 @@ import org.junit.jupiter.params.provider.MethodSource; import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.util.List; import java.util.stream.Stream; @@ -95,6 +96,17 @@ void realTextUsesFixedNotationBetweenNegativeFourAndSixteen(String sqliteValue, assertThat(rs.getString(1)).isEqualTo(expected); } + @ParameterizedTest(name = "{0} -> {1}") + @MethodSource("canonicalText") + void realBytesMatchCanonicalText(String sqliteValue, String expected) throws SQLException { + LibsqlResultSet rs = resultSet(new Value.Float(Double.parseDouble(sqliteValue))); + assertThat(rs.next()).isTrue(); + + assertThat(rs.getBytes(1)).isEqualTo(expected.getBytes(StandardCharsets.UTF_8)); + assertThat(rs.getBytes(1)) + .isEqualTo(rs.getString(1).getBytes(StandardCharsets.UTF_8)); + } + private static LibsqlResultSet resultSet(Value... values) { List