mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
refactor sql parser for oracle Hierarchical clause.
This commit is contained in:
@@ -41,6 +41,12 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery
|
||||
|
||||
protected SQLLimit limit;
|
||||
|
||||
// for oracle & oceanbase
|
||||
protected SQLExpr startWith;
|
||||
protected SQLExpr connectBy;
|
||||
protected boolean prior = false;
|
||||
protected boolean noCycle = false;
|
||||
|
||||
public SQLSelectQueryBlock(){
|
||||
|
||||
}
|
||||
@@ -198,12 +204,52 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery
|
||||
this.limit.setOffset(offset);
|
||||
}
|
||||
|
||||
public boolean isPrior() {
|
||||
return prior;
|
||||
}
|
||||
|
||||
public void setPrior(boolean prior) {
|
||||
this.prior = prior;
|
||||
}
|
||||
|
||||
public SQLExpr getStartWith() {
|
||||
return this.startWith;
|
||||
}
|
||||
|
||||
public void setStartWith(SQLExpr startWith) {
|
||||
if (startWith != null) {
|
||||
startWith.setParent(this);
|
||||
}
|
||||
this.startWith = startWith;
|
||||
}
|
||||
|
||||
public SQLExpr getConnectBy() {
|
||||
return this.connectBy;
|
||||
}
|
||||
|
||||
public void setConnectBy(SQLExpr connectBy) {
|
||||
if (connectBy != null) {
|
||||
connectBy.setParent(this);
|
||||
}
|
||||
this.connectBy = connectBy;
|
||||
}
|
||||
|
||||
public boolean isNoCycle() {
|
||||
return this.noCycle;
|
||||
}
|
||||
|
||||
public void setNoCycle(boolean noCycle) {
|
||||
this.noCycle = noCycle;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void accept0(SQLASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, this.selectList);
|
||||
acceptChild(visitor, this.from);
|
||||
acceptChild(visitor, this.where);
|
||||
acceptChild(visitor, this.startWith);
|
||||
acceptChild(visitor, this.connectBy);
|
||||
acceptChild(visitor, this.groupBy);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
|
||||
+2
-10
@@ -29,7 +29,6 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock {
|
||||
|
||||
private final List<SQLCommentHint> hints = new ArrayList<SQLCommentHint>(1);
|
||||
|
||||
private OracleSelectHierachicalQueryClause hierachicalQueryClause;
|
||||
private ModelClause modelClause;
|
||||
|
||||
public OracleSelectQueryBlock(){
|
||||
@@ -44,14 +43,6 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock {
|
||||
this.modelClause = modelClause;
|
||||
}
|
||||
|
||||
public OracleSelectHierachicalQueryClause getHierachicalQueryClause() {
|
||||
return this.hierachicalQueryClause;
|
||||
}
|
||||
|
||||
public void setHierachicalQueryClause(OracleSelectHierachicalQueryClause hierachicalQueryClause) {
|
||||
this.hierachicalQueryClause = hierachicalQueryClause;
|
||||
}
|
||||
|
||||
public List<SQLCommentHint> getHints() {
|
||||
return this.hints;
|
||||
}
|
||||
@@ -73,7 +64,8 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock {
|
||||
acceptChild(visitor, this.into);
|
||||
acceptChild(visitor, this.from);
|
||||
acceptChild(visitor, this.where);
|
||||
acceptChild(visitor, this.hierachicalQueryClause);
|
||||
acceptChild(visitor, this.startWith);
|
||||
acceptChild(visitor, this.connectBy);
|
||||
acceptChild(visitor, this.groupBy);
|
||||
acceptChild(visitor, this.modelClause);
|
||||
}
|
||||
|
||||
@@ -49,7 +49,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock;
|
||||
@@ -572,67 +571,55 @@ public class OracleSelectParser extends SQLSelectParser {
|
||||
}
|
||||
|
||||
private void parseHierachical(OracleSelectQueryBlock queryBlock) {
|
||||
OracleSelectHierachicalQueryClause hierachical = null;
|
||||
|
||||
|
||||
if (lexer.token() == Token.CONNECT) {
|
||||
hierachical = new OracleSelectHierachicalQueryClause();
|
||||
lexer.nextToken();
|
||||
accept(Token.BY);
|
||||
|
||||
if (lexer.token() == Token.PRIOR) {
|
||||
lexer.nextToken();
|
||||
hierachical.setPrior(true);
|
||||
queryBlock.setPrior(true);
|
||||
}
|
||||
|
||||
if (identifierEquals("NOCYCLE")) {
|
||||
hierachical.setNoCycle(true);
|
||||
queryBlock.setNoCycle(true);
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.PRIOR) {
|
||||
lexer.nextToken();
|
||||
hierachical.setPrior(true);
|
||||
queryBlock.setPrior(true);
|
||||
}
|
||||
}
|
||||
hierachical.setConnectBy(this.exprParser.expr());
|
||||
queryBlock.setConnectBy(this.exprParser.expr());
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.START) {
|
||||
lexer.nextToken();
|
||||
if (hierachical == null) {
|
||||
hierachical = new OracleSelectHierachicalQueryClause();
|
||||
}
|
||||
accept(Token.WITH);
|
||||
|
||||
hierachical.setStartWith(this.exprParser.expr());
|
||||
queryBlock.setStartWith(this.exprParser.expr());
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.CONNECT) {
|
||||
if (hierachical == null) {
|
||||
hierachical = new OracleSelectHierachicalQueryClause();
|
||||
}
|
||||
|
||||
lexer.nextToken();
|
||||
accept(Token.BY);
|
||||
|
||||
if (lexer.token() == Token.PRIOR) {
|
||||
lexer.nextToken();
|
||||
hierachical.setPrior(true);
|
||||
queryBlock.setPrior(true);
|
||||
}
|
||||
|
||||
if (identifierEquals("NOCYCLE")) {
|
||||
hierachical.setNoCycle(true);
|
||||
queryBlock.setNoCycle(true);
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.PRIOR) {
|
||||
lexer.nextToken();
|
||||
hierachical.setPrior(true);
|
||||
queryBlock.setPrior(true);
|
||||
}
|
||||
}
|
||||
hierachical.setConnectBy(this.exprParser.expr());
|
||||
}
|
||||
|
||||
if (hierachical != null) {
|
||||
queryBlock.setHierachicalQueryClause(hierachical);
|
||||
queryBlock.setConnectBy(this.exprParser.expr());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -85,7 +85,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock;
|
||||
@@ -119,8 +118,6 @@ public interface OracleASTVisitor extends SQLASTVisitor {
|
||||
|
||||
void endVisit(OracleSelectForUpdate x);
|
||||
|
||||
void endVisit(OracleSelectHierachicalQueryClause x);
|
||||
|
||||
void endVisit(OracleSelectJoin x);
|
||||
|
||||
void endVisit(OracleSelectPivot x);
|
||||
@@ -155,8 +152,6 @@ public interface OracleASTVisitor extends SQLASTVisitor {
|
||||
|
||||
boolean visit(OracleSelectForUpdate x);
|
||||
|
||||
boolean visit(OracleSelectHierachicalQueryClause x);
|
||||
|
||||
boolean visit(OracleSelectJoin x);
|
||||
|
||||
boolean visit(OracleSelectPivot x);
|
||||
|
||||
-12
@@ -94,7 +94,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item;
|
||||
@@ -159,11 +158,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSelectHierachicalQueryClause x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSelectJoin x) {
|
||||
|
||||
@@ -252,12 +246,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleSelectHierachicalQueryClause x) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleSelectJoin x) {
|
||||
|
||||
|
||||
+19
-30
@@ -110,7 +110,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item;
|
||||
@@ -381,28 +380,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean visit(OracleSelectHierachicalQueryClause x) {
|
||||
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);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean visit(OracleSelectJoin x) {
|
||||
x.getLeft().accept(this);
|
||||
|
||||
@@ -550,9 +527,26 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
x.getWhere().accept(this);
|
||||
}
|
||||
|
||||
if (x.getHierachicalQueryClause() != null) {
|
||||
SQLExpr startWith = x.getStartWith(), connectBy = x.getConnectBy();
|
||||
if (startWith != null || connectBy != null){
|
||||
println();
|
||||
x.getHierachicalQueryClause().accept(this);
|
||||
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);
|
||||
}
|
||||
|
||||
if (x.getGroupBy() != null) {
|
||||
@@ -785,11 +779,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSelectHierachicalQueryClause x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSelectJoin x) {
|
||||
|
||||
|
||||
-12
@@ -117,7 +117,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item;
|
||||
@@ -378,11 +377,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSelectHierachicalQueryClause x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSelectJoin x) {
|
||||
|
||||
@@ -460,12 +454,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleSelectHierachicalQueryClause x) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleSelectJoin x) {
|
||||
super.visit(x);
|
||||
|
||||
Reference in New Issue
Block a user