Skip to content

Commit

Permalink
Check for error in DONE token when fetching result sets (#1943)
Browse files Browse the repository at this point in the history
  • Loading branch information
lilgreenbird authored and tkyc committed Dec 13, 2022
1 parent a6d125c commit 9dd7470
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -519,7 +519,7 @@ protected Object[][] getContents() {
{"R_serverCertError", "Error validating Server Certificate: {0}: {1}."},
{"R_SecureStringInitFailed", "Failed to initialize SecureStringUtil to store secure strings"},
{"R_ALPNFailed", "Failed to negotiate Application-Layer Protocol {0}. Server returned: {1}."},
{"R_serverError", "An error occurred during the current command (Done status {0})."},
{"R_serverError", "An error occurred during the current command (Done status {0}). {1}"},
};
}
// @formatter:on
22 changes: 16 additions & 6 deletions src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java
Original file line number Diff line number Diff line change
Expand Up @@ -382,14 +382,15 @@ boolean onDone(TDSReader tdsReader) throws SQLServerException {
rowCount = 0;

short status = tdsReader.peekStatusFlag();
stmt.connection.getSessionRecovery().decrementUnprocessedResponseCount();

if ((status & TDS.DONE_ERROR) != 0 || (status & TDS.DONE_SRVERROR) != 0) {
SQLServerError databaseError = this.getDatabaseError();
MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_serverError"));
Object[] msgArgs = {status};
Object[] msgArgs = {status, (databaseError != null) ? databaseError.getErrorMessage() : ""};
SQLServerException.makeFromDriverError(stmt.connection, stmt, form.format(msgArgs), null, false);
}

stmt.connection.getSessionRecovery().decrementUnprocessedResponseCount();

return false;
}
}
Expand Down Expand Up @@ -1788,8 +1789,9 @@ final boolean fetchBufferNext() throws SQLServerException {
RowType fetchBufferCurrentRowType = RowType.UNKNOWN;
try {
fetchBufferCurrentRowType = fetchBuffer.nextRow();
if (fetchBufferCurrentRowType.equals(RowType.UNKNOWN))
if (fetchBufferCurrentRowType.equals(RowType.UNKNOWN)) {
return false;
}
} catch (SQLServerException e) {
currentRow = AFTER_LAST_ROW;
rowErrorException = e;
Expand Down Expand Up @@ -5376,6 +5378,14 @@ boolean onDone(TDSReader tdsReader) throws SQLServerException {

StreamDone doneToken = new StreamDone();
doneToken.setFromTDS(tdsReader);
if (doneToken.isFinal() && doneToken.isError()) {
short status = tdsReader.peekStatusFlag();
SQLServerError databaseError = getDatabaseError();
MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_serverError"));
Object[] msgArgs = {status, (databaseError != null) ? databaseError.getErrorMessage() : ""};
SQLServerException.makeFromDriverError(stmt.connection, stmt, form.format(msgArgs), null, false);
}

stmt.connection.getSessionRecovery().decrementUnprocessedResponseCount();

// Done with all the rows in this fetch buffer and done with parsing
Expand Down Expand Up @@ -5472,8 +5482,7 @@ final RowType nextRow() throws SQLServerException {
while (null != tdsReader && !done && fetchBufferCurrentRowType.equals(RowType.UNKNOWN))
TDSParser.parse(tdsReader, fetchBufferTokenHandler);

if (fetchBufferCurrentRowType.equals(RowType.UNKNOWN)
&& null != fetchBufferTokenHandler.getDatabaseError()) {
if (null != fetchBufferTokenHandler.getDatabaseError()) {
SQLServerException.makeFromDatabaseError(stmt.connection, null,
fetchBufferTokenHandler.getDatabaseError().getErrorMessage(),
fetchBufferTokenHandler.getDatabaseError(), false);
Expand Down Expand Up @@ -5533,6 +5542,7 @@ final void processResponse(TDSReader responseTDSReader) throws SQLServerExceptio
tdsReader = responseTDSReader;
discardFetchBuffer();
}

}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/microsoft/sqlserver/jdbc/StreamDone.java
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ void setFromTDS(TDSReader tdsReader) throws SQLServerException {
* @return true if error
*/
/* L0 */ final boolean isError() {
return (status & TDS.DONE_ERROR) != 0;
return (((status & TDS.DONE_ERROR) != 0) || ((status & TDS.DONE_SRVERROR) != 0));
}

/**
Expand Down

0 comments on commit 9dd7470

Please sign in to comment.