From b0933fcd47fcf16fc9e5575689f06ab53d6fc8bc Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Sun, 12 Jun 2022 18:26:10 +0800 Subject: [PATCH] pg sql parser support interval --- .../dialect/postgresql/parser/PGExprParser.java | 2 +- .../sql/dialect/postgresql/parser/PGLexer.java | 1 + .../bvt/sql/postgresql/select/PGSelectTest86.java | 14 ++++++++------ 3 files changed, 10 insertions(+), 7 deletions(-) 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 f5df671240..423c07c181 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 @@ -156,7 +156,7 @@ public class PGExprParser extends SQLExprParser { protected SQLExpr parseInterval() { accept(Token.INTERVAL); SQLIntervalExpr intervalExpr = new SQLIntervalExpr(); - if (lexer.token() != Token.LITERAL_CHARS) { + if (lexer.token() != Token.LITERAL_CHARS && lexer.token() != Token.LITERAL_INT) { return new SQLIdentifierExpr("INTERVAL"); } intervalExpr.setValue(new SQLCharExpr(lexer.stringVal())); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java index 47d915947d..31d66d7cd7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGLexer.java @@ -71,6 +71,7 @@ public class PGLexer extends Lexer { map.put("MERGE", Token.MERGE); map.put("MATCHED", Token.MATCHED); map.put("PARTITION", Token.PARTITION); + map.put("INTERVAL", Token.INTERVAL); DEFAULT_PG_KEYWORDS = new Keywords(map); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest86.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest86.java index dcf516c8cb..8c516641e1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest86.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest86.java @@ -37,13 +37,15 @@ public class PGSelectTest86 assertEquals(1, statements.size()); final SQLStatement stmt = statements.get(0); - assertEquals("SELECT *\n" + - "FROM xxx_point point\n" + - "\tINNER JOIN xxx_cc cc ON point.id = cc.point_id" + assertEquals("SELECT COUNT(1) AS res\n" + + "FROM TB_EXPERIENCE exp\n" + + "WHERE exp.creatdate > DATE_SUB(CURDATE(), INTERVAL '1' MONTH)\n" + + "\tAND exp.cstatus = 1" , stmt.toString()); - assertEquals("select *\n" + - "from xxx_point point\n" + - "\tinner join xxx_cc cc on point.id = cc.point_id", stmt.toLowerCaseString()); + assertEquals("select count(1) as res\n" + + "from TB_EXPERIENCE exp\n" + + "where exp.creatdate > DATE_SUB(CURDATE(), interval '1' month)\n" + + "\tand exp.cstatus = 1", stmt.toLowerCaseString()); } }