From 91a0e3639aebdc746c12c836fc794ecfab3a1f42 Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Fri, 23 Sep 2016 00:03:56 +0300 Subject: [PATCH] SQL query execute fix (handle errors after filters apply) --- .../dbeaver/runtime/sql/SQLQueryJob.java | 42 +++++++++---------- .../model/impl/sql/BasicSQLDialect.java | 4 +- .../jkiss/dbeaver/model/sql/SQLDialect.java | 2 +- .../sql/parser/SQLSemanticProcessor.java | 12 +++--- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/sql/SQLQueryJob.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/sql/SQLQueryJob.java index b0eb2a26c7..2c25817acf 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/sql/SQLQueryJob.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/runtime/sql/SQLQueryJob.java @@ -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) { diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/sql/BasicSQLDialect.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/sql/BasicSQLDialect.java index 492adc704e..1365c96d72 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/sql/BasicSQLDialect.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/sql/BasicSQLDialect.java @@ -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); } diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/SQLDialect.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/SQLDialect.java index 896eebcb7c..a8a9c31e4e 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/SQLDialect.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/SQLDialect.java @@ -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. diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/parser/SQLSemanticProcessor.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/parser/SQLSemanticProcessor.java index 58eafffe7c..e15c1ea1dc 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/parser/SQLSemanticProcessor.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/sql/parser/SQLSemanticProcessor.java @@ -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"); -- GitLab