#12182 Move word start/part checks to dialect; proposals fix

上级 3a19d45d
......@@ -293,6 +293,16 @@ public class SQLServerDialect extends JDBCSQLDialect implements TPRuleProvider {
return super.getUnquotedString(string);
}
@Override
public boolean isWordStart(int ch) {
return super.isWordStart(ch) || ch == '#';
}
@Override
public boolean isWordPart(int ch) {
return super.isWordPart(ch) || ch == '#';
}
@Override
public String[] getSingleLineComments() {
if (!isSqlServer) {
......
......@@ -202,7 +202,7 @@ public class SQLRuleManager {
if (!minimalRules) {
// Add word rule for keywords, functions, types, and constants.
SQLWordRule wordRule = new SQLWordRule(delimRule, typeToken, otherToken);
SQLWordRule wordRule = new SQLWordRule(delimRule, typeToken, otherToken, dialect);
for (String reservedWord : dialect.getReservedWords()) {
DBPKeywordType keywordType = dialect.getKeywordType(reservedWord);
// Functions without parentheses has type 'DBPKeywordType.OTHER' (#8710)
......
......@@ -16,6 +16,8 @@
*/
package org.jkiss.dbeaver.model.sql.parser.rules;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.model.sql.SQLDialect;
import org.jkiss.dbeaver.model.text.parser.TPCharacterScanner;
import org.jkiss.dbeaver.model.text.parser.TPRule;
import org.jkiss.dbeaver.model.text.parser.TPToken;
......@@ -32,18 +34,20 @@ import java.util.Set;
*/
public class SQLWordRule implements TPRule {
private SQLDelimiterRule delimRule;
private TPToken functionToken;
private TPToken defaultToken;
private Map<String, TPToken> words = new HashMap<>();
private Set<String> functions = new HashSet<>();
private StringBuilder buffer = new StringBuilder();
private final SQLDelimiterRule delimRule;
private final TPToken functionToken;
private final TPToken defaultToken;
private final Map<String, TPToken> words = new HashMap<>();
private final Set<String> functions = new HashSet<>();
private final StringBuilder buffer = new StringBuilder();
private final SQLDialect dialect;
private char[][] delimiters;
public SQLWordRule(SQLDelimiterRule delimRule, TPToken functionToken, TPToken defaultToken) {
public SQLWordRule(SQLDelimiterRule delimRule, TPToken functionToken, TPToken defaultToken, @NotNull SQLDialect dialect) {
this.delimRule = delimRule;
this.functionToken = functionToken;
this.defaultToken = defaultToken;
this.dialect = dialect;
}
public boolean hasWord(String word) {
......@@ -65,7 +69,7 @@ public class SQLWordRule implements TPRule {
@Override
public TPToken evaluate(TPCharacterScanner scanner) {
int c = scanner.read();
if (c != TPCharacterScanner.EOF && Character.isUnicodeIdentifierStart(c)) {
if (c != TPCharacterScanner.EOF && dialect.isWordStart(c)) {
buffer.setLength(0);
delimiters = delimRule.getDelimiters();
char prevC;
......@@ -108,7 +112,7 @@ public class SQLWordRule implements TPRule {
}
private boolean isWordPart(char c, char prevC, TPCharacterScanner scanner) {
if (!Character.isUnicodeIdentifierPart(c) && c != '$') {
if (!dialect.isWordPart(c) && c != '$') {
return false;
}
if (c == '$' && prevC == '$') {
......
......@@ -298,6 +298,16 @@ public abstract class AbstractSQLDialect implements SQLDialect {
return null;
}
@Override
public boolean isWordStart(int ch) {
return Character.isUnicodeIdentifierStart(ch);
}
@Override
public boolean isWordPart(int ch) {
return Character.isUnicodeIdentifierPart(ch);
}
@Override
public boolean validIdentifierStart(char c) {
return Character.isLetter(c);
......
......@@ -233,6 +233,10 @@ public interface SQLDialect {
@NotNull
SQLStateType getSQLStateType();
boolean isWordStart(int ch);
boolean isWordPart(int ch);
boolean validIdentifierStart(char c);
/**
* Checks that specified character is a valid identifier part. Non-valid characters should be quoted in queries.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册