• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #3531

19 Nov 2024 10:42AM UTC coverage: 60.213% (-0.006%) from 60.219%
#3531

push

travis-ci

web-flow
Merge pull request #28777 from taosdata/fix/3.0/TD-32366

fix:TD-32366/stmt add geometry datatype check

118529 of 252344 branches covered (46.97%)

Branch coverage included in aggregate %.

7 of 48 new or added lines in 3 files covered. (14.58%)

2282 existing lines in 115 files now uncovered.

199096 of 275161 relevant lines covered (72.36%)

6067577.83 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

55.46
/source/util/src/tcompare.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15
#define _BSD_SOURCE
16
#define _GNU_SOURCE
17
#define _XOPEN_SOURCE
18
#define _DEFAULT_SOURCE
19
#include "tcompare.h"
20
#include "regex.h"
21
#include "tdef.h"
22
#include "thash.h"
23
#include "tlog.h"
24
#include "tutil.h"
25
#include "types.h"
26
#include "osString.h"
27
#include "ttimer.h"
28

29
int32_t setChkInBytes1(const void *pLeft, const void *pRight) {
128,533✔
30
  return NULL != taosHashGet((SHashObj *)pRight, pLeft, 1) ? 1 : 0;
128,533✔
31
}
32

33
int32_t setChkInBytes2(const void *pLeft, const void *pRight) {
2,572✔
34
  return NULL != taosHashGet((SHashObj *)pRight, pLeft, 2) ? 1 : 0;
2,572✔
35
}
36

37
int32_t setChkInBytes4(const void *pLeft, const void *pRight) {
57,311✔
38
  return NULL != taosHashGet((SHashObj *)pRight, pLeft, 4) ? 1 : 0;
57,311✔
39
}
40

41
int32_t setChkInBytes8(const void *pLeft, const void *pRight) {
93,946,721✔
42
  return NULL != taosHashGet((SHashObj *)pRight, pLeft, 8) ? 1 : 0;
93,946,721✔
43
}
44

45
int32_t setChkNotInBytes1(const void *pLeft, const void *pRight) {
4,290✔
46
  return NULL == taosHashGet((SHashObj *)pRight, pLeft, 1) ? 1 : 0;
4,290✔
47
}
48

49
int32_t setChkNotInBytes2(const void *pLeft, const void *pRight) {
3,080✔
50
  return NULL == taosHashGet((SHashObj *)pRight, pLeft, 2) ? 1 : 0;
3,080✔
51
}
52

53
int32_t setChkNotInBytes4(const void *pLeft, const void *pRight) {
27,729✔
54
  return NULL == taosHashGet((SHashObj *)pRight, pLeft, 4) ? 1 : 0;
27,729✔
55
}
56

57
int32_t setChkNotInBytes8(const void *pLeft, const void *pRight) {
22,557✔
58
  return NULL == taosHashGet((SHashObj *)pRight, pLeft, 8) ? 1 : 0;
22,557✔
59
}
60

61
int32_t compareChkInString(const void *pLeft, const void *pRight) {
60,043✔
62
  return NULL != taosHashGet((SHashObj *)pRight, pLeft, varDataTLen(pLeft)) ? 1 : 0;
60,043✔
63
}
64

65
int32_t compareChkNotInString(const void *pLeft, const void *pRight) {
19,393✔
66
  return NULL == taosHashGet((SHashObj *)pRight, pLeft, varDataTLen(pLeft)) ? 1 : 0;
19,393✔
67
}
68

69
int32_t compareInt8Val(const void *pLeft, const void *pRight) {
105,208,228✔
70
  int8_t left = GET_INT8_VAL(pLeft), right = GET_INT8_VAL(pRight);
105,208,228✔
71
  if (left > right) return 1;
105,208,228✔
72
  if (left < right) return -1;
93,843,003✔
73
  return 0;
79,229,339✔
74
}
75

76
int32_t compareInt8ValDesc(const void *pLeft, const void *pRight) { return compareInt8Val(pRight, pLeft); }
5,441✔
77

78
int32_t compareInt16Val(const void *pLeft, const void *pRight) {
8,371,099✔
79
  int16_t left = GET_INT16_VAL(pLeft), right = GET_INT16_VAL(pRight);
8,371,099✔
80
  if (left > right) return 1;
8,371,099✔
81
  if (left < right) return -1;
6,413,513✔
82
  return 0;
5,128,625✔
83
}
84

85
int32_t compareInt16ValDesc(const void *pLeft, const void *pRight) { return compareInt16Val(pRight, pLeft); }
4,945✔
86

87
int32_t compareInt32Val(const void *pLeft, const void *pRight) {
398,512,742✔
88
  int32_t left = GET_INT32_VAL(pLeft), right = GET_INT32_VAL(pRight);
398,512,742✔
89
  if (left > right) return 1;
398,512,742✔
90
  if (left < right) return -1;
359,925,474✔
91
  return 0;
301,097,583✔
92
}
93

94
int32_t compareInt32ValDesc(const void *pLeft, const void *pRight) { return compareInt32Val(pRight, pLeft); }
4,480,401✔
95

96
int32_t compareInt64Val(const void *pLeft, const void *pRight) {
790,408,616✔
97
  int64_t left = GET_INT64_VAL(pLeft), right = GET_INT64_VAL(pRight);
790,408,616✔
98
  if (left > right) return 1;
790,408,616✔
99
  if (left < right) return -1;
563,072,049✔
100
  return 0;
145,700,883✔
101
}
102

103
int32_t compareInt64ValDesc(const void *pLeft, const void *pRight) { return compareInt64Val(pRight, pLeft); }
78,848,820✔
104

105
int32_t compareUint32Val(const void *pLeft, const void *pRight) {
2,155,301✔
106
  uint32_t left = GET_UINT32_VAL(pLeft), right = GET_UINT32_VAL(pRight);
2,155,301✔
107
  if (left > right) return 1;
2,155,301✔
108
  if (left < right) return -1;
1,155,625✔
109
  return 0;
546,845✔
110
}
111

112
int32_t compareUint32ValDesc(const void *pLeft, const void *pRight) { return compareUint32Val(pRight, pLeft); }
1,120,389✔
113

114
int32_t compareUint64Val(const void *pLeft, const void *pRight) {
2,247,643✔
115
  uint64_t left = GET_UINT64_VAL(pLeft), right = GET_UINT64_VAL(pRight);
2,247,643✔
116
  if (left > right) return 1;
2,247,643✔
117
  if (left < right) return -1;
1,226,547✔
118
  return 0;
632,276✔
119
}
120

121
int32_t compareUint64ValDesc(const void *pLeft, const void *pRight) { return compareUint64Val(pRight, pLeft); }
1,203,442✔
122

123
int32_t compareUint16Val(const void *pLeft, const void *pRight) {
52,833✔
124
  uint16_t left = GET_UINT16_VAL(pLeft), right = GET_UINT16_VAL(pRight);
52,833✔
125
  if (left > right) return 1;
52,833✔
126
  if (left < right) return -1;
38,400✔
127
  return 0;
7,924✔
128
}
129

130
int32_t compareUint16ValDesc(const void *pLeft, const void *pRight) { return compareUint16Val(pRight, pLeft); }
30✔
131

132
int32_t compareUint8Val(const void *pLeft, const void *pRight) {
38,793✔
133
  uint8_t left = GET_UINT8_VAL(pLeft), right = GET_UINT8_VAL(pRight);
38,793✔
134
  if (left > right) return 1;
38,793✔
135
  if (left < right) return -1;
24,512✔
136
  return 0;
7,965✔
137
}
138

139
int32_t compareUint8ValDesc(const void *pLeft, const void *pRight) { return compareUint8Val(pRight, pLeft); }
30✔
140

141
int32_t compareFloatVal(const void *pLeft, const void *pRight) {
89,277,936✔
142
  float p1 = GET_FLOAT_VAL(pLeft);
89,277,936✔
143
  float p2 = GET_FLOAT_VAL(pRight);
89,277,936✔
144

145
  if (isnan(p1) && isnan(p2)) {
89,277,936!
146
    return 0;
×
147
  }
148

149
  if (isnan(p1)) {
89,277,936!
150
    return -1;
×
151
  }
152

153
  if (isnan(p2)) {
89,277,936!
154
    return 1;
×
155
  }
156
  if (FLT_EQUAL(p1, p2)) {
89,277,936✔
157
    return 0;
66,206,001✔
158
  }
159
  return FLT_GREATER(p1, p2) ? 1 : -1;
23,071,935!
160
}
161

162
int32_t compareFloatValDesc(const void *pLeft, const void *pRight) { return compareFloatVal(pRight, pLeft); }
5,240✔
163

164
int32_t compareDoubleVal(const void *pLeft, const void *pRight) {
22,719,034✔
165
  double p1 = GET_DOUBLE_VAL(pLeft);
22,719,034✔
166
  double p2 = GET_DOUBLE_VAL(pRight);
22,719,034✔
167

168
  if (isnan(p1) && isnan(p2)) {
22,719,034!
169
    return 0;
×
170
  }
171

172
  if (isnan(p1)) {
22,719,034!
173
    return -1;
×
174
  }
175

176
  if (isnan(p2)) {
22,719,034!
177
    return 1;
×
178
  }
179

180
  if (FLT_EQUAL(p1, p2)) {
22,719,034✔
181
    return 0;
6,925,513✔
182
  }
183
  return FLT_GREATER(p1, p2) ? 1 : -1;
15,793,521!
184
}
185

186
int32_t compareDoubleValDesc(const void *pLeft, const void *pRight) { return compareDoubleVal(pRight, pLeft); }
7,293✔
187

188
int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight) {
349,560,941✔
189
  int32_t len1 = varDataLen(pLeft);
349,560,941✔
190
  int32_t len2 = varDataLen(pRight);
349,560,941✔
191

192
  int32_t minLen = TMIN(len1, len2);
349,560,941✔
193
  int32_t ret = strncmp(varDataVal(pLeft), varDataVal(pRight), minLen);
349,560,941✔
194
  if (ret == 0) {
349,560,941✔
195
    if (len1 == len2) {
263,013,700✔
196
      return 0;
262,941,915✔
197
    } else {
198
      return len1 > len2 ? 1 : -1;
71,785!
199
    }
200
  } else {
201
    return ret > 0 ? 1 : -1;
86,547,241✔
202
  }
203
}
204

205
int32_t compareLenPrefixedStrDesc(const void *pLeft, const void *pRight) {
2,956,819✔
206
  return compareLenPrefixedStr(pRight, pLeft);
2,956,819✔
207
}
208

