diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 2b42fa5b77..c5332c0b89 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -3758,7 +3758,8 @@ public class SQLExprParser extends SQLParser { return unionType; } - if (lexer.identifierEquals(FnvHash.Constants.GENERATED)) { + if (lexer.identifierEquals(FnvHash.Constants.GENERATED) + || lexer.identifierEquals(FnvHash.Constants.RENAME)) { return null; } @@ -4264,8 +4265,29 @@ public class SQLExprParser extends SQLParser { SQLExpr unitIndex = primary(); column.setStep(unitIndex); } + } else if (lexer.token == Token.LPAREN) { + lexer.nextToken(); + SQLColumnDefinition.Identity ident = new SQLColumnDefinition.Identity(); + if (lexer.token == Token.LITERAL_INT) { + ident.setSeed(lexer.integerValue().intValue()); + lexer.nextToken(); + } else { + throw new ParserException("TODO : " + lexer.info()); + } + if (lexer.token == Token.COMMA) { + lexer.nextToken(); + if (lexer.token == Token.LITERAL_INT) { + ident.setIncrement(lexer.integerValue().intValue()); + lexer.nextToken(); + } else { + throw new ParserException("TODO : " + lexer.info()); + } + } + column.setIdentity(ident); + + accept(Token.RPAREN); } return parseColumnRest(column); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index fc25a35ac7..6a2d76b190 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -1799,6 +1799,13 @@ public class SQLStatementParser extends SQLParser { } else if (lexer.token == Token.IDENTIFIER) { SQLAlterTableAddColumn item = parseAlterTableAddColumn(); stmt.addItem(item); + } else if (lexer.token == LPAREN) { + if (dbType == DbType.h2) { + lexer.nextToken(); + SQLAlterTableAddColumn item = parseAlterTableAddColumn(); + stmt.addItem(item); + accept(RPAREN); + } } else if (lexer.token == Token.COLUMN) { lexer.nextToken(); SQLAlterTableAddColumn item = parseAlterTableAddColumn(); diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java index a03b208b0b..4b4a36931a 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -68,8 +68,6 @@ public enum Token { FOR("FOR"), IF("IF"), - - GLOBAL("GLOBAL"), ALL("ALL"), UNION("UNION"), diff --git a/src/test/java/com/alibaba/druid/bvt/sql/h2/H2ResourceTest.java b/src/test/java/com/alibaba/druid/bvt/sql/h2/H2ResourceTest.java new file mode 100644 index 0000000000..35fc82855c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/h2/H2ResourceTest.java @@ -0,0 +1,101 @@ +/* + * Copyright 1999-2018 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.h2; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.h2.parser.H2StatementParser; +import com.alibaba.druid.sql.dialect.h2.visitor.H2OutputVisitor; +import com.alibaba.druid.sql.dialect.h2.visitor.H2SchemaStatVisitor; +import com.alibaba.druid.util.JdbcUtils; +import com.alibaba.druid.util.Utils; +import junit.framework.TestCase; +import org.junit.Assert; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.List; + +public class H2ResourceTest extends TestCase { + + public void test_0() throws Exception { + exec_test("bvt/parser/h2-0.txt"); + } + + public void test_1() throws Exception { + exec_test("bvt/parser/h2-1.txt"); + } + + public void test_2() throws Exception { + exec_test("bvt/parser/h2-2.txt"); + } + + public void exec_test(String resource) throws Exception { + System.out.println(resource); + InputStream is = null; + + is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource); + Reader reader = new InputStreamReader(is, "UTF-8"); + String input = Utils.read(reader); + JdbcUtils.close(reader); + String[] items = input.split("---------------------------"); + String sql = items[0].trim(); + String expect = items[1].trim(); + if (expect != null) { + expect = expect.replaceAll("\\r\\n", "\n"); + } + + H2StatementParser parser = new H2StatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + H2SchemaStatVisitor visitor = new H2SchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println(sql); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + + System.out.println(); + System.out.println(); + + if (expect != null && !expect.isEmpty()) { + assertEquals(expect, stmt.toString()); + } + } + + void mergValidate(String sql, String expect) { + H2StatementParser parser = new H2StatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + StringBuilder out = new StringBuilder(); + H2OutputVisitor visitor = new H2OutputVisitor(out); + stmt.accept(visitor); + + System.out.println(out.toString()); + + Assert.assertEquals(expect, out.toString()); + } + + +} diff --git a/src/test/resources/bvt/parser/h2-0.txt b/src/test/resources/bvt/parser/h2-0.txt new file mode 100644 index 0000000000..db4d7b51c8 --- /dev/null +++ b/src/test/resources/bvt/parser/h2-0.txt @@ -0,0 +1,16 @@ +CREATE TABLE active_rule_parameters ( + id INTEGER NOT NULL AUTO_INCREMENT (1,1), + active_rule_id INTEGER NOT NULL, + rules_parameter_id INTEGER NOT NULL, + value VARCHAR (4000) NULL,rules_parameter_key VARCHAR (128) NULL, + CONSTRAINT pk_active_rule_parameters PRIMARY KEY (id)) + +--------------------------- +CREATE TABLE active_rule_parameters ( + id INTEGER AUTO_INCREMENT NOT NULL AS IDENTITY (1, 1), + active_rule_id INTEGER NOT NULL, + rules_parameter_id INTEGER NOT NULL, + value VARCHAR(4000) NULL, + rules_parameter_key VARCHAR(128) NULL, + CONSTRAINT pk_active_rule_parameters PRIMARY KEY (id) +) \ No newline at end of file diff --git a/src/test/resources/bvt/parser/h2-1.txt b/src/test/resources/bvt/parser/h2-1.txt new file mode 100644 index 0000000000..5e01a45522 --- /dev/null +++ b/src/test/resources/bvt/parser/h2-1.txt @@ -0,0 +1,4 @@ +ALTER TABLE ce_task_message ADD (message_type VARCHAR (255) NULL) +--------------------------- +ALTER TABLE ce_task_message + ADD (message_type VARCHAR(255) NULL) \ No newline at end of file diff --git a/src/test/resources/bvt/parser/h2-2.txt b/src/test/resources/bvt/parser/h2-2.txt new file mode 100644 index 0000000000..0980ac69bc --- /dev/null +++ b/src/test/resources/bvt/parser/h2-2.txt @@ -0,0 +1,5 @@ +ALTER TABLE analysis_properties ALTER COLUMN snapshot_uuid RENAME TO analysis_uuid +--------------------------- +ALTER TABLE analysis_properties + ALTER COLUMN snapshot_uuid, + RENAME TO analysis_uuid \ No newline at end of file