@@ -1301,7 +1301,10 @@ else if ("!".equals(ce.getKey())) {
1301
1301
1302
1302
isItemFirst = false ;
1303
1303
}
1304
-
1304
+
1305
+ if (StringUtil .isEmpty (cs , true )) {//避免SQL条件连接错误
1306
+ continue ;
1307
+ }
1305
1308
1306
1309
whereString += (isCombineFirst ? "" : AND ) + (Logic .isNot (logic ) ? NOT : "" ) + " ( " + cs + " ) " ;
1307
1310
isCombineFirst = false ;
@@ -1768,29 +1771,42 @@ public String getRangeString(String key, Object range) throws Exception {
1768
1771
}
1769
1772
1770
1773
Logic logic = new Logic (key );
1771
- key = logic .getKey ();
1772
- Log .i (TAG , "getRangeString key = " + key );
1774
+ String k = logic .getKey ();
1775
+ Log .i (TAG , "getRangeString k = " + k );
1773
1776
1774
1777
if (range instanceof List ) {
1775
1778
if (logic .isOr () || logic .isNot ()) {
1776
- return getKey (key ) + getInString (key , ((List <?>) range ).toArray (), logic .isNot ());
1779
+ List <?> l = (List <?>) range ;
1780
+ if (logic .isNot () && l .isEmpty ()) {
1781
+ return "" ; // key!{}: [] 这个条件无效,加到 SQL 语句中 key IN() 会报错,getInString 里不好处理
1782
+ }
1783
+ return getKey (k ) + getInString (k , l .toArray (), logic .isNot ());
1777
1784
}
1778
- throw new IllegalArgumentException (key + "{}\" :[] 中key末尾的逻辑运算符只能用 '|','!'中的一种 !" );
1785
+ throw new IllegalArgumentException (key + "{}\" :[] 中 {} 前面的逻辑运算符错误!只能用 '|','!'中的一种 !" );
1779
1786
}
1780
1787
else if (range instanceof String ) {//非Number类型需要客户端拼接成 < 'value0', >= 'value1'这种
1781
- if (isPrepared () && PATTERN_RANGE .matcher ((String ) range ).matches () == false ) {
1782
- throw new UnsupportedOperationException ("字符串 " + range + " 不合法!预编译模式下 key{}:\" condition\" 中 condition 必须符合正则表达式 ^[0-9%!=<>,]+$ !不允许空格!" );
1783
- }
1784
-
1785
- String [] conditions = StringUtil .split ((String ) range );
1788
+ String [] cs = StringUtil .split ((String ) range );
1786
1789
String condition = "" ;
1787
- if (conditions != null ) {
1790
+ if (cs != null ) {
1791
+ String c ;
1788
1792
int index ;
1789
- for (int i = 0 ; i < conditions .length ; i ++) {//对函数条件length(key)<=5这种不再在开头加key
1790
- index = conditions [i ] == null ? -1 : conditions [i ].indexOf ("(" );
1793
+ for (int i = 0 ; i < cs .length ; i ++) {//对函数条件length(key)<=5这种不再在开头加key
1794
+ c = cs [i ];
1795
+ if ("=null" .equals (c )) {
1796
+ c = SQL .isNull ();
1797
+ }
1798
+ else if ("!=null" .equals (c )) {
1799
+ c = SQL .isNull (false );
1800
+ }
1801
+ else if (isPrepared () && PATTERN_RANGE .matcher (c ).matches () == false ) {
1802
+ throw new UnsupportedOperationException (key + "{}:value 的 value 中 " + c + " 不合法!"
1803
+ + "预编译模式下 key{}:\" condition\" 中 condition 必须 为 =null 或 !=null 或 符合正则表达式 ^[0-9%!=<>,]+$ !不允许空格!" );
1804
+ }
1805
+
1806
+ index = c == null ? -1 : c .indexOf ("(" );
1791
1807
condition += ((i <= 0 ? "" : (logic .isAnd () ? AND : OR ))//连接方式
1792
- + (index >= 0 && index < conditions [ i ] .indexOf (")" ) ? "" : getKey (key ) + " " )//函数和非函数条件
1793
- + conditions [ i ] );//单个条件
1808
+ + (index >= 0 && index < c .indexOf (")" ) ? "" : getKey (k ) + " " )//函数和非函数条件
1809
+ + c );//单个条件
1794
1810
}
1795
1811
}
1796
1812
if (condition .isEmpty ()) {
@@ -1800,7 +1816,7 @@ else if (range instanceof String) {//非Number类型需要客户端拼接成 < '
1800
1816
return getCondition (logic .isNot (), condition );
1801
1817
}
1802
1818
else if (range instanceof Subquery ) { //如果在 Parser 解析成 SQL 字符串再引用,没法保证安全性,毕竟可以再通过远程函数等方式来拼接再替代,最后引用的字符串就能注入
1803
- return getKey (key ) + (logic .isNot () ? NOT : "" ) + " IN " + getSubqueryString ((Subquery ) range );
1819
+ return getKey (k ) + (logic .isNot () ? NOT : "" ) + " IN " + getSubqueryString ((Subquery ) range );
1804
1820
}
1805
1821
1806
1822
throw new IllegalArgumentException (key + "{}:range 类型为" + range .getClass ().getSimpleName ()
0 commit comments