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 4b4b06db45..4a5430a375 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -3733,9 +3733,13 @@ public class SQLExprParser extends SQLParser { if (lexer.token == Token.LPAREN) { lexer.nextToken(); - SQLExpr arg = this.expr(); - arg.setParent(charType); - charType.addArgument(arg); + if (typeNameHashCode == FnvHash.Constants.ENUM) { + exprList(charType.getArguments(), charType); + } else { + SQLExpr arg = this.expr(); + arg.setParent(charType); + charType.addArgument(arg); + } accept(Token.RPAREN); } @@ -3905,6 +3909,7 @@ public class SQLExprParser extends SQLParser { || hash == FnvHash.Constants.TEXT || hash == FnvHash.Constants.MEDIUMTEXT || hash == FnvHash.Constants.LONGTEXT + || hash == FnvHash.Constants.ENUM ; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateFunctionTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateFunctionTest_1.java new file mode 100644 index 0000000000..aef362cbc9 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateFunctionTest_1.java @@ -0,0 +1,70 @@ +/* + * 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.mysql.create; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class MySqlCreateFunctionTest_1 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "sql : \n" + + " create function `test1`.`proc1`(`a` enum('1','2') charset utf8)\n" + + " returns int(10)\n" + + " DETERMINISTIC \n" + + " BEGIN\n" + + " return 0;\n" + + " END "; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); + SQLStatement stmt = statementList.get(0); +// print(statementList); + assertEquals(1, statementList.size()); + + System.out.println(SQLUtils.toMySqlString(stmt)); + + assertEquals("CREATE PROCEDURE `load_part_tab` ()\n" + + "BEGIN\n" + + "\tDECLARE v INT DEFAULT 0;\n" + + "\tWHILE v < 1 DO\n" + + "\tINSERT INTO part_tab\n" + + "\tVALUES (v, 'testing partitions', ADDDATE('1995-01-01', RAND(v) * 36520 % 3652));\n" + + "\tSET v = v + 1;\n" + + "\tEND WHILE;\n" + + "END", SQLUtils.toMySqlString(stmt)); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); + 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()); + + assertEquals(1, visitor.getTables().size()); + assertEquals(0, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + + assertTrue(visitor.containsTable("part_tab")); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest15.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest15.java index ca5c4e8233..379374e872 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest15.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest15.java @@ -17,7 +17,13 @@ package com.alibaba.druid.bvt.sql.mysql.create; import com.alibaba.druid.sql.MysqlTest; import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLDataType; +import com.alibaba.druid.sql.ast.SQLParameter; import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateFunctionStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateProcedureStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.util.JdbcConstants; @@ -26,46 +32,24 @@ import java.util.List; public class MySqlCreateProcedureTest15 extends MysqlTest { public void test_0() throws Exception { - String sql = "CREATE DEFINER=`root`@`%` PROCEDURE `load_part_tab`()\n" + - "BEGIN \n" + - "DECLARE v INT DEFAULT 0; \n" + - "WHILE v < 1 DO \n" + - "INSERT INTO part_tab \n" + - "VALUES (v,'testing partitions',ADDDATE('1995-01-01',(RAND(v)*36520) MOD 3652)); \n" + - "SET v = v + 1; \n" + - "END WHILE; \n" + - "END"; + String sql = " create function `test1`.`proc1`(`a` enum('1','2') charset utf8)\n" + + " returns int(10)\n" + + " DETERMINISTIC \n" + + " BEGIN\n" + + " return 0;\n" + + " END "; - List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); - SQLStatement stmt = statementList.get(0); -// print(statementList); - assertEquals(1, statementList.size()); + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, JdbcConstants.MYSQL, false); + SQLCreateFunctionStatement stmt = parser.parseCreateFunction(); + assertEquals(1, stmt.getParameters().size()); - System.out.println(SQLUtils.toMySqlString(stmt)); - - assertEquals("CREATE PROCEDURE `load_part_tab` ()\n" + + assertEquals("CREATE FUNCTION `test1`.`proc1` (\n" + + "\t`a` enum('1', '2') CHARACTER SET utf8\n" + + ")\n" + + "RETURNS int(10) DETERMINISTIC\n" + "BEGIN\n" + - "\tDECLARE v INT DEFAULT 0;\n" + - "\tWHILE v < 1 DO\n" + - "\tINSERT INTO part_tab\n" + - "\tVALUES (v, 'testing partitions', ADDDATE('1995-01-01', RAND(v) * 36520 % 3652));\n" + - "\tSET v = v + 1;\n" + - "\tEND WHILE;\n" + - "END", SQLUtils.toMySqlString(stmt)); - - SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); - 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()); - - assertEquals(1, visitor.getTables().size()); - assertEquals(0, visitor.getColumns().size()); - assertEquals(0, visitor.getConditions().size()); - - assertTrue(visitor.containsTable("part_tab")); + "\tRETURN 0;\n" + + "END", stmt.toString()); }