Skip to content

Commit 608b12b

Browse files
authored
Refactor sql parser (#6606)
* feat: add openspec for druid * feat: add openspec for druid * feat: Introducing a dialect registration mechanism * feat: Splitting the giant SQLStatementParser method * feat: Eliminate direct dependency of base class on dialect type * feat: refactor sql parser.
1 parent a678224 commit 608b12b

112 files changed

Lines changed: 5115 additions & 1333 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

core/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class MySqlLexer extends Lexer {
3434
public static DialectFeature MYSQL_FEATURE = new DialectFeature(
3535
Arrays.asList(
3636
NextTokenPrefixN,
37-
ScanString2PutDoubleBackslash,
37+
ScanStringDoubleBackslash,
3838
JoinRightTableWith,
3939
PostNaturalJoin,
4040
MultipleJoinOn,

core/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public class OdpsLexer extends HiveLexer {
4444
ScanHiveCommentDoubleSpace,
4545
QueryRestSemi,
4646
JoinAt,
47-
UDJ,
47+
UserDefinedJoin,
4848
TwoConsecutiveUnion,
4949
RewriteGroupByCubeRollupToFunction,
5050
PrimaryTwoConsecutiveSet,

core/src/main/java/com/alibaba/druid/sql/parser/DialectFeature.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ public enum LexerFeature implements Feature {
101101
ScanSQLTypeWithAt(1L << 5),
102102
NextTokenColon(1L << 6),
103103
NextTokenPrefixN(1L << 7),
104+
// Deprecated alias kept for compatibility. Use ScanStringDoubleBackslash.
105+
@Deprecated
104106
ScanString2PutDoubleBackslash(1L << 8),
107+
ScanStringDoubleBackslash(1L << 8),
105108
ScanAliasU(1L << 9),
106109
ScanNumberPrefixB(1L << 10),
107110
ScanNumberCommonProcess(1L << 11),
@@ -151,7 +154,10 @@ public enum ParserFeature implements Feature {
151154
JoinRightTableAlias(1L << 7),
152155
PostNaturalJoin(1L << 8),
153156
MultipleJoinOn(1L << 9),
157+
// Deprecated alias kept for compatibility. Use UserDefinedJoin.
158+
@Deprecated
154159
UDJ(1L << 10),
160+
UserDefinedJoin(1L << 10),
155161
TwoConsecutiveUnion(1L << 11),
156162
QueryTable(1L << 12),
157163
GroupByAll(1L << 13),

core/src/main/java/com/alibaba/druid/sql/parser/Lexer.java

Lines changed: 61 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1861,64 +1861,7 @@ protected final void scanString2() {
18611861
hasSpecial = true;
18621862
}
18631863

1864-
switch (ch) {
1865-
case '0':
1866-
putChar('\0');
1867-
break;
1868-
case '\'':
1869-
putChar('\'');
1870-
break;
1871-
case '"':
1872-
putChar('"');
1873-
break;
1874-
case 'b':
1875-
putChar('\b');
1876-
break;
1877-
case 'n':
1878-
putChar('\n');
1879-
break;
1880-
case 'r':
1881-
putChar('\r');
1882-
break;
1883-
case 't':
1884-
putChar('\t');
1885-
break;
1886-
case '\\':
1887-
putChar('\\');
1888-
break;
1889-
case 'Z':
1890-
putChar((char) 0x1A); // ctrl + Z
1891-
break;
1892-
case '%':
1893-
if (dialectFeatureEnabled(ScanString2PutDoubleBackslash)) {
1894-
putChar('\\');
1895-
}
1896-
putChar('%');
1897-
break;
1898-
case '_':
1899-
if (dialectFeatureEnabled(ScanString2PutDoubleBackslash)) {
1900-
putChar('\\');
1901-
}
1902-
putChar('_');
1903-
break;
1904-
case 'u':
1905-
if ((features & SQLParserFeature.SupportUnicodeCodePoint.mask) != 0) {
1906-
char c1 = charAt(++pos);
1907-
char c2 = charAt(++pos);
1908-
char c3 = charAt(++pos);
1909-
char c4 = charAt(++pos);
1910-
1911-
int intVal = Integer.parseInt(new String(new char[]{c1, c2, c3, c4}), 16);
1912-
1913-
putChar((char) intVal);
1914-
} else {
1915-
putChar(ch);
1916-
}
1917-
break;
1918-
default:
1919-
putChar(ch);
1920-
break;
1921-
}
1864+
scanString2PutEscapedChar(ch, true);
19221865

19231866
continue;
19241867
}
@@ -2039,50 +1982,7 @@ protected final void scanString2_d() {
20391982
hasSpecial = true;
20401983
}
20411984

2042-
switch (ch) {
2043-
case '0':
2044-
putChar('\0');
2045-
break;
2046-
case '\'':
2047-
putChar('\'');
2048-
break;
2049-
case '"':
2050-
putChar('"');
2051-
break;
2052-
case 'b':
2053-
putChar('\b');
2054-
break;
2055-
case 'n':
2056-
putChar('\n');
2057-
break;
2058-
case 'r':
2059-
putChar('\r');
2060-
break;
2061-
case 't':
2062-
putChar('\t');
2063-
break;
2064-
case '\\':
2065-
putChar('\\');
2066-
break;
2067-
case 'Z':
2068-
putChar((char) 0x1A); // ctrl + Z
2069-
break;
2070-
case '%':
2071-
if (dialectFeatureEnabled(ScanString2PutDoubleBackslash)) {
2072-
putChar('\\');
2073-
}
2074-
putChar('%');
2075-
break;
2076-
case '_':
2077-
if (dialectFeatureEnabled(ScanString2PutDoubleBackslash)) {
2078-
putChar('\\');
2079-
}
2080-
putChar('_');
2081-
break;
2082-
default:
2083-
putChar(ch);
2084-
break;
2085-
}
1985+
scanString2PutEscapedChar(ch, false);
20861986

20871987
continue;
20881988
}
@@ -2124,6 +2024,65 @@ protected final void scanString2_d() {
21242024
}
21252025
}
21262026

2027+
private void scanString2PutEscapedChar(char escaped, boolean supportUnicodeCodePoint) {
2028+
switch (escaped) {
2029+
case '0':
2030+
putChar('\0');
2031+
return;
2032+
case '\'':
2033+
putChar('\'');
2034+
return;
2035+
case '"':
2036+
putChar('"');
2037+
return;
2038+
case 'b':
2039+
putChar('\b');
2040+
return;
2041+
case 'n':
2042+
putChar('\n');
2043+
return;
2044+
case 'r':
2045+
putChar('\r');
2046+
return;
2047+
case 't':
2048+
putChar('\t');
2049+
return;
2050+
case '\\':
2051+
putChar('\\');
2052+
return;
2053+
case 'Z':
2054+
putChar((char) 0x1A); // ctrl + Z
2055+
return;
2056+
case '%':
2057+
if (dialectFeatureEnabled(ScanStringDoubleBackslash)) {
2058+
putChar('\\');
2059+
}
2060+
putChar('%');
2061+
return;
2062+
case '_':
2063+
if (dialectFeatureEnabled(ScanStringDoubleBackslash)) {
2064+
putChar('\\');
2065+
}
2066+
putChar('_');
2067+
return;
2068+
case 'u':
2069+
if (supportUnicodeCodePoint
2070+
&& (features & SQLParserFeature.SupportUnicodeCodePoint.mask) != 0) {
2071+
char c1 = charAt(++pos);
2072+
char c2 = charAt(++pos);
2073+
char c3 = charAt(++pos);
2074+
char c4 = charAt(++pos);
2075+
int intVal = Integer.parseInt(new String(new char[]{c1, c2, c3, c4}), 16);
2076+
putChar((char) intVal);
2077+
return;
2078+
}
2079+
putChar(escaped);
2080+
return;
2081+
default:
2082+
putChar(escaped);
2083+
}
2084+
}
2085+
21272086
protected void scanAlias() {
21282087
final char quote = ch;
21292088
{

0 commit comments

Comments
 (0)