diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 36aa34c119..a5613cc84e 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1371,15 +1371,12 @@ public SQLExpr primary() { } throw new ParserException("ERROR. " + lexer.info()); case LBRACKET: - if (dbType == DbType.odps || dbType == DbType.clickhouse) { - SQLArrayExpr array = new SQLArrayExpr(); - lexer.nextToken(); - this.exprList(array.getValues(), array); - accept(Token.RBRACKET); - sqlExpr = array; - break; - } - throw new ParserException("ERROR. " + lexer.info()); + SQLArrayExpr arrayTmp = new SQLArrayExpr(); + lexer.nextToken(); + this.exprList(arrayTmp.getValues(), arrayTmp); + accept(Token.RBRACKET); + sqlExpr = arrayTmp; + break; case ON: if (dbType == DbType.postgresql) { String methodName = lexer.stringVal(); diff --git a/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/issues/Issue5908.java b/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/issues/Issue5908.java new file mode 100644 index 0000000000..5c6d34347f --- /dev/null +++ b/core/src/test/java/com/alibaba/druid/bvt/sql/mysql/issues/Issue5908.java @@ -0,0 +1,57 @@ +package com.alibaba.druid.bvt.sql.mysql.issues; + +import java.util.List; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.SQLParseAssertUtil; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.parser.Token; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @author lizongbo + * @see Issue来源 + */ +public class Issue5908 { + + @Test + public void test_parse_brackets() { + for (DbType dbType : new DbType[]{DbType.mysql}) { + for (String sql : new String[]{ + "select array_length(['1'])", // https://github.com/alibaba/druid/issues/5743 + "SELECT CONCAT(date_id, ' ', e1, e2) hour_minute1 \n" + + "from (select 1 k1) AS t,\n" + + "(SELECT date_id FROM dim_date \n" + + "WHERE date_id between date_format(DATE_SUB(20240513, INTERVAL 7 DAY), 'yyyy-MM-dd') AND date_format(20240513, 'yyyy-MM-dd')) dd\n" + + "lateral VIEW explode(['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23']) tmp1 as e1\n" + + "lateral VIEW explode([':00:00', ':30:00']) tmp2 AS e2;", + }) { + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List statementList = parser.parseStatementList(); + System.out.println(statementList); + assertEquals(1, statementList.size()); + SQLParseAssertUtil.assertParseSql(sql, dbType); + } + } + } + + @Test + public void test_parse_brackets2() { + for (DbType dbType : new DbType[]{DbType.postgresql}) { + for (String sql : new String[]{ + "SELECT t.name AS 用户(一类)名称 FROM user_table t", + }) { + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List statementList = parser.parseStatementList(); + System.out.println(statementList); + assertEquals(1, statementList.size()); + SQLParseAssertUtil.assertParseSql(sql, dbType); + } + } + } +}