From b7214015a239d0b80604d61d5bb689bb5b4d116d Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 22 Jan 2018 22:58:33 +0800 Subject: [PATCH] improved mysql parser. bug fixed for issue #2263 --- .../SQLAlterTableDiscardPartition.java | 9 +++++ .../mysql/parser/MySqlStatementParser.java | 5 +++ .../sql/visitor/SQLASTOutputVisitor.java | 5 +++ .../mysql/alter/MySqlAlterTableTest32.java | 37 +++++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/alter/MySqlAlterTableTest32.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDiscardPartition.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDiscardPartition.java index 0d5895a57c..f96b06df75 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDiscardPartition.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDiscardPartition.java @@ -25,6 +25,7 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLAlterTableDiscardPartition extends SQLObjectImpl implements SQLAlterTableItem { private final List partitions = new ArrayList(4); + private boolean tablespace; public List getPartitions() { return partitions; @@ -44,4 +45,12 @@ public class SQLAlterTableDiscardPartition extends SQLObjectImpl implements SQLA } visitor.endVisit(this); } + + public boolean isTablespace() { + return tablespace; + } + + public void setTablespace(boolean tablespace) { + this.tablespace = tablespace; + } } 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 417dfe631d..18564d09b5 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 @@ -3712,6 +3712,11 @@ public class MySqlStatementParser extends SQLStatementParser { this.exprParser.names(item.getPartitions(), item); } + if (lexer.token() == Token.TABLESPACE) { + lexer.nextToken(); + item.setTablespace(true); + } + stmt.addItem(item); } else { accept(Token.TABLESPACE); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index acf96a77bc..bafd60756e 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -5188,6 +5188,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet public boolean visit(SQLAlterTableDiscardPartition x) { print0(ucase ? "DISCARD PARTITION " : "discard partition "); printPartitions(x.getPartitions()); + + if (x.isTablespace()) { + print0(ucase ? " TABLESPACE" : " tablespace"); + } + return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/alter/MySqlAlterTableTest32.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/alter/MySqlAlterTableTest32.java new file mode 100644 index 0000000000..38ef74ff10 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/alter/MySqlAlterTableTest32.java @@ -0,0 +1,37 @@ +/* + * 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.alter; + +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.parser.Token; +import junit.framework.TestCase; +import org.junit.Assert; + +public class MySqlAlterTableTest32 extends TestCase { + + public void test_alter_add_key() throws Exception { + String sql = "ALTER TABLE src.`part_tab` DISCARD PARTITION p10 TABLESPACE"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE src.`part_tab`\n" + + "\tDISCARD PARTITION p10 TABLESPACE", output); + } +}