diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLName.java b/src/main/java/com/alibaba/druid/sql/ast/SQLName.java index 7a317a28ec..c31c094fb2 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLName.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLName.java @@ -16,5 +16,5 @@ package com.alibaba.druid.sql.ast; public interface SQLName extends SQLExpr { - + String getSimleName(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java index 7d48d1df17..887b9145f4 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java @@ -33,6 +33,10 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { this.name = name; } + + public String getSimleName() { + return name; + } public String getName() { return this.name; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java index cc70848a9f..baee099885 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java @@ -36,6 +36,10 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { public SQLPropertyExpr(){ } + + public String getSimleName() { + return name; + } public SQLExpr getOwner() { return this.owner; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java index 69d7768318..9ccc8911a6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java @@ -30,6 +30,10 @@ public class OracleDbLinkExpr extends SQLExprImpl implements SQLName, OracleExpr public OracleDbLinkExpr(){ } + + public String getSimleName() { + return dbLink; + } public SQLExpr getExpr() { return this.expr; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java index b8cd6e3477..62114e7e27 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java @@ -14,31 +14,39 @@ public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements private String server; private String database; private String schema; - private String object; - - public SQLServerObjectReferenceExpr() { - + + public SQLServerObjectReferenceExpr(){ + } - - public SQLServerObjectReferenceExpr(SQLExpr owner, String name) { + + public SQLServerObjectReferenceExpr(SQLExpr owner){ if (owner instanceof SQLIdentifierExpr) { this.database = ((SQLIdentifierExpr) owner).getName(); - this.object = name; } else if (owner instanceof SQLPropertyExpr) { SQLPropertyExpr propExpr = (SQLPropertyExpr) owner; - + this.server = ((SQLIdentifierExpr) propExpr.getOwner()).getName(); this.database = propExpr.getName(); - this.object = name; } else { throw new IllegalArgumentException(owner.toString()); } } + public String getSimleName() { + if (schema != null) { + return schema; + } + + if (database != null) { + return database; + } + return server; + } + @Override public void accept0(SQLServerASTVisitor visitor) { if (visitor.visit(this)) { - + } visitor.endVisit(this); } @@ -47,31 +55,25 @@ public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements boolean flag = false; if (server != null) { buf.append(server); - buf.append('.'); flag = true; } + if (flag) { + buf.append('.'); + } if (database != null) { buf.append(database); - buf.append('.'); flag = true; - } else { - if (flag) { - buf.append('.'); - } - } + } + if (flag) { + buf.append('.'); + } + if (schema != null) { buf.append(schema); - buf.append('.'); flag = true; - } else { - if (flag) { - buf.append('.'); - } } - - buf.append(object); } public String getServer() { @@ -98,12 +100,4 @@ public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements this.schema = schema; } - public String getObject() { - return object; - } - - public void setObject(String object) { - this.object = object; - } - } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java index 278b5b61b1..cf5a73e272 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java @@ -2,6 +2,7 @@ package com.alibaba.druid.sql.dialect.sqlserver.parser; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; @@ -27,15 +28,16 @@ public class SQLServerExprParser extends SQLExprParser { return super.primaryRest(expr); } - public SQLName nameRest(SQLName name) throws ParserException { + public SQLName nameRest(SQLName expr) throws ParserException { if (lexer.token() == Token.DOTDOT) { lexer.nextToken(); String text = lexer.stringVal(); lexer.nextToken(); - name = new SQLServerObjectReferenceExpr(name, text); + SQLServerObjectReferenceExpr owner = new SQLServerObjectReferenceExpr(expr); + expr = new SQLPropertyExpr(owner, text); } - return super.nameRest(name); + return super.nameRest(expr); } } diff --git a/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java index 21b6a44e84..7b6c13fd1f 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; +import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitorAdapter; import com.alibaba.druid.wall.IllegalSQLObjectViolation; @@ -178,4 +179,12 @@ public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements return true; } + + @Override + public boolean visit(SQLServerObjectReferenceExpr x) { + if (config.isPermitSchema(x.getSchema()) || config.isPermitSchema(x.getDatabase())) { + this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x))); + } + return true; + } } diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java index 779fd69d68..5272ac30c4 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -464,8 +464,8 @@ public class WallVisitorUtils { if (expr instanceof SQLPropertyExpr) { SQLPropertyExpr propExpr = (SQLPropertyExpr) expr; - if (propExpr.getOwner() instanceof SQLIdentifierExpr) { - String ownerName = ((SQLIdentifierExpr) propExpr.getOwner()).getName(); + if (propExpr.getOwner() instanceof SQLName) { + String ownerName = ((SQLName) propExpr.getOwner()).getSimleName(); ownerName = form(ownerName);