From 20acfee9edff6a98e696f75f48a28d912b0a992a Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 4 Sep 2017 14:23:43 +0800 Subject: [PATCH] bug fixed for postgresql parser. issue #1945 --- .../dialect/postgresql/visitor/PGOutputVisitor.java | 12 +++++++++++- .../bvt/sql/postgresql/select/PGSelectTest56.java | 8 ++++---- 2 files changed, 15 insertions(+), 5 deletions(-) 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 edc496e3a4..b20a279fe0 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 @@ -19,6 +19,7 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLLimit; import com.alibaba.druid.sql.ast.SQLSetQuantifier; import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGBoxExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr; @@ -409,7 +410,16 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor @Override public boolean visit(PGTypeCastExpr x) { - x.getExpr().accept(this); + SQLExpr expr = x.getExpr(); + if (expr != null) { + if (expr instanceof SQLBinaryOpExpr) { + print('('); + expr.accept(this); + print(')'); + } else { + expr.accept(this); + } + } print0("::"); x.getDataType().accept(this); return false; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest56.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest56.java index 2b5e063c0f..8d6329e430 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest56.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest56.java @@ -32,19 +32,19 @@ public class PGSelectTest56 extends TestCase { List stmtList = SQLUtils.parseStatements(sql, dbType); SQLStatement stmt = stmtList.get(0); - assertEquals("SELECT to_char(CreateDate || ' ' || CAST(HourArgment AS VARCHAR) || ':00:00'::TIMESTAMP, 'YYYY-MM-DD HH24') AS \"intoTime \"\n" + + assertEquals("SELECT to_char((CreateDate || ' ' || CAST(HourArgment AS VARCHAR) || ':00:00')::TIMESTAMP, 'YYYY-MM-DD HH24') AS \"intoTime \"\n" + "FROM analyzedata.StatTime cs\n" + "WHERE 1 = 1\n" + "\tAND cs.CreateDate >= to_date('2017-08-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')\n" + "\tAND cs.CreateDate <= to_date('2017-08-31 23:00:00', 'YYYY-MM-DD HH24:MI:SS')\n" + - "GROUP BY to_char(CreateDate || ' ' || CAST(HourArgment AS VARCHAR) || ':00:00'::TIMESTAMP, 'YYYY-MM-DD HH24')", SQLUtils.toPGString(stmt)); + "GROUP BY to_char((CreateDate || ' ' || CAST(HourArgment AS VARCHAR) || ':00:00')::TIMESTAMP, 'YYYY-MM-DD HH24')", SQLUtils.toPGString(stmt)); - assertEquals("select to_char(CreateDate || ' ' || cast(HourArgment as VARCHAR) || ':00:00'::TIMESTAMP, 'YYYY-MM-DD HH24') as \"intoTime \"\n" + + assertEquals("select to_char((CreateDate || ' ' || cast(HourArgment as VARCHAR) || ':00:00')::TIMESTAMP, 'YYYY-MM-DD HH24') as \"intoTime \"\n" + "from analyzedata.StatTime cs\n" + "where 1 = 1\n" + "\tand cs.CreateDate >= to_date('2017-08-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')\n" + "\tand cs.CreateDate <= to_date('2017-08-31 23:00:00', 'YYYY-MM-DD HH24:MI:SS')\n" + - "group by to_char(CreateDate || ' ' || cast(HourArgment as VARCHAR) || ':00:00'::TIMESTAMP, 'YYYY-MM-DD HH24')", SQLUtils.toPGString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + "group by to_char((CreateDate || ' ' || cast(HourArgment as VARCHAR) || ':00:00')::TIMESTAMP, 'YYYY-MM-DD HH24')", SQLUtils.toPGString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); assertEquals(1, stmtList.size());