diff --git a/src/main/java/com/alibaba/druid/filter/wall/WallFilter.java b/src/main/java/com/alibaba/druid/filter/wall/WallFilter.java index 975909bbc3..0711d01f55 100644 --- a/src/main/java/com/alibaba/druid/filter/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/filter/wall/WallFilter.java @@ -97,6 +97,7 @@ public class WallFilter extends FilterAdapter { String dbType = connection.getDirectDataSource().getDbType(); SQLStatementParser parser = createParser(dbType, sql); + parser.getLexer().setAllowComment(false); // permit comment List statementList = parser.parseStatementList(); if (statementList.size() > 1) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java index cd8c2bafdf..1decc67cb3 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java @@ -26,7 +26,7 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLCreateTableStatement extends SQLStatementImpl { protected Type type; - protected SQLName name; + protected SQLExprTableSource tableSource; protected List tableElementList = new ArrayList(); @@ -35,11 +35,23 @@ public class SQLCreateTableStatement extends SQLStatementImpl { } public SQLName getName() { - return name; + if (tableSource == null) { + return null; + } + + return (SQLName) tableSource.getExpr(); } public void setName(SQLName name) { - this.name = name; + this.setTableSource(new SQLExprTableSource(name)); + } + + public SQLExprTableSource getTableSource() { + return tableSource; + } + + public void setTableSource(SQLExprTableSource tableSource) { + this.tableSource = tableSource; } public Type getType() { @@ -67,7 +79,7 @@ public class SQLCreateTableStatement extends SQLStatementImpl { buf.append("LOCAL TEMPORARY "); } - this.name.output(buf); + this.tableSource.output(buf); buf.append(" "); buf.append("("); @@ -83,7 +95,7 @@ public class SQLCreateTableStatement extends SQLStatementImpl { @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { - this.acceptChild(visitor, name); + this.acceptChild(visitor, tableSource); this.acceptChild(visitor, tableElementList); } visitor.endVisit(this); diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java index de74074987..3d1a091f74 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java @@ -24,34 +24,46 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLDropTableStatement extends SQLStatementImpl { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - protected List tableNames = new ArrayList(); + protected List tableSources = new ArrayList(); public SQLDropTableStatement(){ } public SQLDropTableStatement(SQLName name){ - tableNames.add(name); + this(new SQLExprTableSource(name)); } - public List getTableNames() { - return tableNames; + public SQLDropTableStatement(SQLExprTableSource tableSource){ + this.tableSources.add(tableSource); } - public void setTableNames(List tableNames) { - this.tableNames = tableNames; + public List getTableSources() { + return tableSources; + } + + public void setTableSources(List tableSources) { + this.tableSources = tableSources; } public void setName(SQLName name) { - tableNames.add(name); + this.addTableSource(new SQLExprTableSource(name)); + } + + public void addTableSource(SQLName name) { + this.addTableSource(new SQLExprTableSource(name)); + } + + public void addTableSource(SQLExprTableSource tableSource) { + tableSources.add(tableSource); } @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { - this.acceptChild(visitor, tableNames); + this.acceptChild(visitor, tableSources); } visitor.endVisit(this); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTruncateStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTruncateStatement.java index b013dfdca6..c4ed36ed67 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTruncateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTruncateStatement.java @@ -9,21 +9,25 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLTruncateStatement extends SQLStatementImpl { - private static final long serialVersionUID = 1L; - protected List tableNames = new ArrayList(2); + private static final long serialVersionUID = 1L; + protected List tableSources = new ArrayList(2); - public List getTableNames() { - return tableNames; + public List getTableSources() { + return tableSources; } - public void setTableNames(List tableNames) { - this.tableNames = tableNames; + public void setTableSources(List tableSources) { + this.tableSources = tableSources; + } + + public void addTableSource(SQLName name) { + this.tableSources.add(new SQLExprTableSource(name)); } @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { - acceptChild(visitor, tableNames); + acceptChild(visitor, tableSources); } visitor.endVisit(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/ast/stmt/HiveCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/ast/stmt/HiveCreateTableStatement.java index aaa217164a..ec2340d83e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/hive/ast/stmt/HiveCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/ast/stmt/HiveCreateTableStatement.java @@ -29,7 +29,7 @@ public class HiveCreateTableStatement extends SQLCreateTableStatement implements @Override public void accept0(HiveASTVisitor visitor) { if (visitor.visit(this)) { - this.acceptChild(visitor, name); + this.acceptChild(visitor, tableSource); this.acceptChild(visitor, tableElementList); this.acceptChild(visitor, partitionedBy); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java index 487f1ebc68..ab021430c5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java @@ -69,7 +69,7 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement { buf.append("IF NOT EXISTS "); } - this.name.output(buf); + this.tableSource.output(buf); buf.append(" "); buf.append("("); for (int i = 0, size = tableElementList.size(); i < size; ++i) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDropTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDropTableStatement.java index 11eeaef1d7..4d59b7bf17 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDropTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDropTableStatement.java @@ -21,7 +21,7 @@ public class MySqlDropTableStatement extends SQLDropTableStatement implements My public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { - this.acceptChild(visitor, tableNames); + this.acceptChild(visitor, tableSources); } visitor.endVisit(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 289c016822..faea699089 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -1030,7 +1030,7 @@ public class MySqlStatementParser extends SQLStatementParser { for (;;) { SQLName name = this.exprParser.name(); - stmt.getTableNames().add(name); + stmt.addTableSource(name); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index b84a936387..ec68acf43a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -1322,7 +1322,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV print("IF EXISTS "); } - printAndAccept(x.getTableNames(), ", "); + printAndAccept(x.getTableSources(), ", "); return false; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableStatement.java index fc121a21ae..b6e2779a09 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableStatement.java @@ -4,12 +4,13 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; public class OracleAlterTableStatement extends OracleStatementImpl { private static final long serialVersionUID = 1L; - private SQLName name; + private SQLExprTableSource tableSource; private List items = new ArrayList(); private boolean updateGlobalIndexes = false; @@ -18,7 +19,7 @@ public class OracleAlterTableStatement extends OracleStatementImpl { @Override public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { - acceptChild(visitor, name); + acceptChild(visitor, tableSource); acceptChild(visitor, items); } visitor.endVisit(this); @@ -41,11 +42,22 @@ public class OracleAlterTableStatement extends OracleStatementImpl { } public SQLName getName() { - return name; + if (tableSource == null) { + return null; + } + return (SQLName) tableSource.getExpr(); } public void setName(SQLName name) { - this.name = name; + this.setTableSource(new SQLExprTableSource(name)); + } + + public SQLExprTableSource getTableSource() { + return tableSource; + } + + public void setTableSource(SQLExprTableSource tableSource) { + this.tableSource = tableSource; } public List getItems() { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java index c95f5c86cb..73cfa9a3ee 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java @@ -184,7 +184,7 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { - this.acceptChild(visitor, name); + this.acceptChild(visitor, tableSource); this.acceptChild(visitor, tableElementList); this.acceptChild(visitor, tablespace); this.acceptChild(visitor, select); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleTruncateStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleTruncateStatement.java index 7552609285..b603055ece 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleTruncateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleTruncateStatement.java @@ -17,7 +17,7 @@ public class OracleTruncateStatement extends SQLTruncateStatement implements Ora public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { - acceptChild(visitor, tableNames); + acceptChild(visitor, tableSources); } visitor.endVisit(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java index cfb4936e37..795b4a18d9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java @@ -162,7 +162,7 @@ public class OracleLexer extends Lexer { return; } - if (ch != ':') { + if (ch != ':' && ch != '#') { throw new SQLParseException("illegal variable"); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index 445d6137c3..57dbe2e6b0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -580,7 +580,7 @@ public class OracleStatementParser extends SQLStatementParser { OracleTruncateStatement stmt = new OracleTruncateStatement(); SQLName name = this.exprParser.name(); - stmt.getTableNames().add(name); + stmt.addTableSource(name); if (identifierEquals("PURGE")) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index 0ed82e5548..e44a9d854c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -2839,7 +2839,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public boolean visit(OracleTruncateStatement x) { print("TRUNCATE TABLE "); - printAndAccept(x.getTableNames(), ", "); + printAndAccept(x.getTableSources(), ", "); if (x.isPurgeSnapshotLog()) { print(" PURGE SNAPSHOT LOG"); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGTruncateStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGTruncateStatement.java index 75cf4d2fa5..dfc0af46e0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGTruncateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGTruncateStatement.java @@ -37,7 +37,7 @@ public class PGTruncateStatement extends SQLTruncateStatement implements PGSQLSt public void accept0(PGASTVisitor visitor) { if (visitor.visit(this)) { - acceptChild(visitor, tableNames); + acceptChild(visitor, tableSources); } visitor.endVisit(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java index e50b99707a..df650ddb94 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java @@ -205,7 +205,7 @@ public class PGSQLStatementParser extends SQLStatementParser { for (;;) { SQLName name = this.exprParser.name(); - stmt.getTableNames().add(name); + stmt.addTableSource(name); if (lexer.token() == Token.COMMA) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java index 3428f8f6e1..4b937f47df 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java @@ -251,7 +251,7 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor print("ONLY "); } - printlnAndAccept(x.getTableNames(), ", "); + printlnAndAccept(x.getTableSources(), ", "); if (x.getRestartIdentity() != null) { if (x.getRestartIdentity().booleanValue()) { diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 3af57c7386..f4c84b98a7 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -53,7 +53,7 @@ public class Lexer { protected int tokenPos; /** A character buffer for literals. */ - protected final static ThreadLocal sbufRef = new ThreadLocal(); + protected final static ThreadLocal sbufRef = new ThreadLocal(); protected char[] sbuf; /** string point as size */ @@ -62,25 +62,38 @@ public class Lexer { /** string point as offset */ protected int np; - protected SymbolTable symbolTable = new SymbolTable(); + protected SymbolTable symbolTable = new SymbolTable(); /** * The token, set by nextToken(). */ protected Token token; - protected Keywords keywods = Keywords.DEFAULT_KEYWORDS; + protected Keywords keywods = Keywords.DEFAULT_KEYWORDS; protected String stringVal; - protected boolean skipComment = true; + protected boolean skipComment = true; - private SavePoint savePoint = null; + private SavePoint savePoint = null; + + /* + * anti sql injection + */ + private boolean allowComment = true; public Lexer(String input){ this(input, true); } + public boolean isAllowComment() { + return allowComment; + } + + public void setAllowComment(boolean allowComment) { + this.allowComment = allowComment; + } + private static class SavePoint { int bp; @@ -264,6 +277,9 @@ public class Lexer { } } return; + case '#': + scanVariable(); + return; case '.': scanChar(); if (isDigit(ch)) { @@ -538,7 +554,7 @@ public class Lexer { public void scanVariable() { final char first = ch; - if (ch != '@' && ch != ':') { + if (ch != '@' && ch != ':' && ch != '#') { throw new SQLParseException("illegal variable"); } @@ -575,6 +591,10 @@ public class Lexer { } public void scanComment() { + if (!allowComment) { + throw new NotAllowCommentException(); + } + if (ch != '/') { throw new IllegalStateException(); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/NotAllowCommentException.java b/src/main/java/com/alibaba/druid/sql/parser/NotAllowCommentException.java new file mode 100644 index 0000000000..e9702a995f --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/parser/NotAllowCommentException.java @@ -0,0 +1,19 @@ +package com.alibaba.druid.sql.parser; + +public class NotAllowCommentException extends ParserException { + + private static final long serialVersionUID = 1L; + + public NotAllowCommentException(){ + super(); + } + + public NotAllowCommentException(String message, Throwable e){ + super(message, e); + } + + public NotAllowCommentException(String message){ + super(message); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 54dda9481f..a86506fbfd 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -270,9 +270,12 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); SQLExpr notTarget = expr(); - sqlExpr = new SQLNotExpr(notTarget); accept(Token.RPAREN); + notTarget = exprRest(notTarget); + + sqlExpr = new SQLNotExpr(notTarget); + return primaryRest(sqlExpr); } else { SQLExpr restExpr = expr(); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index b90116e289..52116a1226 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -29,6 +29,7 @@ import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateViewStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLInsertInto; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; @@ -158,7 +159,7 @@ public class SQLStatementParser extends SQLParser { for (;;) { SQLName name = this.exprParser.name(); - stmt.getTableNames().add(name); + stmt.getTableSources().add(new SQLExprTableSource(name)); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -175,7 +176,7 @@ public class SQLStatementParser extends SQLParser { for (;;) { SQLName name = this.exprParser.name(); - stmt.getTableNames().add(name); + stmt.addTableSource(name); if (lexer.token() == Token.COMMA) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 128e4deb42..ef816257ca 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -594,7 +594,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLDropTableStatement x) { print("DROP TABLE "); - printAndAccept(x.getTableNames(), ", "); + printAndAccept(x.getTableSources(), ", "); return false; } @@ -967,7 +967,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { @Override public boolean visit(SQLTruncateStatement x) { print("TRUNCATE TABLE "); - printAndAccept(x.getTableNames(), ", "); + printAndAccept(x.getTableSources(), ", "); return false; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index 12c46ff580..557dee300b 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -358,7 +358,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { if (table != null) { return new Column(table, column); } - + if (variants.containsKey(column)) { return null; } @@ -377,7 +377,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { String originalTable = getCurrentTable(); - for (SQLName name : x.getTableNames()) { + for (SQLExprTableSource tableSource : x.getTableSources()) { + SQLName name = (SQLName) tableSource.getExpr(); + String ident = name.toString(); setCurrentTable(ident); x.putAttribute("_old_local_", originalTable); @@ -402,7 +404,8 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { String originalTable = getCurrentTable(); - for (SQLName name : x.getTableNames()) { + for (SQLExprTableSource tableSource : x.getTableSources()) { + SQLName name = (SQLName) tableSource.getExpr(); String ident = name.toString(); setCurrentTable(ident); x.putAttribute("_old_local_", originalTable); @@ -868,7 +871,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLCommentStatement x) { return false; } - + public boolean visit(SQLCurrentOfCursorExpr x) { return false; } diff --git a/src/main/java/com/alibaba/druid/util/TransactionInfo.java b/src/main/java/com/alibaba/druid/util/TransactionInfo.java new file mode 100644 index 0000000000..ae80395996 --- /dev/null +++ b/src/main/java/com/alibaba/druid/util/TransactionInfo.java @@ -0,0 +1,10 @@ +package com.alibaba.druid.util; + +@Deprecated +public class TransactionInfo extends com.alibaba.druid.proxy.jdbc.TransactionInfo { + + public TransactionInfo(long id){ + super(id); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallVisitorUtilsTest.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallVisitorUtilsTest.java index aac3070e54..f4fa19cf36 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/WallVisitorUtilsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/WallVisitorUtilsTest.java @@ -32,5 +32,7 @@ public class WallVisitorUtilsTest extends TestCase { Assert.assertEquals(Boolean.TRUE, WallVisitorUtils.getValue(SQLUtils.toSQLExpr("(select count(*) from t) > 0"))); Assert.assertEquals(Boolean.TRUE, WallVisitorUtils.getValue(SQLUtils.toSQLExpr("(select count(*) from t) >= 0"))); + Assert.assertEquals(Boolean.FALSE, WallVisitorUtils.getValue(SQLUtils.toSQLExpr("(select count(*) from t) < 0"))); + Assert.assertEquals(Boolean.TRUE, WallVisitorUtils.getValue(SQLUtils.toSQLExpr("NOT (select count(*) from t) < 0"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIbatisSelectTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIbatisSelectTest.java new file mode 100644 index 0000000000..f93b1a5b16 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIbatisSelectTest.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleIbatisSelectTest extends OracleTest { + + public void test_0() throws Exception { + String sql = "SELECT * FROM T WHERE F1 = #id# "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("T"))); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIbatisSelectTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIbatisSelectTest1.java new file mode 100644 index 0000000000..61d0f2781e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIbatisSelectTest1.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleIbatisSelectTest1 extends OracleTest { + + public void test_0() throws Exception { + String sql = "SELECT * FROM T WHERE F1 = $id$"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("T"))); + + Assert.assertEquals(1, visitor.getTables().size()); + //Assert.assertEquals(2, visitor.getColumns().size()); + +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id"))); + } + +}