Skip to content

Commit a2f2523

Browse files
author
diego Dupin
committed
[misc] Batch result correction
1 parent fa7635e commit a2f2523

File tree

8 files changed

+119
-28
lines changed

8 files changed

+119
-28
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<artifactId>mariadb-java-client</artifactId>
88
<packaging>jar</packaging>
99
<name>mariadb-java-client</name>
10-
<version>3.0.2-rc</version>
10+
<version>3.0.3-SNAPSHOT</version>
1111
<description>JDBC driver for MariaDB and MySQL</description>
1212
<url>https://mariadb.com/kb/en/mariadb/about-mariadb-connector-j/</url>
1313

src/main/java/org/mariadb/jdbc/ClientPreparedStatement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ public int[] executeBatch() throws SQLException {
416416
updates[i] = Statement.SUCCESS_NO_INFO;
417417
}
418418
} else {
419-
for (int i = 0; i < Math.min(results.size(), batchParameters.size()); i++) {
419+
for (int i = 0; i < updates.length; i++) {
420420
if (results.get(i) instanceof OkPacket) {
421421
updates[i] = (int) ((OkPacket) results.get(i)).getAffectedRows();
422422
} else {

src/main/java/org/mariadb/jdbc/ServerPreparedStatement.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -550,12 +550,12 @@ public int[] executeBatch() throws SQLException {
550550
executeInternalPreparedBatch();
551551

552552
int[] updates = new int[batchParameters.size()];
553-
if (results.size() != batchParameters.size()) {
554-
for (int i = 0; i < batchParameters.size(); i++) {
553+
if (results.size() != updates.length) {
554+
for (int i = 0; i < updates.length; i++) {
555555
updates[i] = Statement.SUCCESS_NO_INFO;
556556
}
557557
} else {
558-
for (int i = 0; i < Math.min(results.size(), batchParameters.size()); i++) {
558+
for (int i = 0; i < updates.length; i++) {
559559
if (results.get(i) instanceof OkPacket) {
560560
updates[i] = (int) ((OkPacket) results.get(i)).getAffectedRows();
561561
} else {
@@ -581,13 +581,17 @@ public long[] executeLargeBatch() throws SQLException {
581581
executeInternalPreparedBatch();
582582

583583
long[] updates = new long[batchParameters.size()];
584-
if (results.size() != batchParameters.size()) {
585-
for (int i = 0; i < batchParameters.size(); i++) {
584+
if (results.size() != updates.length) {
585+
for (int i = 0; i < updates.length; i++) {
586586
updates[i] = Statement.SUCCESS_NO_INFO;
587587
}
588588
} else {
589-
for (int i = 0; i < results.size(); i++) {
590-
updates[i] = ((OkPacket) results.get(i)).getAffectedRows();
589+
for (int i = 0; i < updates.length; i++) {
590+
if (results.get(i) instanceof OkPacket) {
591+
updates[i] = ((OkPacket) results.get(i)).getAffectedRows();
592+
} else {
593+
updates[i] = org.mariadb.jdbc.Statement.SUCCESS_NO_INFO;
594+
}
591595
}
592596
}
593597

src/main/java/org/mariadb/jdbc/client/impl/StandardClient.java

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -481,25 +481,25 @@ public List<Completion> executePipeline(
481481
responseMsg[i] = sendQuery(messages[i]);
482482
}
483483
while (readCounter < messages.length) {
484-
readCounter++;
485-
for (int j = 0; j < responseMsg[readCounter - 1]; j++) {
484+
for (int j = 0; j < responseMsg[readCounter]; j++) {
486485
results.addAll(
487486
readResponse(
488487
stmt,
489-
messages[readCounter - 1],
488+
messages[readCounter],
490489
fetchSize,
491490
maxRows,
492491
resultSetConcurrency,
493492
resultSetType,
494493
closeOnCompletion));
495494
}
495+
readCounter++;
496496
}
497497
}
498498
return results;
499499
} catch (SQLException sqlException) {
500500

501501
// read remaining results
502-
for (int i = readCounter; i < messages.length; i++) {
502+
for (int i = readCounter + 1; i < messages.length; i++) {
503503
for (int j = 0; j < responseMsg[i]; j++) {
504504
try {
505505
results.addAll(
@@ -546,9 +546,35 @@ public List<Completion> execute(
546546
int resultSetType,
547547
boolean closeOnCompletion)
548548
throws SQLException {
549-
sendQuery(message);
550-
return readResponse(
551-
stmt, message, fetchSize, maxRows, resultSetConcurrency, resultSetType, closeOnCompletion);
549+
int nbResp = sendQuery(message);
550+
if (nbResp == 1) {
551+
return readResponse(
552+
stmt,
553+
message,
554+
fetchSize,
555+
maxRows,
556+
resultSetConcurrency,
557+
resultSetType,
558+
closeOnCompletion);
559+
} else {
560+
if (streamStmt != null) {
561+
streamStmt.fetchRemaining();
562+
streamStmt = null;
563+
}
564+
List<Completion> completions = new ArrayList<>();
565+
while (nbResp-- > 0) {
566+
readResults(
567+
stmt,
568+
message,
569+
completions,
570+
fetchSize,
571+
maxRows,
572+
resultSetConcurrency,
573+
resultSetType,
574+
closeOnCompletion);
575+
}
576+
return completions;
577+
}
552578
}
553579

554580
public List<Completion> readResponse(

src/main/java/org/mariadb/jdbc/message/client/ExecutePacket.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public boolean binaryProtocol() {
128128
}
129129

130130
public String description() {
131-
return command;
131+
return "EXECUTE " + command;
132132
}
133133

134134
public void setPrepareResult(PrepareResultPacket prepareResult) {

src/main/java/org/mariadb/jdbc/message/client/PingPacket.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ public int encode(Writer writer, Context context) throws IOException {
1818
writer.initPacket();
1919
writer.writeByte(0x0e);
2020
writer.flush();
21-
return 0;
21+
return 1;
2222
}
2323
}

src/main/java/org/mariadb/jdbc/message/client/PreparePacket.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,6 @@ public Completion readPacket(
9595

9696
@Override
9797
public String description() {
98-
return sql;
98+
return "PREPARE " + sql;
9999
}
100100
}

src/test/java/org/mariadb/jdbc/integration/BatchTest.java

Lines changed: 70 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,31 +77,39 @@ public void wrongParameter(Connection con) throws SQLException {
7777

7878
@Test
7979
public void differentParameterType() throws SQLException {
80-
try (Connection con = createCon("&useServerPrepStmts=false")) {
81-
differentParameterType(con);
80+
try (Connection con = createCon("&useServerPrepStmts=false&useBulkStmts=false")) {
81+
differentParameterType(con, false);
82+
}
83+
try (Connection con = createCon("&useServerPrepStmts=false&useBulkStmts=true")) {
84+
differentParameterType(con, isMariaDBServer());
85+
}
86+
try (Connection con =
87+
createCon("&useServerPrepStmts=false&useBulkStmts=true&disablePipeline")) {
88+
differentParameterType(con, isMariaDBServer());
8289
}
8390
try (Connection con = createCon("&useServerPrepStmts&useBulkStmts=false")) {
84-
differentParameterType(con);
91+
differentParameterType(con, false);
8592
}
8693
try (Connection con = createCon("&useServerPrepStmts&useBulkStmts")) {
87-
differentParameterType(con);
94+
differentParameterType(con, isMariaDBServer());
8895
}
8996
try (Connection con = createCon("&useServerPrepStmts=false&allowLocalInfile")) {
90-
differentParameterType(con);
97+
differentParameterType(con, isMariaDBServer());
9198
}
9299
try (Connection con = createCon("&useServerPrepStmts&useBulkStmts=false&allowLocalInfile")) {
93-
differentParameterType(con);
100+
differentParameterType(con, false);
94101
}
95102
try (Connection con = createCon("&useServerPrepStmts&useBulkStmts&allowLocalInfile")) {
96-
differentParameterType(con);
103+
differentParameterType(con, false);
97104
}
98105
try (Connection con =
99106
createCon("&useServerPrepStmts&useBulkStmts=false&disablePipeline=true")) {
100-
differentParameterType(con);
107+
differentParameterType(con, false);
101108
}
102109
}
103110

104-
public void differentParameterType(Connection con) throws SQLException {
111+
public void differentParameterType(Connection con, boolean expectSuccessUnknown)
112+
throws SQLException {
105113
Statement stmt = con.createStatement();
106114
stmt.execute("TRUNCATE BatchTest");
107115
try (PreparedStatement prep =
@@ -126,6 +134,59 @@ public void differentParameterType(Connection con) throws SQLException {
126134
assertEquals(2, rs.getInt(1));
127135
assertEquals("2", rs.getString(2));
128136
assertFalse(rs.next());
137+
138+
stmt.execute("TRUNCATE BatchTest");
139+
try (PreparedStatement prep =
140+
con.prepareStatement("INSERT INTO BatchTest(t1, t2) VALUES (?,?)")) {
141+
prep.setInt(1, 1);
142+
prep.setInt(2, 1);
143+
prep.addBatch();
144+
145+
prep.setInt(1, 2);
146+
prep.setInt(2, 2);
147+
prep.addBatch();
148+
int[] res = prep.executeBatch();
149+
assertEquals(2, res.length);
150+
if (expectSuccessUnknown) {
151+
assertEquals(Statement.SUCCESS_NO_INFO, res[0]);
152+
assertEquals(Statement.SUCCESS_NO_INFO, res[1]);
153+
} else {
154+
assertEquals(1, res[0]);
155+
assertEquals(1, res[1]);
156+
}
157+
}
158+
rs = stmt.executeQuery("SELECT * FROM BatchTest");
159+
assertTrue(rs.next());
160+
assertEquals(1, rs.getInt(1));
161+
assertEquals("1", rs.getString(2));
162+
assertTrue(rs.next());
163+
assertEquals(2, rs.getInt(1));
164+
assertEquals("2", rs.getString(2));
165+
assertFalse(rs.next());
166+
167+
stmt.execute("TRUNCATE BatchTest");
168+
try (PreparedStatement prep =
169+
con.prepareStatement("INSERT INTO BatchTest(t1, t2) VALUES (?,?)")) {
170+
prep.setInt(1, 1);
171+
prep.setString(2, "1");
172+
prep.addBatch();
173+
174+
prep.setInt(1, 2);
175+
prep.setInt(2, 2);
176+
prep.addBatch();
177+
int[] res = prep.executeBatch();
178+
assertEquals(2, res.length);
179+
assertEquals(1, res[0]);
180+
assertEquals(1, res[1]);
181+
}
182+
rs = stmt.executeQuery("SELECT * FROM BatchTest");
183+
assertTrue(rs.next());
184+
assertEquals(1, rs.getInt(1));
185+
assertEquals("1", rs.getString(2));
186+
assertTrue(rs.next());
187+
assertEquals(2, rs.getInt(1));
188+
assertEquals("2", rs.getString(2));
189+
assertFalse(rs.next());
129190
}
130191

131192
@Test

0 commit comments

Comments
 (0)