提交 e99b1029 编写于 作者: J jurgen

Custom statement delimiters

Former-commit-id: 612dafaa
上级 2f0f52c1
...@@ -237,20 +237,21 @@ public final class SQLUtils { ...@@ -237,20 +237,21 @@ public final class SQLUtils {
public static String trimQueryStatement(SQLSyntaxManager syntaxManager, String sql) public static String trimQueryStatement(SQLSyntaxManager syntaxManager, String sql)
{ {
sql = sql.trim(); sql = sql.trim();
String statementDelimiter = syntaxManager.getStatementDelimiter(); for (String statementDelimiter : syntaxManager.getStatementDelimiters()) {
if (sql.endsWith(statementDelimiter) && sql.length() > statementDelimiter.length()) { if (sql.endsWith(statementDelimiter) && sql.length() > statementDelimiter.length()) {
if (Character.isAlphabetic(statementDelimiter.charAt(0))) { if (Character.isAlphabetic(statementDelimiter.charAt(0))) {
// Delimiter is alphabetic (e.g. "GO") so it must be prefixed with whitespace // Delimiter is alphabetic (e.g. "GO") so it must be prefixed with whitespace
char lastChar = sql.charAt(sql.length() - statementDelimiter.length() - 1); char lastChar = sql.charAt(sql.length() - statementDelimiter.length() - 1);
if (Character.isUnicodeIdentifierPart(lastChar)) { if (Character.isUnicodeIdentifierPart(lastChar)) {
return sql; return sql;
}
}
// Remove trailing delimiter only if it is not block end
String trimmed = sql.substring(0, sql.length() - statementDelimiter.length());
String test = trimmed.toUpperCase().trim();
if (!test.endsWith(SQLConstants.BLOCK_END)) {
sql = trimmed;
} }
}
// Remove trailing delimiter only if it is not block end
String trimmed = sql.substring(0, sql.length() - statementDelimiter.length());
String test = trimmed.toUpperCase().trim();
if (!test.endsWith(SQLConstants.BLOCK_END)) {
sql = trimmed;
} }
} }
return sql; return sql;
......
...@@ -29,6 +29,8 @@ import org.eclipse.jface.action.IMenuListener; ...@@ -29,6 +29,8 @@ import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.text.*; import org.eclipse.jface.text.*;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
...@@ -97,8 +99,7 @@ import java.util.concurrent.atomic.AtomicInteger; ...@@ -97,8 +99,7 @@ import java.util.concurrent.atomic.AtomicInteger;
* SQL Executor * SQL Executor
*/ */
public class SQLEditor extends SQLEditorBase public class SQLEditor extends SQLEditorBase
implements IDataSourceContainerProviderEx, DBPEventListener, ISaveablePart2, IResultSetContainer, DBPDataSourceUser, DBPDataSourceHandler implements IDataSourceContainerProviderEx, DBPEventListener, ISaveablePart2, IResultSetContainer, DBPDataSourceUser, DBPDataSourceHandler, IPropertyChangeListener {
{
private static final long SCRIPT_UI_UPDATE_PERIOD = 100; private static final long SCRIPT_UI_UPDATE_PERIOD = 100;
private static Image IMG_DATA_GRID = DBeaverActivator.getImageDescriptor("/icons/sql/page_data_grid.png").createImage(); //$NON-NLS-1$ private static Image IMG_DATA_GRID = DBeaverActivator.getImageDescriptor("/icons/sql/page_data_grid.png").createImage(); //$NON-NLS-1$
...@@ -189,6 +190,7 @@ public class SQLEditor extends SQLEditorBase ...@@ -189,6 +190,7 @@ public class SQLEditor extends SQLEditorBase
} }
// Acquire ds container // Acquire ds container
if (dataSourceContainer != null) { if (dataSourceContainer != null) {
dataSourceContainer.getPreferenceStore().removePropertyChangeListener(this);
dataSourceContainer.release(this); dataSourceContainer.release(this);
dataSourceContainer = null; dataSourceContainer = null;
} }
...@@ -196,6 +198,9 @@ public class SQLEditor extends SQLEditorBase ...@@ -196,6 +198,9 @@ public class SQLEditor extends SQLEditorBase
closeAllJobs(); closeAllJobs();
dataSourceContainer = container; dataSourceContainer = container;
if (dataSourceContainer != null) {
dataSourceContainer.getPreferenceStore().addPropertyChangeListener(this);
}
IPathEditorInput input = getEditorInput(); IPathEditorInput input = getEditorInput();
if (input == null) { if (input == null) {
return false; return false;
...@@ -691,10 +696,7 @@ public class SQLEditor extends SQLEditorBase ...@@ -691,10 +696,7 @@ public class SQLEditor extends SQLEditorBase
public void dispose() public void dispose()
{ {
// Acquire ds container // Acquire ds container
final DBSDataSourceContainer dsContainer = getDataSourceContainer(); setDataSourceContainer(null);
if (dsContainer != null) {
dsContainer.release(this);
}
closeAllJobs(); closeAllJobs();
...@@ -871,6 +873,13 @@ public class SQLEditor extends SQLEditorBase ...@@ -871,6 +873,13 @@ public class SQLEditor extends SQLEditorBase
return queryProcessor; return queryProcessor;
} }
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(DBeaverPreferences.SCRIPT_STATEMENT_DELIMITER)) {
reloadSyntaxRules();
}
}
public class QueryProcessor implements SQLResultsConsumer { public class QueryProcessor implements SQLResultsConsumer {
private SQLQueryJob curJob; private SQLQueryJob curJob;
......
...@@ -70,6 +70,8 @@ import org.jkiss.dbeaver.ui.editors.sql.util.SQLSymbolInserter; ...@@ -70,6 +70,8 @@ import org.jkiss.dbeaver.ui.editors.sql.util.SQLSymbolInserter;
import org.jkiss.dbeaver.ui.editors.text.BaseTextEditor; import org.jkiss.dbeaver.ui.editors.text.BaseTextEditor;
import org.jkiss.utils.CommonUtils; import org.jkiss.utils.CommonUtils;
import java.util.Collection;
import java.util.Collections;
import java.util.ResourceBundle; import java.util.ResourceBundle;
/** /**
...@@ -577,15 +579,17 @@ public abstract class SQLEditorBase extends BaseTextEditor { ...@@ -577,15 +579,17 @@ public abstract class SQLEditorBase extends BaseTextEditor {
String queryText = document.get(statementStart, tokenOffset - statementStart); String queryText = document.get(statementStart, tokenOffset - statementStart);
queryText = queryText.trim(); queryText = queryText.trim();
String delimiterText; Collection<String> delimiterTexts;
if (isDelimiter) { if (isDelimiter) {
delimiterText = document.get(tokenOffset, tokenLength); delimiterTexts = Collections.singleton(document.get(tokenOffset, tokenLength));
} else { } else {
delimiterText = syntaxManager.getStatementDelimiter(); delimiterTexts = syntaxManager.getStatementDelimiters();
} }
if (queryText.endsWith(delimiterText)) { for (String delim : delimiterTexts) {
queryText = queryText.substring(0, queryText.length() - delimiterText.length()); if (queryText.endsWith(delim)) {
queryText = queryText.substring(0, queryText.length() - delim.length());
}
} }
// make script line // make script line
return new SQLQuery( return new SQLQuery(
......
...@@ -19,13 +19,13 @@ ...@@ -19,13 +19,13 @@
package org.jkiss.dbeaver.ui.editors.sql.format.tokenized; package org.jkiss.dbeaver.ui.editors.sql.format.tokenized;
import org.jkiss.dbeaver.ui.editors.sql.SQLConstants;
import org.jkiss.dbeaver.ui.editors.sql.format.SQLFormatter; import org.jkiss.dbeaver.ui.editors.sql.format.SQLFormatter;
import org.jkiss.dbeaver.ui.editors.sql.format.SQLFormatterConfiguration; import org.jkiss.dbeaver.ui.editors.sql.format.SQLFormatterConfiguration;
import org.jkiss.dbeaver.utils.ContentUtils; import org.jkiss.dbeaver.utils.ContentUtils;
import org.jkiss.utils.Pair; import org.jkiss.utils.Pair;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
...@@ -34,14 +34,13 @@ import java.util.List; ...@@ -34,14 +34,13 @@ import java.util.List;
public class SQLTokenizedFormatter implements SQLFormatter { public class SQLTokenizedFormatter implements SQLFormatter {
private SQLFormatterConfiguration formatterCfg; private SQLFormatterConfiguration formatterCfg;
private List<Boolean> functionBracket = new ArrayList<Boolean>(); private List<Boolean> functionBracket = new ArrayList<Boolean>();
private List<String> statementDelimiters = new ArrayList<String>(2); private Collection<String> statementDelimiters = new ArrayList<String>(2);
@Override @Override
public String format(final String argSql, SQLFormatterConfiguration configuration) public String format(final String argSql, SQLFormatterConfiguration configuration)
{ {
formatterCfg = configuration; formatterCfg = configuration;
statementDelimiters.add(SQLConstants.DEFAULT_STATEMENT_DELIMITER); statementDelimiters = formatterCfg.getSyntaxManager().getStatementDelimiters();
statementDelimiters.add(formatterCfg.getSyntaxManager().getStatementDelimiter().toUpperCase());
SQLTokensParser fParser = new SQLTokensParser(formatterCfg); SQLTokensParser fParser = new SQLTokensParser(formatterCfg);
functionBracket.clear(); functionBracket.clear();
......
...@@ -29,6 +29,7 @@ import org.eclipse.ui.themes.ITheme; ...@@ -29,6 +29,7 @@ import org.eclipse.ui.themes.ITheme;
import org.eclipse.ui.themes.IThemeManager; import org.eclipse.ui.themes.IThemeManager;
import org.jkiss.code.NotNull; import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable; import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBeaverPreferences;
import org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect; import org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect;
import org.jkiss.dbeaver.model.sql.SQLDataSource; import org.jkiss.dbeaver.model.sql.SQLDataSource;
import org.jkiss.dbeaver.model.sql.SQLDialect; import org.jkiss.dbeaver.model.sql.SQLDialect;
...@@ -59,7 +60,7 @@ public class SQLSyntaxManager extends RuleBasedScanner { ...@@ -59,7 +60,7 @@ public class SQLSyntaxManager extends RuleBasedScanner {
@NotNull @NotNull
private String catalogSeparator; private String catalogSeparator;
@NotNull @NotNull
private String statementDelimiter = SQLConstants.DEFAULT_STATEMENT_DELIMITER; private Set<String> statementDelimiters = new LinkedHashSet<String>();//SQLConstants.DEFAULT_STATEMENT_DELIMITER;
@NotNull @NotNull
private TreeMap<Integer, SQLScriptPosition> positions = new TreeMap<Integer, SQLScriptPosition>(); private TreeMap<Integer, SQLScriptPosition> positions = new TreeMap<Integer, SQLScriptPosition>();
...@@ -101,9 +102,9 @@ public class SQLSyntaxManager extends RuleBasedScanner { ...@@ -101,9 +102,9 @@ public class SQLSyntaxManager extends RuleBasedScanner {
} }
@NotNull @NotNull
public String getStatementDelimiter() public Set<String> getStatementDelimiters()
{ {
return statementDelimiter; return statementDelimiters;
} }
@Nullable @Nullable
...@@ -142,13 +143,14 @@ public class SQLSyntaxManager extends RuleBasedScanner { ...@@ -142,13 +143,14 @@ public class SQLSyntaxManager extends RuleBasedScanner {
{ {
this.unassigned = dataSource == null; this.unassigned = dataSource == null;
this.dataSource = dataSource; this.dataSource = dataSource;
this.statementDelimiters.clear();
if (this.dataSource == null) { if (this.dataSource == null) {
sqlDialect = new BasicSQLDialect(); sqlDialect = new BasicSQLDialect();
quoteSymbol = null; quoteSymbol = null;
structSeparator = SQLConstants.STRUCT_SEPARATOR; structSeparator = SQLConstants.STRUCT_SEPARATOR;
catalogSeparator = String.valueOf(SQLConstants.STRUCT_SEPARATOR); catalogSeparator = String.valueOf(SQLConstants.STRUCT_SEPARATOR);
escapeChar = '\\'; escapeChar = '\\';
statementDelimiter = SQLConstants.DEFAULT_STATEMENT_DELIMITER; statementDelimiters.add(SQLConstants.DEFAULT_STATEMENT_DELIMITER);
} else { } else {
sqlDialect = this.dataSource.getSQLDialect(); sqlDialect = this.dataSource.getSQLDialect();
quoteSymbol = sqlDialect.getIdentifierQuoteString(); quoteSymbol = sqlDialect.getIdentifierQuoteString();
...@@ -156,7 +158,13 @@ public class SQLSyntaxManager extends RuleBasedScanner { ...@@ -156,7 +158,13 @@ public class SQLSyntaxManager extends RuleBasedScanner {
catalogSeparator = sqlDialect.getCatalogSeparator(); catalogSeparator = sqlDialect.getCatalogSeparator();
sqlDialect.getSearchStringEscape(); sqlDialect.getSearchStringEscape();
escapeChar = '\\'; escapeChar = '\\';
statementDelimiter = sqlDialect.getScriptDelimiter().toLowerCase(); statementDelimiters.add(sqlDialect.getScriptDelimiter().toLowerCase());
String extraDelimiters = this.dataSource.getContainer().getPreferenceStore().getString(DBeaverPreferences.SCRIPT_STATEMENT_DELIMITER);
StringTokenizer st = new StringTokenizer(extraDelimiters, " \t,");
while (st.hasMoreTokens()) {
statementDelimiters.add(st.nextToken());
}
} }
} }
...@@ -223,27 +231,26 @@ public class SQLSyntaxManager extends RuleBasedScanner { ...@@ -223,27 +231,26 @@ public class SQLSyntaxManager extends RuleBasedScanner {
// Add numeric rule // Add numeric rule
rules.add(new NumberRule(numberToken)); rules.add(new NumberRule(numberToken));
{ for (final String delimiter : statementDelimiters) {
// Default delim rule WordRule delimRule;
WordRule delimRule = new WordRule(new IWordDetector() { if (Character.isLetterOrDigit(delimiter.charAt(0))) {
@Override delimRule = new WordRule(new SQLWordDetector(), Token.UNDEFINED, true);
public boolean isWordStart(char c) delimRule.addWord(delimiter, delimiterToken);
{ } else {
return SQLConstants.DEFAULT_STATEMENT_DELIMITER.charAt(0) == c; // Default delim rule
} delimRule = new WordRule(new IWordDetector() {
@Override
public boolean isWordStart(char c) {
return delimiter.charAt(0) == c;
}
@Override @Override
public boolean isWordPart(char c) public boolean isWordPart(char c) {
{ return delimiter.indexOf(c) != -1;
return SQLConstants.DEFAULT_STATEMENT_DELIMITER.indexOf(c) != -1; }
} }, Token.UNDEFINED, false);
}, Token.UNDEFINED, false); delimRule.addWord(delimiter, delimiterToken);
delimRule.addWord(SQLConstants.DEFAULT_STATEMENT_DELIMITER, delimiterToken); }
rules.add(delimRule);
}
if (!statementDelimiter.equals(SQLConstants.DEFAULT_STATEMENT_DELIMITER)) {
WordRule delimRule = new WordRule(new SQLWordDetector(), Token.UNDEFINED, true);
delimRule.addWord(statementDelimiter, delimiterToken);
rules.add(delimRule); rules.add(delimRule);
} }
......
...@@ -21,7 +21,6 @@ package org.jkiss.dbeaver.ui.editors.sql.syntax; ...@@ -21,7 +21,6 @@ package org.jkiss.dbeaver.ui.editors.sql.syntax;
import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocument;
import org.jkiss.dbeaver.model.DBPKeywordType;
import org.jkiss.dbeaver.model.sql.SQLDialect; import org.jkiss.dbeaver.model.sql.SQLDialect;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -83,9 +82,11 @@ public class SQLWordPartDetector extends SQLIdentifierDetector ...@@ -83,9 +82,11 @@ public class SQLWordPartDetector extends SQLIdentifierDetector
if (prevDelimiter == null) { if (prevDelimiter == null) {
prevDelimiter = prevPiece.toString(); prevDelimiter = prevPiece.toString();
} }
if (prevPiece.indexOf(syntaxManager.getStatementDelimiter()) != -1) { for (String delim : syntaxManager.getStatementDelimiters()) {
// Statement delimiter found - do not process to previous keyword if (prevPiece.indexOf(delim) != -1) {
return; // Statement delimiter found - do not process to previous keyword
return;
}
} }
int prevStartOffset = prevOffset + 1; int prevStartOffset = prevOffset + 1;
while (prevOffset >= topIndex) { while (prevOffset >= topIndex) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册