diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java index b250580425..f5df671240 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java @@ -16,9 +16,11 @@ package com.alibaba.druid.sql.dialect.postgresql.parser; import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.SQLArrayDataType; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.*; +import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.*; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.SQLExprParser; @@ -72,6 +74,18 @@ public class PGExprParser extends SQLExprParser { } return super.parseDataType(); } + + protected SQLDataType parseDataTypeRest(SQLDataType dataType) { + dataType = super.parseDataTypeRest(dataType); + + if (lexer.token() == Token.LBRACKET) { + lexer.nextToken(); + accept(Token.RBRACKET); + dataType = new SQLArrayDataType(dataType); + } + + return dataType; + } public PGSelectParser createSelectParser() { return new PGSelectParser(this); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java index 4486608f44..700ec074ae 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java @@ -2506,4 +2506,11 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor return false; } + public boolean visit(SQLArrayDataType x) { + x.getComponentType().accept(this); + print('['); + printAndAccept(x.getArguments(), ", "); + print(']'); + return false; + } } 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 823cc0b2dd..5ba4a4e39d 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -3836,6 +3836,8 @@ public class SQLExprParser extends SQLParser { if (lexer.identifierEquals(FnvHash.Constants.ARRAY)) { return parseDataTypeRest(charType); + } else if (lexer.token == Token.LBRACKET) { + return parseDataTypeRest(charType); } return charType; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/expr/ArrayTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/expr/ArrayTest.java new file mode 100644 index 0000000000..715d6754c5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/expr/ArrayTest.java @@ -0,0 +1,21 @@ +package com.alibaba.druid.bvt.sql.postgresql.expr; + + + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGMacAddrExpr; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGExprParser; +import org.junit.Assert; + + +public class ArrayTest extends PGTest { + public void test_timestamp() throws Exception { + String sql = "cast(xx as varchar(12)[])"; + PGExprParser parser = new PGExprParser(sql); + SQLExpr expr =parser.expr(); + Assert.assertEquals("CAST(xx AS varchar(12)[])", SQLUtils.toPGString(expr)); + } +}