Merge lp:~massimo-siani/mariadb-java-client/CONJ-116 into lp:mariadb-java-client

Proposed by Massimo Siani
Status: Merged
Merged at revision: 550
Proposed branch: lp:~massimo-siani/mariadb-java-client/CONJ-116
Merge into: lp:mariadb-java-client
Diff against target: 186 lines (+91/-2) (has conflicts)
7 files modified
src/main/java/org/mariadb/jdbc/internal/common/packet/commands/StreamedQueryPacket.java (+4/-1)
src/main/java/org/mariadb/jdbc/internal/common/query/MySQLParameterizedQuery.java (+23/-0)
src/main/java/org/mariadb/jdbc/internal/common/query/MySQLQuery.java (+5/-0)
src/main/java/org/mariadb/jdbc/internal/common/query/Query.java (+1/-0)
src/main/java/org/mariadb/jdbc/internal/mysql/MySQLProtocol.java (+10/-0)
src/test/java/org/mariadb/jdbc/ConnectionTest.java (+47/-0)
src/test/java/org/mariadb/jdbc/DriverTest.java (+1/-1)
Text conflict in src/test/java/org/mariadb/jdbc/ConnectionTest.java
To merge this branch: bzr merge lp:~massimo-siani/mariadb-java-client/CONJ-116
Reviewer Review Type Date Requested Status
Maria-captains Pending
Review via email: mp+244412@code.launchpad.net

Description of the change

CONJ-116:

Make SQLException prettier when too large packet is sent to the server.