209
int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight) {
77,459,181✔
210
  int32_t len1 = varDataLen(pLeft);
77,459,181✔
211
  int32_t len2 = varDataLen(pRight);
77,459,181✔
212

213
  int32_t ret = tasoUcs4Compare((TdUcs4 *)varDataVal(pLeft), (TdUcs4 *)varDataVal(pRight), len1>len2 ? len2:len1);
77,459,181✔
214
  if (ret == 0) {
80,153,490✔
215
    if (len1 > len2)
60,263,506✔
216
      return 1;
4,527✔
217
    else if(len1 < len2)
60,258,979✔
218
      return -1;
8,377✔
219
    else
220
      return 0;
60,250,602✔
221
  }
222
  return (ret < 0) ? -1 : 1;
19,889,984✔
223
}
224

225
int32_t compareLenPrefixedWStrDesc(const void *pLeft, const void *pRight) {
82,581✔
226
  return compareLenPrefixedWStr(pRight, pLeft);
82,581✔
227
}
228

229
int32_t compareLenBinaryVal(const void *pLeft, const void *pRight) {
211,079✔
230
  int32_t len1 = varDataLen(pLeft);
211,079✔
231
  int32_t len2 = varDataLen(pRight);
211,079✔
232

233
  int32_t minLen = TMIN(len1, len2);
211,079✔
234
  int32_t ret = memcmp(varDataVal(pLeft), varDataVal(pRight), minLen);
211,079✔
235
  if (ret == 0) {
211,079✔
236
    if (len1 == len2) {
143,602✔
237
      return 0;
143,340✔
238
    } else {
239
      return len1 > len2 ? 1 : -1;
262✔
240
    }
241
  } else {
242
    return ret > 0 ? 1 : -1;
67,477✔
243
  }
244
}
245

246
int32_t compareLenBinaryValDesc(const void *pLeft, const void *pRight) {
×
247
  return compareLenBinaryVal(pRight, pLeft);
×
248
}
249

250
// string > number > bool > null
251
// ref: https://dev.mysql.com/doc/refman/8.0/en/json.html#json-comparison
252
int32_t compareJsonVal(const void *pLeft, const void *pRight) {
1,056✔
253
  char leftType = *(char *)pLeft;
1,056✔
254
  char rightType = *(char *)pRight;
1,056✔
255
  if (leftType != rightType) {
1,056✔
256
    return leftType > rightType ? 1 : -1;
684✔
257
  }
258

259
  char *realDataLeft = POINTER_SHIFT(pLeft, CHAR_BYTES);
372✔
260
  char *realDataRight = POINTER_SHIFT(pRight, CHAR_BYTES);
372✔
261
  if (leftType == TSDB_DATA_TYPE_BOOL) {
372!
262
    DEFAULT_COMP(GET_INT8_VAL(realDataLeft), GET_INT8_VAL(realDataRight));
×
263
  } else if (leftType == TSDB_DATA_TYPE_DOUBLE) {
372✔
264
    DEFAULT_DOUBLE_COMP(GET_DOUBLE_VAL(realDataLeft), GET_DOUBLE_VAL(realDataRight));
176!
265
  } else if (leftType == TSDB_DATA_TYPE_NCHAR) {
196✔
266
    return compareLenPrefixedWStr(realDataLeft, realDataRight);
140✔
267
  } else if (leftType == TSDB_DATA_TYPE_NULL) {
56!
268
    return 0;
56✔
269
  } else {
270
    uError("data type unexpected leftType:%d rightType:%d", leftType, rightType);
×
271
    return 0;
×
272
  }
273
}
274

275
int32_t compareInt8Int16(const void *pLeft, const void *pRight) {
18,325✔
276
  int8_t  left = GET_INT8_VAL(pLeft);
18,325✔
277
  int16_t right = GET_INT16_VAL(pRight);
18,325✔
278
  if (left > right) return 1;
18,325!
279
  if (left < right) return -1;
18,325✔
280
  return 0;
175✔
281
}
282

283
int32_t compareInt8Int32(const void *pLeft, const void *pRight) {
1,536✔
284
  int8_t  left = GET_INT8_VAL(pLeft);
1,536✔
285
  int32_t right = GET_INT32_VAL(pRight);
1,536✔
286
  if (left > right) return 1;
1,536!
287
  if (left < right) return -1;
1,536!
288
  return 0;
×
289
}
290

291
int32_t compareInt8Int64(const void *pLeft, const void *pRight) {
60✔
292
  int8_t  left = GET_INT8_VAL(pLeft);
60✔
293
  int64_t right = GET_INT64_VAL(pRight);
60✔
294
  if (left > right) return 1;
60!
295
  if (left < right) return -1;
×
296
  return 0;
×
297
}
298

299
int32_t compareInt8Float(const void *pLeft, const void *pRight) {
238✔
300
  int8_t left = GET_INT8_VAL(pLeft);
238✔
301
  float  right = GET_FLOAT_VAL(pRight);
238✔
302
  if (left > right) return 1;
238✔
303
  if (left < right) return -1;
62✔
304
  return 0;
6✔
305
}
306

307
int32_t compareInt8Double(const void *pLeft, const void *pRight) {
×
308
  int8_t left = GET_INT8_VAL(pLeft);
×
309
  double right = GET_DOUBLE_VAL(pRight);
×
310
  if (left > right) return 1;
×
311
  if (left < right) return -1;
×
312
  return 0;
×
313
}
314

315
int32_t compareInt8Uint8(const void *pLeft, const void *pRight) {
×
316
  int8_t  left = GET_INT8_VAL(pLeft);
×
317
  uint8_t right = GET_UINT8_VAL(pRight);
×
318
  if (left > right) return 1;
×
319
  if (left < right) return -1;
×
320
  return 0;
×
321
}
322

323
int32_t compareInt8Uint16(const void *pLeft, const void *pRight) {
×
324
  int8_t   left = GET_INT8_VAL(pLeft);
×
325
  uint16_t right = GET_UINT16_VAL(pRight);
×
326
  if (left > right) return 1;
×
327
  if (left < right) return -1;
×
328
  return 0;
×
329
}
330

331
int32_t compareInt8Uint32(const void *pLeft, const void *pRight) {
×
332
  int8_t   left = GET_INT8_VAL(pLeft);
×
333
  if (left < 0) return -1;
×
334
  uint32_t right = GET_UINT32_VAL(pRight);
×
335
  if ((uint32_t)left > right) return 1;
×
336
  if ((uint32_t)left < right) return -1;
×
337
  return 0;
×
338
}
339

340
int32_t compareInt8Uint64(const void *pLeft, const void *pRight) {
×
341
  int8_t   left = GET_INT8_VAL(pLeft);
×
342
  if (left < 0) return -1;
×
343
  uint64_t right = GET_UINT64_VAL(pRight);
×
344
  if ((uint64_t)left > right) return 1;
×
345
  if ((uint64_t)left < right) return -1;
×
346
  return 0;
×
347
}
348

349
int32_t compareInt16Int8(const void *pLeft, const void *pRight) {
126,317✔
350
  int16_t left = GET_INT16_VAL(pLeft);
126,317✔
351
  int8_t  right = GET_INT8_VAL(pRight);
126,317✔
352
  if (left > right) return 1;
126,317✔
353
  if (left < right) return -1;
54,152✔
354
  return 0;
13,900✔
355
}
356

357
int32_t compareInt16Int32(const void *pLeft, const void *pRight) {
1,591✔
358
  int16_t left = GET_INT16_VAL(pLeft);
1,591✔
359
  int32_t right = GET_INT32_VAL(pRight);
1,591✔
360
  if (left > right) return 1;
1,591!
361
  if (left < right) return -1;
1,591!
362
  return 0;
×
363
}
364

365
int32_t compareInt16Int64(const void *pLeft, const void *pRight) {
448✔
366
  int16_t left = GET_INT16_VAL(pLeft);
448✔
367
  int64_t right = GET_INT64_VAL(pRight);
448✔
368
  if (left > right) return 1;
448!
369
  if (left < right) return -1;
×
370
  return 0;
×
371
}
372

373
int32_t compareInt16Float(const void *pLeft, const void *pRight) {
136✔
374
  int16_t left = GET_INT16_VAL(pLeft);
136✔
375
  float   right = GET_FLOAT_VAL(pRight);
136✔
376
  if (left > right) return 1;
136✔
377
  if (left < right) return -1;
22✔
378
  return 0;
8✔
379
}
380

381
int32_t compareInt16Double(const void *pLeft, const void *pRight) {
110✔
382
  int16_t left = GET_INT16_VAL(pLeft);
110✔
383
  double  right = GET_DOUBLE_VAL(pRight);
110✔
384
  if (left > right) return 1;
110✔
385
  if (left < right) return -1;
45!
386
  return 0;
×
387
}
388

389
int32_t compareInt16Uint8(const void *pLeft, const void *pRight) {
×
390
  int16_t left = GET_INT16_VAL(pLeft);
×
391
  uint8_t right = GET_UINT8_VAL(pRight);
×
392
  if (left > right) return 1;
×
393
  if (left < right) return -1;
×
394
  return 0;
×
395
}
396

397
int32_t compareInt16Uint16(const void *pLeft, const void *pRight) {
×
398
  int16_t  left = GET_INT16_VAL(pLeft);
×
399
  uint16_t right = GET_UINT16_VAL(pRight);
×
400
  if (left > right) return 1;
×
401
  if (left < right) return -1;
×
402
  return 0;
×
403
}
404

405
int32_t compareInt16Uint32(const void *pLeft, const void *pRight) {
×
406
  int16_t  left = GET_INT16_VAL(pLeft);
×
407
  if (left < 0) return -1;
×
408
  uint32_t right = GET_UINT32_VAL(pRight);
×
409
  if ((uint32_t)left > right) return 1;
×
410
  if ((uint32_t)left < right) return -1;
×
411
  return 0;
×
412
}
413

414
int32_t compareInt16Uint64(const void *pLeft, const void *pRight) {
×
415
  int16_t  left = GET_INT16_VAL(pLeft);
×
416
  if (left < 0) return -1;
×
417
  uint64_t right = GET_UINT64_VAL(pRight);
×
418
  if ((uint64_t)left > right) return 1;
×
419
  if ((uint64_t)left < right) return -1;
×
420
  return 0;
×
421
}
422

423
int32_t compareInt32Int8(const void *pLeft, const void *pRight) {
1,292,008✔
424
  int32_t left = GET_INT32_VAL(pLeft);
1,292,008✔
425
  int8_t  right = GET_INT8_VAL(pRight);
1,292,008✔
426
  if (left > right) return 1;
1,292,008✔
427
  if (left < right) return -1;
679,847✔
428
  return 0;
19,785✔
429
}
430

431
int32_t compareInt32Int16(const void *pLeft, const void *pRight) {
144,579✔
432
  int32_t left = GET_INT32_VAL(pLeft);
144,579✔
433
  int16_t right = GET_INT16_VAL(pRight);
144,579✔
434
  if (left > right) return 1;
144,579✔
435
  if (left < right) return -1;
19,200!
436
  return 0;
×
437
}
438

