|
3 | 3 | import com.google.common.collect.Range; |
4 | 4 | import com.google.common.collect.RangeSet; |
5 | 5 | import com.google.common.collect.TreeRangeSet; |
6 | | -import com.taosdata.jdbc.TSDBError; |
7 | | -import com.taosdata.jdbc.TSDBErrorNumbers; |
8 | | -import com.taosdata.jdbc.rs.ConnectionParam; |
9 | | -import com.taosdata.jdbc.ws.entity.ConnectReq; |
10 | | -import com.taosdata.jdbc.ws.tmq.WSConsumer; |
11 | 6 | import io.netty.buffer.ByteBuf; |
12 | 7 | import io.netty.channel.EventLoopGroup; |
13 | | -import io.netty.channel.MultithreadEventLoopGroup; |
14 | 8 | import io.netty.channel.nio.NioEventLoopGroup; |
15 | 9 | import io.netty.util.ReferenceCountUtil; |
16 | | -import io.netty.util.ResourceLeakDetector; |
17 | 10 | import io.netty.util.concurrent.DefaultThreadFactory; |
18 | 11 | import org.slf4j.Logger; |
19 | 12 | import org.slf4j.LoggerFactory; |
|
23 | 16 | import java.net.UnknownHostException; |
24 | 17 | import java.nio.charset.StandardCharsets; |
25 | 18 | import java.sql.*; |
26 | | -import java.time.LocalDateTime; |
27 | | -import java.time.ZoneId; |
28 | | -import java.time.ZonedDateTime; |
29 | | -import java.time.format.DateTimeFormatter; |
30 | | -import java.time.format.DateTimeFormatterBuilder; |
31 | | -import java.time.format.DateTimeParseException; |
32 | 19 | import java.util.Arrays; |
33 | 20 | import java.util.HashMap; |
34 | 21 | import java.util.Map; |
35 | 22 | import java.util.concurrent.ForkJoinPool; |
36 | | -import java.util.concurrent.TimeUnit; |
37 | 23 | import java.util.regex.Matcher; |
38 | 24 | import java.util.regex.Pattern; |
39 | 25 | import java.util.stream.Collectors; |
|
42 | 28 | public class Utils { |
43 | 29 | private static final Logger log = LoggerFactory.getLogger(Utils.class); |
44 | 30 | private static final ForkJoinPool forkJoinPool = new ForkJoinPool(); |
45 | | - private static final Pattern ptn = Pattern.compile(".*?'"); |
46 | 31 |
|
47 | 32 | private static EventLoopGroup eventLoopGroup = null; |
48 | 33 |
|
49 | 34 | private Utils() {} |
50 | 35 |
|
51 | 36 | public static String escapeSingleQuota(String origin) { |
52 | | - Matcher m = ptn.matcher(origin); |
| 37 | + int length = origin.length(); |
| 38 | + boolean singleQuoteFound = false; |
53 | 39 | StringBuilder sb = new StringBuilder(); |
54 | | - int end = 0; |
55 | | - while (m.find()) { |
56 | | - end = m.end(); |
57 | | - String seg = origin.substring(m.start(), end); |
58 | | - int len = seg.length(); |
59 | | - if (len == 1) { |
60 | | - if ('\'' == seg.charAt(0)) { |
61 | | - sb.append("\\'"); |
62 | | - } else { |
63 | | - sb.append(seg); |
| 40 | + for (int i = 0; i < length; i++) { |
| 41 | + char chr = origin.charAt(i); |
| 42 | + if (chr == '\\') { |
| 43 | + if (singleQuoteFound) { |
| 44 | + sb.append(chr); |
| 45 | + } |
| 46 | + if (i < length - 1 && origin.charAt(i + 1) == '\'') { |
| 47 | + i++; |
| 48 | + if (singleQuoteFound) { |
| 49 | + sb.append('\''); |
| 50 | + } |
64 | 51 | } |
65 | | - } else { // len > 1 |
66 | | - sb.append(seg, 0, seg.length() - 2); |
67 | | - char lastcSec = seg.charAt(seg.length() - 2); |
68 | | - if (lastcSec == '\\') { |
| 52 | + } else if (chr == '\'') { |
| 53 | + if (!singleQuoteFound) { |
| 54 | + singleQuoteFound = true; |
| 55 | + sb.append(origin, 0, i); |
69 | 56 | sb.append("\\'"); |
70 | 57 | } else { |
71 | | - sb.append(lastcSec); |
72 | 58 | sb.append("\\'"); |
73 | 59 | } |
| 60 | + } else if (singleQuoteFound) { |
| 61 | + sb.append(chr); |
74 | 62 | } |
75 | 63 | } |
76 | | - |
77 | | - if (end < origin.length()) { |
78 | | - sb.append(origin.substring(end)); |
79 | | - } |
80 | | - return sb.toString(); |
| 64 | + return singleQuoteFound ? sb.toString() : origin; |
81 | 65 | } |
82 | 66 |
|
83 | 67 | public static String getNativeSql(String rawSql, Object[] parameters) { |
|
0 commit comments