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

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