提交 e1389b24 编写于 作者: S serge-rider

#5233 SQL Server: error handle fix (for multi-results queries)


Former-commit-id: 955eedb6
上级 772c84fb
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
*/ */
package org.jkiss.dbeaver.ext.mssql.model; package org.jkiss.dbeaver.ext.mssql.model;
import org.jkiss.dbeaver.ext.mssql.SQLServerUtils;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCDatabaseMetaData; import org.jkiss.dbeaver.model.exec.jdbc.JDBCDatabaseMetaData;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSourceInfo; import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSourceInfo;
...@@ -24,8 +25,11 @@ import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSourceInfo; ...@@ -24,8 +25,11 @@ import org.jkiss.dbeaver.model.impl.jdbc.JDBCDataSourceInfo;
*/ */
class SQLServerDataSourceInfo extends JDBCDataSourceInfo { class SQLServerDataSourceInfo extends JDBCDataSourceInfo {
private boolean isSybase;
public SQLServerDataSourceInfo(SQLServerDataSource dataSource, JDBCDatabaseMetaData metaData) { public SQLServerDataSourceInfo(SQLServerDataSource dataSource, JDBCDatabaseMetaData metaData) {
super(metaData); super(metaData);
this.isSybase = !SQLServerUtils.isDriverSqlServer(dataSource.getContainer().getDriver());
} }
@Override @Override
...@@ -38,4 +42,9 @@ class SQLServerDataSourceInfo extends JDBCDataSourceInfo { ...@@ -38,4 +42,9 @@ class SQLServerDataSourceInfo extends JDBCDataSourceInfo {
return true; return true;
} }
@Override
public boolean isMultipleResultsFetchBroken() {
return isSybase;
}
} }
...@@ -18,6 +18,7 @@ package org.jkiss.dbeaver.ext.wmi.model; ...@@ -18,6 +18,7 @@ package org.jkiss.dbeaver.ext.wmi.model;
import org.jkiss.dbeaver.model.DBPDataSourceInfo; import org.jkiss.dbeaver.model.DBPDataSourceInfo;
import org.jkiss.dbeaver.model.DBPTransactionIsolation; import org.jkiss.dbeaver.model.DBPTransactionIsolation;
import org.jkiss.dbeaver.model.impl.BaseDataSourceInfo;
import org.osgi.framework.Version; import org.osgi.framework.Version;
import java.util.Collection; import java.util.Collection;
...@@ -25,7 +26,7 @@ import java.util.Collection; ...@@ -25,7 +26,7 @@ import java.util.Collection;
/** /**
* Info * Info
*/ */
public class WMIDataSourceInfo implements DBPDataSourceInfo { public class WMIDataSourceInfo extends BaseDataSourceInfo {
public WMIDataSourceInfo() public WMIDataSourceInfo()
{ {
...@@ -136,18 +137,4 @@ public class WMIDataSourceInfo implements DBPDataSourceInfo { ...@@ -136,18 +137,4 @@ public class WMIDataSourceInfo implements DBPDataSourceInfo {
return true; return true;
} }
@Override
public boolean supportsResultSetScroll() {
return false;
}
@Override
public boolean isDynamicMetadata() {
return false;
}
@Override
public boolean supportsMultipleResults() {
return false;
}
} }
...@@ -152,4 +152,9 @@ public interface DBPDataSourceInfo ...@@ -152,4 +152,9 @@ public interface DBPDataSourceInfo
* Checks whether this data source supports multiple results for a single statement * Checks whether this data source supports multiple results for a single statement
*/ */
boolean supportsMultipleResults(); boolean supportsMultipleResults();
/**
* Workaround for broken drivers (#2792)
*/
boolean isMultipleResultsFetchBroken();
} }
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.model.impl;
import org.jkiss.dbeaver.model.DBPDataSourceInfo;
import org.jkiss.dbeaver.model.DBPTransactionIsolation;
import java.util.Collection;
/**
* BaseDataSourceInfo
*/
public abstract class BaseDataSourceInfo implements DBPDataSourceInfo
{
@Override
public boolean supportsTransactions() {
return false;
}
@Override
public boolean supportsSavepoints() {
return false;
}
@Override
public boolean supportsReferentialIntegrity() {
return false;
}
@Override
public boolean supportsIndexes() {
return false;
}
@Override
public boolean supportsStoredCode() {
return false;
}
@Override
public Collection<DBPTransactionIsolation> getSupportedTransactionsIsolation() {
return null;
}
@Override
public boolean supportsResultSetLimit() {
return false;
}
@Override
public boolean supportsResultSetScroll() {
return false;
}
@Override
public boolean isDynamicMetadata() {
return false;
}
@Override
public boolean supportsMultipleResults() {
return false;
}
@Override
public boolean isReadOnlyData()
{
return false;
}
@Override
public boolean isReadOnlyMetaData()
{
return false;
}
@Override
public boolean isMultipleResultsFetchBroken() {
return false;
}
@Override
public boolean supportsBatchUpdates()
{
return false;
}
}
...@@ -320,6 +320,11 @@ public class JDBCDataSourceInfo implements DBPDataSourceInfo ...@@ -320,6 +320,11 @@ public class JDBCDataSourceInfo implements DBPDataSourceInfo
return false; return false;
} }
@Override
public boolean isMultipleResultsFetchBroken() {
return false;
}
public void setSupportsResultSetScroll(boolean supportsScroll) public void setSupportsResultSetScroll(boolean supportsScroll)
{ {
this.supportsScroll = supportsScroll; this.supportsScroll = supportsScroll;
......
...@@ -1330,6 +1330,11 @@ public abstract class SQLEditorBase extends BaseTextEditor implements DBPContext ...@@ -1330,6 +1330,11 @@ public abstract class SQLEditorBase extends BaseTextEditor implements DBPContext
} }
if (errorOffset < queryStartOffset) errorOffset = queryStartOffset; if (errorOffset < queryStartOffset) errorOffset = queryStartOffset;
if (errorLength > queryLength) errorLength = queryLength; if (errorLength > queryLength) errorLength = queryLength;
if (errorOffset >= queryStartOffset + queryLength) {
// This may happen if error position was incorrectly detected.
// E.g. in SQL Server when actual error happened in some stored procedure.
errorOffset = queryStartOffset + queryLength - 1;
}
getSelectionProvider().setSelection(new TextSelection(errorOffset, errorLength)); getSelectionProvider().setSelection(new TextSelection(errorOffset, errorLength));
scrolled = true; scrolled = true;
} }
......
...@@ -504,10 +504,14 @@ public class SQLQueryJob extends DataSourceJob ...@@ -504,10 +504,14 @@ public class SQLQueryJob extends DataSourceJob
try { try {
hasResultSet = dbcStatement.nextResults(); hasResultSet = dbcStatement.nextResults();
} catch (DBCException e) { } catch (DBCException e) {
log.error(e); if (session.getDataSource().getInfo().isMultipleResultsFetchBroken()) {
// #2792: Check this twice. Some drivers (e.g. Sybase jConnect) log.error(e);
// throw error on n'th result fetch - but it still can keep fetching next results // #2792: Check this twice. Some drivers (e.g. Sybase jConnect)
hasResultSet = dbcStatement.nextResults(); // throw error on n'th result fetch - but it still can keep fetching next results
hasResultSet = dbcStatement.nextResults();
} else {
throw e;
}
} }
updateCount = hasResultSet ? -1 : 0; updateCount = hasResultSet ? -1 : 0;
} else { } else {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册