439
int32_t compareInt32Int64(const void *pLeft, const void *pRight) {
10,699,974✔
440
  int32_t left = GET_INT32_VAL(pLeft);
10,699,974✔
441
  int64_t right = GET_INT64_VAL(pRight);
10,699,974✔
442
  if (left > right) return 1;
10,699,974✔
443
  if (left < right) return -1;
5,651,674!
444
  return 0;
×
445
}
446

447
int32_t compareInt32Float(const void *pLeft, const void *pRight) {
50✔
448
  int32_t left = GET_INT32_VAL(pLeft);
50✔
449
  float   right = GET_FLOAT_VAL(pRight);
50✔
450
  if (left > right) return 1;
50!
451
  if (left < right) return -1;
50!
452
  return 0;
×
453
}
454

455
int32_t compareInt32Double(const void *pLeft, const void *pRight) {
1,392✔
456
  int32_t left = GET_INT32_VAL(pLeft);
1,392✔
457
  double  right = GET_DOUBLE_VAL(pRight);
1,392✔
458
  if (left > right) return 1;
1,392✔
459
  if (left < right) return -1;
445✔
460
  return 0;
145✔
461
}
462

463
int32_t compareInt32Uint8(const void *pLeft, const void *pRight) {
×
464
  int32_t left = GET_INT32_VAL(pLeft);
×
465
  uint8_t right = GET_UINT8_VAL(pRight);
×
466
  if (left > right) return 1;
×
467
  if (left < right) return -1;
×
468
  return 0;
×
469
}
470

471
int32_t compareInt32Uint16(const void *pLeft, const void *pRight) {
×
472
  int32_t  left = GET_INT32_VAL(pLeft);
×
473
  uint16_t right = GET_UINT16_VAL(pRight);
×
474
  if (left > right) return 1;
×
475
  if (left < right) return -1;
×
476
  return 0;
×
477
}
478

479
int32_t compareInt32Uint32(const void *pLeft, const void *pRight) {
64✔
480
  int32_t  left = GET_INT32_VAL(pLeft);
64✔
481
  if (left < 0) return -1;
64!
482
  uint32_t right = GET_UINT32_VAL(pRight);
64✔
483
  if ((uint32_t)left > right) return 1;
64✔
484
  if ((uint32_t)left < right) return -1;
36!
485
  return 0;
36✔
486
}
487

488
int32_t compareInt32Uint64(const void *pLeft, const void *pRight) {
×
489
  int32_t  left = GET_INT32_VAL(pLeft);
×
490
  if (left < 0) return -1;
×
491
  uint64_t right = GET_UINT64_VAL(pRight);
×
492
  if ((uint64_t)left > right) return 1;
×
493
  if ((uint64_t)left < right) return -1;
×
494
  return 0;
×
495
}
496

497
int32_t compareInt64Int8(const void *pLeft, const void *pRight) {
3,317,962✔
498
  int64_t left = GET_INT64_VAL(pLeft);
3,317,962✔
499
  int8_t  right = GET_INT8_VAL(pRight);
3,317,962✔
500
  if (left > right) return 1;
3,317,962✔
501
  if (left < right) return -1;
3,282,451✔
502
  return 0;
3,267,841✔
503
}
504

505
int32_t compareInt64Int16(const void *pLeft, const void *pRight) {
124,042✔
506
  int64_t left = GET_INT64_VAL(pLeft);
124,042✔
507
  int16_t right = GET_INT16_VAL(pRight);
124,042✔
508
  if (left > right) return 1;
124,042!
509
  if (left < right) return -1;
124,042✔
510
  return 0;
100,063✔
511
}
512

513
int32_t compareInt64Int32(const void *pLeft, const void *pRight) {
21,794,458✔
514
  int64_t left = GET_INT64_VAL(pLeft);
21,794,458✔
515
  int32_t right = GET_INT32_VAL(pRight);
21,794,458✔
516
  if (left > right) return 1;
21,794,458✔
517
  if (left < right) return -1;
11,187,145!
UNCOV
518
  return 0;
×
519
}
520

521
int32_t compareInt64Float(const void *pLeft, const void *pRight) {
136✔
522
  int64_t left = GET_INT64_VAL(pLeft);
136✔
523
  float   right = GET_FLOAT_VAL(pRight);
136✔
524
  if (left > right) return 1;
136✔
525
  if (left < right) return -1;
22✔
526
  return 0;
8✔
527
}
528

529
int32_t compareInt64Double(const void *pLeft, const void *pRight) {
40✔
530
  int64_t left = GET_INT64_VAL(pLeft);
40✔
531
  double  right = GET_DOUBLE_VAL(pRight);
40✔
532
  if (left > right) return 1;
40!
533
  if (left < right) return -1;
40!
534
  return 0;
×
535
}
536

537
int32_t compareInt64Uint8(const void *pLeft, const void *pRight) {
×
538
  int64_t left = GET_INT64_VAL(pLeft);
×
539
  uint8_t right = GET_UINT8_VAL(pRight);
×
540
  if (left > right) return 1;
×
541
  if (left < right) return -1;
×
542
  return 0;
×
543
}
544

545
int32_t compareInt64Uint16(const void *pLeft, const void *pRight) {
×
546
  int64_t  left = GET_INT64_VAL(pLeft);
×
547
  uint16_t right = GET_UINT16_VAL(pRight);
×
548
  if (left > right) return 1;
×
549
  if (left < right) return -1;
×
550
  return 0;
×
551
}
552

553
int32_t compareInt64Uint32(const void *pLeft, const void *pRight) {
×
554
  int64_t  left = GET_INT64_VAL(pLeft);
×
555
  uint32_t right = GET_UINT32_VAL(pRight);
×
556
  if (left > right) return 1;
×
557
  if (left < right) return -1;
×
558
  return 0;
×
559
}
560

561
int32_t compareInt64Uint64(const void *pLeft, const void *pRight) {
60✔
562
  int64_t  left = GET_INT64_VAL(pLeft);
60✔
563
  if (left < 0) return -1;
60✔
564
  uint64_t right = GET_UINT64_VAL(pRight);
55✔
565
  if ((uint64_t)left > right) return 1;
55!
566
  if ((uint64_t)left < right) return -1;
55!
567
  return 0;
×
568
}
569

570
int32_t compareFloatInt8(const void *pLeft, const void *pRight) {
625,886✔
571
  float  left = GET_FLOAT_VAL(pLeft);
625,886✔
572
  int8_t right = GET_INT8_VAL(pRight);
625,886✔
573
  if (left > right) return 1;
625,886✔
574
  if (left < right) return -1;
615,917✔
575
  return 0;
605,156✔
576
}
577

578
int32_t compareFloatInt16(const void *pLeft, const void *pRight) {
67,252✔
579
  float   left = GET_FLOAT_VAL(pLeft);
67,252✔
580
  int16_t right = GET_INT16_VAL(pRight);
67,252✔
581
  if (left > right) return 1;
67,252✔
582
  if (left < right) return -1;
2,561!
583
  return 0;
×
584
}
585

586
int32_t compareFloatInt32(const void *pLeft, const void *pRight) {
1,576✔
587
  float   left = GET_FLOAT_VAL(pLeft);
1,576✔
588
  int32_t right = GET_INT32_VAL(pRight);
1,576✔
589
  if (left > right) return 1;
1,576✔
590
  if (left < right) return -1;
1,344!
591
  return 0;
×
592
}
593

594
int32_t compareFloatInt64(const void *pLeft, const void *pRight) {
×
595
  float   left = GET_FLOAT_VAL(pLeft);
×
596
  int64_t right = GET_INT64_VAL(pRight);
×
597
  if (left > right) return 1;
×
598
  if (left < right) return -1;
×
599
  return 0;
×
600
}
601

602
int32_t compareFloatDouble(const void *pLeft, const void *pRight) {
5,891,679✔
603
  float  left = GET_FLOAT_VAL(pLeft);
5,891,679✔
604
  double right = GET_DOUBLE_VAL(pRight);
5,891,679✔
605

606
  if (isnan(left) && isnan(right)) {
5,891,679!
607
    return 0;
×
608
  }
609

610
  if (isnan(left)) {
5,891,679!
611
    return -1;
×
612
  }
613

614
  if (isnan(right)) {
5,891,679!
615
    return 1;
×
616
  }
617

618
  if (FLT_EQUAL(left, right)) {
5,891,679!
619
    return 0;
×
620
  }
621
  return FLT_GREATER(left, right) ? 1 : -1;
5,891,679!
622
}
623

624
int32_t compareFloatUint8(const void *pLeft, const void *pRight) {
×
625
  float   left = GET_FLOAT_VAL(pLeft);
×
626
  uint8_t right = GET_UINT8_VAL(pRight);
×
627
  if (left > right) return 1;
×
628
  if (left < right) return -1;
×
629
  return 0;
×
630
}
631

632
int32_t compareFloatUint16(const void *pLeft, const void *pRight) {
×
633
  float    left = GET_FLOAT_VAL(pLeft);
×
634
  uint16_t right = GET_UINT16_VAL(pRight);
×
635
  if (left > right) return 1;
×
636
  if (left < right) return -1;
×
637
  return 0;
×
638
}
639

640
int32_t compareFloatUint32(const void *pLeft, const void *pRight) {
×
641
  float    left = GET_FLOAT_VAL(pLeft);
×
642
  uint32_t right = GET_UINT32_VAL(pRight);
×
643
  if (left > right) return 1;
×
644
  if (left < right) return -1;
×
645
  return 0;
×
646
}
647

648
int32_t compareFloatUint64(const void *pLeft, const void *pRight) {
×
649
  float    left = GET_FLOAT_VAL(pLeft);
×
650
  uint64_t right = GET_UINT64_VAL(pRight);
×
651
  if (left > right) return 1;
×
652
  if (left < right) return -1;
×
653
  return 0;
×
654
}
655

656
int32_t compareDoubleInt8(const void *pLeft, const void *pRight) {
8,005,424✔
657
  double left = GET_DOUBLE_VAL(pLeft);
8,005,424✔
658
  int8_t right = GET_INT8_VAL(pRight);
8,005,424✔
659
  if (left > right) return 1;
8,005,424✔
660
  if (left < right) return -1;
4,414,500✔
661
  return 0;
895,516✔
662
}
663

664
int32_t compareDoubleInt16(const void *pLeft, const void *pRight) {
600,000✔
665
  double  left = GET_DOUBLE_VAL(pLeft);
600,000✔
666
  int16_t right = GET_INT16_VAL(pRight);
600,000✔
667
  if (left > right) return 1;
600,000!
668
  if (left < right) return -1;
600,000!
669
  return 0;
600,000✔
670
}
671

672
int32_t compareDoubleInt32(const void *pLeft, const void *pRight) {
47,032✔
673
  double  left = GET_DOUBLE_VAL(pLeft);
47,032✔
674
  int32_t right = GET_INT32_VAL(pRight);
47,032✔
675
  if (left > right) return 1;
47,032✔
676
  if (left < right) return -1;
40,954✔
677
  return 0;
118✔
678
}
679

