From 881851976769d07d90918fa0719e5edfce4505b5 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 3 Oct 2017 15:52:24 +0800 Subject: [PATCH] improved sql parser. for issue #1675 --- .../mysql/parser/MySqlCreateTableParser.java | 3 + .../mysql/visitor/MySqlOutputVisitor.java | 4 +- .../createTable/MySqlCreateTableTest80.java | 56 +++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest80.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java index ddb29dbb3d..390b92567d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java @@ -110,6 +110,9 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { lexer.nextToken(); SQLName name = this.exprParser.name(); stmt.setLike(name); + } else if (lexer.token() == Token.SELECT) { + SQLSelect query = new MySqlSelectParser(this.exprParser).select(); + stmt.setSelect(query); } else { for (;;) { if (lexer.token() == Token.IDENTIFIER // 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 761f72af98..74b51cedc2 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 @@ -484,10 +484,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } if (x.getSelect() != null) { - this.indentCount++; + println(); + print0(ucase ? "AS" : "as"); println(); x.getSelect().accept(this); - this.indentCount--; } for (SQLCommentHint hint : x.getOptionHints()) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest80.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest80.java new file mode 100644 index 0000000000..3ace4d8f85 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest80.java @@ -0,0 +1,56 @@ +/* + * Copyright 1999-2017 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.createTable; + +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.Column; + +public class MySqlCreateTableTest80 extends MysqlTest { + + public void test_one() throws Exception { + String sql = "create table tb1(select * from tb2)"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseCreateTable(); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); +// +// Column column = visitor.getColumn("tb_custom_vip_show_message", "custom_vip_show_message_seq"); +// assertNotNull(column); +// assertEquals("INT", column.getDataType()); + + { + String output = SQLUtils.toMySqlString(stmt); + assertEquals("CREATE TABLE tb1\n" + + "AS\n" + + "SELECT *\n" + + "FROM tb2", output); + } + + { + String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + assertEquals("create table tb1\n" + + "as\n" + + "select *\n" + + "from tb2", output); + } + } +}