From 11ff35f4aea5e95b670694411574d2438c5e8d54 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 13 Jul 2016 09:32:12 +0800 Subject: [PATCH] improved mysql parser Kill_Statement support. issue #1326 --- .../ast/statement/MySqlKillStatement.java | 19 ++++++++++++------ .../mysql/parser/MySqlStatementParser.java | 7 ++++--- .../mysql/visitor/MySqlOutputVisitor.java | 5 ++++- .../mysql/visitor/MySqlSchemaStatVisitor.java | 2 +- .../druid/bvt/sql/mysql/Kill_Test.java | 20 +++++++++++++++++++ 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlKillStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlKillStatement.java index cc70cb8105..c84f427f8a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlKillStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlKillStatement.java @@ -15,16 +15,19 @@ */ package com.alibaba.druid.sql.dialect.mysql.ast.statement; +import java.util.ArrayList; +import java.util.List; + import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; public class MySqlKillStatement extends MySqlStatementImpl { - private Type type; - private SQLExpr threadId; + private Type type; + private List threadIds = new ArrayList(); public static enum Type { - CONNECTION, QUERY + CONNECTION, QUERY } public Type getType() { @@ -36,16 +39,20 @@ public class MySqlKillStatement extends MySqlStatementImpl { } public SQLExpr getThreadId() { - return threadId; + return threadIds.get(0); } public void setThreadId(SQLExpr threadId) { - this.threadId = threadId; + this.threadIds.set(0, threadId); + } + + public List getThreadIds() { + return threadIds; } public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { - acceptChild(visitor, threadId); + acceptChild(visitor, threadIds); } 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 26cf93139d..80a04965a3 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 @@ -33,6 +33,7 @@ import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; +import com.alibaba.druid.sql.ast.expr.SQLListExpr; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; @@ -508,13 +509,13 @@ public class MySqlStatementParser extends SQLStatementParser { } else if (identifierEquals("QUERY")) { stmt.setType(MySqlKillStatement.Type.QUERY); lexer.nextToken(); + } else if (lexer.token() == Token.LITERAL_INT) { + // skip } else { throw new ParserException("not support kill type " + lexer.token()); } - SQLExpr threadId = this.exprParser.expr(); - stmt.setThreadId(threadId); - + this.exprParser.exprList(stmt.getThreadIds(), stmt); return stmt; } 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 dedad6c518..93412e297d 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 @@ -1492,8 +1492,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV print0(ucase ? "KILL CONNECTION " : "kill connection "); } else if (MySqlKillStatement.Type.QUERY.equals(x.getType())) { print0(ucase ? "KILL QUERY " : "kill query "); + } else { + print0(ucase ? "KILL " : "kill "); } - x.getThreadId().accept(this); + + printAndAccept(x.getThreadIds(), ", "); return false; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 108eade106..1f2c4d40a1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -448,7 +448,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public boolean visit(MySqlKillStatement x) { - return true; + return false; } @Override diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/Kill_Test.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/Kill_Test.java index 8578470a8e..6755a1701c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/Kill_Test.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/Kill_Test.java @@ -48,7 +48,27 @@ public class Kill_Test extends TestCase { Assert.assertEquals("KILL CONNECTION 233;", text); } + public void test_2() throws Exception { + String sql = "KILL 233"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List stmtList = parser.parseStatementList(); + + String text = output(stmtList); + + Assert.assertEquals("KILL 233;", text); + } + public void test_3() throws Exception { + String sql = "KILL 233,234"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List stmtList = parser.parseStatementList(); + + String text = output(stmtList); + + Assert.assertEquals("KILL 233, 234;", text); + } private String output(List stmtList) { StringBuilder out = new StringBuilder();