diff --git a/src/main/java/org/mariadb/jdbc/internal/packet/dao/parameters/StringParameter.java b/src/main/java/org/mariadb/jdbc/internal/packet/dao/parameters/StringParameter.java index 4152bed42..7f0c4e0d2 100644 --- a/src/main/java/org/mariadb/jdbc/internal/packet/dao/parameters/StringParameter.java +++ b/src/main/java/org/mariadb/jdbc/internal/packet/dao/parameters/StringParameter.java @@ -65,6 +65,8 @@ public class StringParameter implements ParameterHolder, Cloneable { private boolean noBackslashEscapes; private byte[] escapedArray = null; private int position; + private int charsOffset; + private boolean binary; public StringParameter(String string, boolean noBackslashEscapes) throws SQLException { this.string = string; @@ -122,8 +124,12 @@ public String toString() { } } else { if (position > 1024) { + //escape bytes have integrated quote, binary hasn't + if (binary) return "'" + new String(escapedArray, 0, 1024) + "...'"; return new String(escapedArray, 0, 1024) + "...'"; } else { + //escape bytes have integrated quote, binary hasn't + if (binary) return "'" + new String(escapedArray, 0, position) + "'"; return new String(escapedArray, 0, position); } } @@ -165,7 +171,7 @@ private void escapeUtf8() { char[] chars = StringUtils.getChars(string); string = null; int charsLength = chars.length; - int charsOffset = 0; + charsOffset = 0; position = 0; //create UTF-8 byte array @@ -202,12 +208,13 @@ private void escapeUtf8() { escapedArray[position++] = (byte) '\\'; } escapedArray[position++] = (byte) currChar; - } else getNonAsciiByte(currChar, chars, charsOffset, charsLength); + } else getNonAsciiByte(currChar, chars, charsLength); } escapedArray[position++] = (byte) '\''; + binary = false; } - private void getNonAsciiByte(char currChar, char[] chars, int charsOffset, int charsLength) { + private void getNonAsciiByte(char currChar, char[] chars, int charsLength) { if (currChar < 0x800) { escapedArray[position++] = (byte) (0xc0 | (currChar >> 6)); escapedArray[position++] = (byte) (0x80 | (currChar & 0x3f)); @@ -251,7 +258,7 @@ private void utf8() { char[] chars = StringUtils.getChars(string); string = null; int charsLength = chars.length; - int charsOffset = 0; + charsOffset = 0; position = 0; escapedArray = new byte[(charsLength * 3)]; @@ -260,8 +267,9 @@ private void utf8() { char currChar = chars[charsOffset++]; if (currChar < 0x80) { escapedArray[position++] = (byte) currChar; - } else getNonAsciiByte(currChar, chars, charsOffset, charsLength); + } else getNonAsciiByte(currChar, chars, charsLength); } + binary = true; } public boolean isLongData() { diff --git a/src/main/java/org/mariadb/jdbc/internal/protocol/AbstractMultiSend.java b/src/main/java/org/mariadb/jdbc/internal/protocol/AbstractMultiSend.java index 2089744b9..b441b21af 100644 --- a/src/main/java/org/mariadb/jdbc/internal/protocol/AbstractMultiSend.java +++ b/src/main/java/org/mariadb/jdbc/internal/protocol/AbstractMultiSend.java @@ -356,7 +356,7 @@ public PrepareResult executeComMultiBatch(int paramCount) throws QueryException comStmtPrepare = new ComStmtPrepare(protocol, sql); comStmtPrepare.sendSubCmd(writer); } - + int initialCounter = status.sendCmdCounter; do { if (sendSubCmd(writer, executionResult, parametersList, queries, paramCount, status, prepareResult)) { @@ -382,7 +382,11 @@ public PrepareResult executeComMultiBatch(int paramCount) throws QueryException try { protocol.getResult(executionResult, resultSetScrollType, binaryProtocol, true); } catch (QueryException qex) { - if (exception == null) exception = qex; + if (exception == null) { + exception = handleResultException(qex, executionResult, + parametersList, queries, counter, initialCounter, paramCount, + prepareResult); + } } } diff --git a/src/main/java/org/mariadb/jdbc/internal/util/DefaultOptions.java b/src/main/java/org/mariadb/jdbc/internal/util/DefaultOptions.java index b0bf14c80..2893478ce 100644 --- a/src/main/java/org/mariadb/jdbc/internal/util/DefaultOptions.java +++ b/src/main/java/org/mariadb/jdbc/internal/util/DefaultOptions.java @@ -591,7 +591,7 @@ private static Options parse(HaMode haMode, Properties properties, Options optio //not compatible options //disable use server prepare id using client rewrite - if (options.rewriteBatchedStatements) { + if (options.rewriteBatchedStatements || options.allowMultiQueries) { options.useServerPrepStmts = false; options.cachePrepStmts = false; } diff --git a/src/test/java/org/mariadb/jdbc/BufferTest.java b/src/test/java/org/mariadb/jdbc/BufferTest.java index 883e6970e..8e1bd449d 100644 --- a/src/test/java/org/mariadb/jdbc/BufferTest.java +++ b/src/test/java/org/mariadb/jdbc/BufferTest.java @@ -90,7 +90,7 @@ public void send20mSqlNotCompressDataException() throws SQLException { } catch (SQLException sqlexception) { assertTrue("not the expected exception. was " + sqlexception.getMessage(), sqlexception.getMessage().contains("Could not send query: max_allowed_packet=") - || sqlexception.getMessage().contains("is > to max_allowed_packet")); + || sqlexception.getMessage().contains("is >= to max_allowed_packet")); } } @@ -103,7 +103,7 @@ public void send20mSqlCompressDataException() throws SQLException { } catch (SQLException sqlexception) { assertTrue("not the expected exception. was " + sqlexception.getMessage(), sqlexception.getMessage().contains("Could not send query: max_allowed_packet=") - || sqlexception.getMessage().contains("is > to max_allowed_packet")); + || sqlexception.getMessage().contains("is >= to max_allowed_packet")); } } @@ -116,7 +116,7 @@ public void send40mSqlNotCompressDataException() throws SQLException { } catch (SQLException sqlexception) { assertTrue("not the expected exception. was " + sqlexception.getMessage(), sqlexception.getMessage().contains("Could not send query: max_allowed_packet=") - || sqlexception.getMessage().contains("is > to max_allowed_packet")); + || sqlexception.getMessage().contains("is >= to max_allowed_packet")); } } @@ -129,7 +129,7 @@ public void send40mSqlCompressDataException() throws SQLException { } catch (SQLException sqlexception) { assertTrue("not the expected exception. was " + sqlexception.getMessage(), sqlexception.getMessage().contains("Could not send query: max_allowed_packet=") - || sqlexception.getMessage().contains("is > to max_allowed_packet")); + || sqlexception.getMessage().contains("is >= to max_allowed_packet")); } } @@ -143,7 +143,7 @@ public void send20mByteBufferNotCompressDataException() throws SQLException { } catch (SQLException sqlexception) { assertTrue("not the expected exception. was " + sqlexception.getMessage(), sqlexception.getMessage().contains("Could not send query: max_allowed_packet=") - || sqlexception.getMessage().contains("is > to max_allowed_packet")); + || sqlexception.getMessage().contains("is >= to max_allowed_packet")); } } @@ -156,7 +156,7 @@ public void send20mByteBufferCompressDataException() throws SQLException { } catch (SQLException sqlexception) { assertTrue("not the expected exception. was " + sqlexception.getMessage(), sqlexception.getMessage().contains("Could not send query: max_allowed_packet=") - || sqlexception.getMessage().contains("is > to max_allowed_packet")); + || sqlexception.getMessage().contains("is >= to max_allowed_packet")); } } @@ -169,7 +169,7 @@ public void send40mByteBufferNotCompressDataException() throws SQLException { } catch (SQLException sqlexception) { assertTrue("not the expected exception. was " + sqlexception.getMessage(), sqlexception.getMessage().contains("Could not send query: max_allowed_packet=") - || sqlexception.getMessage().contains("is > to max_allowed_packet")); + || sqlexception.getMessage().contains("is >= to max_allowed_packet")); } } @@ -182,7 +182,7 @@ public void send40mByteBufferCompressDataException() throws SQLException { } catch (SQLException sqlexception) { assertTrue("not the expected exception. was " + sqlexception.getMessage(), sqlexception.getMessage().contains("Could not send query: max_allowed_packet=") - || sqlexception.getMessage().contains("is > to max_allowed_packet")); + || sqlexception.getMessage().contains("is >= to max_allowed_packet")); } }