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

#2989 Query filters preference (force subselects)

上级 659a18ae
......@@ -806,6 +806,8 @@ public class CoreMessages extends NLS {
public static String pref_page_database_general_label_result_set_max_size;
public static String pref_page_database_general_label_result_set_cancel_timeout;
public static String pref_page_database_general_label_result_set_cancel_timeout_tip;
public static String pref_page_database_resultsets_label_filter_force_subselect;
public static String pref_page_database_resultsets_label_filter_force_subselect_tip;
public static String pref_page_database_resultsets_group_binary;
public static String pref_page_database_resultsets_label_binary_use_strings;
public static String pref_page_database_resultsets_label_binary_presentation;
......
......@@ -795,6 +795,8 @@ pref_page_database_general_label_cache_max_size = LOB cache max size
pref_page_database_general_label_max_lob_length = Maximum LOB length to keep in memory
pref_page_database_general_label_result_set_cancel_timeout = Query cancel timeout
pref_page_database_general_label_result_set_cancel_timeout_tip = Query cancellation timeout (ms) after which DBeaver will stop query execution in UI
pref_page_database_resultsets_label_filter_force_subselect = Always use subselect for filters
pref_page_database_resultsets_label_filter_force_subselect_tip = Force subselect use for query filters. Otherwise try to patch query WHERE clause (default).
pref_page_database_general_label_result_set_max_size = ResultSet fetch size
pref_page_database_general_separate_meta_connection = Open separate connection for metadata read
pref_page_database_resultsets_group_binary = Binary data
......
......@@ -44,6 +44,7 @@ public class PrefPageResultSetMain extends TargetPrefPage
private Button readQueryMetadata;
private Button readQueryReferences;
private Spinner queryCancelTimeout;
private Button filterForceSubselect;
private Button keepStatementOpenCheck;
private Button alwaysUseAllColumns;
......@@ -67,6 +68,7 @@ public class PrefPageResultSetMain extends TargetPrefPage
store.contains(ModelPreferences.RESULT_SET_MAX_ROWS_USE_SQL) ||
store.contains(DBeaverPreferences.RESULT_SET_READ_METADATA) ||
store.contains(DBeaverPreferences.RESULT_SET_CANCEL_TIMEOUT) ||
store.contains(ModelPreferences.SQL_FILTER_FORCE_SUBSELECT) ||
store.contains(DBeaverPreferences.RS_EDIT_USE_ALL_COLUMNS) ||
store.contains(DBeaverPreferences.RS_EDIT_NEW_ROWS_AFTER) ||
store.contains(DBeaverPreferences.RS_EDIT_REFRESH_AFTER_UPDATE) ||
......@@ -102,6 +104,9 @@ public class PrefPageResultSetMain extends TargetPrefPage
queryCancelTimeout = UIUtils.createLabelSpinner(queriesGroup, CoreMessages.pref_page_database_general_label_result_set_cancel_timeout, CoreMessages.pref_page_database_general_label_result_set_cancel_timeout_tip, 0, 0, Integer.MAX_VALUE);
queryCancelTimeout.setEnabled(false);
filterForceSubselect = UIUtils.createCheckbox(queriesGroup, CoreMessages.pref_page_database_resultsets_label_filter_force_subselect,
CoreMessages.pref_page_database_resultsets_label_filter_force_subselect_tip, false, 2);
readQueryMetadata.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
......@@ -144,6 +149,7 @@ public class PrefPageResultSetMain extends TargetPrefPage
readQueryMetadata.setSelection(store.getBoolean(DBeaverPreferences.RESULT_SET_READ_METADATA));
readQueryReferences.setSelection(store.getBoolean(DBeaverPreferences.RESULT_SET_READ_REFERENCES));
queryCancelTimeout.setSelection(store.getInt(DBeaverPreferences.RESULT_SET_CANCEL_TIMEOUT));
filterForceSubselect.setSelection(store.getBoolean(ModelPreferences.SQL_FILTER_FORCE_SUBSELECT));
keepStatementOpenCheck.setSelection(store.getBoolean(DBeaverPreferences.KEEP_STATEMENT_OPEN));
alwaysUseAllColumns.setSelection(store.getBoolean(DBeaverPreferences.RS_EDIT_USE_ALL_COLUMNS));
......@@ -169,6 +175,7 @@ public class PrefPageResultSetMain extends TargetPrefPage
store.setValue(DBeaverPreferences.RESULT_SET_READ_METADATA, readQueryMetadata.getSelection());
store.setValue(DBeaverPreferences.RESULT_SET_READ_REFERENCES, readQueryReferences.getSelection());
store.setValue(DBeaverPreferences.RESULT_SET_CANCEL_TIMEOUT, queryCancelTimeout.getSelection());
store.setValue(ModelPreferences.SQL_FILTER_FORCE_SUBSELECT, filterForceSubselect.getSelection());
store.setValue(DBeaverPreferences.KEEP_STATEMENT_OPEN, keepStatementOpenCheck.getSelection());
store.setValue(DBeaverPreferences.RS_EDIT_USE_ALL_COLUMNS, alwaysUseAllColumns.getSelection());
......@@ -192,6 +199,7 @@ public class PrefPageResultSetMain extends TargetPrefPage
store.setToDefault(DBeaverPreferences.RESULT_SET_READ_METADATA);
store.setToDefault(DBeaverPreferences.RESULT_SET_READ_REFERENCES);
store.setToDefault(DBeaverPreferences.RESULT_SET_CANCEL_TIMEOUT);
store.setToDefault(ModelPreferences.SQL_FILTER_FORCE_SUBSELECT);
store.setToDefault(DBeaverPreferences.KEEP_STATEMENT_OPEN);
store.setToDefault(DBeaverPreferences.RS_EDIT_USE_ALL_COLUMNS);
......
......@@ -84,6 +84,7 @@ public final class ModelPreferences
public static final String SQL_NAMED_PARAMETERS_PREFIX = "sql.parameter.prefix"; //$NON-NLS-1$
public static final String SQL_CONTROL_COMMAND_PREFIX = "sql.command.prefix"; //$NON-NLS-1$
public static final String SQL_VARIABLES_ENABLED = "sql.variables.enabled"; //$NON-NLS-1$
public static final String SQL_FILTER_FORCE_SUBSELECT = "sql.query.filter.force.subselect"; //$NON-NLS-1$
public final static String SQL_FORMAT_FORMATTER = "sql.format.formatter";
public final static String SQL_FORMAT_KEYWORD_CASE = "sql.format.keywordCase";
......@@ -168,6 +169,7 @@ public final class ModelPreferences
PrefUtils.setDefaultPreferenceValue(store, SQL_NAMED_PARAMETERS_PREFIX, String.valueOf(SQLConstants.DEFAULT_PARAMETER_PREFIX));
PrefUtils.setDefaultPreferenceValue(store, SQL_CONTROL_COMMAND_PREFIX, String.valueOf(SQLConstants.DEFAULT_CONTROL_COMMAND_PREFIX));
PrefUtils.setDefaultPreferenceValue(store, SQL_VARIABLES_ENABLED, false);
PrefUtils.setDefaultPreferenceValue(store, SQL_FILTER_FORCE_SUBSELECT, false);
PrefUtils.setDefaultPreferenceValue(store, SQL_FORMAT_FORMATTER, SQLFormatterTokenized.FORMATTER_ID);
PrefUtils.setDefaultPreferenceValue(store, SQL_FORMAT_KEYWORD_CASE, "");
......
......@@ -28,6 +28,7 @@ import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.*;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ModelPreferences;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
......@@ -65,20 +66,23 @@ public class SQLSemanticProcessor {
}
}
// FIXME: Applying filters changes query formatting (thus it changes column names in expressions)
// FIXME: Solution - always wrap query in subselect + add patched WHERE and ORDER
// Applying filters changes query formatting (thus it changes column names in expressions)
// Solution - always wrap query in subselect + add patched WHERE and ORDER
// It is configurable
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);
if (statement instanceof Select && ((Select) statement).getSelectBody() instanceof PlainSelect) {
PlainSelect select = (PlainSelect) ((Select) statement).getSelectBody();
if (patchSelectQuery(dataSource, select, dataFilter)) {
return statement.toString();
if (!dataSource.getContainer().getPreferenceStore().getBoolean(ModelPreferences.SQL_FILTER_FORCE_SUBSELECT)) {
try {
Statement statement = CCJSqlParserUtil.parse(sqlQuery);
if (statement instanceof Select && ((Select) statement).getSelectBody() instanceof PlainSelect) {
PlainSelect select = (PlainSelect) ((Select) statement).getSelectBody();
if (patchSelectQuery(dataSource, select, dataFilter)) {
return statement.toString();
}
}
} catch (Throwable e) {
log.debug("SQL parse error", e);
}
} catch (Throwable e) {
log.debug("SQL parse error", e);
}
return wrapQuery(dataSource, sqlQuery, dataFilter);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册