From 0fe68aaf5704768f089c26b63dcad65ce372d9b0 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 31 Dec 2025 22:14:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`SqlUtil.PATTERN=5FIN=5FCLAUS?= =?UTF-8?q?E`=E9=80=BB=E8=BE=91=E7=BC=BA=E9=99=B7=E5=AF=BC=E8=87=B4in?= =?UTF-8?q?=E8=AF=AD=E5=8F=A5=E5=8F=82=E6=95=B0=E4=B8=8D=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=88pr#4203@Github=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/v7/db/sql/SqlUtil.java | 2 +- .../cn/hutool/v7/db/sql/Issue4200Test.java | 68 +++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 hutool-db/src/test/java/cn/hutool/v7/db/sql/Issue4200Test.java diff --git a/hutool-db/src/main/java/cn/hutool/v7/db/sql/SqlUtil.java b/hutool-db/src/main/java/cn/hutool/v7/db/sql/SqlUtil.java index 777323de86..e6529fd567 100644 --- a/hutool-db/src/main/java/cn/hutool/v7/db/sql/SqlUtil.java +++ b/hutool-db/src/main/java/cn/hutool/v7/db/sql/SqlUtil.java @@ -49,7 +49,7 @@ public class SqlUtil { /** * SQL中的in语句部分的正则 */ - private static final Pattern PATTERN_IN_CLAUSE = PatternPool.get("\\s+in\\s+[(]", Pattern.CASE_INSENSITIVE); + private static final Pattern PATTERN_IN_CLAUSE = PatternPool.get("\\s+in\\s+[(]\\s*$", Pattern.CASE_INSENSITIVE); /** * 构件相等条件的where语句
diff --git a/hutool-db/src/test/java/cn/hutool/v7/db/sql/Issue4200Test.java b/hutool-db/src/test/java/cn/hutool/v7/db/sql/Issue4200Test.java new file mode 100644 index 0000000000..219e59ad01 --- /dev/null +++ b/hutool-db/src/test/java/cn/hutool/v7/db/sql/Issue4200Test.java @@ -0,0 +1,68 @@ +package cn.hutool.v7.db.sql; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class Issue4200Test { + /** + * issues中提及的SQL + */ + private final static String TEST_SQL = "select case when 1 in (1) and 2 = any(:number) then 1 else 0 end"; + + + /** + * 基础测试:in子句测试 + */ + @Test + public void isInClauseTest0() { + final String sql = "select case when 1=1 and 2 in ( "; + assertTrue(SqlUtil.isInClause(sql)); + } + + /** + * 基础测试:in子句测试 + */ + @Test + public void isInClauseTest1() { + final String sql = "select case when 1=1 and 2 in ("; + assertTrue(SqlUtil.isInClause(sql)); + } + + /** + * 基础测试:非in子句测试 + */ + @Test + public void isInClauseTest2() { + // 测试基本的ORDER BY移除 + //final String sql = "select case when 1 in (1) and 2 = any(:number) then 1 else 0 end"; + final String sql = "select case when 1=1 and 2 = any("; + + assertFalse(SqlUtil.isInClause(sql)); + } + + /** + * 测试 包含in但非param对应的in子句测试 + */ + @Test + public void isInClauseTest3() { + // 截断前sql + //final String sql = + final String sql = "select case when 1 in (?,?,?) and 2 = any("; + + assertFalse(SqlUtil.isInClause(sql)); + } + + /** + * 测试 包含in但非param对应的in子句测试 + */ + @Test + public void isInClauseTest4() { + // 截断前sql + //final String sql = + final String sql = "select case when 1 in (?,?,?) and 2 = any("; + + assertFalse(SqlUtil.isInClause(sql)); + } +}