From d64c6bfb519695ced11296d74d94907e951b5908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=95=8A=E8=A5=BF?= Date: Wed, 6 Nov 2024 10:43:29 +0800 Subject: [PATCH] GaussDB support parseInterval. --- .../gaussdb/parser/GaussDbExprParser.java | 28 +++++++++++++++-- .../gaussdb/visitor/GaussDbOutputVisitor.java | 30 ++++++++++++++++++- .../test/resources/bvt/parser/gaussdb/3.txt | 11 +++++++ 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 core/src/test/resources/bvt/parser/gaussdb/3.txt diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/gaussdb/parser/GaussDbExprParser.java b/core/src/main/java/com/alibaba/druid/sql/dialect/gaussdb/parser/GaussDbExprParser.java index 0ad8a42286..9121821801 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/gaussdb/parser/GaussDbExprParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/gaussdb/parser/GaussDbExprParser.java @@ -2,8 +2,7 @@ import com.alibaba.druid.DbType; import com.alibaba.druid.sql.ast.*; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.dialect.gaussdb.ast.GaussDbPartitionValue; import com.alibaba.druid.sql.dialect.postgresql.parser.PGExprParser; @@ -170,4 +169,29 @@ protected SQLAggregateExpr parseAggregateExprRest(SQLAggregateExpr aggregateExpr } return aggregateExpr; } + + @Override + protected SQLExpr parseInterval() { + accept(Token.INTERVAL); + SQLIntervalExpr intervalExpr = new SQLIntervalExpr(); + if (lexer.token() != Token.LITERAL_CHARS + && lexer.token() != Token.LITERAL_INT + && lexer.token() != Token.VARIANT + ) { + return new SQLIdentifierExpr("INTERVAL"); + } + SQLExpr value = expr(); + + if (value instanceof SQLCharExpr) { + String literal = ((SQLCharExpr) value).getText(); + String[] split = literal.split(" "); + if (split.length == 2) { + return new SQLIntervalExpr(new SQLIntegerExpr(Integer.parseInt(split[0])), SQLIntervalUnit.of(split[1])); + } else { + intervalExpr.setValue(value); + return intervalExpr; + } + } + return intervalExpr; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/gaussdb/visitor/GaussDbOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/dialect/gaussdb/visitor/GaussDbOutputVisitor.java index dec627ecc0..3824994ab1 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/gaussdb/visitor/GaussDbOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/gaussdb/visitor/GaussDbOutputVisitor.java @@ -2,7 +2,7 @@ import com.alibaba.druid.DbType; import com.alibaba.druid.sql.ast.*; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; @@ -338,4 +338,32 @@ protected void printCompression(SQLColumnDefinition x) { x.getCompression().accept(this); } } + + @Override + public boolean visit(SQLIntervalExpr x) { + print0(ucase ? "INTERVAL " : "interval "); + SQLExpr value = x.getValue(); + + boolean str = value instanceof SQLCharExpr; + if (!str) { + print('\''); + } + value.accept(this); + + SQLIntervalUnit unit = x.getUnit(); + if (unit != null) { + print(' '); + print0(ucase ? unit.name : unit.nameLCase); + if (value instanceof SQLIntegerExpr) { + SQLIntegerExpr integerExpr = (SQLIntegerExpr) value; + if (integerExpr.getNumber().intValue() > 1) { + print(ucase ? 'S' : 's'); + } + } + } + if (!str) { + print('\''); + } + return false; + } } diff --git a/core/src/test/resources/bvt/parser/gaussdb/3.txt b/core/src/test/resources/bvt/parser/gaussdb/3.txt new file mode 100644 index 0000000000..fdd0bbe047 --- /dev/null +++ b/core/src/test/resources/bvt/parser/gaussdb/3.txt @@ -0,0 +1,11 @@ +SELECT interval '1 month' +-------------------- +SELECT INTERVAL '1 MONTH' +------------------------------------------------------------------------------------------------------------------------ +SELECT interval '3 days' +-------------------- +SELECT INTERVAL '3 DAYS' +------------------------------------------------------------------------------------------------------------------------ +SELECT INTERVAL '1 year 2 months 3 days 5 hours' +-------------------- +SELECT INTERVAL '1 year 2 months 3 days 5 hours' \ No newline at end of file