Skip to content

Commit ad412fc

Browse files
committed
新增支持 @column:"key" 反引号指定字段名
1 parent bac5eab commit ad412fc

File tree

1 file changed

+37
-14
lines changed

1 file changed

+37
-14
lines changed

APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,11 @@ public abstract class AbstractSQLConfig implements SQLConfig {
145145
RAW_MAP.put("DISTINCT", "");
146146

147147
//时间
148-
RAW_MAP.put("DATE", "");
149148
RAW_MAP.put("now()", "");
149+
RAW_MAP.put("DATE", "");
150+
RAW_MAP.put("TIME", "");
150151
RAW_MAP.put("DATETIME", "");
152+
RAW_MAP.put("TIMESTAMP", "");
151153
RAW_MAP.put("DateTime", "");
152154
RAW_MAP.put("SECOND", "");
153155
RAW_MAP.put("MINUTE", "");
@@ -157,17 +159,33 @@ public abstract class AbstractSQLConfig implements SQLConfig {
157159
RAW_MAP.put("MONTH", "");
158160
RAW_MAP.put("QUARTER", "");
159161
RAW_MAP.put("YEAR", "");
160-
RAW_MAP.put("json", "");
161-
RAW_MAP.put("unit", "");
162+
// RAW_MAP.put("json", "");
163+
// RAW_MAP.put("unit", "");
162164

163165
//MYSQL 数据类型 BINARY,CHAR,DATETIME,TIME,DECIMAL,SIGNED,UNSIGNED
164166
RAW_MAP.put("BINARY", "");
165167
RAW_MAP.put("SIGNED", "");
166168
RAW_MAP.put("DECIMAL", "");
169+
RAW_MAP.put("DOUBLE", "");
170+
RAW_MAP.put("FLOAT", "");
171+
RAW_MAP.put("BOOLEAN", "");
172+
RAW_MAP.put("ENUM", "");
173+
RAW_MAP.put("SET", "");
174+
RAW_MAP.put("POINT", "");
175+
RAW_MAP.put("BLOB", "");
176+
RAW_MAP.put("LONGBLOB", "");
167177
RAW_MAP.put("BINARY", "");
168178
RAW_MAP.put("UNSIGNED", "");
179+
RAW_MAP.put("BIT", "");
180+
RAW_MAP.put("TINYINT", "");
181+
RAW_MAP.put("SMALLINT", "");
182+
RAW_MAP.put("INT", "");
183+
RAW_MAP.put("BIGINT", "");
169184
RAW_MAP.put("CHAR", "");
170-
RAW_MAP.put("TIME", "");
185+
RAW_MAP.put("VARCHAR", "");
186+
RAW_MAP.put("TEXT", "");
187+
RAW_MAP.put("LONGTEXT", "");
188+
RAW_MAP.put("JSON", "");
171189

172190
//窗口函数关键字
173191
RAW_MAP.put("OVER", "");
@@ -1686,28 +1704,33 @@ private String[] parseArgsSplitWithComma(String param, boolean isColumn, boolean
16861704
String ck = ckeys[i];
16871705

16881706
// 如果参数包含 "'" ,解析字符串
1689-
if (ck.contains("'")) {
1690-
int count = 0;
1691-
for (int j = 0; j < ck.length(); j++) {
1692-
if (ck.charAt(j) == '\'') count++;
1707+
if (ck.startsWith("`") && ck.endsWith("`")) {
1708+
origin = ck.substring(1, ck.length() - 1);
1709+
//sql 注入判断 判断
1710+
if (StringUtil.isName(origin) == false) {
1711+
throw new IllegalArgumentException("字符 " + ck + " 不合法!"
1712+
+ "预编译模式下 @column:\"`column0`,`column1`:alias;function0(arg0,arg1,...);function1(...):alias...\""
1713+
+ " 中所有字符串 column 都必须必须为1个单词 !");
16931714
}
1694-
// FIXME 把 `column` 和 '2 values with [ / : ] ..' 按引号位置分割才能满足全文索引、窗口函数的需要
1695-
// 排除字符串中参数中包含 ' 的情况和不以' 开头和结尾的情况,同时排除 cast('s' as ...) 以空格分隔的参数中包含字符串的情况
1696-
if (count != 2 || !(ck.startsWith("'") && ck.endsWith("'"))) {
1715+
1716+
ckeys[i] = getKey(origin).toString();
1717+
}
1718+
else if (ck.startsWith("'") && ck.endsWith("'")) {
1719+
origin = ck.substring(1, ck.length() - 1);
1720+
if (origin.contains("'")) {
16971721
throw new IllegalArgumentException("字符串 " + ck + " 不合法!"
16981722
+ "预编译模式下 @column:\"column0,column1:alias;function0(arg0,arg1,...);function1(...):alias...\""
16991723
+ " 中字符串参数不合法,必须以 ' 开头, ' 结尾,字符串中不能包含 ' ");
17001724
}
17011725
//sql 注入判断 判断
1702-
origin = (ck.substring(1, ck.length() - 1));
17031726
if (origin.contains("--") || PATTERN_STRING.matcher(origin).matches() == true) {
17041727
throw new IllegalArgumentException("字符 " + ck + " 不合法!"
17051728
+ "预编译模式下 @column:\"column0,column1:alias;function0(arg0,arg1,...);function1(...):alias...\""
17061729
+ " 中所有字符串 arg 都必须不符合正则表达式 " + PATTERN_STRING + " 且不包含连续减号 -- !");
17071730
}
1708-
1731+
17091732
// 1.字符串不是字段也没有别名,所以不解析别名 2. 是字符串,进行预编译,使用getValue() ,对字符串进行截取
1710-
ckeys[i] = getValue(ck.substring(1, ck.length() - 1)).toString();
1733+
ckeys[i] = getValue(origin).toString();
17111734
}
17121735
else {
17131736
// 参数不包含",",即不是字符串

0 commit comments

Comments
 (0)