提交 91a0e363 编写于 作者: S Serge Rider

SQL query execute fix (handle errors after filters apply)

上级 61ce94f2
......@@ -270,50 +270,48 @@ public class SQLQueryJob extends DataSourceJob implements Closeable
}
}
private boolean executeSingleQuery(@NotNull DBCSession session, @NotNull SQLQuery sqlQuery, boolean fireEvents)
private boolean executeSingleQuery(@NotNull DBCSession session, @NotNull SQLQuery sqlQuery, final boolean fireEvents)
{
lastError = null;
final String originalQueryText = sqlQuery.getQuery();
DBCExecutionContext executionContext = getExecutionContext();
SQLQueryResult curResult = new SQLQueryResult(sqlQuery);
final DBCExecutionContext executionContext = getExecutionContext();
final DBPDataSource dataSource = executionContext.getDataSource();
final SQLQuery originalQuery = sqlQuery;
long startTime = System.currentTimeMillis();
boolean startQueryAlerted = false;
// Modify query (filters + parameters)
if (dataFilter != null && dataFilter.hasFilters() && dataSource instanceof SQLDataSource) {
String filteredQueryText = ((SQLDataSource) dataSource).getSQLDialect().addFiltersToQuery(
dataSource, originalQuery.getQuery(), dataFilter);
sqlQuery = new SQLQuery(
filteredQueryText,
sqlQuery.getOffset(),
sqlQuery.getLength());
}
final SQLQueryResult curResult = new SQLQueryResult(sqlQuery);
if (rsOffset > 0) {
curResult.setRowOffset(rsOffset);
}
SQLQuery originalQuery = sqlQuery;
long startTime = System.currentTimeMillis();
boolean startQueryAlerted = false;
try {
// Prepare statement
closeStatement();
// Check and invalidate connection
DBPDataSource dataSource = executionContext.getDataSource();
if (!connectionInvalidated && dataSource.getContainer().getPreferenceStore().getBoolean(DBeaverPreferences.STATEMENT_INVALIDATE_BEFORE_EXECUTE)) {
executionContext.invalidateContext(session.getProgressMonitor());
connectionInvalidated = true;
}
try {
// Modify query (filters + parameters)
if (dataFilter != null && dataFilter.hasFilters() && dataSource instanceof SQLDataSource) {
String filteredQueryText = ((SQLDataSource) dataSource).getSQLDialect().addFiltersToQuery(dataSource, originalQueryText, dataFilter);
sqlQuery = new SQLQuery(
filteredQueryText,
sqlQuery.getOffset(),
sqlQuery.getLength());
}
} catch (DBException e) {
throw new DBCException("Can't apply query filter", e);
}
Boolean hasParameters = prepareStatementParameters(sqlQuery);
if (hasParameters == null) {
return false;
}
statistics.setQueryText(originalQueryText);
statistics.setQueryText(originalQuery.getQuery());
// Notify query start
if (fireEvents && listener != null) {
......
......@@ -19,7 +19,6 @@ package org.jkiss.dbeaver.model.impl.sql;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPIdentifierCase;
import org.jkiss.dbeaver.model.DBPKeywordType;
......@@ -32,7 +31,6 @@ import org.jkiss.dbeaver.model.sql.SQLStateType;
import org.jkiss.dbeaver.model.sql.parser.SQLSemanticProcessor;
import org.jkiss.dbeaver.model.struct.DBSAttributeBase;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
import org.jkiss.utils.Pair;
import java.util.*;
......@@ -305,7 +303,7 @@ public class BasicSQLDialect implements SQLDialect {
}
@Override
public String addFiltersToQuery(DBPDataSource dataSource, String query, DBDDataFilter filter) throws DBException {
public String addFiltersToQuery(DBPDataSource dataSource, String query, DBDDataFilter filter) {
return SQLSemanticProcessor.addFiltersToQuery(dataSource, query, filter);
}
......
......@@ -233,7 +233,7 @@ public interface SQLDialect {
@NotNull
MultiValueInsertMode getMultiValueInsertMode();
String addFiltersToQuery(DBPDataSource dataSource, String query, DBDDataFilter filter) throws DBException;
String addFiltersToQuery(DBPDataSource dataSource, String query, DBDDataFilter filter);
/**
* Two-item array containing begin and end of multi-line comments.
......
......@@ -30,7 +30,7 @@ import net.sf.jsqlparser.statement.select.FromItem;
import net.sf.jsqlparser.statement.select.OrderByElement;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
......@@ -48,6 +48,8 @@ import java.util.List;
*/
public class SQLSemanticProcessor {
private static final Log log = Log.getLog(SQLSemanticProcessor.class);
private static final String NESTED_QUERY_AlIAS = "z_q";
public static boolean isSelectQuery(String query)
......@@ -64,7 +66,7 @@ public class SQLSemanticProcessor {
}
}
public static String addFiltersToQuery(final DBPDataSource dataSource, String sqlQuery, final DBDDataFilter dataFilter) throws DBException {
public static String addFiltersToQuery(final DBPDataSource dataSource, String sqlQuery, final DBDDataFilter dataFilter) {
boolean supportSubqueries = dataSource instanceof SQLDataSource && ((SQLDataSource) dataSource).getSQLDialect().supportsSubqueries();
try {
Statement statement = CCJSqlParserUtil.parse(sqlQuery);
......@@ -75,13 +77,13 @@ public class SQLSemanticProcessor {
return statement.toString();
}
}
return wrapQuery(dataSource, sqlQuery, dataFilter);
} catch (Throwable e) {
throw new DBException("SQL parse error", e);
log.debug("SQL parse error", e);
}
return wrapQuery(dataSource, sqlQuery, dataFilter);
}
public static String wrapQuery(final DBPDataSource dataSource, String sqlQuery, final DBDDataFilter dataFilter) throws DBException {
public static String wrapQuery(final DBPDataSource dataSource, String sqlQuery, final DBDDataFilter dataFilter) {
// Append filter conditions to query
StringBuilder modifiedQuery = new StringBuilder(sqlQuery.length() + 100);
modifiedQuery.append("SELECT * FROM (\n");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册