Modified:
branches/branch_5_1/CHANGES
branches/branch_5_1/src/com/mysql/jdbc/MysqlIO.java
branches/branch_5_1/src/com/mysql/jdbc/RowDataDynamic.java
branches/branch_5_1/src/com/mysql/jdbc/StatementImpl.java
branches/branch_5_1/src/testsuite/regression/ResultSetRegressionTest.java
Log:
Fixed Bug#33678 - Multiple result sets not supported in
"streaming" mode. This fix covers both normal statements, and stored
procedures, with the exception of stored procedures with registered
OUTPUT parameters, which can't be used at all with "streaming" result
sets.
Modified: branches/branch_5_1/CHANGES
===================================================================
--- branches/branch_5_1/CHANGES 2008-01-03 15:30:42 UTC (rev 6705)
+++ branches/branch_5_1/CHANGES 2008-01-04 02:40:19 UTC (rev 6706)
@@ -113,6 +113,12 @@
uses shouldn't use cursor-based fetching at all, so we've
ensured that internal statements have their fetch size set to "0".
+ - Fixed Bug#33678 - Multiple result sets not supported in
+ "streaming" mode. This fix covers both normal statements, and stored
+ procedures, with the exception of stored procedures with registered
+ OUTPUT parameters, which can't be used at all with "streaming" result
+ sets.
+
10-09-07 - Version 5.1.5
- Released instead of 5.1.4 to pickup patch for BUG#31053
Modified: branches/branch_5_1/src/com/mysql/jdbc/MysqlIO.java
===================================================================
--- branches/branch_5_1/src/com/mysql/jdbc/MysqlIO.java 2008-01-03 15:30:42 UTC (rev 6705)
+++ branches/branch_5_1/src/com/mysql/jdbc/MysqlIO.java 2008-01-04 02:40:19 UTC (rev 6706)
@@ -95,7 +95,7 @@
private static final int CLIENT_MULTI_RESULTS = 131072; // Enable/disable
multi-results
private static final int SERVER_STATUS_IN_TRANS = 1;
private static final int SERVER_STATUS_AUTOCOMMIT = 2; // Server in auto_commit mode
- private static final int SERVER_MORE_RESULTS_EXISTS = 8; // Multi query - next query
exists
+ static final int SERVER_MORE_RESULTS_EXISTS = 8; // Multi query - next query exists
private static final int SERVER_QUERY_NO_GOOD_INDEX_USED = 16;
private static final int SERVER_QUERY_NO_INDEX_USED = 32;
private static final int SERVER_STATUS_CURSOR_EXISTS = 64;
@@ -1672,6 +1672,55 @@
this.streamingData = null;
}
+ boolean tackOnMoreStreamingResults(ResultSetImpl addingTo) throws SQLException {
+ if ((this.serverStatus & SERVER_MORE_RESULTS_EXISTS) != 0) {
+
+ boolean moreRowSetsExist = true;
+ ResultSetImpl currentResultSet = addingTo;
+ boolean firstTime = true;
+
+ while (moreRowSetsExist) {
+ if (!firstTime && currentResultSet.reallyResult()) {
+ break;
+ }
+
+ firstTime = false;
+
+ Buffer fieldPacket = checkErrorPacket();
+ fieldPacket.setPosition(0);
+
+ java.sql.Statement owningStatement = addingTo.getStatement();
+
+ int maxRows = owningStatement.getMaxRows();
+
+ // fixme for catalog, isBinary
+
+ ResultSetImpl newResultSet = readResultsForQueryOrUpdate(
+ (StatementImpl)owningStatement,
+ maxRows, owningStatement.getResultSetType(),
+ owningStatement.getResultSetConcurrency(),
+ true, owningStatement.getConnection().getCatalog(), fieldPacket,
+ addingTo.isBinaryEncoded,
+ -1L, null);
+
+ currentResultSet.setNextResultSet(newResultSet);
+
+ currentResultSet = newResultSet;
+
+ moreRowSetsExist = (this.serverStatus &
MysqlIO.SERVER_MORE_RESULTS_EXISTS) != 0;
+
+ if (!currentResultSet.reallyResult() && !moreRowSetsExist) {
+ // special case, we can stop "streaming"
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
ResultSetImpl readAllResults(StatementImpl callingStatement, int maxRows,
int resultSetType, int resultSetConcurrency, boolean streamResults,
String catalog, Buffer resultPacket, boolean isBinaryEncoded,
@@ -1696,10 +1745,17 @@
// TODO: We need to support streaming of multiple result sets
//
if (serverHasMoreResults && streamResults) {
- clearInputStream();
-
- throw SQLError.createSQLException(Messages.getString("MysqlIO.23"),
//$NON-NLS-1$
- SQLError.SQL_STATE_DRIVER_NOT_CAPABLE);
+ //clearInputStream();
+//
+ //throw SQLError.createSQLException(Messages.getString("MysqlIO.23"),
//$NON-NLS-1$
+ //SQLError.SQL_STATE_DRIVER_NOT_CAPABLE);
+ if (topLevelResultSet.getUpdateCount() != -1) {
+ tackOnMoreStreamingResults(topLevelResultSet);
+ }
+
+ reclaimLargeReusablePacket();
+
+ return topLevelResultSet;
}
boolean moreRowSetsExist = checkForMoreResults & serverHasMoreResults;
@@ -2407,7 +2463,7 @@
*
* @throws SQLException if an error occurs while reading the rows
*/
- private final ResultSetImpl readResultsForQueryOrUpdate(
+ protected final ResultSetImpl readResultsForQueryOrUpdate(
StatementImpl callingStatement, int maxRows, int resultSetType,
int resultSetConcurrency, boolean streamResults, String catalog,
Buffer resultPacket, boolean isBinaryEncoded, long preSentColumnCount,
Modified: branches/branch_5_1/src/com/mysql/jdbc/RowDataDynamic.java
===================================================================
--- branches/branch_5_1/src/com/mysql/jdbc/RowDataDynamic.java 2008-01-03 15:30:42 UTC
(rev 6705)
+++ branches/branch_5_1/src/com/mysql/jdbc/RowDataDynamic.java 2008-01-04 02:40:19 UTC
(rev 6706)
@@ -25,6 +25,7 @@
package com.mysql.jdbc;
import java.sql.SQLException;
+import java.sql.Statement;
import com.mysql.jdbc.profiler.ProfilerEvent;
import com.mysql.jdbc.profiler.ProfilerEventHandler;
@@ -69,6 +70,8 @@
private boolean useBufferRowExplicit;
+ private boolean moreResultsExisted;
+
/**
* Creates a new RowDataDynamic object.
*
@@ -388,7 +391,7 @@
nextRecord();
- if (this.nextRow == null && !this.streamerClosed) {
+ if (this.nextRow == null && !this.streamerClosed &&
!this.moreResultsExisted) {
this.io.closeStreamer(this);
this.streamerClosed = true;
}
@@ -414,7 +417,8 @@
if (this.nextRow == null) {
this.isAtEnd = true;
-
+ this.moreResultsExisted = this.io.tackOnMoreStreamingResults(this.owner);
+
if (this.index == -1) {
this.wasEmpty = true;
}
Modified: branches/branch_5_1/src/com/mysql/jdbc/StatementImpl.java
===================================================================
--- branches/branch_5_1/src/com/mysql/jdbc/StatementImpl.java 2008-01-03 15:30:42 UTC (rev
6705)
+++ branches/branch_5_1/src/com/mysql/jdbc/StatementImpl.java 2008-01-04 02:40:19 UTC (rev
6706)
@@ -1932,13 +1932,25 @@
return false;
}
+ boolean streamingMode = createStreamingResultSet();
+
+ if (streamingMode) {
+ if (this.results.reallyResult()) {
+ while (this.results.next()); // need to drain remaining rows to get to server status
+ // which tells us whether more results actually exist or not
+ }
+ }
+
ResultSetInternalMethods nextResultSet = this.results.getNextResultSet();
switch (current) {
case java.sql.Statement.CLOSE_CURRENT_RESULT:
if (this.results != null) {
- this.results.close();
+ if (!streamingMode) {
+ this.results.close();
+ }
+
this.results.clearNextResult();
}
@@ -1947,7 +1959,10 @@
case java.sql.Statement.CLOSE_ALL_RESULTS:
if (this.results != null) {
- this.results.close();
+ if (!streamingMode) {
+ this.results.close();
+ }
+
this.results.clearNextResult();
}
Modified: branches/branch_5_1/src/testsuite/regression/ResultSetRegressionTest.java
===================================================================
--- branches/branch_5_1/src/testsuite/regression/ResultSetRegressionTest.java 2008-01-03
15:30:42 UTC (rev 6705)
+++ branches/branch_5_1/src/testsuite/regression/ResultSetRegressionTest.java 2008-01-04
02:40:19 UTC (rev 6706)
@@ -4507,4 +4507,85 @@
}
}
}
+
+ /**
+ * Tests fix for Bug#33678 - Multiple result sets not supported in
+ * "streaming" mode. This fix covers both normal statements, and stored
+ * procedures, with the exception of stored procedures with registered
+ * OUTPUT parameters, which can't be used at all with "streaming" result
+ * sets.
+ *
+ * @throws Exception
+ */
+ public void testBug33678() throws Exception {
+ if (!versionMeetsMinimum(4, 1)) {
+ return;
+ }
+
+ createTable("testBug33678", "(field1 INT)");
+
+
+ Connection multiConn = getConnectionWithProps("allowMultiQueries=true");
+ Statement multiStmt = multiConn.createStatement();
+
+ try {
+ multiStmt.setFetchSize(Integer.MIN_VALUE);
+
+ multiStmt.execute("SELECT 1 UNION SELECT 2; INSERT INTO testBug33678 VALUES (1);
UPDATE testBug33678 set field1=2; INSERT INTO testBug33678 VALUES(3); UPDATE testBug33678
set field1=2 WHERE field1=3; UPDATE testBug33678 set field1=2; SELECT 1");
+ this.rs = multiStmt.getResultSet();
+ this.rs.next();
+ assertEquals("1", this.rs.getString(1));
+
+ assertFalse(multiStmt.getMoreResults());
+ assertEquals(1, multiStmt.getUpdateCount());
+ assertFalse(multiStmt.getMoreResults());
+ assertEquals(1, multiStmt.getUpdateCount());
+ assertFalse(multiStmt.getMoreResults());
+ assertEquals(1, multiStmt.getUpdateCount());
+ assertFalse(multiStmt.getMoreResults());
+ assertEquals(1, multiStmt.getUpdateCount());
+ assertFalse(multiStmt.getMoreResults());
+ assertEquals(2, multiStmt.getUpdateCount());
+ assertTrue(multiStmt.getMoreResults());
+ this.rs = multiStmt.getResultSet();
+ this.rs.next();
+ assertEquals("1", this.rs.getString(1));
+
+ this.rs.close();
+
+ multiStmt.execute("INSERT INTO testBug33678 VALUES (1); INSERT INTO testBug33678
VALUES (1), (2); INSERT INTO testBug33678 VALUES (1), (2), (3)");
+
+ assertEquals(1, multiStmt.getUpdateCount());
+ assertFalse(multiStmt.getMoreResults());
+ assertEquals(2, multiStmt.getUpdateCount());
+ assertFalse(multiStmt.getMoreResults());
+ assertEquals(3, multiStmt.getUpdateCount());
+ assertFalse(multiStmt.getMoreResults() && multiStmt.getUpdateCount() == -1);
+
+ this.rs.close();
+
+ if (versionMeetsMinimum(5, 0)) {
+ createProcedure("spBug33678", "() BEGIN SELECT 1; SELECT 2; SELECT 3; END");
+
+ CallableStatement cStmt = multiConn.prepareCall("{CALL spBug33678()}");
+ cStmt.setFetchSize(Integer.MIN_VALUE);
+ cStmt.execute();
+
+ for (int i = 0; i < 2; i++) {
+ if (i != 0) {
+ assertTrue(cStmt.getMoreResults());
+ }
+
+ this.rs = cStmt.getResultSet();
+ assertTrue(this.rs.next());
+ assertEquals(i + 1, this.rs.getInt(1));
+ }
+ }
+ } finally {
+ multiStmt.close();
+ multiConn.close();
+
+ closeMemberJDBCResources();
+ }
+ }
}
| Thread |
|---|
| • Connector/J commit: r6706 - in branches/branch_5_1: . src/com/mysql/jdbc src/testsuite/regression | mmatthews | 4 Jan 2008 |