680
int32_t compareDoubleInt64(const void *pLeft, const void *pRight) {
9,283,439✔
681
  double  left = GET_DOUBLE_VAL(pLeft);
9,283,439✔
682
  int64_t right = GET_INT64_VAL(pRight);
9,283,439✔
683
  if (left > right) return 1;
9,283,439✔
684
  if (left < right) return -1;
4,882,681✔
685
  return 0;
1,114,196✔
686
}
687

688
int32_t compareDoubleFloat(const void *pLeft, const void *pRight) {
4,350✔
689
  double left = GET_DOUBLE_VAL(pLeft);
4,350✔
690
  float  right = GET_FLOAT_VAL(pRight);
4,350✔
691

692
  if (isnan(left) && isnan(right)) {
4,350!
693
    return 0;
×
694
  }
695

696
  if (isnan(left)) {
4,350!
697
    return -1;
×
698
  }
699

700
  if (isnan(right)) {
4,350!
701
    return 1;
×
702
  }
703

704
  if (FLT_EQUAL(left, right)) {
4,350✔
705
    return 0;
1,495✔
706
  }
707
  return FLT_GREATER(left, right) ? 1 : -1;
2,855!
708
}
709

710
int32_t compareDoubleUint8(const void *pLeft, const void *pRight) {
×
711
  double  left = GET_DOUBLE_VAL(pLeft);
×
712
  uint8_t right = GET_UINT8_VAL(pRight);
×
713
  if (left > right) return 1;
×
714
  if (left < right) return -1;
×
715
  return 0;
×
716
}
717

718
int32_t compareDoubleUint16(const void *pLeft, const void *pRight) {
×
719
  double   left = GET_DOUBLE_VAL(pLeft);
×
720
  uint16_t right = GET_UINT16_VAL(pRight);
×
721
  if (left > right) return 1;
×
722
  if (left < right) return -1;
×
723
  return 0;
×
724
}
725

726
int32_t compareDoubleUint32(const void *pLeft, const void *pRight) {
×
727
  double   left = GET_DOUBLE_VAL(pLeft);
×
728
  uint32_t right = GET_UINT32_VAL(pRight);
×
729
  if (left > right) return 1;
×
730
  if (left < right) return -1;
×
731
  return 0;
×
732
}
733

734
int32_t compareDoubleUint64(const void *pLeft, const void *pRight) {
×
735
  double   left = GET_DOUBLE_VAL(pLeft);
×
736
  uint64_t right = GET_UINT64_VAL(pRight);
×
737
  if (left > right) return 1;
×
738
  if (left < right) return -1;
×
739
  return 0;
×
740
}
741

742
int32_t compareUint8Int8(const void *pLeft, const void *pRight) {
19,118✔
743
  uint8_t left = GET_UINT8_VAL(pLeft);
19,118✔
744
  int8_t  right = GET_INT8_VAL(pRight);
19,118✔
745
  if (left > right) return 1;
19,118✔
746
  if (left < right) return -1;
4,383✔
747
  return 0;
1,943✔
748
}
749

750
int32_t compareUint8Int16(const void *pLeft, const void *pRight) {
×
751
  uint8_t left = GET_UINT8_VAL(pLeft);
×
752
  int16_t right = GET_INT16_VAL(pRight);
×
753
  if (left > right) return 1;
×
754
  if (left < right) return -1;
×
755
  return 0;
×
756
}
757

758
int32_t compareUint8Int32(const void *pLeft, const void *pRight) {
×
759
  uint8_t left = GET_UINT8_VAL(pLeft);
×
760
  int32_t right = GET_INT32_VAL(pRight);
×
761
  if (left > right) return 1;
×
762
  if (left < right) return -1;
×
763
  return 0;
×
764
}
765

766
int32_t compareUint8Int64(const void *pLeft, const void *pRight) {
×
767
  uint8_t left = GET_UINT8_VAL(pLeft);
×
768
  int64_t right = GET_INT64_VAL(pRight);
×
769
  if (left > right) return 1;
×
770
  if (left < right) return -1;
×
771
  return 0;
×
772
}
773

774
int32_t compareUint8Float(const void *pLeft, const void *pRight) {
×
775
  uint8_t left = GET_UINT8_VAL(pLeft);
×
776
  float   right = GET_FLOAT_VAL(pRight);
×
777
  if (left > right) return 1;
×
778
  if (left < right) return -1;
×
779
  return 0;
×
780
}
781

782
int32_t compareUint8Double(const void *pLeft, const void *pRight) {
×
783
  uint8_t left = GET_UINT8_VAL(pLeft);
×
784
  double  right = GET_DOUBLE_VAL(pRight);
×
785
  if (left > right) return 1;
×
786
  if (left < right) return -1;
×
787
  return 0;
×
788
}
789

790
int32_t compareUint8Uint16(const void *pLeft, const void *pRight) {
175✔
791
  uint8_t  left = GET_UINT8_VAL(pLeft);
175✔
792
  uint16_t right = GET_UINT16_VAL(pRight);
175✔
793
  if (left > right) return 1;
175!
794
  if (left < right) return -1;
175!
795
  return 0;
175✔
796
}
797

798
int32_t compareUint8Uint32(const void *pLeft, const void *pRight) {
×
799
  uint8_t  left = GET_UINT8_VAL(pLeft);
×
800
  uint32_t right = GET_UINT32_VAL(pRight);
×
801
  if (left > right) return 1;
×
802
  if (left < right) return -1;
×
803
  return 0;
×
804
}
805

806
int32_t compareUint8Uint64(const void *pLeft, const void *pRight) {
×
807
  uint8_t  left = GET_UINT8_VAL(pLeft);
×
808
  uint64_t right = GET_UINT64_VAL(pRight);
×
809
  if (left > right) return 1;
×
810
  if (left < right) return -1;
×
811
  return 0;
×
812
}
813

814
int32_t compareUint16Int8(const void *pLeft, const void *pRight) {
16,730✔
815
  uint16_t left = GET_UINT16_VAL(pLeft);
16,730✔
816
  int8_t   right = GET_INT8_VAL(pRight);
16,730✔
817
  if (left > right) return 1;
16,730✔
818
  if (left < right) return -1;
3,149✔
819
  return 0;
1,504✔
820
}
821

822
int32_t compareUint16Int16(const void *pLeft, const void *pRight) {
×
823
  uint16_t left = GET_UINT16_VAL(pLeft);
×
824
  int16_t  right = GET_INT16_VAL(pRight);
×
825
  if (left > right) return 1;
×
826
  if (left < right) return -1;
×
827
  return 0;
×
828
}
829

830
int32_t compareUint16Int32(const void *pLeft, const void *pRight) {
×
831
  uint16_t left = GET_UINT16_VAL(pLeft);
×
832
  int32_t  right = GET_INT32_VAL(pRight);
×
833
  if (left > right) return 1;
×
834
  if (left < right) return -1;
×
835
  return 0;
×
836
}
837

838
int32_t compareUint16Int64(const void *pLeft, const void *pRight) {
×
839
  uint16_t left = GET_UINT16_VAL(pLeft);
×
840
  int64_t  right = GET_INT64_VAL(pRight);
×
841
  if (left > right) return 1;
×
842
  if (left < right) return -1;
×
843
  return 0;
×
844
}
845

846
int32_t compareUint16Float(const void *pLeft, const void *pRight) {
×
847
  uint16_t left = GET_UINT16_VAL(pLeft);
×
848
  float    right = GET_FLOAT_VAL(pRight);
×
849
  if (left > right) return 1;
×
850
  if (left < right) return -1;
×
851
  return 0;
×
852
}
853

854
int32_t compareUint16Double(const void *pLeft, const void *pRight) {
×
855
  uint16_t left = GET_UINT16_VAL(pLeft);
×
856
  double   right = GET_DOUBLE_VAL(pRight);
×
857
  if (left > right) return 1;
×
858
  if (left < right) return -1;
×
859
  return 0;
×
860
}
861

862
int32_t compareUint16Uint8(const void *pLeft, const void *pRight) {
×
863
  uint16_t left = GET_UINT16_VAL(pLeft);
×
864
  uint8_t  right = GET_UINT8_VAL(pRight);
×
865
  if (left > right) return 1;
×
866
  if (left < right) return -1;
×
867
  return 0;
×
868
}
869

870
int32_t compareUint16Uint32(const void *pLeft, const void *pRight) {
×
871
  uint16_t left = GET_UINT16_VAL(pLeft);
×
872
  uint32_t right = GET_UINT32_VAL(pRight);
×
873
  if (left > right) return 1;
×
874
  if (left < right) return -1;
×
875
  return 0;
×
876
}
877

878
int32_t compareUint16Uint64(const void *pLeft, const void *pRight) {
×
879
  uint16_t left = GET_UINT16_VAL(pLeft);
×
880
  uint64_t right = GET_UINT64_VAL(pRight);
×
881
  if (left > right) return 1;
×
882
  if (left < right) return -1;
×
883
  return 0;
×
884
}
885

886
int32_t compareUint32Int8(const void *pLeft, const void *pRight) {
17,710✔
887
  uint32_t left = GET_UINT32_VAL(pLeft);
17,710✔
888
  int8_t   right = GET_INT8_VAL(pRight);
17,710✔
889
  if (right < 0) return 1;
17,710!
890
  if (left > (uint32_t)right) return 1;
17,710✔
891
  if (left < (uint32_t)right) return -1;
2,814✔
892
  return 0;
1,351✔
893
}
894

895
int32_t compareUint32Int16(const void *pLeft, const void *pRight) {
5✔
896
  uint32_t left = GET_UINT32_VAL(pLeft);
5✔
897
  int16_t  right = GET_INT16_VAL(pRight);
5✔
898
  if (right < 0) return 1;
5!
899
  if (left > (uint32_t)right) return 1;
5!
900
  if (left < (uint32_t)right) return -1;
5!
901
  return 0;
5✔
902
}
903

904
int32_t compareUint32Int32(const void *pLeft, const void *pRight) {
×
905
  uint32_t left = GET_UINT32_VAL(pLeft);
×
906
  int32_t  right = GET_INT32_VAL(pRight);
×
907
  if (right < 0) return 1;
×
908
  if (left > (uint32_t)right) return 1;
×
909
  if (left < (uint32_t)right) return -1;
×
910
  return 0;
×
911
}
912

913
int32_t compareUint32Int64(const void *pLeft, const void *pRight) {
×
914
  uint32_t left = GET_UINT32_VAL(pLeft);
×
915
  int64_t  right = GET_INT64_VAL(pRight);
×
916
  if (left > right) return 1;
×
917
  if (left < right) return -1;
×
918
  return 0;
×
919
}
920

921
int32_t compareUint32Float(const void *pLeft, const void *pRight) {
×
922
  uint32_t left = GET_UINT32_VAL(pLeft);
×
923
  float    right = GET_FLOAT_VAL(pRight);
×
924
  if (left > right) return 1;
×
925
  if (left < right) return -1;
×
926
  return 0;
×
927
}
928

