From 87946bb9681fcc66f319e4ae54663e8b5d3afaff Mon Sep 17 00:00:00 2001 From: rusher Date: Thu, 31 Oct 2019 18:02:39 +0100 Subject: [PATCH] [CONJ-743] Signed byte value wrong serialization for text protocol --- .../com/send/parameters/ByteParameter.java | 10 +- src/test/java/org/mariadb/jdbc/ByteTest.java | 104 ++++++++++++++++++ .../java/org/mariadb/jdbc/DriverTest.java | 2 +- 3 files changed, 109 insertions(+), 7 deletions(-) create mode 100644 src/test/java/org/mariadb/jdbc/ByteTest.java diff --git a/src/main/java/org/mariadb/jdbc/internal/com/send/parameters/ByteParameter.java b/src/main/java/org/mariadb/jdbc/internal/com/send/parameters/ByteParameter.java index c9b34944f..682b0015a 100644 --- a/src/main/java/org/mariadb/jdbc/internal/com/send/parameters/ByteParameter.java +++ b/src/main/java/org/mariadb/jdbc/internal/com/send/parameters/ByteParameter.java @@ -63,7 +63,7 @@ public class ByteParameter implements Cloneable, ParameterHolder { private final int value; public ByteParameter(byte value) { - this.value = value & 0xFF; + this.value = value; } /** @@ -73,13 +73,11 @@ public ByteParameter(byte value) { * @throws IOException if any socket error occur */ public void writeTo(final PacketOutputStream os) throws IOException { - os.write("0x"); - os.write(hexArray[value >>> 4]); - os.write(hexArray[value & 0x0F]); + os.write(String.valueOf(value).getBytes()); } public long getApproximateTextProtocolLength() { - return 4; + return String.valueOf(value).length(); } /** @@ -98,7 +96,7 @@ public ColumnType getColumnType() { @Override public String toString() { - return "0x" + hexArray[value >>> 4] + hexArray[value & 0x0F]; + return String.valueOf(value); } public boolean isNullData() { diff --git a/src/test/java/org/mariadb/jdbc/ByteTest.java b/src/test/java/org/mariadb/jdbc/ByteTest.java new file mode 100644 index 000000000..06d8c2256 --- /dev/null +++ b/src/test/java/org/mariadb/jdbc/ByteTest.java @@ -0,0 +1,104 @@ +/* + * + * MariaDB Client for Java + * + * Copyright (c) 2012-2014 Monty Program Ab. + * Copyright (c) 2015-2019 MariaDB Ab. + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with this library; if not, write to Monty Program Ab info@montyprogram.com. + * + * This particular MariaDB Client for Java file is work + * derived from a Drizzle-JDBC. Drizzle-JDBC file which is covered by subject to + * the following copyright and notice provisions: + * + * Copyright (c) 2009-2011, Marcus Eriksson + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * Neither the name of the driver nor the names of its contributors may not be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + */ + +package org.mariadb.jdbc; + +import org.junit.*; + +import java.sql.*; + +import static org.junit.Assert.*; + +public class ByteTest extends BaseTest { + + @BeforeClass() + public static void initClass() throws SQLException { + createTable("ByteTest", "test tinyint, test2 TINYBLOB"); + } + + @Test + public void byteSending() throws SQLException { + Assume.assumeFalse(sharedUsePrepare()); + try (PreparedStatement prep = sharedConnection.prepareStatement("INSERT INTO ByteTest value " + + "(?, ?)")) { + prep.setByte(1, (byte) -6); + prep.setByte(2, (byte) -6); + prep.execute(); + Statement stmt = sharedConnection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM ByteTest"); + assertTrue(rs.next()); + assertEquals(rs.getByte(1), (byte) -6); + assertEquals(rs.getByte(2), (byte) -6); + assertEquals(rs.getInt(1), -6); + assertEquals(rs.getInt(2), -6); + } + } + + @Test + public void byteSendingBinary() throws SQLException { + try (Connection conn = setConnection("&useServerPrepStmts")) { + try (PreparedStatement prep = + conn.prepareStatement("INSERT INTO ByteTest value " + "(?, ?)")) { + prep.setByte(1, (byte) -6); + prep.setByte(2, (byte) -6); + prep.execute(); + Statement stmt = sharedConnection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM ByteTest"); + assertTrue(rs.next()); + assertEquals(rs.getByte(1), (byte) -6); + assertEquals(rs.getByte(2), (byte) -6); + assertEquals(rs.getInt(1), -6); + assertEquals(rs.getInt(2), -6); + } + } + } +} diff --git a/src/test/java/org/mariadb/jdbc/DriverTest.java b/src/test/java/org/mariadb/jdbc/DriverTest.java index 88fc5f06b..373c57f84 100644 --- a/src/test/java/org/mariadb/jdbc/DriverTest.java +++ b/src/test/java/org/mariadb/jdbc/DriverTest.java @@ -1523,7 +1523,7 @@ public void preparedStatementToString() throws Exception { ps.setDouble(6, 1.5); ps.setByte(7, (byte) 0xfe); assertEquals( - "sql : 'SELECT ?,?,?,?,?,?,?', parameters : [1,1,'one',true,'1972-04-22',1.5,0xFE]", + "sql : 'SELECT ?,?,?,?,?,?,?', parameters : [1,1,'one',true,'1972-04-22',1.5,-2]", ps.toString()); } }