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)); + } +}