929
int32_t compareUint32Double(const void *pLeft, const void *pRight) {
×
930
  uint32_t left = GET_UINT32_VAL(pLeft);
×
931
  double   right = GET_DOUBLE_VAL(pRight);
×
932
  if (left > right) return 1;
×
933
  if (left < right) return -1;
×
934
  return 0;
×
935
}
936

937
int32_t compareUint32Uint8(const void *pLeft, const void *pRight) {
×
938
  uint32_t left = GET_UINT32_VAL(pLeft);
×
939
  uint8_t  right = GET_UINT8_VAL(pRight);
×
940
  if (left > right) return 1;
×
941
  if (left < right) return -1;
×
942
  return 0;
×
943
}
944

945
int32_t compareUint32Uint16(const void *pLeft, const void *pRight) {
×
946
  uint32_t left = GET_UINT32_VAL(pLeft);
×
947
  uint16_t right = GET_UINT16_VAL(pRight);
×
948
  if (left > right) return 1;
×
949
  if (left < right) return -1;
×
950
  return 0;
×
951
}
952

953
int32_t compareUint32Uint64(const void *pLeft, const void *pRight) {
×
954
  uint32_t left = GET_UINT32_VAL(pLeft);
×
955
  uint64_t right = GET_UINT64_VAL(pRight);
×
956
  if (left > right) return 1;
×
957
  if (left < right) return -1;
×
958
  return 0;
×
959
}
960

961
int32_t compareUint64Int8(const void *pLeft, const void *pRight) {
19,023✔
962
  uint64_t left = GET_UINT64_VAL(pLeft);
19,023✔
963
  int8_t   right = GET_INT8_VAL(pRight);
19,023✔
964
  if (right < 0) return 1;
19,023!
965
  if (left > (uint64_t)right) return 1;
19,023✔
966
  if (left < (uint64_t)right) return -1;
3,369✔
967
  return 0;
2,031✔
968
}
969

970
int32_t compareUint64Int16(const void *pLeft, const void *pRight) {
5✔
971
  uint64_t left = GET_UINT64_VAL(pLeft);
5✔
972
  int16_t  right = GET_INT16_VAL(pRight);
5✔
973
  if (right < 0) return 1;
5!
974
  if (left > (uint64_t)right) return 1;
5!
975
  if (left < (uint64_t)right) return -1;
5!
976
  return 0;
5✔
977
}
978

979
int32_t compareUint64Int32(const void *pLeft, const void *pRight) {
8✔
980
  uint64_t left = GET_UINT64_VAL(pLeft);
8✔
981
  int32_t  right = GET_INT32_VAL(pRight);
8✔
982
  if (right < 0) return 1;
8!
983
  if (left > (uint64_t)right) return 1;
8!
984
  if (left < (uint64_t)right) return -1;
8✔
985
  return 0;
2✔
986
}
987

988
int32_t compareUint64Int64(const void *pLeft, const void *pRight) {
×
989
  uint64_t left = GET_UINT64_VAL(pLeft);
×
990
  int64_t  right = GET_INT64_VAL(pRight);
×
991
  if (right < 0) return 1;
×
992
  if (left > (uint64_t)right) return 1;
×
993
  if (left < (uint64_t)right) return -1;
×
994
  return 0;
×
995
}
996

997
int32_t compareUint64Float(const void *pLeft, const void *pRight) {
×
998
  uint64_t left = GET_UINT64_VAL(pLeft);
×
999
  float    right = GET_FLOAT_VAL(pRight);
×
1000
  if (left > right) return 1;
×
1001
  if (left < right) return -1;
×
1002
  return 0;
×
1003
}
1004

1005
int32_t compareUint64Double(const void *pLeft, const void *pRight) {
×
1006
  uint64_t left = GET_UINT64_VAL(pLeft);
×
1007
  double   right = GET_DOUBLE_VAL(pRight);
×
1008
  if (left > right) return 1;
×
1009
  if (left < right) return -1;
×
1010
  return 0;
×
1011
}
1012

1013
int32_t compareUint64Uint8(const void *pLeft, const void *pRight) {
×
1014
  uint64_t left = GET_UINT64_VAL(pLeft);
×
1015
  uint8_t  right = GET_UINT8_VAL(pRight);
×
1016
  if (left > right) return 1;
×
1017
  if (left < right) return -1;
×
1018
  return 0;
×
1019
}
1020

1021
int32_t compareUint64Uint16(const void *pLeft, const void *pRight) {
×
1022
  uint64_t left = GET_UINT64_VAL(pLeft);
×
1023
  uint16_t right = GET_UINT16_VAL(pRight);
×
1024
  if (left > right) return 1;
×
1025
  if (left < right) return -1;
×
1026
  return 0;
×
1027
}
1028

1029
int32_t compareUint64Uint32(const void *pLeft, const void *pRight) {
×
1030
  uint64_t left = GET_UINT64_VAL(pLeft);
×
1031
  uint32_t right = GET_UINT32_VAL(pRight);
×
1032
  if (left > right) return 1;
×
1033
  if (left < right) return -1;
×
1034
  return 0;
×
1035
}
1036

1037
int32_t compareJsonValDesc(const void *pLeft, const void *pRight) { return compareJsonVal(pRight, pLeft); }
204✔
1038

1039
/*
1040
 * Compare two strings
1041
 *    TSDB_MATCH:            Match
1042
 *    TSDB_NOMATCH:          No match
1043
 *    TSDB_NOWILDCARDMATCH:  No match in spite of having * or % wildcards.
1044
 * Like matching rules:
1045
 *      '%': Matches zero or more characters
1046
 *      '_': Matches one character
1047
 *
1048
 */
1049
int32_t patternMatch(const char *pattern, size_t psize, const char *str, size_t ssize,
11,666,849✔
1050
                     const SPatternCompareInfo *pInfo) {
1051
  char c, c1;
1052

1053
  int32_t i = 0;
11,666,849✔
1054
  int32_t j = 0;
11,666,849✔
1055
  int32_t nMatchChar = 0;
11,666,849✔
1056

1057
  while ((i < psize) && ((c = pattern[i++]) != 0)) {
23,520,751!
1058
    if (c == pInfo->matchAll) { /* Match "*" */
13,882,325✔
1059

1060
      while ((i < psize) && ((c = pattern[i++]) == pInfo->matchAll || c == pInfo->matchOne)) {
2,002,783✔
1061
        if (c == pInfo->matchOne) {
5,459✔
1062
          if (j >= ssize || str[j++] == 0) {  // empty string, return not match
5,235!
1063
            return TSDB_PATTERN_NOWILDCARDMATCH;
×
1064
          } else {
1065
            ++nMatchChar;
5,235✔
1066
          }
1067
        }
1068
      }
1069

1070
      if (i >= psize && (c == pInfo->umatchOne || c == pInfo->umatchAll)) {
1,997,324✔
1071
        return TSDB_PATTERN_MATCH; /* "*" at the end of the pattern matches */
1,949,528✔
1072
      }
1073

1074
      if (c == '\\' && (pattern[i] == '_' || pattern[i] == '%')) {
47,796!
1075
        c = pattern[i];
1,512✔
1076
        i++;
1,512✔
1077
      }
1078

1079
      char rejectList[2] = {toupper(c), tolower(c)};
47,796✔
1080

1081
      str += nMatchChar;
47,796✔
1082
      int32_t remain = ssize - nMatchChar;
47,796✔
1083
      while (1) {
9,608,968✔
1084
        size_t n = tstrncspn(str, remain, rejectList, 2);
9,656,764✔
1085

1086
        str += n;
9,657,143✔
1087
        remain -= n;
9,657,143✔
1088

1089
        if ((remain <= 0) || str[0] == 0) {
9,657,143!
1090
          break;
1091
        }
1092

1093
        int32_t ret = patternMatch(&pattern[i], psize - i, ++str, --remain, pInfo);
9,626,330✔
1094
        if (ret != TSDB_PATTERN_NOMATCH) {
9,625,852✔
1095
          return ret;
16,884✔
1096
        }
1097
      }
1098

1099
      return TSDB_PATTERN_NOWILDCARDMATCH;
30,813✔
1100
    }
1101

1102
    if (j < ssize) {
11,885,001✔
1103
      c1 = str[j++];
11,883,942✔
1104
      ++nMatchChar;
11,883,942✔
1105

1106
      if (c == '\\' && (pattern[i] == '_' || pattern[i] == '%')) {
11,883,942✔
1107
        if (c1 != pattern[i]) {
302✔
1108
          return TSDB_PATTERN_NOMATCH;
199✔
1109
        } else {
1110
          i++;
103✔
1111
          continue;
103✔
1112
        }
1113
      }
1114

1115
      if (c == c1 || tolower(c) == tolower(c1) || (c == pInfo->matchOne && c1 != 0)) {
11,883,640!
1116
        continue;
11,853,799✔
1117
      }
1118
    }
1119

1120
    return TSDB_PATTERN_NOMATCH;
30,900✔
1121
  }
1122

1123
  return (j >= ssize || str[j] == 0) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH;
9,638,426!
1124
}
1125

1126
int32_t wcsPatternMatch(const TdUcs4 *pattern, size_t psize, const TdUcs4 *str, size_t ssize,
2,262,822✔
1127
                        const SPatternCompareInfo *pInfo) {
1128
  TdUcs4 c, c1;
1129

1130
  int32_t i = 0;
2,262,822✔
1131
  int32_t j = 0;
2,262,822✔
1132
  int32_t nMatchChar = 0;
2,262,822✔
1133

1134
  while ((i < psize) && ((c = pattern[i++]) != 0)) {
13,536,235!
1135
    if (c == pInfo->umatchAll) { /* Match "%" */
13,534,028✔
1136

1137
      while ((i < psize) && ((c = pattern[i++]) == pInfo->umatchAll || c == pInfo->umatchOne)) {
2,258,690!
1138
        if (c == pInfo->umatchOne) {
×
1139
          if (j >= ssize || str[j++] == 0) {
×
1140
            return TSDB_PATTERN_NOWILDCARDMATCH;
×
1141
          } else {
1142
            ++nMatchChar;
×
1143
          }
1144
        }
1145
      }
1146

1147
      if (i >= psize && (c == pInfo->umatchOne || c == pInfo->umatchAll)) {
2,258,690!
1148
        return TSDB_PATTERN_MATCH;
2,256,248✔
1149
      }
1150

1151
      if (c == '\\' && (pattern[i] == '_' || pattern[i] == '%')) {
2,442!
1152
        c = pattern[i];
×
1153
        i++;
×
1154
      }
1155

1156
      TdUcs4 rejectList[2] = {towupper(c), towlower(c)};
2,442✔
1157

1158
      str += nMatchChar;
2,442✔
1159
      int32_t remain = ssize - nMatchChar;
2,442✔
1160
      while (1) {
2,057✔
1161
        size_t n = twcsncspn(str, remain, rejectList, 2);
4,499✔
1162

1163
        str += n;
4,525✔
1164
        remain -= n;
4,525✔
1165

1166
        if ((remain <= 0) || str[0] == 0) {
4,525!
1167
          break;
1168
        }
1169

1170
        int32_t ret = wcsPatternMatch(&pattern[i], psize - i, ++str, --remain, pInfo);
4,151✔
1171
        if (ret != TSDB_PATTERN_NOMATCH) {
4,151✔
1172
          return ret;
2,094✔
1173
        }
1174
      }
1175

1176
      return TSDB_PATTERN_NOWILDCARDMATCH;
374✔
1177
    }
1178

1179
    if (j < ssize) {
11,275,338!
1180
      c1 = str[j++];
11,275,549✔
1181
      nMatchChar++;
11,275,549✔
1182

1183
      if (c == '\\' && (pattern[i] == '_' || pattern[i] == '%')) {
11,275,549!
1184
        if (c1 != pattern[i]) {
×
1185
          return TSDB_PATTERN_NOMATCH;
×
1186
        } else {
1187
          i++;
×
1188
          continue;
×
1189
        }
1190
      }
1191

1192
      if (c == c1 || towlower(c) == towlower(c1) || (c == pInfo->umatchOne && c1 != 0)) {
11,275,549!
1193
        continue;
11,273,413✔
1194
      }
1195
    }
1196

1197
    return TSDB_PATTERN_NOMATCH;
1,925✔
1198
  }
1199

1200
  return (j >= ssize || str[j] == 0) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH;
2,207!
1201
}
1202

