@@ -1301,7 +1301,10 @@ else if ("!".equals(ce.getKey())) {
13011301
13021302 isItemFirst = false ;
13031303 }
1304-
1304+
1305+ if (StringUtil .isEmpty (cs , true )) {//避免SQL条件连接错误
1306+ continue ;
1307+ }
13051308
13061309 whereString += (isCombineFirst ? "" : AND ) + (Logic .isNot (logic ) ? NOT : "" ) + " ( " + cs + " ) " ;
13071310 isCombineFirst = false ;
@@ -1768,29 +1771,42 @@ public String getRangeString(String key, Object range) throws Exception {
17681771 }
17691772
17701773 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 );
17731776
17741777 if (range instanceof List ) {
17751778 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 ());
17771784 }
1778- throw new IllegalArgumentException (key + "{}\" :[] 中key末尾的逻辑运算符只能用 '|','!'中的一种 !" );
1785+ throw new IllegalArgumentException (key + "{}\" :[] 中 {} 前面的逻辑运算符错误!只能用 '|','!'中的一种 !" );
17791786 }
17801787 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 );
17861789 String condition = "" ;
1787- if (conditions != null ) {
1790+ if (cs != null ) {
1791+ String c ;
17881792 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 ("(" );
17911807 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 );//单个条件
17941810 }
17951811 }
17961812 if (condition .isEmpty ()) {
@@ -1800,7 +1816,7 @@ else if (range instanceof String) {//非Number类型需要客户端拼接成 < '
18001816 return getCondition (logic .isNot (), condition );
18011817 }
18021818 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 );
18041820 }
18051821
18061822 throw new IllegalArgumentException (key + "{}:range 类型为" + range .getClass ().getSimpleName ()
0 commit comments