Example from Connector/J:
Packet for query is too large (1106929 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.

To post a comment you must log in.
537. By Massimo Siani

Fix for CONJ-116: Make SQLException prettier when too large packet is sent to the server

Revision history for this message
Massimo Siani (massimo-siani) wrote :

Sorry, there was a bug in the previous one. Now should be fine.

Revision history for this message
Vladislav Vaintroub (wlad-montyprogram) wrote :

Does not seem very efficient, creating a new String and converting to UTF8 bytes.

Also not entirely correct, especially for blobs, as blob bytes are not UTF8, and some bytes need escaping, and the escape byte needs to be taken into acccount.

If at all, the check is be better done in PacketOutputStream , before sending .For example, in PacketOutputStream.internalFlush() if dataLen exceeds max_allowed_packet, reset seqNo and position, and throw "exceeds max_allowed_packet" from there.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/main/java/org/mariadb/jdbc/internal/common/packet/commands/StreamedQueryPacket.java'
2--- src/main/java/org/mariadb/jdbc/internal/common/packet/commands/StreamedQueryPacket.java 2012-12-21 18:15:36 +0000
3+++ src/main/java/org/mariadb/jdbc/internal/common/packet/commands/StreamedQueryPacket.java 2014-12-12 12:33:01 +0000
4@@ -66,7 +66,6 @@
5 public StreamedQueryPacket(final Query query)
6 {
7 this.query = query;
8-
9 }
10
11 public int send(final OutputStream ostream) throws IOException,
12@@ -79,4 +78,8 @@
13 pos.finishPacket();
14 return 0;
15 }
16+
17+ public int getPacketLength() {
18+ return query.getPacketLength();
19+ }
20 }
21\ No newline at end of file
22
23=== modified file 'src/main/java/org/mariadb/jdbc/internal/common/query/MySQLParameterizedQuery.java'
24--- src/main/java/org/mariadb/jdbc/internal/common/query/MySQLParameterizedQuery.java 2014-10-21 15:41:04 +0000
25+++ src/main/java/org/mariadb/jdbc/internal/common/query/MySQLParameterizedQuery.java 2014-12-12 12:33:01 +0000
26@@ -199,4 +199,27 @@
27 }
28 }
29
30+ private String toSQL2() throws UnsupportedEncodingException {
31+ if(queryPartsArray.length == 0) {
32+ return "";
33+ }
34+ String result;
35+ result = new String(queryPartsArray[0], "UTF-8");
36+ for(int i = 1; i<queryPartsArray.length; i++) {
37+ result += parameters[i-1];
38+ if(queryPartsArray[i].length != 0)
39+ result += new String(queryPartsArray[i], "UTF-8");
40+ }
41+ return result;
42+ }
43+
44+ @Override
45+ public int getPacketLength() {
46+ try {
47+ return toSQL2().getBytes("UTF-8").length;
48+ } catch (UnsupportedEncodingException e) {
49+ return -1;
50+ }
51+ }
52+
53 }
54
55=== modified file 'src/main/java/org/mariadb/jdbc/internal/common/query/MySQLQuery.java'
56--- src/main/java/org/mariadb/jdbc/internal/common/query/MySQLQuery.java 2012-12-21 18:15:36 +0000
57+++ src/main/java/org/mariadb/jdbc/internal/common/query/MySQLQuery.java 2014-12-12 12:33:01 +0000
58@@ -115,5 +115,10 @@
59 return query;
60 }
61
62+ @Override
63+ public int getPacketLength() {
64+ return length();
65+ }
66+
67
68 }
69
70=== modified file 'src/main/java/org/mariadb/jdbc/internal/common/query/Query.java'
71--- src/main/java/org/mariadb/jdbc/internal/common/query/Query.java 2012-12-21 18:15:36 +0000
72+++ src/main/java/org/mariadb/jdbc/internal/common/query/Query.java 2014-12-12 12:33:01 +0000
73@@ -60,4 +60,5 @@
74 String getQuery();
75 QueryType getQueryType();
76 void validate() throws QueryException;
77+ int getPacketLength();
78 }
79
80=== modified file 'src/main/java/org/mariadb/jdbc/internal/mysql/MySQLProtocol.java'
81--- src/main/java/org/mariadb/jdbc/internal/mysql/MySQLProtocol.java 2014-12-09 15:02:39 +0000
82+++ src/main/java/org/mariadb/jdbc/internal/mysql/MySQLProtocol.java 2014-12-12 12:33:01 +0000
83@@ -1020,6 +1020,16 @@
84 this.moreResults = false;
85 final StreamedQueryPacket packet = new StreamedQueryPacket(dQuery);
86
87+ int packetLength = packet.getPacketLength();
88+ if (this.maxAllowedPacket > 0 && packetLength > 0 && packetLength > this.maxAllowedPacket) {
89+ throw new QueryException("Packet for query is too large ("
90+ + packetLength
91+ + " > "
92+ + this.maxAllowedPacket
93+ + "). You can change this value on the server by setting the max_allowed_packet' variable.",
94+ -1, SQLExceptionMapper.SQLStates.UNDEFINED_SQLSTATE.getSqlState());
95+ }
96+
97 try {
98 packet.send(writer);
99 } catch (IOException e) {
100
101=== modified file 'src/test/java/org/mariadb/jdbc/ConnectionTest.java'
102--- src/test/java/org/mariadb/jdbc/ConnectionTest.java 2014-12-09 10:28:02 +0000
103+++ src/test/java/org/mariadb/jdbc/ConnectionTest.java 2014-12-12 12:33:01 +0000
104@@ -2,8 +2,13 @@
105
106 import static org.junit.Assert.*;
107
108+<<<<<<< TREE
109 import java.lang.reflect.Field;
110 import java.sql.Connection;
111+=======
112+import java.io.UnsupportedEncodingException;
113+import java.sql.ResultSet;
114+>>>>>>> MERGE-SOURCE
115 import java.sql.SQLException;
116 import java.sql.SQLPermission;
117 import java.sql.Statement;
118@@ -75,6 +80,7 @@
119 stmt.close();
120 }
121 }
122+<<<<<<< TREE
123
124
125 /**
126@@ -198,5 +204,46 @@
127 long threadId = serverThreadIdField.getLong(protocol);
128 return threadId;
129 }
130+=======
131+
132+ /**
133+ * CONJ-116: Make SQLException prettier when too large packet is sent to the server
134+ * @throws SQLException
135+ * @throws UnsupportedEncodingException
136+ */
137+ @Test
138+ public void maxAllowedPackedExceptionIsPrettyTest() throws SQLException, UnsupportedEncodingException {
139+ int maxAllowedPacket = 1024 * 1024;
140+ Statement statement = connection.createStatement();
141+ ResultSet rs = statement.executeQuery("SHOW VARIABLES LIKE 'max_allowed_packet'");
142+ if (rs.next()) {
143+ maxAllowedPacket = rs.getInt(2);
144+ }
145+ rs.close();
146+ statement.execute("DROP TABLE IF EXISTS dummy");
147+ statement.execute("CREATE TABLE dummy (a BLOB)");
148+ //Create a SQL packet bigger than maxAllowedPacket
149+ StringBuilder sb = new StringBuilder();
150+ String rowData = "('this is a dummy row values')";
151+ int rowsToWrite = (maxAllowedPacket / rowData.getBytes("UTF-8").length) + 1;
152+ for (int row = 1; row <= rowsToWrite; row++) {
153+ if (row >= 2) {
154+ sb.append(", ");
155+ }
156+ sb.append(rowData);
157+ }
158+ String sql = "INSERT INTO dummy VALUES " + sb.toString();
159+ try {
160+ statement.executeUpdate(sql);
161+ fail("The previous statement should throw an SQLException");
162+ } catch (SQLException e) {
163+ assertTrue(e.getMessage().contains("max_allowed_packet"));
164+ } catch (Exception e) {
165+ fail("The previous statement should throw an SQLException not a general Exception");
166+ } finally {
167+ statement.execute("DROP TABLE dummy");
168+ }
169+ }
170+>>>>>>> MERGE-SOURCE
171
172 }
173
174=== modified file 'src/test/java/org/mariadb/jdbc/DriverTest.java'
175--- src/test/java/org/mariadb/jdbc/DriverTest.java 2014-10-21 15:21:12 +0000
176+++ src/test/java/org/mariadb/jdbc/DriverTest.java 2014-12-12 12:33:01 +0000
177@@ -1603,8 +1603,8 @@
178 @Test
179 public void createDbWithSpacesTest() throws SQLException {
180 String oldDb = mDatabase;
181+ setParameters("&createDB=true");
182 setDatabase("test with spaces");
183- setConnection("&createDB=true");
184 DatabaseMetaData dbmd = connection.getMetaData();
185 ResultSet rs = dbmd.getCatalogs();
186 boolean foundDb = false;

Subscribers

People subscribed via source and target branches