mysql parser support Hierarchical clause.

This commit is contained in:
wenshao
2017-04-24 00:39:18 +08:00
parent 915854c7c8
commit d3bacf9e70
13 changed files with 176 additions and 88 deletions
@@ -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());
}
}
@@ -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());
}
}
@@ -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();
@@ -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);
}
}
}