From 741babe2c883057c92b1e603a8343da84703b54e Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 16 Oct 2020 00:04:45 +0800 Subject: [PATCH] fix NamedSql bug --- CHANGELOG.md | 3 ++- .../src/main/java/cn/hutool/db/sql/NamedSql.java | 9 ++++++--- .../src/test/java/cn/hutool/db/NamedSqlTest.java | 13 +++++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c281bf50c..b3ae47dc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.4.5 (2020-10-14) +# 5.4.5 (2020-10-16) ### 新特性 * 【core 】 ConsoleTable代码优化(pr#190@Gitee) @@ -27,6 +27,7 @@ * 【json 】 解决JSON中转换为double小数精度丢失问题(pr#192@Gitee) * 【core 】 修复CaseInsensitiveMap的remove等方法并没有忽略大小写的问题(pr#1163@Gitee) * 【poi 】 修复合并单元格值读取错误的问题 +* 【poi 】 修复NamedSql解析形如col::numeric出错问题(issue#I1YHBX@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/NamedSql.java b/hutool-db/src/main/java/cn/hutool/db/sql/NamedSql.java index 09480669d..cb0209a56 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/NamedSql.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/NamedSql.java @@ -78,7 +78,7 @@ public class NamedSql { return; } - int len = namedSql.length(); + final int len = namedSql.length(); final StrBuilder name = StrUtil.strBuilder(); final StrBuilder sqlBuilder = StrUtil.strBuilder(); @@ -87,10 +87,9 @@ public class NamedSql { for (int i = 0; i < len; i++) { c = namedSql.charAt(i); if (ArrayUtil.contains(NAME_START_CHARS, c)) { - nameStartChar = c; - // 新的变量开始符出现,要处理之前的变量 replaceVar(nameStartChar, name, sqlBuilder, paramMap); + nameStartChar = c; } else if (null != nameStartChar) { // 变量状态 if (isGenerateChar(c)) { @@ -126,6 +125,10 @@ public class NamedSql { */ private void replaceVar(Character nameStartChar, StrBuilder name, StrBuilder sqlBuilder, Map paramMap){ if(name.isEmpty()){ + if(null != nameStartChar){ + // 类似于:的情况,需要补上: + sqlBuilder.append(nameStartChar); + } // 无变量,按照普通字符处理 return; } diff --git a/hutool-db/src/test/java/cn/hutool/db/NamedSqlTest.java b/hutool-db/src/test/java/cn/hutool/db/NamedSqlTest.java index de324333a..58465c24e 100644 --- a/hutool-db/src/test/java/cn/hutool/db/NamedSqlTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/NamedSqlTest.java @@ -60,6 +60,19 @@ public class NamedSqlTest { Assert.assertEquals(sql, namedSql.getSql()); } + @Test + public void parseTest4() { + // 测试postgre中形如data_value::numeric是否出错 + String sql = "select device_key, min(data_value::numeric) as data_value from device"; + + Map paramMap = MapUtil + .builder("name1", (Object)"张三") + .build(); + + NamedSql namedSql = new NamedSql(sql, paramMap); + Assert.assertEquals(sql, namedSql.getSql()); + } + @Test public void queryTest() throws SQLException { Map paramMap = MapUtil