From 5b6b8b8b76a94d5c70b5fb38f13676b4ee01657d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Wed, 22 Feb 2012 20:25:36 +0800 Subject: [PATCH] sql parser support drop table --- .../druid/sql/parser/SQLStatementParser.java | 22 +++++++--- .../druid/sql/visitor/SchemaStatVisitor.java | 31 ++++++++++++++ .../com/alibaba/druid/stat/TableStat.java | 24 +++++++++-- .../bvt/sql/postgresql/DropTableTest.java | 41 +++++++++++++++++++ 4 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/postgresql/DropTableTest.java 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 8e7d04cdcd..51ac7f713d 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -111,12 +111,24 @@ public class SQLStatementParser extends SQLParser { if (lexer.token() == Token.TABLE) { lexer.nextToken(); - SQLName name = this.exprParser.name(); - statementList.add(new SQLDropTableStatement(name)); + + SQLDropTableStatement stmt = new SQLDropTableStatement(); + + for (;;) { + SQLName name = this.exprParser.name(); + stmt.getTableNames().add(name); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + + statementList.add(stmt); continue; } } - + if (lexer.token() == Token.TRUNCATE) { SQLStatement stmt = parseTruncate(); statementList.add(stmt); @@ -136,9 +148,9 @@ public class SQLStatementParser extends SQLParser { throw new ParserException("TODO " + lexer.token()); } } - + public SQLStatement parseTruncate() { - throw new ParserException("TODO " + lexer.token()); + throw new ParserException("TODO " + lexer.token()); } public SQLStatement parseInsert() { 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 75db082ea9..556a367015 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -14,6 +14,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; 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.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; @@ -65,6 +66,36 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } + + @Override + public boolean visit(SQLDropTableStatement x) { + x.putAttribute("_original_use_mode", modeLocal.get()); + modeLocal.set(Mode.Insert); + + aliasLocal.set(new HashMap()); + + String originalTable = currentTableLocal.get(); + + for (SQLName name : x.getTableNames()) { + String ident = name.toString(); + currentTableLocal.set(ident); + x.putAttribute("_old_local_", originalTable); + + TableStat stat = tableStats.get(ident); + if (stat == null) { + stat = new TableStat(); + tableStats.put(new TableStat.Name(ident), stat); + } + stat.incrementDropCount(); + + Map aliasMap = aliasLocal.get(); + if (aliasMap != null) { + aliasMap.put(ident, ident); + } + } + + return false; + } @Override public boolean visit(SQLInsertStatement x) { diff --git a/src/main/java/com/alibaba/druid/stat/TableStat.java b/src/main/java/com/alibaba/druid/stat/TableStat.java index c659e3d141..bbc1a49525 100644 --- a/src/main/java/com/alibaba/druid/stat/TableStat.java +++ b/src/main/java/com/alibaba/druid/stat/TableStat.java @@ -21,6 +21,19 @@ public class TableStat { int updateCount = 0; int deleteCount = 0; int insertCount = 0; + int dropCount = 0; + + public int getDropCount() { + return dropCount; + } + + public void incrementDropCount() { + dropCount++; + } + + public void setDropCount(int dropCount) { + this.dropCount = dropCount; + } public int getSelectCount() { return selectCount; @@ -73,16 +86,19 @@ public class TableStat { public String toString() { StringBuilder buf = new StringBuilder(4); if (insertCount > 0) { - buf.append("C"); + buf.append("Insert"); } if (updateCount > 0) { - buf.append("U"); + buf.append("Update"); } if (selectCount > 0) { - buf.append("R"); + buf.append("Selelct"); } if (deleteCount > 0) { - buf.append("D"); + buf.append("Delete"); + } + if (dropCount > 0) { + buf.append("Drop"); } return buf.toString(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/DropTableTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/DropTableTest.java new file mode 100644 index 0000000000..6c5ec0ad01 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/DropTableTest.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql.postgresql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class DropTableTest extends PGTest { + + public void test_0() throws Exception { + String sql = "DROP TABLE films, distributors;"; + + 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("films"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("distributors"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("films")).getDropCount() == 1); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("distributors")).getDropCount() == 1); + + Assert.assertTrue(visitor.getFields().size() == 0); + } + + +}