From 2dca31e7fa1fe5de56376c906dcbd5eb110fb7da Mon Sep 17 00:00:00 2001 From: kolzeq Date: Tue, 19 Apr 2016 10:24:39 +0200 Subject: [PATCH] [CONJ-282] Handling YEARs with binary prepareStatement --- README.md | 2 +- documentation/Changelog.md | 6 +++++ .../resultset/MariaSelectResultSet.java | 27 ++++++++++++------- src/test/java/org/mariadb/jdbc/DateTest.java | 11 ++++++++ 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index eb0b1da66..abf40759d 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Development snapshot are available on sonatype nexus repository org.mariadb.jdbc mariadb-java-client - 1.5.0-SNAPSHOT + 1.4.3-SNAPSHOT ``` diff --git a/documentation/Changelog.md b/documentation/Changelog.md index 4c8e44ced..fc1643bcc 100644 --- a/documentation/Changelog.md +++ b/documentation/Changelog.md @@ -1,10 +1,16 @@ # Changelog +* [1.4.3](#1.4.3) * [1.4.2](#1.4.2) * [1.4.1](#1.4.1) * [1.4.0](#1.4.0) --- +## 1.4.3 +Not released +* [CONJ-282] Handling YEARs with binary prepareStatement +* [CONJ-278] Improve prepared statement on failover + ## 1.4.2 Released on 08 april 2016 * [CONJ-275] Streaming result without result throw "Current position is before the first row" diff --git a/src/main/java/org/mariadb/jdbc/internal/queryresults/resultset/MariaSelectResultSet.java b/src/main/java/org/mariadb/jdbc/internal/queryresults/resultset/MariaSelectResultSet.java index 0e74ecb2c..3e724aa4b 100644 --- a/src/main/java/org/mariadb/jdbc/internal/queryresults/resultset/MariaSelectResultSet.java +++ b/src/main/java/org/mariadb/jdbc/internal/queryresults/resultset/MariaSelectResultSet.java @@ -3261,18 +3261,27 @@ private Date binaryDate(byte[] rawBytes, ColumnInformation columnInfo, Calendar if (rawBytes.length == 0) { return null; } - int year; - int month; - int day; - year = ((rawBytes[0] & 0xff) | (rawBytes[1] & 0xff) << 8); - month = rawBytes[2]; - day = rawBytes[3]; + int year = ((rawBytes[0] & 0xff) | (rawBytes[1] & 0xff) << 8); + + if (rawBytes.length == 2 && columnInfo.getLength() == 2) { + //YEAR(2) - deprecated + if (year <= 69) { + year += 2000; + } else { + year += 1900; + } + } + + int month = 1; + int day = 1; + + if (rawBytes.length >= 4) { + month = rawBytes[2]; + day = rawBytes[3]; + } Calendar calendar = Calendar.getInstance(); - /*if (!options.useLegacyDatetimeCode) { - c = cal; - }*/ Date dt; synchronized (calendar) { diff --git a/src/test/java/org/mariadb/jdbc/DateTest.java b/src/test/java/org/mariadb/jdbc/DateTest.java index 17e8339de..513661d26 100644 --- a/src/test/java/org/mariadb/jdbc/DateTest.java +++ b/src/test/java/org/mariadb/jdbc/DateTest.java @@ -149,10 +149,21 @@ public void yearTest() throws SQLException { Date.valueOf("2155-01-01")}; Date[] data2 = new Date[]{null, Date.valueOf("1970-01-01"), Date.valueOf("2000-01-01"), Date.valueOf("2069-01-01")}; + checkDateResult(data1, data2, rs); + + //CONJ-282 + PreparedStatement preparedStatement = sharedConnection.prepareStatement("SELECT * FROM yeartest"); + rs = preparedStatement.executeQuery(); + checkDateResult(data1, data2, rs); + } + + private void checkDateResult(Date[] data1, Date[] data2, ResultSet rs) throws SQLException { int count = 0; while (rs.next()) { assertEquals(data1[count], rs.getObject(1)); assertEquals(data2[count], rs.getObject(2)); + assertEquals(data1[count], rs.getDate(1)); + assertEquals(data2[count], rs.getDate(2)); count++; } }