From 087ac651ba8360d7f9566430bade9b1a4eed6297 Mon Sep 17 00:00:00 2001 From: abomb4 Date: Sun, 19 Jun 2022 18:42:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=20DB2=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=20INTERVAL=20=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=B0=86=20VALUE=20=E7=94=A8=E6=8B=AC?= =?UTF-8?q?=E5=8F=B7=E5=8C=85=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dialect/db2/visitor/DB2OutputVisitor.java | 2 + .../db2/visitor/DB2OutputVisitorTest.java | 59 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2OutputVisitorTest.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2OutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2OutputVisitor.java index 1ab61522cf..7c4f370fa7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2OutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2OutputVisitor.java @@ -153,7 +153,9 @@ public class DB2OutputVisitor extends SQLASTOutputVisitor implements DB2ASTVisit public boolean visit(SQLIntervalExpr x) { SQLExpr value = x.getValue(); + print('('); value.accept(this); + print(')'); SQLIntervalUnit unit = x.getUnit(); if (unit != null) { diff --git a/src/test/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2OutputVisitorTest.java b/src/test/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2OutputVisitorTest.java new file mode 100644 index 0000000000..4bc7833c59 --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2OutputVisitorTest.java @@ -0,0 +1,59 @@ +package com.alibaba.druid.sql.dialect.db2.visitor; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +/** + * @author abomb4 2022-06-19 + */ +public class DB2OutputVisitorTest { + + @Test + public void test() { + + List testCases = Arrays.asList( + new TestCase("interval 表达式应该带括号 select", + "SELECT A, B, C FROM D WHERE C < CURRENT TIMESTAMP + (10 * 60) SECONDS", + "SELECT A, B, C FROM D WHERE C < CURRENT TIMESTAMP + (10 * 60) SECONDS"), + new TestCase("interval 表达式应该带括号 insert", + "INSERT INTO TEST VALUES (1, CURRENT TIMESTAMP + ((10 + 60) SECONDS))", + "INSERT INTO TEST VALUES (1, CURRENT TIMESTAMP + (10 + 60) SECONDS)"), + new TestCase("interval 表达式应该带括号 update", + "UPDATE test SET created = CURRENT TIMESTAMP + 10 SECONDS WHERE created < CURRENT TIMESTAMP + (10 * 60) SECONDS", + "UPDATE test SET created = CURRENT TIMESTAMP + (10) SECONDS WHERE created < CURRENT TIMESTAMP + (10 * 60) SECONDS") + ); + + for (TestCase testCase : testCases) { + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(testCase.origin, DbType.db2); + StringBuilder builder = new StringBuilder(); + DB2OutputVisitor visitor = new DB2OutputVisitor(builder); + visitor.setUppCase(false); + visitor.setPrettyFormat(false); + visitor.setParameterized(false); + SQLStatement stmt = parser.parseStatement(); + stmt.accept(visitor); + String result = builder.toString(); + Assert.assertEquals(testCase.name, testCase.expected, result); + } + System.out.println("DB2 Interval test ok."); + } + + private static class TestCase { + String name; + String origin; + String expected; + + public TestCase(String name, String origin, String expected) { + this.name = name; + this.origin = origin; + this.expected = expected; + } + } +}