Fix issue 4200

This commit is contained in:
帆 陈
2025-12-30 11:34:37 +08:00
parent 855b800a77
commit bf4ea2580c
2 changed files with 70 additions and 1 deletions

View File

@@ -33,7 +33,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语句<br>

View File

@@ -0,0 +1,69 @@
package cn.hutool.db.sql;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
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));
}
}