mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
mysql parser support Hierarchical clause.
This commit is contained in:
@@ -158,6 +158,8 @@ public class MySqlSelectParser extends SQLSelectParser {
|
||||
|
||||
parseWhere(queryBlock);
|
||||
|
||||
parseHierachical(queryBlock);
|
||||
|
||||
parseGroupBy(queryBlock);
|
||||
|
||||
queryBlock.setOrderBy(this.exprParser.parseOrderBy());
|
||||
|
||||
@@ -279,6 +279,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
x.getWhere().accept(this);
|
||||
}
|
||||
|
||||
printHierarchical(x);
|
||||
|
||||
if (x.getGroupBy() != null) {
|
||||
println();
|
||||
x.getGroupBy().accept(this);
|
||||
|
||||
@@ -148,7 +148,7 @@ public class OdpsSelectParser extends SQLSelectParser {
|
||||
break;
|
||||
}
|
||||
|
||||
String alias = this.as();
|
||||
String alias = this.tableAlias();
|
||||
tableSource.setAlias(alias);
|
||||
|
||||
accept(Token.LPAREN);
|
||||
|
||||
@@ -563,66 +563,9 @@ public class OracleSelectParser extends SQLSelectParser {
|
||||
}
|
||||
|
||||
protected String as() {
|
||||
if (lexer.token() == Token.CONNECT) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return super.as();
|
||||
}
|
||||
|
||||
private void parseHierachical(OracleSelectQueryBlock queryBlock) {
|
||||
|
||||
|
||||
if (lexer.token() == Token.CONNECT) {
|
||||
lexer.nextToken();
|
||||
accept(Token.BY);
|
||||
|
||||
if (lexer.token() == Token.PRIOR) {
|
||||
lexer.nextToken();
|
||||
queryBlock.setPrior(true);
|
||||
}
|
||||
|
||||
if (identifierEquals("NOCYCLE")) {
|
||||
queryBlock.setNoCycle(true);
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.PRIOR) {
|
||||
lexer.nextToken();
|
||||
queryBlock.setPrior(true);
|
||||
}
|
||||
}
|
||||
queryBlock.setConnectBy(this.exprParser.expr());
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.START) {
|
||||
lexer.nextToken();
|
||||
accept(Token.WITH);
|
||||
|
||||
queryBlock.setStartWith(this.exprParser.expr());
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.CONNECT) {
|
||||
lexer.nextToken();
|
||||
accept(Token.BY);
|
||||
|
||||
if (lexer.token() == Token.PRIOR) {
|
||||
lexer.nextToken();
|
||||
queryBlock.setPrior(true);
|
||||
}
|
||||
|
||||
if (identifierEquals("NOCYCLE")) {
|
||||
queryBlock.setNoCycle(true);
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.PRIOR) {
|
||||
lexer.nextToken();
|
||||
queryBlock.setPrior(true);
|
||||
}
|
||||
}
|
||||
queryBlock.setConnectBy(this.exprParser.expr());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public SQLTableSource parseTableSource() {
|
||||
if (lexer.token() == (Token.LPAREN)) {
|
||||
@@ -807,10 +750,10 @@ public class OracleSelectParser extends SQLSelectParser {
|
||||
tableSource.setFlashback(flashback());
|
||||
}
|
||||
|
||||
tableSource.setAlias(as());
|
||||
tableSource.setAlias(tableAlias());
|
||||
} else if ((tableSource.getAlias() == null) || (tableSource.getAlias().length() == 0)) {
|
||||
if (lexer.token() != Token.LEFT && lexer.token() != Token.RIGHT && lexer.token() != Token.FULL) {
|
||||
tableSource.setAlias(as());
|
||||
tableSource.setAlias(tableAlias());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1273,7 +1273,7 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
deleteStatement.setTableName(tableName);
|
||||
}
|
||||
|
||||
deleteStatement.setAlias(as());
|
||||
deleteStatement.setAlias(tableAlias());
|
||||
}
|
||||
|
||||
if (lexer.token() == (Token.WHERE)) {
|
||||
|
||||
@@ -49,7 +49,7 @@ public class OracleUpdateParser extends SQLStatementParser {
|
||||
update.setTableSource(tableSource);
|
||||
|
||||
if ((update.getAlias() == null) || (update.getAlias().length() == 0)) {
|
||||
update.setAlias(as());
|
||||
update.setAlias(tableAlias());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-21
@@ -527,27 +527,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
x.getWhere().accept(this);
|
||||
}
|
||||
|
||||
SQLExpr startWith = x.getStartWith(), connectBy = x.getConnectBy();
|
||||
if (startWith != null || connectBy != null){
|
||||
println();
|
||||
if (x.getStartWith() != null) {
|
||||
print0(ucase ? "START WITH " : "start with ");
|
||||
x.getStartWith().accept(this);
|
||||
println();
|
||||
}
|
||||
|
||||
print0(ucase ? "CONNECT BY " : "connect by ");
|
||||
|
||||
if (x.isNoCycle()) {
|
||||
print0(ucase ? "NOCYCLE " : "nocycle ");
|
||||
}
|
||||
|
||||
if (x.isPrior()) {
|
||||
print0(ucase ? "PRIOR " : "prior ");
|
||||
}
|
||||
|
||||
x.getConnectBy().accept(this);
|
||||
}
|
||||
printHierarchical(x);
|
||||
|
||||
if (x.getGroupBy() != null) {
|
||||
println();
|
||||
|
||||
+1
-1
@@ -256,7 +256,7 @@ public class SQLServerStatementParser extends SQLStatementParser {
|
||||
insertStatement.setTableName(tableName);
|
||||
|
||||
if (lexer.token() == Token.LITERAL_ALIAS) {
|
||||
insertStatement.setAlias(as());
|
||||
insertStatement.setAlias(tableAlias());
|
||||
}
|
||||
|
||||
parseInsert0_hinits(insertStatement);
|
||||
|
||||
@@ -60,10 +60,28 @@ public class SQLParser {
|
||||
}
|
||||
}
|
||||
|
||||
protected String tableAlias() {
|
||||
if (lexer.token() == Token.CONNECT || lexer.token() == Token.START) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (identifierEquals("START") || identifierEquals("CONNECT")) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return this.as();
|
||||
}
|
||||
|
||||
protected String as() {
|
||||
String alias = null;
|
||||
|
||||
if (lexer.token() == Token.AS) {
|
||||
final Token token = lexer.token();
|
||||
|
||||
if (token == Token.COMMA) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (token == Token.AS) {
|
||||
lexer.nextToken();
|
||||
|
||||
alias = alias();
|
||||
|
||||
@@ -448,7 +448,7 @@ public class SQLSelectParser extends SQLParser {
|
||||
if ((tableSource.getAlias() == null) || (tableSource.getAlias().length() == 0)) {
|
||||
if (lexer.token() != Token.LEFT && lexer.token() != Token.RIGHT && lexer.token() != Token.FULL
|
||||
&& !identifierEquals("STRAIGHT_JOIN") && !identifierEquals("CROSS") && lexer.token != Token.OUTER) {
|
||||
String alias = as();
|
||||
String alias = tableAlias();
|
||||
if (alias != null) {
|
||||
tableSource.setAlias(alias);
|
||||
return parseTableSourceRest(tableSource);
|
||||
@@ -589,4 +589,55 @@ public class SQLSelectParser extends SQLParser {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void parseHierachical(SQLSelectQueryBlock queryBlock) {
|
||||
if (lexer.token() == Token.CONNECT || identifierEquals("CONNECT")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.BY);
|
||||
|
||||
if (lexer.token() == Token.PRIOR || identifierEquals("PRIOR")) {
|
||||
lexer.nextToken();
|
||||
queryBlock.setPrior(true);
|
||||
}
|
||||
|
||||
if (identifierEquals("NOCYCLE")) {
|
||||
queryBlock.setNoCycle(true);
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.PRIOR) {
|
||||
lexer.nextToken();
|
||||
queryBlock.setPrior(true);
|
||||
}
|
||||
}
|
||||
queryBlock.setConnectBy(this.exprParser.expr());
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.START || identifierEquals("START")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.WITH);
|
||||
|
||||
queryBlock.setStartWith(this.exprParser.expr());
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.CONNECT || identifierEquals("CONNECT")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.BY);
|
||||
|
||||
if (lexer.token() == Token.PRIOR || identifierEquals("PRIOR")) {
|
||||
lexer.nextToken();
|
||||
queryBlock.setPrior(true);
|
||||
}
|
||||
|
||||
if (identifierEquals("NOCYCLE")) {
|
||||
queryBlock.setNoCycle(true);
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.PRIOR || identifierEquals("PRIOR")) {
|
||||
lexer.nextToken();
|
||||
queryBlock.setPrior(true);
|
||||
}
|
||||
}
|
||||
queryBlock.setConnectBy(this.exprParser.expr());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1511,7 +1511,7 @@ public class SQLStatementParser extends SQLParser {
|
||||
insertStatement.setTableName(tableName);
|
||||
|
||||
if (lexer.token() == Token.LITERAL_ALIAS) {
|
||||
insertStatement.setAlias(as());
|
||||
insertStatement.setAlias(tableAlias());
|
||||
}
|
||||
|
||||
parseInsert0_hinits(insertStatement);
|
||||
@@ -2247,7 +2247,7 @@ public class SQLStatementParser extends SQLParser {
|
||||
stmt.setInto(exprParser.name());
|
||||
}
|
||||
|
||||
stmt.setAlias(as());
|
||||
stmt.setAlias(tableAlias());
|
||||
|
||||
accept(Token.USING);
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeInsertClause;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeUpdateClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock;
|
||||
import com.alibaba.druid.util.JdbcConstants;
|
||||
|
||||
public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements ParameterizedVisitor, PrintableVisitor {
|
||||
@@ -3955,4 +3956,28 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void printHierarchical(SQLSelectQueryBlock x) {
|
||||
SQLExpr startWith = x.getStartWith(), connectBy = x.getConnectBy();
|
||||
if (startWith != null || connectBy != null){
|
||||
println();
|
||||
if (x.getStartWith() != null) {
|
||||
print0(ucase ? "START WITH " : "start with ");
|
||||
x.getStartWith().accept(this);
|
||||
println();
|
||||
}
|
||||
|
||||
print0(ucase ? "CONNECT BY " : "connect by ");
|
||||
|
||||
if (x.isNoCycle()) {
|
||||
print0(ucase ? "NOCYCLE " : "nocycle ");
|
||||
}
|
||||
|
||||
if (x.isPrior()) {
|
||||
print0(ucase ? "PRIOR " : "prior ");
|
||||
}
|
||||
|
||||
x.getConnectBy().accept(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user