1203
int32_t comparestrRegexNMatch(const void *pLeft, const void *pRight) {
631,533✔
1204
  return comparestrRegexMatch(pLeft, pRight) ? 0 : 1;
631,533✔
1205
}
1206

1207
typedef struct UsingRegex {
1208
  regex_t pRegex;
1209
  int32_t lastUsedTime;
1210
} UsingRegex;
1211
typedef UsingRegex* HashRegexPtr;
1212

1213
typedef struct RegexCache {
1214
  SHashObj      *regexHash;
1215
  void          *regexCacheTmr;
1216
  void          *timer;
1217
  SRWLatch      mutex;
1218
  bool          exit;
1219
} RegexCache;
1220
static RegexCache sRegexCache;
1221
#define MAX_REGEX_CACHE_SIZE   20
1222
#define REGEX_CACHE_CLEAR_TIME 30
1223

1224
static void checkRegexCache(void* param, void* tmrId) {
2,888✔
1225
  int32_t  code = 0;
2,888✔
1226
  taosRLockLatch(&sRegexCache.mutex);
2,888✔
1227
  if(sRegexCache.exit) {
2,888!
1228
    goto _exit;
×
1229
  }
1230
  bool stopped = taosTmrReset(checkRegexCache, REGEX_CACHE_CLEAR_TIME * 1000, param, sRegexCache.regexCacheTmr, &tmrId);
2,888✔
1231
  if (stopped) {
2,888!
1232
    uError("failed to reset regex cache timer");
×
1233
    goto _exit;
×
1234
  }
1235
  if (taosHashGetSize(sRegexCache.regexHash) < MAX_REGEX_CACHE_SIZE) {
2,888✔
1236
    goto _exit;
2,884✔
1237
  }
1238

1239
  if (taosHashGetSize(sRegexCache.regexHash) >= MAX_REGEX_CACHE_SIZE) {
4!
1240
    UsingRegex **ppUsingRegex = taosHashIterate(sRegexCache.regexHash, NULL);
4✔
1241
    while ((ppUsingRegex != NULL)) {
400✔
1242
      if (taosGetTimestampSec() - (*ppUsingRegex)->lastUsedTime > REGEX_CACHE_CLEAR_TIME) {
396!
1243
        size_t len = 0;
×
1244
        char* key = (char*)taosHashGetKey(ppUsingRegex, &len);
×
1245
        if (TSDB_CODE_SUCCESS != taosHashRemove(sRegexCache.regexHash, key, len)) {
×
1246
          uError("failed to remove regex pattern %s from cache", key);
×
1247
          goto _exit;
×
1248
        }
1249
      }
1250
      ppUsingRegex = taosHashIterate(sRegexCache.regexHash, ppUsingRegex);
396✔
1251
    }
1252
  }
1253
_exit:
4✔
1254
  taosRUnLockLatch(&sRegexCache.mutex);
2,888✔
1255
}
2,888✔
1256

1257
void regexCacheFree(void *ppUsingRegex) {
723✔
1258
  regfree(&(*(UsingRegex **)ppUsingRegex)->pRegex);
723✔
1259
  taosMemoryFree(*(UsingRegex **)ppUsingRegex);
723✔
1260
}
723✔
1261

1262
int32_t InitRegexCache() {
5,660✔
1263
  #ifdef WINDOWS
1264
    return 0;
1265
  #endif
1266
  sRegexCache.regexHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK);
5,660✔
1267
  if (sRegexCache.regexHash == NULL) {
5,660!
1268
    uError("failed to create RegexCache");
×
1269
    return terrno;
×
1270
  }
1271
  taosHashSetFreeFp(sRegexCache.regexHash, regexCacheFree);
5,660✔
1272
  sRegexCache.regexCacheTmr = taosTmrInit(0, 0, 0, "REGEXCACHE");
5,660✔
1273
  if (sRegexCache.regexCacheTmr == NULL) {
5,660!
1274
    uError("failed to create regex cache check timer");
×
1275
    return terrno;
×
1276
  }
1277

1278
  sRegexCache.exit = false;
5,660✔
1279
  taosInitRWLatch(&sRegexCache.mutex);
5,660✔
1280
  sRegexCache.timer = taosTmrStart(checkRegexCache, REGEX_CACHE_CLEAR_TIME * 1000, NULL, sRegexCache.regexCacheTmr);
5,660✔
1281
  if (sRegexCache.timer == NULL) {
5,660!
1282
    uError("failed to start regex cache timer");
×
1283
    return terrno;
×
1284
  }
1285

1286
  return TSDB_CODE_SUCCESS;
5,660✔
1287
}
1288

1289
void DestroyRegexCache(){
5,660✔
1290
  #ifdef WINDOWS
1291
    return;
1292
  #endif
1293
  int32_t code = 0;
5,660✔
1294
  uInfo("[regex cache] destory regex cache");
5,660!
1295
  bool ret = taosTmrStopA(&sRegexCache.timer);
5,660✔
1296
  if (!ret) {
5,660✔
1297
    uError("failed to stop regex cache timer");
1,193!
1298
  }
1299
  taosWLockLatch(&sRegexCache.mutex);
5,660✔
1300
  sRegexCache.exit = true;
5,660✔
1301
  taosHashCleanup(sRegexCache.regexHash);
5,660✔
1302
  taosTmrCleanUp(sRegexCache.regexCacheTmr);
5,660✔
1303
  taosWUnLockLatch(&sRegexCache.mutex);
5,660✔
1304
}
5,660✔
1305

1306
int32_t checkRegexPattern(const char *pPattern) {
50,010✔
1307
  if (pPattern == NULL) {
50,010!
1308
    return TSDB_CODE_PAR_REGULAR_EXPRESSION_ERROR;
×
1309
  }
1310

1311
  regex_t regex;
1312
  int32_t cflags = REG_EXTENDED;
50,010✔
1313
  int32_t ret = regcomp(&regex, pPattern, cflags);
50,010✔
1314
  if (ret != 0) {
50,012✔
1315
    char msgbuf[256] = {0};
4,012✔
1316
    (void)regerror(ret, &regex, msgbuf, tListLen(msgbuf));
4,012✔
1317
    uError("Failed to compile regex pattern %s. reason %s", pPattern, msgbuf);
4,012!
1318
    return TSDB_CODE_PAR_REGULAR_EXPRESSION_ERROR;
4,012✔
1319
  }
1320
  regfree(&regex);
46,000✔
1321
  return TSDB_CODE_SUCCESS;
46,000✔
1322
}
1323

1324
int32_t getRegComp(const char *pPattern, HashRegexPtr **regexRet) {
45,867✔
1325
  HashRegexPtr* ppUsingRegex = (HashRegexPtr*)taosHashAcquire(sRegexCache.regexHash, pPattern, strlen(pPattern));
45,867✔
1326
  if (ppUsingRegex != NULL) {
45,870✔
1327
    (*ppUsingRegex)->lastUsedTime = taosGetTimestampSec();
45,148✔
1328
    *regexRet = ppUsingRegex;
45,141✔
1329
    return TSDB_CODE_SUCCESS;
45,141✔
1330
  }
1331
  UsingRegex *pUsingRegex = taosMemoryMalloc(sizeof(UsingRegex));
722✔
1332
  if (pUsingRegex == NULL) {
722!
1333
    uError("Failed to Malloc when compile regex pattern %s.", pPattern);
×
1334
    return terrno;
×
1335
  }
1336
  int32_t cflags = REG_EXTENDED;
722✔
1337
  int32_t ret = regcomp(&pUsingRegex->pRegex, pPattern, cflags);
722✔
1338
  if (ret != 0) {
719!
1339
    char msgbuf[256] = {0};
×
1340
    (void)regerror(ret, &pUsingRegex->pRegex, msgbuf, tListLen(msgbuf));
×
1341
    uError("Failed to compile regex pattern %s. reason %s", pPattern, msgbuf);
×
1342
    taosMemoryFree(pUsingRegex);
×
1343
    return TSDB_CODE_PAR_REGULAR_EXPRESSION_ERROR;
×
1344
  }
1345

1346
  while (true) {
×
1347
    int code = taosHashPut(sRegexCache.regexHash, pPattern, strlen(pPattern), &pUsingRegex, sizeof(UsingRegex *));
719✔
1348
    if (code != 0 && code != TSDB_CODE_DUP_KEY) {
723!
1349
      regexCacheFree(&pUsingRegex);
×
1350
      uError("Failed to put regex pattern %s into cache, exception internal error.", pPattern);
×
1351
      return code;
×
1352
    } else if (code == TSDB_CODE_DUP_KEY) {
723✔
1353
      terrno = 0;
17✔
1354
    }
1355
    ppUsingRegex = (UsingRegex **)taosHashAcquire(sRegexCache.regexHash, pPattern, strlen(pPattern));
723✔
1356
    if (ppUsingRegex) {
722!
1357
      if (*ppUsingRegex != pUsingRegex) {
722✔
1358
        regexCacheFree(&pUsingRegex);
17✔
1359
      }
1360
      pUsingRegex = (*ppUsingRegex);
722✔
1361
      break;
722✔
1362
    } else {
1363
      continue;
×
1364
    }
1365
  }
1366
  pUsingRegex->lastUsedTime = taosGetTimestampSec();
722✔
1367
  *regexRet = ppUsingRegex;
723✔
1368
  return TSDB_CODE_SUCCESS;
723✔
1369
}
1370

