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 dc3e7d40f6..39fd99f64e 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 @@ -15,6 +15,9 @@ */ package com.alibaba.druid.sql.ast.statement; +import java.util.ArrayList; +import java.util.List; + import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -23,35 +26,33 @@ public class SQLDropTableStatement extends SQLStatementImpl { private static final long serialVersionUID = 1L; - private SQLName name; + private List tableNames = new ArrayList(); public SQLDropTableStatement(){ } public SQLDropTableStatement(SQLName name){ - - this.name = name; + tableNames.add(name); } - public SQLName getName() { - return name; + public List getTableNames() { + return tableNames; + } + + public void setTableNames(List tableNames) { + this.tableNames = tableNames; } public void setName(SQLName name) { - this.name = name; + tableNames.add(name); } - @Override - public void output(StringBuffer buf) { - buf.append("DROP TABLE "); - this.name.output(buf); - } @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { - this.acceptChild(visitor, name); + this.acceptChild(visitor, tableNames); } visitor.endVisit(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java index 39467e4477..e224f4bb04 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java @@ -8,98 +8,105 @@ import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.Token; public class PGLexer extends Lexer { - public final static Keywords DEFAULT_MYSQL_KEYWORDS; - static { - Map map = new HashMap(); - map.put("EXISTS", Token.EXISTS); - map.put("THEN", Token.THEN); - map.put("AS", Token.AS); - map.put("GROUP", Token.GROUP); - map.put("BY", Token.BY); - map.put("HAVING", Token.HAVING); - map.put("DELETE", Token.DELETE); - map.put("ORDER", Token.ORDER); - map.put("INDEX", Token.INDEX); - map.put("FOR", Token.FOR); - map.put("SCHEMA", Token.SCHEMA); - map.put("FOREIGN", Token.FOREIGN); - map.put("REFERENCE", Token.REFERENCE); - map.put("REFERENCES", Token.REFERENCES); - map.put("CHECK", Token.CHECK); - map.put("PRIMARY", Token.PRIMARY); - map.put("KEY", Token.KEY); - map.put("CONSTRAINT", Token.CONSTRAINT); - map.put("DEFAULT", Token.DEFAULT); - map.put("VIEW", Token.VIEW); - map.put("CREATE", Token.CREATE); - map.put("VALUES", Token.VALUES); - map.put("ALTER", Token.ALTER); - map.put("TABLE", Token.TABLE); - map.put("DROP", Token.DROP); - map.put("SET", Token.SET); - map.put("INTO", Token.INTO); - map.put("UPDATE", Token.UPDATE); - map.put("NULL", Token.NULL); - map.put("IS", Token.IS); - map.put("NOT", Token.NOT); - map.put("SELECT", Token.SELECT); - map.put("INSERT", Token.INSERT); - map.put("FROM", Token.FROM); - map.put("WHERE", Token.WHERE); - map.put("AND", Token.AND); - map.put("OR", Token.OR); - map.put("XOR", Token.XOR); - map.put("DISTINCT", Token.DISTINCT); - map.put("UNIQUE", Token.UNIQUE); - map.put("ALL", Token.ALL); - map.put("UNION", Token.UNION); - map.put("INTERSECT", Token.INTERSECT); - map.put("MINUS", Token.MINUS); - map.put("INNER", Token.INNER); - map.put("LEFT", Token.LEFT); - map.put("RIGHT", Token.RIGHT); - map.put("FULL", Token.FULL); - map.put("ON", Token.ON); - map.put("OUTER", Token.OUTER); - map.put("JOIN", Token.JOIN); - map.put("NEW", Token.NEW); - map.put("CASE", Token.CASE); - map.put("WHEN", Token.WHEN); - map.put("END", Token.END); - map.put("WHEN", Token.WHEN); - map.put("ELSE", Token.ELSE); - map.put("EXISTS", Token.EXISTS); - map.put("CAST", Token.CAST); - map.put("IN", Token.IN); - map.put("ASC", Token.ASC); - map.put("DESC", Token.DESC); - map.put("LIKE", Token.LIKE); - map.put("ESCAPE", Token.ESCAPE); - map.put("BETWEEN", Token.BETWEEN); - map.put("INTERVAL", Token.INTERVAL); - map.put("LOCK", Token.LOCK); - map.put("SOME", Token.SOME); - map.put("ANY", Token.ANY); - map.put("TRUNCATE", Token.TRUNCATE); + public final static Keywords DEFAULT_MYSQL_KEYWORDS; - map.put("LIMIT", Token.LIMIT); - map.put("OFFSET", Token.OFFSET); - map.put("WINDOW", Token.WINDOW); - map.put("ROW", Token.ROW); - map.put("ROWS", Token.ROWS); - map.put("ONLY", Token.ONLY); - map.put("FIRST", Token.FIRST); - map.put("NEXT", Token.NEXT); - map.put("FETCH", Token.FETCH); - map.put("OF", Token.OF); - map.put("SHARE", Token.SHARE); - map.put("NOWAIT", Token.NOWAIT); - map.put("RECURSIVE", Token.RECURSIVE); - map.put("WITH", Token.WITH); + static { + Map map = new HashMap(); + map.put("EXISTS", Token.EXISTS); + map.put("THEN", Token.THEN); + map.put("AS", Token.AS); + map.put("GROUP", Token.GROUP); + map.put("BY", Token.BY); + map.put("HAVING", Token.HAVING); + map.put("DELETE", Token.DELETE); + map.put("ORDER", Token.ORDER); + map.put("INDEX", Token.INDEX); + map.put("FOR", Token.FOR); + map.put("SCHEMA", Token.SCHEMA); + map.put("FOREIGN", Token.FOREIGN); + map.put("REFERENCE", Token.REFERENCE); + map.put("REFERENCES", Token.REFERENCES); + map.put("CHECK", Token.CHECK); + map.put("PRIMARY", Token.PRIMARY); + map.put("KEY", Token.KEY); + map.put("CONSTRAINT", Token.CONSTRAINT); + map.put("DEFAULT", Token.DEFAULT); + map.put("VIEW", Token.VIEW); + map.put("CREATE", Token.CREATE); + map.put("VALUES", Token.VALUES); + map.put("ALTER", Token.ALTER); + map.put("TABLE", Token.TABLE); + map.put("DROP", Token.DROP); + map.put("SET", Token.SET); + map.put("INTO", Token.INTO); + map.put("UPDATE", Token.UPDATE); + map.put("NULL", Token.NULL); + map.put("IS", Token.IS); + map.put("NOT", Token.NOT); + map.put("SELECT", Token.SELECT); + map.put("INSERT", Token.INSERT); + map.put("FROM", Token.FROM); + map.put("WHERE", Token.WHERE); + map.put("AND", Token.AND); + map.put("OR", Token.OR); + map.put("XOR", Token.XOR); + map.put("DISTINCT", Token.DISTINCT); + map.put("UNIQUE", Token.UNIQUE); + map.put("ALL", Token.ALL); + map.put("UNION", Token.UNION); + map.put("INTERSECT", Token.INTERSECT); + map.put("MINUS", Token.MINUS); + map.put("INNER", Token.INNER); + map.put("LEFT", Token.LEFT); + map.put("RIGHT", Token.RIGHT); + map.put("FULL", Token.FULL); + map.put("ON", Token.ON); + map.put("OUTER", Token.OUTER); + map.put("JOIN", Token.JOIN); + map.put("NEW", Token.NEW); + map.put("CASE", Token.CASE); + map.put("WHEN", Token.WHEN); + map.put("END", Token.END); + map.put("WHEN", Token.WHEN); + map.put("ELSE", Token.ELSE); + map.put("EXISTS", Token.EXISTS); + map.put("CAST", Token.CAST); + map.put("IN", Token.IN); + map.put("ASC", Token.ASC); + map.put("DESC", Token.DESC); + map.put("LIKE", Token.LIKE); + map.put("ESCAPE", Token.ESCAPE); + map.put("BETWEEN", Token.BETWEEN); + map.put("INTERVAL", Token.INTERVAL); + map.put("LOCK", Token.LOCK); + map.put("SOME", Token.SOME); + map.put("ANY", Token.ANY); + map.put("TRUNCATE", Token.TRUNCATE); + + map.put("LIMIT", Token.LIMIT); + map.put("OFFSET", Token.OFFSET); + map.put("WINDOW", Token.WINDOW); + map.put("ROW", Token.ROW); + map.put("ROWS", Token.ROWS); + map.put("ONLY", Token.ONLY); + map.put("FIRST", Token.FIRST); + map.put("NEXT", Token.NEXT); + map.put("FETCH", Token.FETCH); + map.put("OF", Token.OF); + map.put("SHARE", Token.SHARE); + map.put("NOWAIT", Token.NOWAIT); + map.put("RECURSIVE", Token.RECURSIVE); + map.put("WITH", Token.WITH); + map.put("RESTART", Token.RESTART); + map.put("CONTINUE", Token.CONTINUE); + map.put("IDENTITY", Token.IDENTITY); + map.put("CASCADE", Token.CASCADE); + map.put("RESTRICT", Token.RESTRICT); + + DEFAULT_MYSQL_KEYWORDS = new Keywords(map); + } - DEFAULT_MYSQL_KEYWORDS = new Keywords(map); - } public PGLexer(String input){ super(input); super.keywods = DEFAULT_MYSQL_KEYWORDS; 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 cce75f0988..15c6ea4af0 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -526,7 +526,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLDropTableStatement x) { print("DROP TABLE "); - x.getName().accept(this); + printAndAccept(x.getTableNames(), ", "); return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/TruncateTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/TruncateTest.java index 8ca5384270..ef9d5631ae 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/TruncateTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/TruncateTest.java @@ -12,9 +12,10 @@ import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Column; public class TruncateTest extends PGTest { - public void test_0() throws Exception { - String sql = "TRUNCATE bigtable, fattable;"; - + + public void test_0() throws Exception { + String sql = "TRUNCATE bigtable, fattable;"; + PGSQLStatementParser parser = new PGSQLStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement statemen = statementList.get(0); @@ -24,13 +25,56 @@ public class TruncateTest extends PGTest { PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); statemen.accept(visitor); - + System.out.println("Tables : " + visitor.getTables()); System.out.println("fields : " + visitor.getFields()); - + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("bigtable"))); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("fattable"))); - + Assert.assertTrue(visitor.getFields().size() == 0); - } + } + + public void test_1() throws Exception { + String sql = "TRUNCATE bigtable, fattable RESTART IDENTITY;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getFields()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("bigtable"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("fattable"))); + + Assert.assertTrue(visitor.getFields().size() == 0); + } + + public void test_2() throws Exception { + String sql = "TRUNCATE othertable CASCADE;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getFields()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("othertable"))); + + Assert.assertTrue(visitor.getFields().size() == 0); + } }