From 252c048fbfaac2b1256c3dc0b96fb478de567690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Thu, 5 May 2016 18:15:44 +0800 Subject: [PATCH] improved mysql sql parser support --- .../mysql/parser/MySqlSelectParser.java | 2 +- .../mysql/parser/MySqlStatementParser.java | 32 +------ .../simplejndi}/DruidDataSourceConverter.java | 0 .../bvt/sql/mysql/MySqlUpdateTest_6.java | 2 +- .../bvt/sql/mysql/MySqlUpdateTest_7.java | 87 +++++++++++++++++++ 5 files changed, 90 insertions(+), 33 deletions(-) rename src/main/java/com/alibaba/druid/{pool => support/simplejndi}/DruidDataSourceConverter.java (100%) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlUpdateTest_7.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java index 3ff115c917..a95353cf9d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java @@ -238,7 +238,7 @@ public class MySqlSelectParser extends SQLSelectParser { return tableSrc; } - private MySqlUpdateStatement parseUpdateStatment() { + protected MySqlUpdateStatement parseUpdateStatment() { MySqlUpdateStatement update = new MySqlUpdateStatement(); lexer.nextToken(); 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 6f7cfcac31..7ffb1f71ad 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 @@ -242,37 +242,7 @@ public class MySqlStatementParser extends SQLStatementParser { } public SQLUpdateStatement parseUpdateStatement() { - MySqlUpdateStatement stmt = createUpdateStatement(); - - if (lexer.token() == Token.UPDATE) { - lexer.nextToken(); - - if (identifierEquals(LOW_PRIORITY)) { - lexer.nextToken(); - stmt.setLowPriority(true); - } - - if (identifierEquals(IGNORE)) { - lexer.nextToken(); - stmt.setIgnore(true); - } - - SQLTableSource tableSource = this.exprParser.createSelectParser().parseTableSource(); - stmt.setTableSource(tableSource); - } - - parseUpdateSet(stmt); - - if (lexer.token() == (Token.WHERE)) { - lexer.nextToken(); - stmt.setWhere(this.exprParser.expr()); - } - - stmt.setOrderBy(this.exprParser.parseOrderBy()); - - stmt.setLimit(parseLimit()); - - return stmt; + return new MySqlSelectParser(this.exprParser).parseUpdateStatment(); } protected MySqlUpdateStatement createUpdateStatement() { diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSourceConverter.java b/src/main/java/com/alibaba/druid/support/simplejndi/DruidDataSourceConverter.java similarity index 100% rename from src/main/java/com/alibaba/druid/pool/DruidDataSourceConverter.java rename to src/main/java/com/alibaba/druid/support/simplejndi/DruidDataSourceConverter.java diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlUpdateTest_6.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlUpdateTest_6.java index 8dc9e63916..495742a0b7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlUpdateTest_6.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlUpdateTest_6.java @@ -30,7 +30,7 @@ import com.alibaba.druid.stat.TableStat.Column; public class MySqlUpdateTest_6 extends MysqlTest { public void test_0() throws Exception { - String sql = "/* 6445c36514623747244871009d62f9/0//sub_order_id:1462374729595/order_id:1462374729594/ */" + String sql = "/* 6445c36514623747244871009d62f9/0//sub_order_id:1234567890/order_id:123456/ */" + "SELECT id, user_id, item_id, sku_id, flag" + " , sellable_quantity, fff03, status, feature, feature_lock" + " , version, gmt_create, gmt_modified, root_id, parent_id, dist_type, dist_id" diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlUpdateTest_7.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlUpdateTest_7.java new file mode 100644 index 0000000000..9d25bac4bc --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlUpdateTest_7.java @@ -0,0 +1,87 @@ +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + +public class MySqlUpdateTest_7 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "UPDATE ROLLBACK_ON_FAIL TARGET_AFFECT_ROW 1 " + + "`table_3966` AS `table_3966_11` SET `version` = `version` + 3, `gmt_modified` = NOW(), `optype` = ?, `feature` = ? " + + "WHERE `sub_biz_order_id` = ? AND `biz_order_type` = ? AND `id` = ? AND `ti_id` = ? AND `optype` = ? AND `root_id` = ?"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); +// System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(9, visitor.getColumns().size()); + Assert.assertEquals(6, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("table_3966"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("table_3966", "sub_biz_order_id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("table_3966", "feature"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("table_3966", "id"))); + + { + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("UPDATE ROLLBACK_ON_FAIL TARGET_AFFECT_ROW 1 `table_3966` `table_3966_11`" + + "\nSET `version` = `version` + 3, `gmt_modified` = NOW(), `optype` = ?, `feature` = ?" + + "\nWHERE `sub_biz_order_id` = ?" + + "\n\tAND `biz_order_type` = ?" + + "\n\tAND `id` = ?" + + "\n\tAND `ti_id` = ?" + + "\n\tAND `optype` = ?" + + "\n\tAND `root_id` = ?", // + output); + } + { + String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + Assert.assertEquals("update rollback_on_fail target_affect_row 1 `table_3966` `table_3966_11`" + + "\nset `version` = `version` + 3, `gmt_modified` = NOW(), `optype` = ?, `feature` = ?" + + "\nwhere `sub_biz_order_id` = ?" + + "\n\tand `biz_order_type` = ?" + + "\n\tand `id` = ?" + + "\n\tand `ti_id` = ?" + + "\n\tand `optype` = ?" + + "\n\tand `root_id` = ?", // + output); + } + } +}