From 5a6c377a5064212b4a8b68875f0f059b271e8e3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Thu, 15 Mar 2012 12:49:29 +0800 Subject: [PATCH 1/7] bug fixed for sql parser : SQLNotExpr --- .../java/com/alibaba/druid/sql/parser/SQLExprParser.java | 5 ++++- .../alibaba/druid/bvt/filter/wall/WallVisitorUtilsTest.java | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) 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/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"))); } } From 123385f74a12843da2994677f750c6c078539684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Thu, 15 Mar 2012 13:04:56 +0800 Subject: [PATCH 2/7] refactor --- .../ast/statement/SQLDropTableStatement.java | 30 +++++++++++++------ .../statement/MySqlDropTableStatement.java | 2 +- .../mysql/parser/MySqlStatementParser.java | 2 +- .../mysql/visitor/MySqlOutputVisitor.java | 2 +- .../druid/sql/parser/SQLStatementParser.java | 3 +- .../sql/visitor/SQLASTOutputVisitor.java | 2 +- .../druid/sql/visitor/SchemaStatVisitor.java | 7 +++-- 7 files changed, 31 insertions(+), 17 deletions(-) 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/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/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index b90116e289..9261d45d2e 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; 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..725db7f312 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; } 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..1af1611abc 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; } @@ -402,7 +402,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 +869,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLCommentStatement x) { return false; } - + public boolean visit(SQLCurrentOfCursorExpr x) { return false; } From 5f80737ead01c9a0f1c035f06eb575b5de66c222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Thu, 15 Mar 2012 13:11:53 +0800 Subject: [PATCH 3/7] add wall support --- .../alibaba/druid/filter/wall/WallFilter.java | 1 + .../com/alibaba/druid/sql/parser/Lexer.java | 27 +++++++++++++++---- .../sql/parser/NotAllowCommentException.java | 19 +++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/parser/NotAllowCommentException.java 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/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 3af57c7386..504dfc55e7 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; @@ -575,6 +588,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); + } + +} From 7c62f95ce7e2668fff7c09e8de1b2a56e4863cee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Thu, 15 Mar 2012 13:45:20 +0800 Subject: [PATCH 4/7] add ibatis parameters support --- .../dialect/oracle/parser/OracleLexer.java | 2 +- .../com/alibaba/druid/sql/parser/Lexer.java | 5 ++- .../sql/oracle/OracleIbatisSelectTest.java | 41 +++++++++++++++++++ .../sql/oracle/OracleIbatisSelectTest1.java | 41 +++++++++++++++++++ 4 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIbatisSelectTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleIbatisSelectTest1.java 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/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 504dfc55e7..f4c84b98a7 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -277,6 +277,9 @@ public class Lexer { } } return; + case '#': + scanVariable(); + return; case '.': scanChar(); if (isDigit(ch)) { @@ -551,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"); } 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"))); + } + +} From 4bf0785f57087f754e1468614d5b5b350e579ab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Thu, 15 Mar 2012 14:09:16 +0800 Subject: [PATCH 5/7] druid 0.1.18 compatible --- .../java/com/alibaba/druid/util/TransactionInfo.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/com/alibaba/druid/util/TransactionInfo.java 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); + } + +} From 7862e719e77a696e29b5430dd090680f6e7c6130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Thu, 15 Mar 2012 14:12:30 +0800 Subject: [PATCH 6/7] refactor --- .../ast/stmt/OracleAlterTableStatement.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) 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() { From fc910ce7741bb0bf31b2342fa0a9df1834c7a44b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Thu, 15 Mar 2012 14:25:42 +0800 Subject: [PATCH 7/7] refactor --- .../ast/statement/SQLTruncateStatement.java | 18 ++++++++++------- .../ast/stmt/OracleAlterTableStatement.java | 20 +++++++++++++++---- .../ast/stmt/OracleTruncateStatement.java | 2 +- .../oracle/parser/OracleStatementParser.java | 2 +- .../oracle/visitor/OracleOutputVisitor.java | 2 +- .../ast/stmt/PGTruncateStatement.java | 2 +- .../parser/PGSQLStatementParser.java | 2 +- .../postgresql/visitor/PGOutputVisitor.java | 2 +- .../druid/sql/parser/SQLStatementParser.java | 2 +- .../sql/visitor/SQLASTOutputVisitor.java | 2 +- .../druid/sql/visitor/SchemaStatVisitor.java | 4 +++- 11 files changed, 38 insertions(+), 20 deletions(-) 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/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/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/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/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 9261d45d2e..52116a1226 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -176,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 725db7f312..ef816257ca 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -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 1af1611abc..557dee300b 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -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);