From a68a56af0fa6d6ba81378116fb288f6dc2395e49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E5=A4=95?= Date: Fri, 15 Dec 2017 16:47:37 +0800 Subject: [PATCH] bug fixed: withSubQuery parser for mysql --- .../mysql/parser/MySqlSelectParser.java | 2 +- .../sql/mysql/insert/MySqlInsertTest_17.java | 62 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/insert/MySqlInsertTest_17.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 627970a09f..cf06f8b591 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 @@ -229,7 +229,7 @@ public class MySqlSelectParser extends SQLSelectParser { accept(Token.RPAREN); SQLSelectQuery query = queryRest(select.getQuery()); - if (query instanceof SQLUnionQuery) { + if (query instanceof SQLUnionQuery && select.getWithSubQuery() == null) { select.getQuery().setBracket(true); tableSource = new SQLUnionQueryTableSource((SQLUnionQuery) query); } else { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/insert/MySqlInsertTest_17.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/insert/MySqlInsertTest_17.java new file mode 100644 index 0000000000..0ba2dead84 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/insert/MySqlInsertTest_17.java @@ -0,0 +1,62 @@ +package com.alibaba.druid.bvt.sql.mysql.insert; + +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.ast.statement.MySqlInsertStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import org.junit.Assert; + +import java.util.List; + +public class MySqlInsertTest_17 extends MysqlTest { + + public void test_insert_rollback_on_fail() throws Exception { + String sql = "INSERT INTO dashboard_crowd_analysis(cname,cvalue,orders,users,dt,tagid)\n" + + "SELECT x.cname as cname,\n" + " x.cvalue as cvalue,\n" + " x.orders as orders,\n" + + " x.users as users,\n" + " 20171211 as dt,\n" + " 91 as tagid\n" + + "FROM (WITH h AS\n" + " (SELECT a.userid,\n" + " a.col_1,\n" + + " a.col_2,\n" + " a.col_3,\n" + " a.col_4,\n" + + " a.col_5,\n" + " a.col_6,\n" + " c.orders_week\n" + + " FROM\n" + " (SELECT userid,\n" + " col_1,\n" + + " col_2,\n" + " col_3,\n" + " col_4,\n" + + " col_5,\n" + " col_6\n" + + " FROM ofo_personas_dimensions\n" + " WHERE dt=20171211)a\n" + + " JOIN\n" + " (SELECT userid\n" + " FROM personas_user_tag\n" + + " WHERE tagid=91)b ON a.userid=b.userid\n" + " JOIN\n" + + " (SELECT userid,\n" + " orders_week\n" + + " FROM ofo_personas_metrics\n" + + " WHERE dt=20171211)c ON a.userid=c.userid)\n" + " SELECT 'col_1' as cname,\n" + + " col_1 as cvalue,\n" + " sum(orders_week) AS orders,\n" + + " count(userid) AS users\n" + " FROM h\n" + " GROUP BY col_1\n" + + " UNION ALL\n" + " SELECT 'col_2' as cname,\n" + " col_2 as cvalue,\n" + + " sum(orders_week) AS orders,\n" + " count(userid) AS users\n" + + " FROM h\n" + " GROUP BY col_2)x"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + MySqlInsertStatement insertStmt = (MySqlInsertStatement) stmt; + // System.out.println(SQLUtils.toMySqlString(insertStmt)); + + String formatSql = "INSERT INTO dashboard_crowd_analysis (cname, cvalue, orders, users, dt\n" + "\t, tagid)\n" + + "SELECT x.cname AS cname, x.cvalue AS cvalue, x.orders AS orders, x.users AS users, 20171211 AS dt\n" + + "\t, 91 AS tagid\n" + "FROM (\n" + "\tWITH h AS (\n" + + "\t\t\tSELECT a.userid, a.col_1, a.col_2, a.col_3, a.col_4\n" + + "\t\t\t\t, a.col_5, a.col_6, c.orders_week\n" + "\t\t\tFROM (\n" + + "\t\t\t\tSELECT userid, col_1, col_2, col_3, col_4\n" + "\t\t\t\t\t, col_5, col_6\n" + + "\t\t\t\tFROM ofo_personas_dimensions\n" + "\t\t\t\tWHERE dt = 20171211\n" + "\t\t\t) a\n" + + "\t\t\t\tJOIN (\n" + "\t\t\t\t\tSELECT userid\n" + "\t\t\t\t\tFROM personas_user_tag\n" + + "\t\t\t\t\tWHERE tagid = 91\n" + "\t\t\t\t) b\n" + "\t\t\t\tON a.userid = b.userid\n" + + "\t\t\t\tJOIN (\n" + "\t\t\t\t\tSELECT userid, orders_week\n" + + "\t\t\t\t\tFROM ofo_personas_metrics\n" + "\t\t\t\t\tWHERE dt = 20171211\n" + + "\t\t\t\t) c\n" + "\t\t\t\tON a.userid = c.userid\n" + "\t\t)\n" + + "\tSELECT 'col_1' AS cname, col_1 AS cvalue, SUM(orders_week) AS orders\n" + + "\t\t, COUNT(userid) AS users\n" + "\tFROM h\n" + "\tGROUP BY col_1\n" + "\tUNION ALL\n" + + "\tSELECT 'col_2' AS cname, col_2 AS cvalue, SUM(orders_week) AS orders\n" + + "\t\t, COUNT(userid) AS users\n" + "\tFROM h\n" + "\tGROUP BY col_2\n" + ") x"; + Assert.assertEquals(formatSql, SQLUtils.toMySqlString(insertStmt)); + } + +}