Skip to content

Commit 5e7be77

Browse files
lingo-xpwenshao
authored andcommitted
Implement doris select and create parser.
1 parent 4b77b8d commit 5e7be77

25 files changed

+784
-37
lines changed

core/src/main/java/com/alibaba/druid/DbType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ public enum DbType {
8181
bigquery(1L << 48),
8282

8383
impala(1L << 49),
84+
doris(1L << 50),
8485

8586
ingres(0),
8687
cloudscape(0),

core/src/main/java/com/alibaba/druid/sql/SQLUtils.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.alibaba.druid.sql.dialect.clickhouse.visitor.CKStatVisitor;
2626
import com.alibaba.druid.sql.dialect.db2.visitor.DB2OutputVisitor;
2727
import com.alibaba.druid.sql.dialect.db2.visitor.DB2SchemaStatVisitor;
28+
import com.alibaba.druid.sql.dialect.doris.visitor.DorisOutputVisitor;
2829
import com.alibaba.druid.sql.dialect.h2.visitor.H2OutputVisitor;
2930
import com.alibaba.druid.sql.dialect.h2.visitor.H2SchemaStatVisitor;
3031
import com.alibaba.druid.sql.dialect.hive.ast.HiveInsert;
@@ -560,6 +561,8 @@ public static SQLASTOutputVisitor createFormatOutputVisitor(
560561
return new BigQueryOutputVisitor(out);
561562
case impala:
562563
return new ImpalaOutputVisitor(out);
564+
case doris:
565+
return new DorisOutputVisitor(out);
563566
default:
564567
return new SQLASTOutputVisitor(out, dbType);
565568
}

core/src/main/java/com/alibaba/druid/sql/ast/SQLSetQuantifier.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public interface SQLSetQuantifier {
2222

2323
public static final int UNIQUE = 3;
2424
public static final int DISTINCTROW = 4;
25+
public static final int ALL_EXCEPT = 5;
2526

2627
// <SetQuantifier>
2728
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.alibaba.druid.sql.dialect.doris.ast;
2+
3+
import com.alibaba.druid.sql.ast.SQLExpr;
4+
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
5+
import com.alibaba.druid.sql.dialect.doris.visitor.DorisASTVisitor;
6+
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
public class DorisExprTableSource extends SQLExprTableSource implements DorisObject {
12+
protected List<SQLExpr> tablets;
13+
protected SQLExpr repeatable;
14+
15+
public void addTablet(SQLExpr tablet) {
16+
if (tablets == null) {
17+
tablets = new ArrayList<>(2);
18+
}
19+
20+
if (tablet != null) {
21+
tablet.setParent(this);
22+
tablets.add(tablet);
23+
}
24+
}
25+
26+
public List<SQLExpr> getTablets() {
27+
if (tablets == null) {
28+
tablets = new ArrayList<>(2);
29+
}
30+
return tablets;
31+
}
32+
33+
public SQLExpr getRepeatable() {
34+
return repeatable;
35+
}
36+
37+
public void setRepeatable(SQLExpr repeatable) {
38+
if (repeatable != null) {
39+
repeatable.setParent(this);
40+
}
41+
this.repeatable = repeatable;
42+
}
43+
44+
@Override
45+
public void accept0(SQLASTVisitor v) {
46+
if (v instanceof DorisASTVisitor) {
47+
accept0((DorisASTVisitor) v);
48+
} else {
49+
super.accept0(v);
50+
}
51+
}
52+
53+
@Override
54+
public void accept0(DorisASTVisitor visitor) {
55+
if (visitor.visit(this)) {
56+
acceptChild(visitor, this.tablets);
57+
acceptChild(visitor, this.repeatable);
58+
}
59+
}
60+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.alibaba.druid.sql.dialect.doris.ast;
2+
3+
import com.alibaba.druid.sql.ast.SQLObject;
4+
import com.alibaba.druid.sql.dialect.doris.visitor.DorisASTVisitor;
5+
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
6+
7+
public interface DorisObject extends SQLObject {
8+
default void accept0(SQLASTVisitor v) {
9+
if (v instanceof DorisASTVisitor) {
10+
accept0((DorisASTVisitor) v);
11+
}
12+
}
13+
void accept0(DorisASTVisitor visitor);
14+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.alibaba.druid.sql.dialect.doris.ast;
2+
3+
import com.alibaba.druid.sql.ast.SQLObjectImpl;
4+
import com.alibaba.druid.sql.dialect.doris.visitor.DorisASTVisitor;
5+
6+
public abstract class DorisObjectImpl extends SQLObjectImpl implements DorisObject {
7+
public abstract void accept0(DorisASTVisitor visitor);
8+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.alibaba.druid.sql.dialect.doris.parser;
2+
3+
import com.alibaba.druid.DbType;
4+
import com.alibaba.druid.sql.dialect.starrocks.parser.StarRocksCreateTableParser;
5+
import com.alibaba.druid.sql.parser.SQLExprParser;
6+
7+
public class DorisCreateTableParser
8+
extends StarRocksCreateTableParser {
9+
public DorisCreateTableParser(SQLExprParser exprParser) {
10+
super(exprParser);
11+
dbType = DbType.doris;
12+
}
13+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.alibaba.druid.sql.dialect.doris.parser;
2+
3+
import com.alibaba.druid.DbType;
4+
import com.alibaba.druid.sql.dialect.starrocks.parser.StarRocksExprParser;
5+
import com.alibaba.druid.sql.parser.Lexer;
6+
import com.alibaba.druid.sql.parser.SQLParserFeature;
7+
8+
public class DorisExprParser
9+
extends StarRocksExprParser {
10+
public DorisExprParser(String sql, SQLParserFeature... features) {
11+
super(new DorisLexer(sql, features));
12+
lexer.nextToken();
13+
dbType = DbType.doris;
14+
}
15+
16+
public DorisExprParser(Lexer lexer) {
17+
super(lexer);
18+
dbType = DbType.doris;
19+
}
20+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.alibaba.druid.sql.dialect.doris.parser;
2+
3+
import com.alibaba.druid.DbType;
4+
import com.alibaba.druid.sql.dialect.starrocks.parser.StarRocksLexer;
5+
import com.alibaba.druid.sql.parser.Keywords;
6+
import com.alibaba.druid.sql.parser.SQLParserFeature;
7+
import com.alibaba.druid.sql.parser.Token;
8+
9+
import java.util.HashMap;
10+
import java.util.Map;
11+
12+
public class DorisLexer
13+
extends StarRocksLexer {
14+
@Override
15+
protected Keywords loadKeywords() {
16+
Map<String, Token> map = new HashMap<String, Token>();
17+
18+
map.putAll(Keywords.DEFAULT_KEYWORDS.getKeywords());
19+
20+
map.put("DISTINCTROW", Token.DISTINCTROW);
21+
map.put("EXCEPT", Token.EXCEPT);
22+
map.put("TABLET", Token.TABLET);
23+
map.put("PARTITION", Token.PARTITION);
24+
map.put("ROWS", Token.ROWS);
25+
map.put("PERCENT", Token.PERCENT);
26+
map.put("REPEATABLE", Token.REPEATABLE);
27+
map.put("TABLESAMPLE", Token.TABLESAMPLE);
28+
// map.put("DISTRIBUTED", Token.DISTRIBUTE);
29+
30+
return new Keywords(map);
31+
}
32+
33+
public DorisLexer(String input, SQLParserFeature... features) {
34+
super(input);
35+
this.keepComments = true;
36+
dbType = DbType.doris;
37+
for (SQLParserFeature feature : features) {
38+
config(feature, true);
39+
}
40+
}
41+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.alibaba.druid.sql.dialect.doris.parser;
2+
3+
import com.alibaba.druid.DbType;
4+
import com.alibaba.druid.sql.ast.SQLExpr;
5+
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
6+
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
7+
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
8+
import com.alibaba.druid.sql.ast.statement.SQLTableSampling;
9+
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
10+
import com.alibaba.druid.sql.dialect.doris.ast.DorisExprTableSource;
11+
import com.alibaba.druid.sql.dialect.starrocks.parser.StarRocksSelectParser;
12+
import com.alibaba.druid.sql.parser.SQLExprParser;
13+
import com.alibaba.druid.sql.parser.SQLSelectListCache;
14+
import com.alibaba.druid.sql.parser.Token;
15+
16+
public class DorisSelectParser
17+
extends StarRocksSelectParser {
18+
public DorisSelectParser(SQLExprParser exprParser, SQLSelectListCache selectListCache) {
19+
super(exprParser, selectListCache);
20+
dbType = DbType.doris;
21+
}
22+
23+
protected DorisExprParser createExprParser() {
24+
return new DorisExprParser(lexer);
25+
}
26+
27+
@Override
28+
protected void parseBeforeSelectList(SQLSelectQueryBlock queryBlock) {
29+
if (lexer.token() == Token.DISTINCT) {
30+
queryBlock.setDistionOption(SQLSetQuantifier.DISTINCT);
31+
lexer.nextToken();
32+
} else if (lexer.token() == Token.DISTINCTROW) {
33+
queryBlock.setDistionOption(SQLSetQuantifier.DISTINCTROW);
34+
lexer.nextToken();
35+
} else if (lexer.token() == Token.ALL) {
36+
lexer.nextToken();
37+
if (lexer.nextIf(Token.EXCEPT)) {
38+
queryBlock.setDistionOption(SQLSetQuantifier.ALL_EXCEPT);
39+
} else {
40+
queryBlock.setDistionOption(SQLSetQuantifier.ALL);
41+
}
42+
}
43+
}
44+
45+
@Override
46+
public void parseAfterTableSourceRest(SQLTableSource tableSource) {
47+
if (tableSource instanceof DorisExprTableSource) {
48+
DorisExprTableSource dorisExprTableSource = (DorisExprTableSource) tableSource;
49+
if (lexer.nextIf(Token.PARTITION)) {
50+
accept(Token.LPAREN);
51+
do {
52+
dorisExprTableSource.addPartition(this.exprParser.name());
53+
}
54+
while (lexer.nextIf(Token.COMMA));
55+
accept(Token.RPAREN);
56+
}
57+
if (lexer.nextIf(Token.TABLET)) {
58+
accept(Token.LPAREN);
59+
dorisExprTableSource.addTablet(expr());
60+
accept(Token.RPAREN);
61+
}
62+
63+
if (lexer.nextIf(Token.TABLESAMPLE)) {
64+
accept(Token.LPAREN);
65+
SQLTableSampling sqlTableSampling = new SQLTableSampling();
66+
SQLExpr expr = expr();
67+
if (lexer.nextIf(Token.ROWS)) {
68+
sqlTableSampling.setRows(expr);
69+
} else if (lexer.nextIf(Token.PERCENT)) {
70+
sqlTableSampling.setPercent(expr);
71+
} else {
72+
sqlTableSampling.setByteLength(expr);
73+
}
74+
dorisExprTableSource.setSampling(sqlTableSampling);
75+
accept(Token.RPAREN);
76+
}
77+
78+
if (lexer.nextIf(Token.REPEATABLE)) {
79+
dorisExprTableSource.setRepeatable(expr());
80+
}
81+
82+
}
83+
}
84+
@Override
85+
protected SQLExprTableSource getTableSource() {
86+
return new DorisExprTableSource();
87+
}
88+
}

0 commit comments

Comments
 (0)