1371
void releaseRegComp(UsingRegex  **regex){
45,868✔
1372
  taosHashRelease(sRegexCache.regexHash, regex);
45,868✔
1373
}
45,870✔
1374

1375
static threadlocal UsingRegex ** ppUsingRegex;
1376
static threadlocal regex_t * pRegex;
1377
static threadlocal char    *pOldPattern = NULL;
1378

1379
#ifdef WINDOWS
1380
static threadlocal regex_t gRegex;
1381

1382
void DestoryThreadLocalRegComp() {
1383
  if (NULL != pOldPattern) {
1384
    regfree(&gRegex);
1385
    taosMemoryFree(pOldPattern);
1386
    pOldPattern = NULL;
1387
  }
1388
}
1389

1390
int32_t threadGetRegComp(regex_t **regex, const char *pPattern) {
1391
  if (NULL != pOldPattern) {
1392
    if (strcmp(pOldPattern, pPattern) == 0) {
1393
      *regex = &gRegex;
1394
      return 0;
1395
    } else {
1396
      DestoryThreadLocalRegComp();
1397
    }
1398
  }
1399
  pOldPattern = taosStrdup(pPattern);
1400
  if (NULL == pOldPattern) {
1401
    uError("Failed to Malloc when compile regex pattern %s.", pPattern);
1402
    return terrno;
1403
  }
1404
  int32_t cflags = REG_EXTENDED;
1405
  int32_t ret = regcomp(&gRegex, pPattern, cflags);
1406
  if (ret != 0) {
1407
    char msgbuf[256] = {0};
1408
    (void)regerror(ret, &gRegex, msgbuf, tListLen(msgbuf));
1409
    uError("Failed to compile regex pattern %s. reason %s", pPattern, msgbuf);
1410
    taosMemoryFree(pOldPattern);
1411
    pOldPattern = NULL;
1412
    return TSDB_CODE_PAR_REGULAR_EXPRESSION_ERROR;
1413
  }
1414
  *regex = &gRegex;
1415
  return 0;
1416
}
1417
#else
1418
void DestoryThreadLocalRegComp() {
672,467✔
1419
  if (NULL != pOldPattern) {
672,467✔
1420
    releaseRegComp(ppUsingRegex);
45,869✔
1421
    taosMemoryFree(pOldPattern);
45,871✔
1422
    ppUsingRegex = NULL;
45,868✔
1423
    pRegex = NULL;
45,868✔
1424
    pOldPattern = NULL;
45,868✔
1425
  }
1426
}
672,466✔
1427

1428
int32_t threadGetRegComp(regex_t **regex, const char *pPattern) {
4,553,571✔
1429
  if (NULL != pOldPattern) {
4,553,571✔
1430
    if (strcmp(pOldPattern, pPattern) == 0) {
4,549,606✔
1431
      *regex = pRegex;
4,509,262✔
1432
      return 0;
4,509,262✔
1433
    } else {
1434
      DestoryThreadLocalRegComp();
40,344✔
1435
    }
1436
  }
1437

1438
  HashRegexPtr *ppRegex = NULL;
45,755✔
1439
  int32_t code = getRegComp(pPattern, &ppRegex);
45,755✔
1440
  if (code != TSDB_CODE_SUCCESS) {
45,856!
1441
    return code;
×
1442
  }
1443
  pOldPattern = taosStrdup(pPattern);
45,856✔
1444
  if (NULL == pOldPattern) {
45,865✔
1445
    uError("Failed to Malloc when compile regex pattern %s.", pPattern);
1!
1446
    return terrno;
1✔
1447
  }
1448
  ppUsingRegex = ppRegex;
45,864✔
1449
  pRegex = &((*ppUsingRegex)->pRegex);
45,864✔
1450
  *regex = &(*ppRegex)->pRegex;
45,864✔
1451
  return 0;
45,864✔
1452
}
1453
#endif
1454

1455
static int32_t doExecRegexMatch(const char *pString, const char *pPattern) {
4,551,878✔
1456
  int32_t ret = 0;
4,551,878✔
1457
  char    msgbuf[256] = {0};
4,551,878✔
1458

1459
  regex_t *regex = NULL;
4,551,878✔
1460
  ret = threadGetRegComp(&regex, pPattern);
4,551,878✔
1461
  if (ret != 0) {
4,554,007!
1462
    return ret;
×
1463
  }
1464

1465
  regmatch_t pmatch[1];
1466
  ret = regexec(regex, pString, 1, pmatch, 0);
4,554,007✔
1467
  if (ret != 0 && ret != REG_NOMATCH) {
4,554,389!
1468
    terrno =  TSDB_CODE_PAR_REGULAR_EXPRESSION_ERROR; 
×
1469
    (void)regerror(ret, regex, msgbuf, sizeof(msgbuf));
×
1470
    uDebug("Failed to match %s with pattern %s, reason %s", pString, pPattern, msgbuf)
×
1471
  }
1472

1473
  return (ret == 0) ? 0 : 1;
4,554,374✔
1474
}
1475

1476
int32_t comparestrRegexMatch(const void *pLeft, const void *pRight) {
3,460,200✔
1477
  size_t sz = varDataLen(pRight);
3,460,200✔
1478
  char  *pattern = taosMemoryMalloc(sz + 1);
3,460,200✔
1479
  if (NULL == pattern) {
3,460,070!
1480
    return 1;  // terrno has been set
×
1481
  }
1482

1483
  (void)memcpy(pattern, varDataVal(pRight), varDataLen(pRight));
3,460,070✔
1484
  pattern[sz] = 0;
3,460,070✔
1485

1486
  sz = varDataLen(pLeft);
3,460,070✔
1487
  char *str = taosMemoryMalloc(sz + 1);
3,460,070✔
1488
  if (NULL == str) {
3,459,859!
1489
    taosMemoryFree(pattern);
×
1490
    return 1;  // terrno has been set
×
1491
  }
1492

1493
  (void)memcpy(str, varDataVal(pLeft), sz);
3,459,859✔
1494
  str[sz] = 0;
3,459,859✔
1495

1496
  int32_t ret = doExecRegexMatch(str, pattern);
3,459,859✔
1497

1498
  taosMemoryFree(str);
3,461,591✔
1499
  taosMemoryFree(pattern);
3,460,941✔
1500

1501
  return (ret == 0) ? 0 : 1;
3,460,344✔
1502
}
1503

1504
int32_t comparewcsRegexMatch(const void *pString, const void *pPattern) {
1,092,727✔
1505
  size_t len = varDataLen(pPattern);
1,092,727✔
1506
  char  *pattern = taosMemoryMalloc(len + 1);
1,092,727✔
1507
  if (NULL == pattern) {
1,092,697!
1508
    return 1;  // terrno has been set
×
1509
  }
1510

1511
  int convertLen = taosUcs4ToMbs((TdUcs4 *)varDataVal(pPattern), len, pattern);
1,092,697✔
1512
  if (convertLen < 0) {
1,092,978!
1513
    taosMemoryFree(pattern);
×
1514
    return 1; // terrno has been set
×
1515
  }
1516

1517
  pattern[convertLen] = 0;
1,092,978✔
1518

1519
  len = varDataLen(pString);
1,092,978✔
1520
  char *str = taosMemoryMalloc(len + 1);
1,092,978✔
1521
  if (NULL == str) {
1,092,970!
1522
    taosMemoryFree(pattern);
×
1523
    return 1; // terrno has been set
×
1524
  }
1525

1526
  convertLen = taosUcs4ToMbs((TdUcs4 *)varDataVal(pString), len, str);
1,092,970✔
1527
  if (convertLen < 0) {
1,092,967!
1528
    taosMemoryFree(str);
×
1529
    taosMemoryFree(pattern);
×
1530
    return 1; // terrno has been set
×
1531
  }
1532

1533
  str[convertLen] = 0;
1,092,967✔
1534

1535
  int32_t ret = doExecRegexMatch(str, pattern);
1,092,967✔
1536

1537
  taosMemoryFree(str);
1,092,959✔
1538
  taosMemoryFree(pattern);
1,092,760✔
1539

1540
  return (ret == 0) ? 0 : 1;
1,092,654✔
1541
}
1542

1543
int32_t comparewcsRegexNMatch(const void *pLeft, const void *pRight) {
549,836✔
1544
  return comparewcsRegexMatch(pLeft, pRight) ? 0 : 1;
549,836✔
1545
}
1546

1547
int32_t taosArrayCompareString(const void *a, const void *b) {
224✔
1548
  const char *x = *(const char **)a;
224✔
1549
  const char *y = *(const char **)b;
224✔
1550

1551
  return strcmp(x, y);
224✔
1552
}
1553

1554
int32_t comparestrPatternMatch(const void *pLeft, const void *pRight) {
2,041,820✔
1555
  SPatternCompareInfo pInfo = PATTERN_COMPARE_INFO_INITIALIZER;
2,041,820✔
1556

1557
  if (varDataTLen(pRight) > TSDB_MAX_FIELD_LEN) {
2,041,820!
1558
    return 1;
×
1559
  }
1560
  size_t pLen = varDataLen(pRight);
2,041,820✔
1561
  size_t sz = varDataLen(pLeft);
2,041,820✔
1562

1563
  int32_t ret = patternMatch(varDataVal(pRight), pLen, varDataVal(pLeft), sz, &pInfo);
2,041,820✔
1564
  return (ret == TSDB_PATTERN_MATCH) ? 0 : 1;
2,038,068✔
1565
}
1566

1567
int32_t comparestrPatternNMatch(const void *pLeft, const void *pRight) {
32✔
1568
  return comparestrPatternMatch(pLeft, pRight) ? 0 : 1;
32✔
1569
}
1570

1571
int32_t comparewcsPatternMatch(const void *pLeft, const void *pRight) {
2,258,682✔
1572
  SPatternCompareInfo pInfo = PATTERN_COMPARE_INFO_INITIALIZER;
2,258,682✔
1573

1574
  size_t psize = varDataLen(pRight);
2,258,682✔
1575

1576
  int32_t ret = wcsPatternMatch((TdUcs4 *)varDataVal(pRight), psize / TSDB_NCHAR_SIZE, (TdUcs4 *)varDataVal(pLeft),
2,258,682✔
1577
                                varDataLen(pLeft) / TSDB_NCHAR_SIZE, &pInfo);
2,258,682✔
1578
  return (ret == TSDB_PATTERN_MATCH) ? 0 : 1;
2,256,974✔
1579
}
1580

1581
int32_t comparewcsPatternNMatch(const void *pLeft, const void *pRight) {
×
1582
  return comparewcsPatternMatch(pLeft, pRight) ? 0 : 1;
×
1583
}
1584

1585
__compar_fn_t getComparFunc(int32_t type, int32_t optr) {
1,915,576✔
1586
  __compar_fn_t comparFn = NULL;
1,915,576✔
1587

1588
  if (optr == OP_TYPE_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_VARBINARY &&
1,915,576!
1589
                             type != TSDB_DATA_TYPE_NCHAR && type != TSDB_DATA_TYPE_GEOMETRY)) {
×
1590
    switch (type) {
×
1591
      case TSDB_DATA_TYPE_BOOL:
×
1592
      case TSDB_DATA_TYPE_TINYINT:
1593
      case TSDB_DATA_TYPE_UTINYINT:
1594
        return setChkInBytes1;
×
1595
      case TSDB_DATA_TYPE_SMALLINT:
×
1596
      case TSDB_DATA_TYPE_USMALLINT:
1597
        return setChkInBytes2;
×
1598
      case TSDB_DATA_TYPE_INT:
×
1599
      case TSDB_DATA_TYPE_UINT:
1600
      case TSDB_DATA_TYPE_FLOAT:
1601
        return setChkInBytes4;
×
1602
      case TSDB_DATA_TYPE_BIGINT:
×
1603
      case TSDB_DATA_TYPE_UBIGINT:
1604
      case TSDB_DATA_TYPE_DOUBLE:
1605
      case TSDB_DATA_TYPE_TIMESTAMP:
1606
        return setChkInBytes8;
×
1607
      default:
×
1608
        uError("getComparFunc data type unexpected type:%d, optr:%d", type, optr);
×
1609
        terrno = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
×
1610
        return NULL;
×
1611
    }
1612
  }
1613

1614
  if (optr == OP_TYPE_NOT_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_VARBINARY &&
1,915,576!
1615
                                 type != TSDB_DATA_TYPE_NCHAR && type != TSDB_DATA_TYPE_GEOMETRY)) {
×
1616
    switch (type) {
×
1617
      case TSDB_DATA_TYPE_BOOL:
×
1618
      case TSDB_DATA_TYPE_TINYINT:
1619
      case TSDB_DATA_TYPE_UTINYINT:
1620
        return setChkNotInBytes1;
×
1621
      case TSDB_DATA_TYPE_SMALLINT:
×
1622
      case TSDB_DATA_TYPE_USMALLINT:
1623
        return setChkNotInBytes2;
×
1624
      case TSDB_DATA_TYPE_INT:
×
1625
      case TSDB_DATA_TYPE_UINT:
1626
      case TSDB_DATA_TYPE_FLOAT:
1627
        return setChkNotInBytes4;
×
1628
      case TSDB_DATA_TYPE_BIGINT:
×
1629
      case TSDB_DATA_TYPE_UBIGINT:
1630
      case TSDB_DATA_TYPE_DOUBLE:
1631
      case TSDB_DATA_TYPE_TIMESTAMP:
1632
        return setChkNotInBytes8;
×
1633
      default:
×
1634
        uError("getComparFunc data type unexpected type:%d, optr:%d", type, optr);
×
1635
        terrno = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
×
1636
        return NULL;
×
1637
    }
1638
  }
1639

1640
  switch (type) {
1,915,576✔
1641
    case TSDB_DATA_TYPE_BOOL:
199,681✔
1642
    case TSDB_DATA_TYPE_TINYINT:
1643
      comparFn = compareInt8Val;
199,681✔
1644
      break;
199,681✔
1645
    case TSDB_DATA_TYPE_SMALLINT:
75,537✔
1646
      comparFn = compareInt16Val;
75,537✔
1647
      break;
75,537✔
1648
    case TSDB_DATA_TYPE_INT:
615,619✔
1649
      comparFn = compareInt32Val;
615,619✔
1650
      break;
615,619✔
1651
    case TSDB_DATA_TYPE_BIGINT:
497,732✔
1652
    case TSDB_DATA_TYPE_TIMESTAMP:
1653
      comparFn = compareInt64Val;
497,732✔
1654
      break;
497,732✔
1655
    case TSDB_DATA_TYPE_FLOAT:
25,722✔
1656
      comparFn = compareFloatVal;
25,722✔
1657
      break;
25,722✔
1658
    case TSDB_DATA_TYPE_DOUBLE:
96,135✔
1659
      comparFn = compareDoubleVal;
96,135✔
1660
      break;
96,135✔
1661
    case TSDB_DATA_TYPE_VARBINARY:
11,672✔
1662
      if (optr == OP_TYPE_IN) {
11,672!
1663
        comparFn = compareChkInString;
×
1664
      } else if (optr == OP_TYPE_NOT_IN) {
11,672!
1665
        comparFn = compareChkNotInString;
×
1666
      } else { /* normal relational comparFn */
1667
        comparFn = compareLenBinaryVal;
11,672✔
1668
      }
1669
      break;
11,672✔
1670
    case TSDB_DATA_TYPE_BINARY:
217,169✔
1671
    case TSDB_DATA_TYPE_GEOMETRY: {
1672
      if (optr == OP_TYPE_MATCH) {
217,169!
1673
        comparFn = comparestrRegexMatch;
×
1674
      } else if (optr == OP_TYPE_NMATCH) {
217,169!
1675
        comparFn = comparestrRegexNMatch;
×
1676
      } else if (optr == OP_TYPE_LIKE) { /* wildcard query using like operator */
217,169!
1677
        comparFn = comparestrPatternMatch;
×
1678
      } else if (optr == OP_TYPE_NOT_LIKE) { /* wildcard query using like operator */
217,169!
1679
        comparFn = comparestrPatternNMatch;
×
1680
      } else if (optr == OP_TYPE_IN) {
217,169!
1681
        comparFn = compareChkInString;
×
1682
      } else if (optr == OP_TYPE_NOT_IN) {
217,169!
1683
        comparFn = compareChkNotInString;
×
1684
      } else { /* normal relational comparFn */
1685
        comparFn = compareLenPrefixedStr;
217,169✔
1686
      }
1687

1688
      break;
217,169✔
1689
    }
1690

1691
    case TSDB_DATA_TYPE_NCHAR: {
72,295✔
1692
      if (optr == OP_TYPE_MATCH) {
72,295!
1693
        comparFn = comparewcsRegexMatch;
×
1694
      } else if (optr == OP_TYPE_NMATCH) {
72,295!
1695
        comparFn = comparewcsRegexNMatch;
×
1696
      } else if (optr == OP_TYPE_LIKE) {
72,295!
1697
        comparFn = comparewcsPatternMatch;
×
1698
      } else if (optr == OP_TYPE_NOT_LIKE) {
72,295!
1699
        comparFn = comparewcsPatternNMatch;
×
1700
      } else if (optr == OP_TYPE_IN) {
72,295!
1701
        comparFn = compareChkInString;
×
1702
      } else if (optr == OP_TYPE_NOT_IN) {
72,295!
1703
        comparFn = compareChkNotInString;
×
1704
      } else {
1705
        comparFn = compareLenPrefixedWStr;
72,295✔
1706
      }
1707
      break;
72,295✔
1708
    }
1709

1710
    case TSDB_DATA_TYPE_UTINYINT:
30,316✔
1711
      comparFn = compareUint8Val;
30,316✔
1712
      break;
30,316✔
1713
    case TSDB_DATA_TYPE_USMALLINT:
42,756✔
1714
      comparFn = compareUint16Val;
42,756✔
1715
      break;
42,756✔
1716
    case TSDB_DATA_TYPE_UINT:
14,948✔
1717
      comparFn = compareUint32Val;
14,948✔
1718
      break;
14,948✔
1719
    case TSDB_DATA_TYPE_UBIGINT:
15,944✔
1720
      comparFn = compareUint64Val;
15,944✔
1721
      break;
15,944✔
1722

1723
    default:
50✔
1724
      comparFn = compareInt32Val;
50✔
1725
      break;
50✔
1726
  }
1727

1728
  return comparFn;
1,915,576✔
1729
}
1730

1731
__compar_fn_t getKeyComparFunc(int32_t keyType, int32_t order) {
31,128,715✔
1732
  switch (keyType) {
31,128,715✔
1733
    case TSDB_DATA_TYPE_TINYINT:
17,048✔
1734
    case TSDB_DATA_TYPE_BOOL:
1735
      return (order == TSDB_ORDER_ASC) ? compareInt8Val : compareInt8ValDesc;
17,048✔
1736
    case TSDB_DATA_TYPE_SMALLINT:
110,668✔
1737
      return (order == TSDB_ORDER_ASC) ? compareInt16Val : compareInt16ValDesc;
110,668✔
1738
    case TSDB_DATA_TYPE_INT:
1,929,209✔
1739
      return (order == TSDB_ORDER_ASC) ? compareInt32Val : compareInt32ValDesc;
1,929,209✔
1740
    case TSDB_DATA_TYPE_BIGINT:
25,182,135✔
1741
    case TSDB_DATA_TYPE_TIMESTAMP:
1742
      return (order == TSDB_ORDER_ASC) ? compareInt64Val : compareInt64ValDesc;
25,182,135✔
1743
    case TSDB_DATA_TYPE_FLOAT:
11,960✔
1744
      return (order == TSDB_ORDER_ASC) ? compareFloatVal : compareFloatValDesc;
11,960✔
1745
    case TSDB_DATA_TYPE_DOUBLE:
70,744✔
1746
      return (order == TSDB_ORDER_ASC) ? compareDoubleVal : compareDoubleValDesc;
70,744✔
1747
    case TSDB_DATA_TYPE_UTINYINT:
200✔
1748
      return (order == TSDB_ORDER_ASC) ? compareUint8Val : compareUint8ValDesc;
200✔
1749
    case TSDB_DATA_TYPE_USMALLINT:
192✔
1750
      return (order == TSDB_ORDER_ASC) ? compareUint16Val : compareUint16ValDesc;
192✔
1751
    case TSDB_DATA_TYPE_UINT:
830,525✔
1752
      return (order == TSDB_ORDER_ASC) ? compareUint32Val : compareUint32ValDesc;
830,525✔
1753
    case TSDB_DATA_TYPE_UBIGINT:
865,761✔
1754
      return (order == TSDB_ORDER_ASC) ? compareUint64Val : compareUint64ValDesc;
865,761✔
1755
    case TSDB_DATA_TYPE_VARBINARY:
3✔
1756
      return (order == TSDB_ORDER_ASC) ? compareLenBinaryVal : compareLenBinaryValDesc;
3!
1757
    case TSDB_DATA_TYPE_BINARY:
1,907,309✔
1758
    case TSDB_DATA_TYPE_GEOMETRY:
1759
      return (order == TSDB_ORDER_ASC) ? compareLenPrefixedStr : compareLenPrefixedStrDesc;
1,907,309✔
1760
    case TSDB_DATA_TYPE_NCHAR:
202,382✔
1761
      return (order == TSDB_ORDER_ASC) ? compareLenPrefixedWStr : compareLenPrefixedWStrDesc;
202,382✔
1762
    case TSDB_DATA_TYPE_JSON:
48✔
1763
      return (order == TSDB_ORDER_ASC) ? compareJsonVal : compareJsonValDesc;
48✔
1764
    default:
531✔
1765
      return (order == TSDB_ORDER_ASC) ? compareInt32Val : compareInt32ValDesc;
531!
1766
  }
1767
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc