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

taosdata / TDengine / #4473

08 Jul 2025 09:38AM UTC coverage: 62.922% (+0.7%) from 62.22%
#4473

push

travis-ci

web-flow
Merge pull request #31712 from taosdata/merge/mainto3.0

merge: from main to 3.0 branch

158525 of 321496 branches covered (49.31%)

Branch coverage included in aggregate %.

56 of 60 new or added lines in 13 files covered. (93.33%)

1333 existing lines in 67 files now uncovered.

245526 of 320647 relevant lines covered (76.57%)

17689640.25 hits per line

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

67.81
/source/libs/scalar/src/filter.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
#include <tlog.h>
16
#include "decimal.h"
17
#include "nodes.h"
18
#include "os.h"
19
#include "tglobal.h"
20
#include "thash.h"
21
// #include "queryLog.h"
22
#include "filter.h"
23
#include "filterInt.h"
24
#include "functionMgt.h"
25
#include "sclInt.h"
26
#include "tcompare.h"
27
#include "tdatablock.h"
28
#include "tsimplehash.h"
29
#include "ttime.h"
30

31
bool filterRangeCompGi(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
97,612,567✔
32
  int32_t result = cfunc(maxv, minr);
97,612,567✔
33
  return result >= 0;
97,610,505✔
34
}
35
bool filterRangeCompGe(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
45,457,200✔
36
  int32_t result = cfunc(maxv, minr);
45,457,200✔
37
  return result > 0;
45,462,940✔
38
}
39
bool filterRangeCompLi(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
84,709,413✔
40
  int32_t result = cfunc(minv, maxr);
84,709,413✔
41
  return result <= 0;
84,709,201✔
42
}
43
bool filterRangeCompLe(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
30,478,001✔
44
  int32_t result = cfunc(minv, maxr);
30,478,001✔
45
  return result < 0;
30,478,038✔
46
}
47
bool filterRangeCompii(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
12,746,103✔
48
  return cfunc(maxv, minr) >= 0 && cfunc(minv, maxr) <= 0;
12,746,103✔
49
}
50
bool filterRangeCompee(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
566,270✔
51
  return cfunc(maxv, minr) > 0 && cfunc(minv, maxr) < 0;
566,270✔
52
}
53
bool filterRangeCompei(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
120✔
54
  return cfunc(maxv, minr) > 0 && cfunc(minv, maxr) <= 0;
120✔
55
}
56
bool filterRangeCompie(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
2,144,016✔
57
  return cfunc(maxv, minr) >= 0 && cfunc(minv, maxr) < 0;
2,144,016✔
58
}
59

60
rangeCompFunc filterGetRangeCompFunc(char sflag, char eflag) {
1,288,123✔
61
  if (FILTER_GET_FLAG(sflag, RANGE_FLG_NULL)) {
1,288,123✔
62
    if (FILTER_GET_FLAG(eflag, RANGE_FLG_EXCLUDE)) {
231,295✔
63
      return filterRangeCompLe;
55,466✔
64
    }
65

66
    return filterRangeCompLi;
175,829✔
67
  }
68

69
  if (FILTER_GET_FLAG(eflag, RANGE_FLG_NULL)) {
1,056,828✔
70
    if (FILTER_GET_FLAG(sflag, RANGE_FLG_EXCLUDE)) {
364,874✔
71
      return filterRangeCompGe;
78,164✔
72
    }
73

74
    return filterRangeCompGi;
286,710✔
75
  }
76

77
  if (FILTER_GET_FLAG(sflag, RANGE_FLG_EXCLUDE)) {
691,954✔
78
    if (FILTER_GET_FLAG(eflag, RANGE_FLG_EXCLUDE)) {
310✔
79
      return filterRangeCompee;
301✔
80
    }
81

82
    return filterRangeCompei;
9✔
83
  }
84

85
  if (FILTER_GET_FLAG(eflag, RANGE_FLG_EXCLUDE)) {
691,644✔
86
    return filterRangeCompie;
146✔
87
  }
88

89
  return filterRangeCompii;
691,498✔
90
}
91

92
rangeCompFunc gRangeCompare[] = {filterRangeCompee, filterRangeCompei, filterRangeCompie, filterRangeCompii,
93
                                 filterRangeCompGe, filterRangeCompGi, filterRangeCompLe, filterRangeCompLi};
94

95
int8_t filterGetRangeCompFuncFromOptrs(uint8_t optr, uint8_t optr2) {
2,192,048✔
96
  if (optr2) {
2,192,048✔
97
    if (optr2 != OP_TYPE_LOWER_THAN && optr2 != OP_TYPE_LOWER_EQUAL) {
57,604!
98
      return -1;
×
99
    }
100

101
    if (optr == OP_TYPE_GREATER_THAN) {
57,604✔
102
      if (optr2 == OP_TYPE_LOWER_THAN) {
359✔
103
        return 0;
350✔
104
      }
105

106
      return 1;
9✔
107
    }
108

109
    if (optr2 == OP_TYPE_LOWER_THAN) {
57,245✔
110
      return 2;
154✔
111
    }
112

113
    return 3;
57,091✔
114
  } else {
115
    switch (optr) {
2,134,444✔
116
      case OP_TYPE_GREATER_THAN:
119,771✔
117
        return 4;
119,771✔
118
      case OP_TYPE_GREATER_EQUAL:
327,810✔
119
        return 5;
327,810✔
120
      case OP_TYPE_LOWER_THAN:
97,422✔
121
        return 6;
97,422✔
122
      case OP_TYPE_LOWER_EQUAL:
285,133✔
123
        return 7;
285,133✔
124
      default:
1,304,308✔
125
        break;
1,304,308✔
126
    }
127
  }
128

129
  return -1;
1,304,308✔
130
}
131

132
__compar_fn_t gDataCompare[] = {
133
    compareInt32Val,       compareInt8Val,         compareInt16Val,         compareInt64Val,
134
    compareFloatVal,       compareDoubleVal,       compareLenPrefixedStr,   comparestrPatternMatch,
135
    compareChkInString,    comparewcsPatternMatch, compareLenPrefixedWStr,  compareUint8Val,
136
    compareUint16Val,      compareUint32Val,       compareUint64Val,        setChkInBytes1,
137
    setChkInBytes2,        setChkInBytes4,         setChkInBytes8,          comparestrRegexMatch,
138
    comparestrRegexNMatch, setChkNotInBytes1,      setChkNotInBytes2,       setChkNotInBytes4,
139
    setChkNotInBytes8,     compareChkNotInString,  comparestrPatternNMatch, comparewcsPatternNMatch,
140
    comparewcsRegexMatch,  comparewcsRegexNMatch,  compareLenBinaryVal,     compareDecimal64,
141
    compareDecimal128,     setChkInDecimalHash,        setChkNotInDecimalHash,
142
};
143

144
__compar_fn_t gInt8SignCompare[] = {compareInt8Val,   compareInt8Int16, compareInt8Int32,
145
                                    compareInt8Int64, compareInt8Float, compareInt8Double};
146
__compar_fn_t gInt8UsignCompare[] = {compareInt8Uint8, compareInt8Uint16, compareInt8Uint32, compareInt8Uint64};
147

148
__compar_fn_t gInt16SignCompare[] = {compareInt16Int8,  compareInt16Val,   compareInt16Int32,
149
                                     compareInt16Int64, compareInt16Float, compareInt16Double};
150
__compar_fn_t gInt16UsignCompare[] = {compareInt16Uint8, compareInt16Uint16, compareInt16Uint32, compareInt16Uint64};
151

152
__compar_fn_t gInt32SignCompare[] = {compareInt32Int8,  compareInt32Int16, compareInt32Val,
153
                                     compareInt32Int64, compareInt32Float, compareInt32Double};
154
__compar_fn_t gInt32UsignCompare[] = {compareInt32Uint8, compareInt32Uint16, compareInt32Uint32, compareInt32Uint64};
155

156
__compar_fn_t gInt64SignCompare[] = {compareInt64Int8, compareInt64Int16, compareInt64Int32,
157
                                     compareInt64Val,  compareInt64Float, compareInt64Double};
158
__compar_fn_t gInt64UsignCompare[] = {compareInt64Uint8, compareInt64Uint16, compareInt64Uint32, compareInt64Uint64};
159

160
__compar_fn_t gFloatSignCompare[] = {compareFloatInt8,  compareFloatInt16, compareFloatInt32,
161
                                     compareFloatInt64, compareFloatVal,   compareFloatDouble};
162
__compar_fn_t gFloatUsignCompare[] = {compareFloatUint8, compareFloatUint16, compareFloatUint32, compareFloatUint64};
163

164
__compar_fn_t gDoubleSignCompare[] = {compareDoubleInt8,  compareDoubleInt16, compareDoubleInt32,
165
                                      compareDoubleInt64, compareDoubleFloat, compareDoubleVal};
166
__compar_fn_t gDoubleUsignCompare[] = {compareDoubleUint8, compareDoubleUint16, compareDoubleUint32,
167
                                       compareDoubleUint64};
168

169
__compar_fn_t gUint8SignCompare[] = {compareUint8Int8,  compareUint8Int16, compareUint8Int32,
170
                                     compareUint8Int64, compareUint8Float, compareUint8Double};
171
__compar_fn_t gUint8UsignCompare[] = {compareUint8Val, compareUint8Uint16, compareUint8Uint32, compareUint8Uint64};
172

173
__compar_fn_t gUint16SignCompare[] = {compareUint16Int8,  compareUint16Int16, compareUint16Int32,
174
                                      compareUint16Int64, compareUint16Float, compareUint16Double};
175
__compar_fn_t gUint16UsignCompare[] = {compareUint16Uint8, compareUint16Val, compareUint16Uint32, compareUint16Uint64};
176

177
__compar_fn_t gUint32SignCompare[] = {compareUint32Int8,  compareUint32Int16, compareUint32Int32,
178
                                      compareUint32Int64, compareUint32Float, compareUint32Double};
179
__compar_fn_t gUint32UsignCompare[] = {compareUint32Uint8, compareUint32Uint16, compareUint32Val, compareUint32Uint64};
180

181
__compar_fn_t gUint64SignCompare[] = {compareUint64Int8,  compareUint64Int16, compareUint64Int32,
182
                                      compareUint64Int64, compareUint64Float, compareUint64Double};
183
__compar_fn_t gUint64UsignCompare[] = {compareUint64Uint8, compareUint64Uint16, compareUint64Uint32, compareUint64Val};
184

185
int32_t filterGetCompFuncIdx(int32_t type, int32_t optr, int8_t *comparFn, bool scalarMode) {
13,688,745✔
186
  int32_t code = TSDB_CODE_SUCCESS;
13,688,745✔
187
  if (optr == OP_TYPE_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_VARBINARY &&
13,688,745!
188
                             type != TSDB_DATA_TYPE_NCHAR && type != TSDB_DATA_TYPE_GEOMETRY)) {
1,973,267!
189
    switch (type) {
1,973,293!
190
      case TSDB_DATA_TYPE_BOOL:
383,440✔
191
      case TSDB_DATA_TYPE_TINYINT:
192
      case TSDB_DATA_TYPE_UTINYINT:
193
        *comparFn = 15;
383,440✔
194
        break;
383,440✔
195
      case TSDB_DATA_TYPE_SMALLINT:
2✔
196
      case TSDB_DATA_TYPE_USMALLINT:
197
        *comparFn = 16;
2✔
198
        break;
2✔
199
      case TSDB_DATA_TYPE_INT:
707✔
200
      case TSDB_DATA_TYPE_UINT:
201
      case TSDB_DATA_TYPE_FLOAT:
202
        *comparFn = 17;
707✔
203
        break;
707✔
204
      case TSDB_DATA_TYPE_BIGINT:
1,588,519✔
205
      case TSDB_DATA_TYPE_UBIGINT:
206
      case TSDB_DATA_TYPE_DOUBLE:
207
      case TSDB_DATA_TYPE_TIMESTAMP:
208
        *comparFn = 18;
1,588,519✔
209
        break;
1,588,519✔
210
      case TSDB_DATA_TYPE_JSON:
×
211
        *comparFn = 0;
×
212
        code = TSDB_CODE_QRY_JSON_IN_ERROR;
×
213
        break;
×
214
      case TSDB_DATA_TYPE_DECIMAL64:
511✔
215
      case TSDB_DATA_TYPE_DECIMAL:
216
        *comparFn = 33;
511✔
217
        break;
511✔
218
      default:
114✔
219
        *comparFn = 0;
114✔
220
        break;
114✔
221
    }
222
    return code;
1,973,293✔
223
  }
224

225
  if (optr == OP_TYPE_NOT_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_VARBINARY && type != TSDB_DATA_TYPE_NCHAR && type != TSDB_DATA_TYPE_GEOMETRY)) {
11,715,452✔
226
    switch (type) {
12,166!
227
      case TSDB_DATA_TYPE_BOOL:
30✔
228
      case TSDB_DATA_TYPE_TINYINT:
229
      case TSDB_DATA_TYPE_UTINYINT:
230
        *comparFn = 21;
30✔
231
        break;
30✔
232
      case TSDB_DATA_TYPE_SMALLINT:
2✔
233
      case TSDB_DATA_TYPE_USMALLINT:
234
        *comparFn = 22;
2✔
235
        break;
2✔
236
      case TSDB_DATA_TYPE_INT:
623✔
237
      case TSDB_DATA_TYPE_UINT:
238
      case TSDB_DATA_TYPE_FLOAT:
239
        *comparFn = 23;
623✔
240
        break;
623✔
241
      case TSDB_DATA_TYPE_BIGINT:
11,000✔
242
      case TSDB_DATA_TYPE_UBIGINT:
243
      case TSDB_DATA_TYPE_DOUBLE:
244
      case TSDB_DATA_TYPE_TIMESTAMP:
245
        *comparFn = 24;
11,000✔
246
        break;
11,000✔
247
      case TSDB_DATA_TYPE_JSON:
×
248
        *comparFn = 0;
×
249
        code = TSDB_CODE_QRY_JSON_IN_ERROR;
×
250
        break;
×
251
      case TSDB_DATA_TYPE_DECIMAL64:
511✔
252
      case TSDB_DATA_TYPE_DECIMAL:
253
        *comparFn = 34;
511✔
254
        break;
511✔
255
      default:
×
256
        *comparFn = 0;
×
257
        break;
×
258
    }
259
    return code;
12,166✔
260
  }
261

262
  //  if (optr == OP_TYPE_JSON_CONTAINS && type == TSDB_DATA_TYPE_JSON) {
263
  //    return 28;
264
  //  }
265

266
  switch (type) {
11,703,286!
267
    case TSDB_DATA_TYPE_BOOL:
3,381,132✔
268
    case TSDB_DATA_TYPE_TINYINT:
269
      *comparFn = 1;
3,381,132✔
270
      break;
3,381,132✔
271
    case TSDB_DATA_TYPE_SMALLINT:
681,540✔
272
      *comparFn = 2;
681,540✔
273
      break;
681,540✔
274
    case TSDB_DATA_TYPE_INT:
748,619✔
275
      *comparFn = 0;
748,619✔
276
      break;
748,619✔
277
    case TSDB_DATA_TYPE_BIGINT:
1,686,759✔
278
    case TSDB_DATA_TYPE_TIMESTAMP:
279
      *comparFn = 3;
1,686,759✔
280
      break;
1,686,759✔
281
    case TSDB_DATA_TYPE_FLOAT:
82,817✔
282
      *comparFn = 4;
82,817✔
283
      break;
82,817✔
284
    case TSDB_DATA_TYPE_DOUBLE:
1,136,100✔
285
      *comparFn = 5;
1,136,100✔
286
      break;
1,136,100✔
287
    case TSDB_DATA_TYPE_VARBINARY:{
80✔
288
      if (optr == OP_TYPE_IN) {
80✔
289
        *comparFn = 8;
15✔
290
      } else if (optr == OP_TYPE_NOT_IN) {
65✔
291
        *comparFn = 25;
7✔
292
      } else { /* normal relational comparFn */
293
        *comparFn = 30;
58✔
294
      }
295
      break;
80✔
296
    }
297
    case TSDB_DATA_TYPE_BINARY: {
2,411,267✔
298
      if (optr == OP_TYPE_MATCH) {
2,411,267✔
299
        *comparFn = 19;
269,887✔
300
      } else if (optr == OP_TYPE_NMATCH) {
2,141,380✔
301
        *comparFn = 20;
290,958✔
302
      } else if (optr == OP_TYPE_LIKE) {     /* wildcard query using like operator */
1,850,422✔
303
        *comparFn = 7;
671,662✔
304
      } else if (optr == OP_TYPE_NOT_LIKE) { /* wildcard query using like operator */
1,178,760✔
305
        *comparFn = 26;
8,241✔
306
      } else if (optr == OP_TYPE_IN) {
1,170,519✔
307
        *comparFn = 8;
437,216✔
308
      } else if (optr == OP_TYPE_NOT_IN) {
733,303✔
309
        *comparFn = 25;
2,123✔
310
      } else { /* normal relational comparFn */
311
        *comparFn = 6;
731,180✔
312
      }
313

314
      break;
2,411,267✔
315
    }
316

317
    case TSDB_DATA_TYPE_NCHAR: {
1,572,227✔
318
      if (optr == OP_TYPE_MATCH) {
1,572,227✔
319
        *comparFn = scalarMode ? 28 : 19;
368,355!
320
      } else if (optr == OP_TYPE_NMATCH) {
1,203,872✔
321
        *comparFn = scalarMode ? 29 : 20;
80,462!
322
      } else if (optr == OP_TYPE_LIKE) {
1,123,410✔
323
        *comparFn = 9;
398,156✔
324
      } else if (optr == OP_TYPE_NOT_LIKE) {
725,254✔
325
        *comparFn = 27;
3,702✔
326
      } else if (optr == OP_TYPE_IN) {
721,552✔
327
        *comparFn = 8;
108,889✔
328
      } else if (optr == OP_TYPE_NOT_IN) {
612,663✔
329
        *comparFn = 25;
14✔
330
      } else {
331
        *comparFn = 10;
612,649✔
332
      }
333
      break;
1,572,227✔
334
    }
335

336
    case TSDB_DATA_TYPE_GEOMETRY: {
47✔
337
      if (optr == OP_TYPE_EQUAL || optr == OP_TYPE_NOT_EQUAL || optr == OP_TYPE_IS_NULL ||
47!
338
          optr == OP_TYPE_IS_NOT_NULL) {
339
        *comparFn = 30;
11✔
340
      } else if (optr == OP_TYPE_IN) {
36✔
341
        *comparFn = 8;
20✔
342
      } else if (optr == OP_TYPE_NOT_IN) {
16✔
343
        *comparFn = 25;
4✔
344
      } else {
345
        *comparFn = 0;
12✔
346
        code = TSDB_CODE_QRY_GEO_NOT_SUPPORT_ERROR;
12✔
347
      }
348
      break;
47✔
349
    }
350

351
    case TSDB_DATA_TYPE_UTINYINT:
63✔
352
      *comparFn = 11;
63✔
353
      break;
63✔
354
    case TSDB_DATA_TYPE_USMALLINT:
62✔
355
      *comparFn = 12;
62✔
356
      break;
62✔
357
    case TSDB_DATA_TYPE_UINT:
217✔
358
      *comparFn = 13;
217✔
359
      break;
217✔
360
    case TSDB_DATA_TYPE_UBIGINT:
222✔
361
      *comparFn = 14;
222✔
362
      break;
222✔
363
    case TSDB_DATA_TYPE_DECIMAL64:
90✔
364
      *comparFn = 31;
90✔
365
      break;
90✔
366
    case TSDB_DATA_TYPE_DECIMAL:
4,045✔
367
      *comparFn = 32;
4,045✔
368
      break;
4,045✔
UNCOV
369
    default:
×
UNCOV
370
      *comparFn = 0;
×
UNCOV
371
      break;
×
372
  }
373

374
  return code;
11,703,286✔
375
}
376

377
int32_t filterGetCompFunc(__compar_fn_t *func, int32_t type, int32_t optr) {
11,494,145✔
378
  int8_t compFuncIdx = 0;
11,494,145✔
379
  int32_t code = filterGetCompFuncIdx(type, optr, &compFuncIdx, true);
11,494,145✔
380
  if (TSDB_CODE_SUCCESS == code) *func = gDataCompare[compFuncIdx];
11,492,485!
381
  return code;
11,492,485✔
382
}
383

384
__compar_fn_t filterGetCompFuncEx(int32_t lType, int32_t rType, int32_t optr) {
2,957,405✔
385
  if (TSDB_DATA_TYPE_NULL == rType || TSDB_DATA_TYPE_JSON == rType) {
2,957,405!
386
    return NULL;
260✔
387
  }
388

389
  switch (lType) {
2,957,145✔
390
    case TSDB_DATA_TYPE_TINYINT: {
190,574✔
391
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
190,574✔
392
        return gInt8SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
190,573✔
393
      } else {
394
        return gInt8UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
1✔
395
      }
396
      break;
397
    }
398
    case TSDB_DATA_TYPE_SMALLINT: {
410,211✔
399
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
410,211!
400
        return gInt16SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
410,211✔
401
      } else {
402
        return gInt16UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
×
403
      }
404
      break;
405
    }
406
    case TSDB_DATA_TYPE_INT: {
280,432✔
407
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
280,432✔
408
        return gInt32SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
280,426✔
409
      } else {
410
        return gInt32UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
6✔
411
      }
412
      break;
413
    }
414
    case TSDB_DATA_TYPE_BIGINT: {
709,865✔
415
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
709,865!
416
        return gInt64SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
506,842✔
417
      } else {
418
        return gInt64UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
203,023✔
419
      }
420
      break;
421
    }
422
    case TSDB_DATA_TYPE_FLOAT: {
1,215,630✔
423
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
1,215,630!
424
        return gFloatSignCompare[rType - TSDB_DATA_TYPE_TINYINT];
1,215,630✔
425
      } else {
426
        return gFloatUsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
×
427
      }
428
      break;
429
    }
430
    case TSDB_DATA_TYPE_DOUBLE: {
133,299✔
431
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
133,299!
432
        return gDoubleSignCompare[rType - TSDB_DATA_TYPE_TINYINT];
133,299✔
433
      } else {
434
        return gDoubleUsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
×
435
      }
436
      break;
437
    }
438
    case TSDB_DATA_TYPE_UTINYINT: {
1,987✔
439
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
1,987!
440
        return gUint8SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
1,982✔
441
      } else {
442
        return gUint8UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
5✔
443
      }
444
      break;
445
    }
446
    case TSDB_DATA_TYPE_USMALLINT: {
5,858✔
447
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
5,858!
448
        return gUint16SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
5,857✔
449
      } else {
450
        return gUint16UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
1✔
451
      }
452
      break;
453
    }
454
    case TSDB_DATA_TYPE_UINT: {
1,960✔
455
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
1,960!
456
        return gUint32SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
1,960✔
457
      } else {
458
        return gUint32UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
×
459
      }
460
      break;
461
    }
462
    case TSDB_DATA_TYPE_UBIGINT: {
6,260✔
463
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
6,260!
464
        return gUint64SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
6,260✔
465
      } else {
466
        return gUint64UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
×
467
      }
468
      break;
469
    }
470
    default:
1,069✔
471
      break;
1,069✔
472
  }
473
  return NULL;
1,069✔
474
}
475

476
static FORCE_INLINE int32_t filterCompareGroupCtx(const void *pLeft, const void *pRight) {
594,509✔
477
  SFilterGroupCtx *left = *((SFilterGroupCtx **)pLeft), *right = *((SFilterGroupCtx **)pRight);
594,509✔
478
  if (left->colNum > right->colNum) return 1;
594,509✔
479
  if (left->colNum < right->colNum) return -1;
592,103✔
480
  return 0;
591,674✔
481
}
482

483
int32_t filterInitUnitsFields(SFilterInfo *info) {
1,610,005✔
484
  info->unitSize = FILTER_DEFAULT_UNIT_SIZE;
1,610,005✔
485
  info->units = taosMemoryCalloc(info->unitSize, sizeof(SFilterUnit));
1,610,005!
486
  if (info->units == NULL) {
1,611,691!
487
    return terrno;
×
488
  }
489

490
  info->fields[FLD_TYPE_COLUMN].num = 0;
1,611,691✔
491
  info->fields[FLD_TYPE_COLUMN].size = FILTER_DEFAULT_FIELD_SIZE;
1,611,691✔
492
  info->fields[FLD_TYPE_COLUMN].fields = taosMemoryCalloc(info->fields[FLD_TYPE_COLUMN].size, sizeof(SFilterField));
1,611,691!
493
  if (info->fields[FLD_TYPE_COLUMN].fields == NULL) {
1,611,860!
494
    return terrno;
×
495
  }
496
  info->fields[FLD_TYPE_VALUE].num = 0;
1,611,860✔
497
  info->fields[FLD_TYPE_VALUE].size = FILTER_DEFAULT_FIELD_SIZE;
1,611,860✔
498
  info->fields[FLD_TYPE_VALUE].fields = taosMemoryCalloc(info->fields[FLD_TYPE_VALUE].size, sizeof(SFilterField));
1,611,860✔
499
  if (info->fields[FLD_TYPE_VALUE].fields == NULL) {
1,611,827!
500
    return terrno;
×
501
  }
502

503
  return TSDB_CODE_SUCCESS;
1,611,827✔
504
}
505

506
static FORCE_INLINE int32_t filterNewRange(SFilterRangeCtx *ctx, SFilterRange *ra, SFilterRangeNode **r) {
507

508
  if (ctx->rf) {
3,975,409✔
509
    *r = ctx->rf;
348✔
510
    ctx->rf = ctx->rf->next;
348✔
511
    (*r)->prev = NULL;
348✔
512
    (*r)->next = NULL;
348✔
513
  } else {
514
    *r = taosMemoryCalloc(1, sizeof(SFilterRangeNode));
3,975,061!
515
    if (*r == NULL) {
3,979,422!
516
      return terrno;
×
517
    }
518
  }
519

520
  FILTER_COPY_RA(&(*r)->ra, ra);
3,979,770✔
521

522
  return TSDB_CODE_SUCCESS;
3,979,770✔
523
}
524

525
int32_t filterInitRangeCtx(int32_t type, int32_t options, SFilterRangeCtx **ctx) {
4,529,699✔
526
  if (type > TSDB_DATA_TYPE_UBIGINT || type < TSDB_DATA_TYPE_BOOL ||
4,529,699!
527
      type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_VARBINARY ||
4,532,341!
528
      type == TSDB_DATA_TYPE_NCHAR || type == TSDB_DATA_TYPE_GEOMETRY) {
4,532,604!
529
    qError("not supported range type:%d", type);
×
530
    return TSDB_CODE_QRY_FILTER_NOT_SUPPORT_TYPE;
×
531
  }
532

533
  *ctx = taosMemoryCalloc(1, sizeof(SFilterRangeCtx));
4,532,905!
534
  if (*ctx == NULL) {
4,545,490!
535
    return terrno;
×
536
  }
537
  (*ctx)->type = type;
4,545,490✔
538
  (*ctx)->options = options;
4,545,490✔
539
  (*ctx)->pCompareFunc = getComparFunc(type, 0);
4,545,490✔
540
  if ((*ctx)->pCompareFunc == NULL) {
4,542,828✔
541
    taosMemoryFree(*ctx);
912!
542
    return terrno;
×
543
  }
544

545
  return TSDB_CODE_SUCCESS;
4,541,916✔
546
}
547

548
int32_t filterResetRangeCtx(SFilterRangeCtx *ctx) {
305,325✔
549
  ctx->status = 0;
305,325✔
550

551
  if (ctx->rf == NULL) {
305,325✔
552
    ctx->rf = ctx->rs;
298,274✔
553
    ctx->rs = NULL;
298,274✔
554
    return TSDB_CODE_SUCCESS;
298,274✔
555
  }
556

557
  ctx->isnull = false;
7,051✔
558
  ctx->notnull = false;
7,051✔
559
  ctx->isrange = false;
7,051✔
560

561
  SFilterRangeNode *r = ctx->rf;
7,051✔
562

563
  while (r && r->next) {
7,051!
564
    r = r->next;
×
565
  }
566

567
  r->next = ctx->rs;
7,051✔
568
  ctx->rs = NULL;
7,051✔
569
  return TSDB_CODE_SUCCESS;
7,051✔
570
}
571

572
int32_t filterReuseRangeCtx(SFilterRangeCtx *ctx, int32_t type, int32_t options) {
×
573
  FLT_ERR_RET(filterResetRangeCtx(ctx));
×
574

575
  ctx->type = type;
×
576
  ctx->options = options;
×
577
  ctx->pCompareFunc = getComparFunc(type, 0);
×
578

579
  if (ctx->pCompareFunc == NULL) {
×
580
    return terrno;
×
581
  }
582
  return TSDB_CODE_SUCCESS;
×
583
}
584

585
int32_t filterConvertRange(SFilterRangeCtx *cur, SFilterRange *ra, bool *notNull) {
374,740✔
586
  int64_t tmp = 0;
374,740✔
587

588
  if (!FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL)) {
374,740✔
589
    int32_t sr = cur->pCompareFunc(&ra->s, getDataMin(cur->type, &tmp));
195,301✔
590
    if (sr == 0) {
195,446✔
591
      FILTER_SET_FLAG(ra->sflag, RANGE_FLG_NULL);
2,660✔
592
    }
593
  }
594

595
  if (!FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL)) {
374,885✔
596
    int32_t er = cur->pCompareFunc(&ra->e, getDataMax(cur->type, &tmp));
193,443✔
597
    if (er == 0) {
193,713✔
598
      FILTER_SET_FLAG(ra->eflag, RANGE_FLG_NULL);
106,839✔
599
    }
600
  }
601

602
  if (FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL) && FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL)) {
375,155✔
603
    *notNull = true;
123,978✔
604
  } else {
605
    *notNull = false;
251,177✔
606
  }
607

608
  return TSDB_CODE_SUCCESS;
375,155✔
609
}
610

611
int32_t filterAddRangeOptr(void *h, uint8_t raOptr, int32_t optr, bool *empty, bool *all) {
6,169,954✔
612
  SFilterRangeCtx *ctx = (SFilterRangeCtx *)h;
6,169,954✔
613

614
  if (optr == LOGIC_COND_TYPE_AND) {
6,169,954✔
615
    SET_AND_OPTR(ctx, raOptr);
3,454,952!
616
    if (CHK_AND_OPTR(ctx) || (raOptr == FILTER_DUMMY_EMPTY_OPTR)) {
3,454,952!
617
      FILTER_SET_FLAG(ctx->status, MR_ST_EMPTY);
212✔
618
      *empty = true;
212✔
619
    }
620
  } else {
621
    SET_OR_OPTR(ctx, raOptr);
2,715,002!
622
    if (CHK_OR_OPTR(ctx)) {
2,715,002✔
623
      FILTER_SET_FLAG(ctx->status, MR_ST_ALL);
56✔
624
      *all = true;
56✔
625
    }
626
  }
627

628
  return TSDB_CODE_SUCCESS;
6,169,954✔
629
}
630

631
int32_t filterAddRangeImpl(void *h, SFilterRange *ra, int32_t optr) {
4,940,434✔
632
  SFilterRangeCtx *ctx = (SFilterRangeCtx *)h;
4,940,434✔
633

634
  if (ctx->rs == NULL) {
4,940,434✔
635
    if ((FILTER_GET_FLAG(ctx->status, MR_ST_START) == 0) ||
3,643,256✔
636
        (FILTER_GET_FLAG(ctx->status, MR_ST_ALL) && (optr == LOGIC_COND_TYPE_AND)) ||
2!
637
        ((!FILTER_GET_FLAG(ctx->status, MR_ST_ALL)) && (optr == LOGIC_COND_TYPE_OR))) {
2!
638
      APPEND_RANGE(ctx, ctx->rs, ra);
7,289,832!
639
      FILTER_SET_FLAG(ctx->status, MR_ST_START);
3,646,708✔
640
    }
641

642
    return TSDB_CODE_SUCCESS;
3,646,840✔
643
  }
644

645
  SFilterRangeNode *r = ctx->rs;
1,297,178✔
646
  SFilterRangeNode *rn = NULL;
1,297,178✔
647
  int32_t           cr = 0;
1,297,178✔
648

649
  if (optr == LOGIC_COND_TYPE_AND) {
1,297,178✔
650
    while (r != NULL) {
802,901✔
651
      cr = ctx->pCompareFunc(&r->ra.s, &ra->e);
595,999✔
652
      if (FILTER_GREATER(cr, r->ra.sflag, ra->eflag)) {
596,207✔
653
        FREE_FROM_RANGE(ctx, r);
30,490!
654
        break;
15,251✔
655
      }
656

657
      cr = ctx->pCompareFunc(&ra->s, &r->ra.e);
580,956✔
658
      if (FILTER_GREATER(cr, ra->sflag, r->ra.eflag)) {
580,732✔
659
        rn = r->next;
831✔
660
        FREE_RANGE(ctx, r);
831!
661
        r = rn;
831✔
662
        continue;
831✔
663
      }
664

665
      cr = ctx->pCompareFunc(&ra->s, &r->ra.s);
579,901✔
666
      if (FILTER_GREATER(cr, ra->sflag, r->ra.sflag)) {
580,061✔
667
        SIMPLE_COPY_VALUES((char *)&r->ra.s, &ra->s);
9,600✔
668
        cr == 0 ? (r->ra.sflag |= ra->sflag) : (r->ra.sflag = ra->sflag);
9,600✔
669
      }
670

671
      cr = ctx->pCompareFunc(&r->ra.e, &ra->e);
580,061✔
672
      if (FILTER_GREATER(cr, r->ra.eflag, ra->eflag)) {
579,968✔
673
        SIMPLE_COPY_VALUES((char *)&r->ra.e, &ra->e);
374,336✔
674
        cr == 0 ? (r->ra.eflag |= ra->eflag) : (r->ra.eflag = ra->eflag);
374,336✔
675
        break;
374,336✔
676
      }
677

678
      r = r->next;
205,632✔
679
    }
680

681
    return TSDB_CODE_SUCCESS;
596,489✔
682
  }
683

684
  // TSDB_RELATION_OR
685

686
  bool smerged = false;
700,740✔
687
  bool emerged = false;
700,740✔
688

689
  while (r != NULL) {
719,827✔
690
    cr = ctx->pCompareFunc(&r->ra.s, &ra->e);
702,842✔
691
    if (FILTER_GREATER(cr, r->ra.sflag, ra->eflag)) {
702,720!
692
      if (emerged == false) {
317,652!
693
        INSERT_RANGE(ctx, r, ra);
637,500!
694
      }
695

696
      break;
318,428✔
697
    }
698

699
    if (smerged == false) {
385,068✔
700
      cr = ctx->pCompareFunc(&ra->s, &r->ra.e);
384,254✔
701
      if (FILTER_GREATER(cr, ra->sflag, r->ra.eflag)) {
384,385✔
702
        if (r->next) {
8,697✔
703
          r = r->next;
172✔
704
          continue;
172✔
705
        }
706

707
        APPEND_RANGE(ctx, r, ra);
17,051!
708
        break;
8,526✔
709
      }
710

711
      cr = ctx->pCompareFunc(&r->ra.s, &ra->s);
375,688✔
712
      if (FILTER_GREATER(cr, r->ra.sflag, ra->sflag)) {
375,326✔
713
        SIMPLE_COPY_VALUES((char *)&r->ra.s, &ra->s);
18,212✔
714
        cr == 0 ? (r->ra.sflag &= ra->sflag) : (r->ra.sflag = ra->sflag);
18,212✔
715
      }
716

717
      smerged = true;
375,326✔
718
    }
719

720
    if (emerged == false) {
376,140✔
721
      cr = ctx->pCompareFunc(&ra->e, &r->ra.e);
375,660✔
722
      if (FILTER_GREATER(cr, ra->eflag, r->ra.eflag)) {
375,551✔
723
        SIMPLE_COPY_VALUES((char *)&r->ra.e, &ra->e);
38,383✔
724
        if (cr == 0) {
38,383✔
725
          r->ra.eflag &= ra->eflag;
19,476✔
726
          break;
19,476✔
727
        }
728

729
        r->ra.eflag = ra->eflag;
18,907✔
730
        emerged = true;
18,907✔
731
        r = r->next;
18,907✔
732
        continue;
18,907✔
733
      }
734

735
      break;
337,168✔
736
    }
737

738
    cr = ctx->pCompareFunc(&ra->e, &r->ra.e);
480✔
739
    if (FILTER_GREATER(cr, ra->eflag, r->ra.eflag)) {
24!
740
      rn = r->next;
8✔
741
      FREE_RANGE(ctx, r);
8!
742
      r = rn;
8✔
743

744
      continue;
8✔
745
    } else {
746
      SIMPLE_COPY_VALUES(&r->prev->ra.e, (char *)&r->ra.e);
16✔
747
      cr == 0 ? (r->prev->ra.eflag &= r->ra.eflag) : (r->prev->ra.eflag = r->ra.eflag);
16✔
748
      FREE_RANGE(ctx, r);
16!
749

750
      break;
16✔
751
    }
752
  }
753

754
  if (ctx->rs && ctx->rs->next == NULL) {
700,599!
755
    bool notnull;
756
    FLT_ERR_RET(filterConvertRange(ctx, &ctx->rs->ra, &notnull));
375,747!
757
    if (notnull) {
374,963✔
758
      bool all = false;
123,944✔
759
      FREE_FROM_RANGE(ctx, ctx->rs);
247,948!
760
      FLT_ERR_RET(filterAddRangeOptr(h, OP_TYPE_IS_NOT_NULL, optr, NULL, &all));
123,944✔
761
      if (all) {
123,935✔
762
        FILTER_SET_FLAG(ctx->status, MR_ST_ALL);
8✔
763
      }
764
    }
765
  }
766

767
  return TSDB_CODE_SUCCESS;
699,806✔
768
}
769

770
int32_t filterAddRange(void *h, SFilterRange *ra, int32_t optr) {
4,939,242✔
771
  SFilterRangeCtx *ctx = (SFilterRangeCtx *)h;
4,939,242✔
772
  int64_t          tmp = 0;
4,939,242✔
773

774
  if (FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL)) {
4,939,242✔
775
    SIMPLE_COPY_VALUES(&ra->s, getDataMin(ctx->type, &tmp));
1,653,144✔
776
    // FILTER_CLR_FLAG(ra->sflag, RA_NULL);
777
  }
778

779
  if (FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL)) {
4,938,502✔
780
    SIMPLE_COPY_VALUES(&ra->e, getDataMax(ctx->type, &tmp));
1,571,828✔
781
    // FILTER_CLR_FLAG(ra->eflag, RA_NULL);
782
  }
783

784
  return filterAddRangeImpl(h, ra, optr);
4,937,534✔
785
}
786

787
int32_t filterAddRangeCtx(void *dst, void *src, int32_t optr) {
2,094,280✔
788
  SFilterRangeCtx *dctx = (SFilterRangeCtx *)dst;
2,094,280✔
789
  SFilterRangeCtx *sctx = (SFilterRangeCtx *)src;
2,094,280✔
790

791
  if (optr != LOGIC_COND_TYPE_OR) {
2,094,280!
792
    fltError("filterAddRangeCtx get invalid optr:%d", optr);
×
793
    return TSDB_CODE_QRY_FILTER_WRONG_OPTR_TYPE;
×
794
  }
795

796
  if (sctx->rs == NULL) {
2,094,280✔
797
    return TSDB_CODE_SUCCESS;
7,116✔
798
  }
799

800
  SFilterRangeNode *r = sctx->rs;
2,087,164✔
801

802
  while (r) {
4,176,686✔
803
    FLT_ERR_RET(filterAddRange(dctx, &r->ra, optr));
2,087,164!
804
    r = r->next;
2,089,522✔
805
  }
806

807
  return TSDB_CODE_SUCCESS;
2,089,522✔
808
}
809

810
int32_t filterCopyRangeCtx(void *dst, void *src) {
6,085✔
811
  SFilterRangeCtx *dctx = (SFilterRangeCtx *)dst;
6,085✔
812
  SFilterRangeCtx *sctx = (SFilterRangeCtx *)src;
6,085✔
813

814
  dctx->status = sctx->status;
6,085✔
815

816
  dctx->isnull = sctx->isnull;
6,085✔
817
  dctx->notnull = sctx->notnull;
6,085✔
818
  dctx->isrange = sctx->isrange;
6,085✔
819

820
  SFilterRangeNode *r = sctx->rs;
6,085✔
821
  SFilterRangeNode *dr = dctx->rs;
6,085✔
822

823
  while (r) {
11,483✔
824
    APPEND_RANGE(dctx, dr, &r->ra);
10,796!
825
    if (dr == NULL) {
5,398!
826
      dr = dctx->rs;
5,398✔
827
    } else {
828
      dr = dr->next;
×
829
    }
830
    r = r->next;
5,398✔
831
  }
832

833
  return TSDB_CODE_SUCCESS;
6,085✔
834
}
835

836
int32_t filterFinishRange(void *h) {
703,437✔
837
  SFilterRangeCtx *ctx = (SFilterRangeCtx *)h;
703,437✔
838

839
  if (FILTER_GET_FLAG(ctx->status, MR_ST_FIN)) {
703,437✔
840
    return TSDB_CODE_SUCCESS;
340,368✔
841
  }
842

843
  if (FILTER_GET_FLAG(ctx->options, FLT_OPTION_TIMESTAMP)) {
363,069!
844
    SFilterRangeNode *r = ctx->rs;
363,150✔
845
    SFilterRangeNode *rn = NULL;
363,150✔
846

847
    while (r && r->next) {
363,324✔
848
      int64_t tmp = 1;
174✔
849
      int32_t code = operateVal(&tmp, &r->ra.e, &tmp, OP_TYPE_ADD, ctx->type);
174✔
850
      if (code != 0) {
174!
851
        return TSDB_CODE_APP_ERROR;
×
852
      }
853
      if (ctx->pCompareFunc(&tmp, &r->next->ra.s) == 0) {
174✔
854
        rn = r->next;
16✔
855
        SIMPLE_COPY_VALUES((char *)&r->next->ra.s, (char *)&r->ra.s);
16✔
856
        FREE_RANGE(ctx, r);
16!
857
        r = rn;
16✔
858

859
        continue;
16✔
860
      }
861

862
      r = r->next;
158✔
863
    }
864
  }
865

866
  FILTER_SET_FLAG(ctx->status, MR_ST_FIN);
363,069✔
867

868
  return TSDB_CODE_SUCCESS;
363,069✔
869
}
870

871
int32_t filterGetRangeNum(void *h, int32_t *num) {
363,080✔
872
  FLT_ERR_RET(filterFinishRange(h));
363,080!
873

874
  SFilterRangeCtx *ctx = (SFilterRangeCtx *)h;
363,220✔
875

876
  *num = 0;
363,220✔
877

878
  SFilterRangeNode *r = ctx->rs;
363,220✔
879

880
  while (r) {
703,738✔
881
    ++(*num);
340,518✔
882
    r = r->next;
340,518✔
883
  }
884

885
  return TSDB_CODE_SUCCESS;
363,220✔
886
}
887

888
int32_t filterGetRangeRes(void *h, SFilterRange *ra) {
340,223✔
889
  FLT_ERR_RET(filterFinishRange(h));
340,223!
890

891
  SFilterRangeCtx  *ctx = (SFilterRangeCtx *)h;
340,363✔
892
  uint32_t          num = 0;
340,363✔
893
  SFilterRangeNode *r = ctx->rs;
340,363✔
894

895
  while (r) {
680,792✔
896
    if (num) {
340,429✔
897
      ra->e = r->ra.e;
158✔
898
      ra->eflag = r->ra.eflag;
158✔
899
    } else {
900
      FILTER_COPY_RA(ra, &r->ra);
340,271✔
901
    }
902

903
    ++num;
340,429✔
904
    r = r->next;
340,429✔
905
  }
906

907
  if (num == 0) {
340,363!
908
    qError("no range result");
×
909
    return TSDB_CODE_APP_ERROR;
×
910
  }
911

912
  return TSDB_CODE_SUCCESS;
340,363✔
913
}
914

915
int32_t filterSourceRangeFromCtx(SFilterRangeCtx *ctx, void *sctx, int32_t optr, bool *empty, bool *all) {
2,605,272✔
916
  SFilterRangeCtx *src = (SFilterRangeCtx *)sctx;
2,605,272✔
917

918
  if (src->isnull) {
2,605,272✔
919
    FLT_ERR_RET(filterAddRangeOptr(ctx, OP_TYPE_IS_NULL, optr, empty, all));
98,665!
920
    if (FILTER_GET_FLAG(ctx->status, MR_ST_ALL)) {
98,679✔
921
      *all = true;
32✔
922
    }
923
  }
924

925
  if (src->notnull) {
2,605,286✔
926
    FLT_ERR_RET(filterAddRangeOptr(ctx, OP_TYPE_IS_NOT_NULL, optr, empty, all));
391,530!
927
    if (FILTER_GET_FLAG(ctx->status, MR_ST_ALL)) {
391,625✔
928
      *all = true;
16✔
929
    }
930
  }
931

932
  if (src->isrange) {
2,605,381✔
933
    FLT_ERR_RET(filterAddRangeOptr(ctx, 0, optr, empty, all));
2,115,486!
934

935
    if (!(optr == LOGIC_COND_TYPE_OR && ctx->notnull)) {
2,116,504!
936
      FLT_ERR_RET(filterAddRangeCtx(ctx, src, optr));
2,096,633!
937
    }
938

939
    if (FILTER_GET_FLAG(ctx->status, MR_ST_ALL)) {
2,116,539✔
940
      *all = true;
8✔
941
    }
942
  }
943

944
  return TSDB_CODE_SUCCESS;
2,606,434✔
945
}
946

947
int32_t filterFreeRangeCtx(void *h) {
4,545,048✔
948
  if (h == NULL) {
4,545,048!
949
    return TSDB_CODE_SUCCESS;
×
950
  }
951

952
  SFilterRangeCtx  *ctx = (SFilterRangeCtx *)h;
4,545,048✔
953
  SFilterRangeNode *r = ctx->rs;
4,545,048✔
954
  SFilterRangeNode *rn = NULL;
4,545,048✔
955

956
  while (r) {
8,087,266✔
957
    rn = r->next;
3,539,963✔
958
    taosMemoryFree(r);
3,539,963!
959
    r = rn;
3,542,218✔
960
  }
961

962
  r = ctx->rf;
4,547,303✔
963
  while (r) {
4,985,966✔
964
    rn = r->next;
438,629✔
965
    taosMemoryFree(r);
438,629!
966
    r = rn;
438,663✔
967
  }
968

969
  taosMemoryFree(ctx);
4,547,337✔
970

971
  return TSDB_CODE_SUCCESS;
4,547,470✔
972
}
973

974
int32_t filterDetachCnfGroup(SFilterGroup *gp1, SFilterGroup *gp2, SArray *group) {
1,413,076✔
975
  SFilterGroup gp = {0};
1,413,076✔
976

977
  gp.unitNum = gp1->unitNum + gp2->unitNum;
1,413,076✔
978
  gp.unitIdxs = taosMemoryCalloc(gp.unitNum, sizeof(*gp.unitIdxs));
1,413,076!
979
  if (NULL == gp.unitIdxs) {
1,420,464!
980
    FLT_ERR_RET(terrno);
×
981
  }
982
  (void)memcpy(gp.unitIdxs, gp1->unitIdxs, gp1->unitNum * sizeof(*gp.unitIdxs));
1,420,464✔
983
  (void)memcpy(gp.unitIdxs + gp1->unitNum, gp2->unitIdxs, gp2->unitNum * sizeof(*gp.unitIdxs));
1,420,464✔
984

985
  gp.unitFlags = NULL;
1,420,464✔
986

987
  if (NULL == taosArrayPush(group, &gp)) {
1,420,217!
988
    taosMemoryFreeClear(gp.unitIdxs);
×
989
    FLT_ERR_RET(terrno);
×
990
  }
991

992
  return TSDB_CODE_SUCCESS;
1,419,675✔
993
}
994

995
int32_t filterDetachCnfGroups(SArray *group, SArray *left, SArray *right) {
1,872,577✔
996
  int32_t leftSize = (int32_t)taosArrayGetSize(left);
1,872,577✔
997
  int32_t rightSize = (int32_t)taosArrayGetSize(right);
1,869,779✔
998

999
  if (taosArrayGetSize(left) <= 0) {
1,870,471✔
1000
    if (taosArrayGetSize(right) <= 0) {
765,470✔
1001
      fltDebug("both groups are empty");
24!
1002
      return TSDB_CODE_SUCCESS;
×
1003
    }
1004

1005
    SFilterGroup *gp = NULL;
765,430✔
1006
    while ((gp = (SFilterGroup *)taosArrayPop(right)) != NULL) {
1,546,796✔
1007
      if (NULL == taosArrayPush(group, gp)) {
781,366!
1008
        FLT_ERR_RET(terrno);
×
1009
      }
1010
    }
1011

1012
    return TSDB_CODE_SUCCESS;
765,881✔
1013
  }
1014

1015
  if (taosArrayGetSize(right) <= 0) {
1,106,172!
1016
    SFilterGroup *gp = NULL;
×
1017
    while ((gp = (SFilterGroup *)taosArrayPop(left)) != NULL) {
×
1018
      if (NULL == taosArrayPush(group, gp)) {
×
1019
        FLT_ERR_RET(terrno);
×
1020
      }
1021
    }
1022

1023
    return TSDB_CODE_SUCCESS;
×
1024
  }
1025

1026
  for (int32_t l = 0; l < leftSize; ++l) {
2,217,499✔
1027
    SFilterGroup *gp1 = taosArrayGet(left, l);
1,108,505✔
1028
    if (NULL == gp1) {
1,106,870!
1029
      FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
1030
    }
1031

1032
    for (int32_t r = 0; r < rightSize; ++r) {
2,527,061✔
1033
      SFilterGroup *gp2 = taosArrayGet(right, r);
1,415,394✔
1034
      if (NULL == gp2) {
1,413,170!
1035
        FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
1036
      }
1037

1038
      FLT_ERR_RET(filterDetachCnfGroup(gp1, gp2, group));
1,413,170!
1039
    }
1040
  }
1041

1042
  return TSDB_CODE_SUCCESS;
1,108,994✔
1043
}
1044

1045
int32_t filterGetFiledByDesc(SFilterFields *fields, int32_t type, void *v) {
1,928,514✔
1046
  for (uint32_t i = 0; i < fields->num; ++i) {
3,822,136✔
1047
    if (nodesEqualNode(fields->fields[i].desc, v)) {
3,004,576✔
1048
      return i;
1,109,922✔
1049
    }
1050
  }
1051

1052
  return -1;
817,560✔
1053
}
1054

1055
int32_t filterGetFiledByData(SFilterInfo *info, int32_t type, void *v, int32_t dataLen, bool *sameBuf) {
481,030✔
1056
  if (type == FLD_TYPE_VALUE) {
481,030!
1057
    if (info->pctx.valHash == false) {
481,139!
1058
      qError("value hash is empty");
×
1059
      return -1;
×
1060
    }
1061

1062
    SFilterDataInfo *dInfo = taosHashGet(info->pctx.valHash, v, dataLen);
481,139✔
1063
    if (dInfo) {
480,521✔
1064
      *sameBuf = (dInfo->addr == v);
208,692✔
1065
      return dInfo->idx;
208,692✔
1066
    }
1067
  }
1068

1069
  return -1;
271,720✔
1070
}
1071

1072
// In the params, we should use void *data instead of void **data, there is no need to use taosMemoryFreeClear(*data) to
1073
// set *data = 0 Besides, fields data value is a pointer, so dataLen should be POINTER_BYTES for better.
1074
int32_t filterAddField(SFilterInfo *info, void *desc, void **data, int32_t type, SFilterFieldId *fid, int32_t dataLen,
6,797,551✔
1075
                       bool freeIfExists, int16_t *srcFlag) {
1076
  int32_t   idx = -1;
6,797,551✔
1077
  uint32_t *num;
1078
  bool      sameBuf = false;
6,797,551✔
1079

1080
  num = &info->fields[type].num;
6,797,551✔
1081

1082
  if (*num > 0) {
6,797,551✔
1083
    if (type == FLD_TYPE_COLUMN) {
3,742,210✔
1084
      idx = filterGetFiledByDesc(&info->fields[type], type, desc);
1,929,092✔
1085
    } else if (data && (*data) && dataLen > 0 && FILTER_GET_FLAG(info->options, FLT_OPTION_NEED_UNIQE)) {
1,813,118!
1086
      idx = filterGetFiledByData(info, type, *data, dataLen, &sameBuf);
481,172✔
1087
    }
1088
  }
1089

1090
  if (idx < 0) {
6,802,114✔
1091
    idx = *num;
5,484,524✔
1092
    if (idx >= info->fields[type].size) {
5,484,524✔
1093
      info->fields[type].size += FILTER_DEFAULT_FIELD_SIZE;
73,536✔
1094
      info->fields[type].fields =
148,417✔
1095
          taosMemoryRealloc(info->fields[type].fields, info->fields[type].size * sizeof(SFilterField));
73,536!
1096
      if (info->fields[type].fields == NULL) {
74,881!
1097
        *num = 0;
×
1098
        fltError("taosMemoryRealloc failed, size:%d", (int32_t)(info->fields[type].size * sizeof(SFilterField)));
×
1099
        FLT_ERR_RET(terrno);
×
1100
      }
1101
    }
1102

1103
    info->fields[type].fields[idx].flag = type;
5,485,869✔
1104
    info->fields[type].fields[idx].desc = desc;
5,485,869✔
1105
    info->fields[type].fields[idx].data = data ? *data : NULL;
5,485,869✔
1106

1107
    if (type == FLD_TYPE_COLUMN) {
5,485,869✔
1108
      FILTER_SET_FLAG(info->fields[type].fields[idx].flag, FLD_DATA_NO_FREE);
2,429,131✔
1109
    }
1110

1111
    ++(*num);
5,485,869✔
1112

1113
    if (data && (*data) && dataLen > 0 && FILTER_GET_FLAG(info->options, FLT_OPTION_NEED_UNIQE)) {
5,485,869!
1114
      if (info->pctx.valHash == NULL) {
448,013✔
1115
        info->pctx.valHash = taosHashInit(FILTER_DEFAULT_GROUP_SIZE * FILTER_DEFAULT_VALUE_SIZE,
175,818✔
1116
                                          taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, false);
1117
        if (NULL == info->pctx.valHash) {
175,830!
1118
          fltError("taosHashInit failed, size:%d", FILTER_DEFAULT_GROUP_SIZE * FILTER_DEFAULT_VALUE_SIZE);
×
1119
          if (srcFlag) {
×
1120
            FILTER_SET_FLAG(*srcFlag, FLD_DATA_NO_FREE);
×
1121
          }
1122
          FLT_ERR_RET(terrno);
×
1123
        }
1124
      }
1125

1126
      SFilterDataInfo dInfo = {idx, *data};
448,025✔
1127
      if (taosHashPut(info->pctx.valHash, *data, dataLen, &dInfo, sizeof(dInfo))) {
448,025!
1128
        fltError("taosHashPut to set failed");
×
1129
        if (srcFlag) {
×
1130
          FILTER_SET_FLAG(*srcFlag, FLD_DATA_NO_FREE);
×
1131
        }
1132
        FLT_ERR_RET(terrno);
×
1133
      }
1134
      if (srcFlag) {
448,422✔
1135
        FILTER_SET_FLAG(*srcFlag, FLD_DATA_NO_FREE);
30,012✔
1136
      }
1137
    }
1138
  } else if (type != FLD_TYPE_COLUMN && data) {
1,317,590!
1139
    if (freeIfExists) {
208,689✔
1140
      taosMemoryFreeClear(*data);
181,199!
1141
    } else if (sameBuf && srcFlag) {
27,490!
1142
      FILTER_SET_FLAG(*srcFlag, FLD_DATA_NO_FREE);
26,474✔
1143
    }
1144
  }
1145

1146
  fid->type = type;
6,803,461✔
1147
  fid->idx = idx;
6,803,461✔
1148

1149
  return TSDB_CODE_SUCCESS;
6,803,461✔
1150
}
1151

1152
static FORCE_INLINE int32_t filterAddColFieldFromField(SFilterInfo *info, SFilterField *field, SFilterFieldId *fid) {
1153
  int32_t code = filterAddField(info, field->desc, &field->data, FILTER_GET_TYPE(field->flag), fid, 0, false, NULL);
560,981✔
1154

1155
  FILTER_SET_FLAG(field->flag, FLD_DATA_NO_FREE);
561,561✔
1156

1157
  return code;
561,561✔
1158
}
1159

1160
int32_t filterAddFieldFromNode(SFilterInfo *info, SNode *node, SFilterFieldId *fid) {
5,568,352✔
1161
  if (node == NULL) {
5,568,352✔
1162
    fltDebug("empty node");
509,184✔
1163
    goto _return;
509,248✔
1164
  }
1165

1166
  if (nodeType(node) != QUERY_NODE_COLUMN && nodeType(node) != QUERY_NODE_VALUE &&
5,059,168✔
1167
      nodeType(node) != QUERY_NODE_NODE_LIST) {
497!
1168
    goto _return;
×
1169
  }
1170

1171
  int32_t type;
1172
  void   *v;
1173

1174
  if (nodeType(node) == QUERY_NODE_COLUMN) {
5,059,168✔
1175
    type = FLD_TYPE_COLUMN;
2,896,633✔
1176
    v = node;
2,896,633✔
1177
  } else {
1178
    type = FLD_TYPE_VALUE;
2,162,535✔
1179
    v = node;
2,162,535✔
1180
  }
1181

1182
  FLT_ERR_RET(filterAddField(info, v, NULL, type, fid, 0, true, NULL));
5,059,168✔
1183

1184
_return:
5,059,751✔
1185
  return TSDB_CODE_SUCCESS;
5,568,999✔
1186
}
1187

1188
int32_t filterAddUnitImpl(SFilterInfo *info, uint8_t optr, SFilterFieldId *left, SFilterFieldId *right, uint8_t optr2,
3,759,239✔
1189
                          SFilterFieldId *right2, uint32_t *uidx) {
1190
  if (FILTER_GET_FLAG(info->options, FLT_OPTION_NEED_UNIQE)) {
3,759,239✔
1191
    if (info->pctx.unitHash == NULL) {
641,873✔
1192
      info->pctx.unitHash = taosHashInit(FILTER_DEFAULT_GROUP_SIZE * FILTER_DEFAULT_UNIT_SIZE,
176,534✔
1193
                                         taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, false);
1194
      if (NULL == info->pctx.unitHash) {
176,625!
1195
        fltError("taosHashInit failed, size:%d", FILTER_DEFAULT_GROUP_SIZE * FILTER_DEFAULT_UNIT_SIZE);
×
1196
        FLT_ERR_RET(terrno);
×
1197
      }
1198
    } else {
1199
      char v[14] = {0};
465,339✔
1200
      FLT_PACKAGE_UNIT_HASH_KEY(&v, optr, optr2, left->idx, (right ? right->idx : -1), (right2 ? right2->idx : -1));
465,339✔
1201
      void *hu = taosHashGet(info->pctx.unitHash, v, sizeof(v));
465,339✔
1202
      if (hu) {
465,305✔
1203
        *uidx = *(uint32_t *)hu;
189,562✔
1204
        return TSDB_CODE_SUCCESS;
189,562✔
1205
      }
1206
    }
1207
  }
1208

1209
  if (info->unitNum >= info->unitSize) {
3,571,468✔
1210
    uint32_t psize = info->unitSize;
142,783✔
1211
    info->unitSize += FILTER_DEFAULT_UNIT_SIZE;
142,783✔
1212

1213
    void *tmp = taosMemoryRealloc(info->units, info->unitSize * sizeof(SFilterUnit));
142,783!
1214
    if (tmp == NULL) {
142,834!
1215
      return terrno;
×
1216
    }
1217
    info->units = (SFilterUnit *)tmp;
142,834✔
1218
    (void)memset(info->units + psize, 0, sizeof(*info->units) * FILTER_DEFAULT_UNIT_SIZE);
142,834✔
1219
  }
1220

1221
  SFilterUnit *u = &info->units[info->unitNum];
3,571,519✔
1222

1223
  u->compare.optr = optr;
3,571,519✔
1224
  u->left = *left;
3,571,519✔
1225
  if (right) {
3,571,519✔
1226
    u->right = *right;
3,524,075✔
1227
  }
1228
  u->compare.optr2 = optr2;
3,571,519✔
1229
  if (right2) {
3,571,519✔
1230
    u->right2 = *right2;
57,738✔
1231
  }
1232

1233
  if (u->right.type == FLD_TYPE_VALUE) {
3,571,519✔
1234
    SFilterField *val = FILTER_UNIT_RIGHT_FIELD(info, u);
3,016,481✔
1235
    if (!FILTER_GET_FLAG(val->flag, FLD_TYPE_VALUE)) {
3,016,481!
1236
      fltError("filterAddUnitImpl get invalid flag : %d in val", val->flag);
×
1237
      return TSDB_CODE_APP_ERROR;
×
1238
    }
1239
  } else {
1240
    int32_t paramNum = scalarGetOperatorParamNum(optr);
555,038✔
1241
    if (1 != paramNum) {
555,102✔
1242
      fltError("invalid right field in unit, operator:%s, rightType:%d", operatorTypeStr(optr), u->right.type);
1,787!
1243
      return TSDB_CODE_APP_ERROR;
×
1244
    }
1245
  }
1246

1247
  SFilterField *col = FILTER_UNIT_LEFT_FIELD(info, u);
3,569,796✔
1248
  if (!FILTER_GET_FLAG(col->flag, FLD_TYPE_COLUMN)) {
3,569,796!
1249
    fltError("filterAddUnitImpl get invalid flag : %d in col", col->flag);
×
1250
    return TSDB_CODE_APP_ERROR;
×
1251
  }
1252

1253
  info->units[info->unitNum].compare.type = FILTER_GET_COL_FIELD_TYPE(col);
3,569,796✔
1254
  info->units[info->unitNum].compare.precision = FILTER_GET_COL_FIELD_PRECISION(col);
3,569,796✔
1255

1256
  *uidx = info->unitNum;
3,569,796✔
1257

1258
  if (FILTER_GET_FLAG(info->options, FLT_OPTION_NEED_UNIQE)) {
3,569,796✔
1259
    char v[14] = {0};
452,774✔
1260
    FLT_PACKAGE_UNIT_HASH_KEY(&v, optr, optr2, left->idx, (right ? right->idx : -1), (right2 ? right2->idx : -1));
452,774✔
1261
    if (taosHashPut(info->pctx.unitHash, v, sizeof(v), uidx, sizeof(*uidx))) {
452,774!
1262
      fltError("taosHashPut to set failed");
×
1263
      FLT_ERR_RET(terrno);
×
1264
    }
1265

1266
  }
1267

1268
  ++info->unitNum;
3,570,460✔
1269

1270
  return TSDB_CODE_SUCCESS;
3,570,460✔
1271
}
1272

1273
int32_t filterAddUnit(SFilterInfo *info, uint8_t optr, SFilterFieldId *left, SFilterFieldId *right, uint32_t *uidx) {
3,672,211✔
1274
  return filterAddUnitImpl(info, optr, left, right, 0, NULL, uidx);
3,672,211✔
1275
}
1276

1277
int32_t filterAddUnitToGroup(SFilterGroup *group, uint32_t unitIdx) {
3,759,555✔
1278
  if (group->unitNum >= group->unitSize) {
3,759,555✔
1279
    group->unitSize += FILTER_DEFAULT_UNIT_SIZE;
3,411,862✔
1280

1281
    void *tmp = taosMemoryRealloc(group->unitIdxs, group->unitSize * sizeof(*group->unitIdxs));
3,411,862!
1282
    if (tmp == NULL) {
3,411,074!
1283
      return terrno;
×
1284
    }
1285
    group->unitIdxs = tmp;
3,411,074✔
1286
  }
1287

1288
  group->unitIdxs[group->unitNum++] = unitIdx;
3,758,767✔
1289

1290
  return TSDB_CODE_SUCCESS;
3,758,767✔
1291
}
1292

1293
static void filterFreeGroup(void *pItem) {
4,826,236✔
1294
  if (pItem == NULL) {
4,826,236!
1295
    return;
×
1296
  }
1297

1298
  SFilterGroup *p = (SFilterGroup *)pItem;
4,826,236✔
1299
  taosMemoryFreeClear(p->unitIdxs);
4,826,236!
1300
  taosMemoryFreeClear(p->unitFlags);
4,825,931✔
1301
}
1302

1303
int32_t fltAddGroupUnitFromNode(void *pContext, SFilterInfo *info, SNode *tree, SArray *group) {
2,896,503✔
1304
  SFltBuildGroupCtx *ctx = (SFltBuildGroupCtx *)pContext;
2,896,503✔
1305
  SOperatorNode *node = (SOperatorNode *)tree;
2,896,503✔
1306
  int32_t        ret = TSDB_CODE_SUCCESS;
2,896,503✔
1307
  SFilterFieldId left = {0}, right = {0};
2,896,503✔
1308
  FLT_ERR_RET(filterAddFieldFromNode(info, node->pLeft, &left));
2,896,503!
1309
  uint8_t  type = FILTER_GET_COL_FIELD_TYPE(FILTER_GET_FIELD(info, left));
2,897,417✔
1310
  int32_t  len = 0;
2,897,417✔
1311
  uint32_t uidx = 0;
2,897,417✔
1312
  int32_t  code = 0;
2,897,417✔
1313

1314
  if (node->opType == OP_TYPE_IN && (!IS_VAR_DATA_TYPE(type))) {
3,120,154!
1315
    SNodeListNode *listNode = (SNodeListNode *)node->pRight;
222,787✔
1316

1317
    SScalarParam out = {.columnData = taosMemoryCalloc(1, sizeof(SColumnInfoData))};
222,787!
1318
    if (out.columnData == NULL) {
222,828!
1319
      return terrno;
×
1320
    }
1321
    out.columnData->info.type = type;
222,828✔
1322
    out.columnData->info.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes;  // reserved space for simple_copy
222,828✔
1323

1324
    int32_t overflowCount = 0;
222,828✔
1325
    SNode* nodeItem = NULL;
222,828✔
1326
    FOREACH(nodeItem, listNode->pNodeList) {
668,182!
1327
      SValueNode *valueNode = (SValueNode *)nodeItem;
444,722✔
1328
      if (valueNode->node.resType.type != type) {
444,722!
1329
        int32_t overflow = 0;
×
1330
        code = sclConvertValueToSclParam(valueNode, &out, &overflow);
×
1331
        if (TSDB_CODE_SUCCESS != code) {
×
1332
          //        fltError("convert from %d to %d failed", in.type, out.type);
1333
          break;
×
1334
        }
1335

1336
        if (overflow) {
×
1337
          ++overflowCount;
×
1338
          continue;
×
1339
        }
1340

1341
        len = tDataTypes[type].bytes;
×
1342

1343
        code = filterAddField(info, NULL, (void **)&out.columnData->pData, FLD_TYPE_VALUE, &right, len, true, NULL);
×
1344
        if (TSDB_CODE_SUCCESS != code) {
×
1345
          break;
×
1346
        }
1347
        out.columnData->pData = NULL;
×
1348
      } else {
1349
        void *data = taosMemoryCalloc(1, tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes);  // reserved space for simple_copy
444,722✔
1350
        if (NULL == data) {
445,407!
1351
          code = terrno;
×
1352
          break;
×
1353
        }
1354
        (void)memcpy(data, nodesGetValueFromNode(valueNode), tDataTypes[type].bytes);
445,407✔
1355
        code = filterAddField(info, NULL, (void **)&data, FLD_TYPE_VALUE, &right, len, true, NULL);
445,497✔
1356
        if (TSDB_CODE_SUCCESS != code) {
445,701!
1357
          break;
×
1358
        }
1359
      }
1360
      code = filterAddUnit(info, OP_TYPE_EQUAL, &left, &right, &uidx);
445,701✔
1361
      if (TSDB_CODE_SUCCESS != code) {
445,632!
1362
        break;
×
1363
      }
1364
      SFilterGroup fgroup = {0};
445,632✔
1365
      code = filterAddUnitToGroup(&fgroup, uidx);
445,632✔
1366
      if (TSDB_CODE_SUCCESS != code) {
445,208!
1367
        filterFreeGroup((void*)&fgroup);
×
1368
        break;
×
1369
      }
1370
      if (NULL == taosArrayPush(group, &fgroup)) {
445,354!
1371
        filterFreeGroup((void*)&fgroup);
×
1372
        code = terrno;
×
1373
        break;
×
1374
      }
1375
    }
1376
    if(overflowCount == listNode->pNodeList->length) {
223,460!
1377
      ctx->ignore = true;
×
1378
    }
1379
    colDataDestroy(out.columnData);
223,460✔
1380
    taosMemoryFree(out.columnData);
222,567!
1381
    FLT_ERR_RET(code);
222,737!
1382
  } else {
1383
    FLT_ERR_RET(filterAddFieldFromNode(info, node->pRight, &right));
2,674,630!
1384

1385
    FLT_ERR_RET(filterAddUnit(info, node->opType, &left, &right, &uidx));
2,673,123!
1386
    SFilterGroup fgroup = {0};
2,673,512✔
1387
    FLT_ERR_RET(filterAddUnitToGroup(&fgroup, uidx));
2,673,512!
1388

1389
    if (NULL == taosArrayPush(group, &fgroup)) {
2,673,528!
1390
      FLT_ERR_RET(terrno);
×
1391
    }
1392
  }
1393

1394
  return TSDB_CODE_SUCCESS;
2,896,491✔
1395
}
1396

1397
int32_t filterAddUnitFromUnit(SFilterInfo *dst, SFilterInfo *src, SFilterUnit *u, uint32_t *uidx) {
79,895✔
1398
  SFilterFieldId left, right, *pright = &right;
79,895✔
1399
  uint8_t        type = FILTER_UNIT_DATA_TYPE(u);
79,895✔
1400
  uint16_t       flag = 0;
79,895✔
1401

1402
  FLT_ERR_RET(filterAddField(dst, FILTER_UNIT_COL_DESC(src, u), NULL, FLD_TYPE_COLUMN, &left, 0, false, NULL));
79,895✔
1403
  SFilterField *t = FILTER_UNIT_LEFT_FIELD(src, u);
80,402✔
1404

1405
  if (u->right.type == FLD_TYPE_VALUE) {
80,402✔
1406
    void         *data = FILTER_UNIT_VAL_DATA(src, u);
57,513✔
1407
    SFilterField *rField = FILTER_UNIT_RIGHT_FIELD(src, u);
57,513✔
1408

1409
    if (IS_VAR_DATA_TYPE(type)) {
57,513!
1410
      if (FILTER_UNIT_OPTR(u) == OP_TYPE_IN) {
57,513✔
1411
        FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, POINTER_BYTES, false, &rField->flag));
10!
1412
        // POINTER_BYTES should be sizeof(SHashObj), but POINTER_BYTES is also right.
1413

1414
        t = FILTER_GET_FIELD(dst, right);
10✔
1415
        FILTER_SET_FLAG(t->flag, FLD_DATA_IS_HASH);
10✔
1416
      } else {
1417
        FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, varDataTLen(data), false, &rField->flag));
57,503!
1418
      }
1419
    } else {
1420
      FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, false, &rField->flag));
×
1421
    }
1422
  } else {
1423
    pright = NULL;
22,889✔
1424
  }
1425

1426
  return filterAddUnit(dst, FILTER_UNIT_OPTR(u), &left, pright, uidx);
80,379✔
1427
}
1428

1429
int32_t filterAddUnitRight(SFilterInfo *info, uint8_t optr, SFilterFieldId *right, uint32_t uidx) {
×
1430
  SFilterUnit *u = &info->units[uidx];
×
1431
  u->compare.optr2 = optr;
×
1432
  u->right2 = *right;
×
1433

1434
  return TSDB_CODE_SUCCESS;
×
1435
}
1436

1437
int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRangeCtx *ctx, uint32_t cidx,
560,981✔
1438
                                  SFilterGroup *g, int32_t optr, SArray *res) {
1439
  SFilterFieldId left, right, right2;
1440
  uint32_t       uidx = 0;
560,981✔
1441

1442
  SFilterField *col = FILTER_GET_COL_FIELD(src, cidx);
560,981✔
1443

1444
  FLT_ERR_RET(filterAddColFieldFromField(dst, col, &left));
561,561!
1445

1446
  int32_t type = FILTER_GET_COL_FIELD_TYPE(FILTER_GET_FIELD(dst, left));
561,561✔
1447

1448
  if (optr == LOGIC_COND_TYPE_AND) {
561,561✔
1449
    if (ctx->isnull) {
461,609✔
1450
      if (ctx->notnull || ctx->isrange) {
19,016!
1451
        fltError("filterAddGroupUnitFromCtx get invalid ctx : isnull %d, notnull %d, isrange %d",
1!
1452
                 ctx->isnull, ctx->notnull, ctx->isrange);
1453
        FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
1!
1454
      }
1455
      FLT_ERR_RET(filterAddUnit(dst, OP_TYPE_IS_NULL, &left, NULL, &uidx));
19,016!
1456
      FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
19,010!
1457
      return TSDB_CODE_SUCCESS;
18,998✔
1458
    }
1459

1460
    if (ctx->notnull) {
442,593✔
1461
      if (ctx->isnull || ctx->isrange) {
29,588!
1462
        fltError("filterAddGroupUnitFromCtx get invalid ctx : isnull %d, notnull %d, isrange %d",
×
1463
                 ctx->isnull, ctx->notnull, ctx->isrange);
1464
        FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1465
      }
1466
      FLT_ERR_RET(filterAddUnit(dst, OP_TYPE_IS_NOT_NULL, &left, NULL, &uidx));
29,588!
1467
      FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
29,622✔
1468
      return TSDB_CODE_SUCCESS;
29,616✔
1469
    }
1470

1471
    if (!ctx->isrange) {
413,005!
1472
      if (!ctx->isnull && !ctx->notnull) {
×
1473
        fltError("filterAddGroupUnitFromCtx get invalid ctx : isnull %d, notnull %d, isrange %d",
×
1474
                 ctx->isnull, ctx->notnull, ctx->isrange);
1475
        FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1476
      }
1477
      return TSDB_CODE_SUCCESS;
×
1478
    }
1479

1480
    if (!ctx->rs || ctx->rs->next != NULL) {
413,005!
1481
      fltError("filterAddGroupUnitFromCtx get invalid range node with rs:%p", ctx->rs);
503!
1482
      FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
503!
1483
    }
1484

1485
    SFilterRange *ra = &ctx->rs->ra;
413,005✔
1486

1487
    if (((FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL)) && (FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL)))) {
413,005!
1488
      fltError("filterAddGroupUnitFromCtx get invalid range with sflag:%d, eflag:%d",
×
1489
               FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL), FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL));
1490
      FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1491
    }
1492

1493
    if ((!FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL)) && (!FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL))) {
412,651✔
1494
      __compar_fn_t func = getComparFunc(type, 0);
200,259✔
1495
      if (func == NULL) {
199,996!
1496
        FLT_ERR_RET(terrno);
×
1497
      }
1498
      if (func(&ra->s, &ra->e) == 0) {
199,996✔
1499
        void *data = taosMemoryMalloc(sizeof(int64_t));
139,296✔
1500
        if (data == NULL) {
139,248!
1501
          FLT_ERR_RET(terrno);
×
1502
        }
1503
        SIMPLE_COPY_VALUES(data, &ra->s);
139,248✔
1504
        FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
139,248!
1505
        FLT_ERR_RET(filterAddUnit(dst, OP_TYPE_EQUAL, &left, &right, &uidx));
139,575!
1506
        FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
139,558✔
1507
        return TSDB_CODE_SUCCESS;
139,502✔
1508
      } else {
1509
        void *data = taosMemoryMalloc(sizeof(int64_t));
60,559!
1510
        if (data == NULL) {
60,751!
1511
          FLT_ERR_RET(terrno);
×
1512
        }
1513
        SIMPLE_COPY_VALUES(data, &ra->s);
60,751✔
1514
        FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
60,751!
1515
        void *data2 = taosMemoryMalloc(sizeof(int64_t));
60,821!
1516
        if (data2 == NULL) {
60,782!
1517
          FLT_ERR_RET(terrno);
×
1518
        }
1519
        SIMPLE_COPY_VALUES(data2, &ra->e);
60,782✔
1520
        FLT_ERR_RET(filterAddField(dst, NULL, &data2, FLD_TYPE_VALUE, &right2, tDataTypes[type].bytes, true, NULL));
60,782!
1521

1522
        FLT_ERR_RET(filterAddUnitImpl(
60,884!
1523
            dst, FILTER_GET_FLAG(ra->sflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_GREATER_THAN : OP_TYPE_GREATER_EQUAL, &left,
1524
            &right, FILTER_GET_FLAG(ra->eflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_LOWER_THAN : OP_TYPE_LOWER_EQUAL, &right2,
1525
            &uidx));
1526
        FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
60,898!
1527
        return TSDB_CODE_SUCCESS;
60,856✔
1528
      }
1529
    }
1530

1531
    if (!FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL)) {
212,392✔
1532
      void *data = taosMemoryMalloc(sizeof(int64_t));
168,343!
1533
      if (data == NULL) {
168,278!
1534
        FLT_ERR_RET(terrno);
×
1535
      }
1536
      SIMPLE_COPY_VALUES(data, &ra->s);
168,278✔
1537
      FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
168,278✔
1538
      FLT_ERR_RET(filterAddUnit(dst, FILTER_GET_FLAG(ra->sflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_GREATER_THAN : OP_TYPE_GREATER_EQUAL,
168,509!
1539
                                &left, &right, &uidx));
1540
      FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
169,003✔
1541
    }
1542

1543
    if (!FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL)) {
212,638✔
1544
      void *data = taosMemoryMalloc(sizeof(int64_t));
44,188!
1545
      if (data == NULL) {
44,215!
1546
        FLT_ERR_RET(terrno);
×
1547
      }
1548
      SIMPLE_COPY_VALUES(data, &ra->e);
44,215✔
1549
      FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
44,215!
1550
      FLT_ERR_RET(filterAddUnit(dst, FILTER_GET_FLAG(ra->eflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_LOWER_THAN : OP_TYPE_LOWER_EQUAL,
44,240!
1551
                                &left, &right, &uidx));
1552
      FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
44,319!
1553
    }
1554

1555
    return TSDB_CODE_SUCCESS;
212,695✔
1556
  }
1557

1558
  // OR PROCESS
1559

1560
  SFilterGroup ng = {0};
99,952✔
1561
  g = &ng;
99,952✔
1562

1563
  if (!ctx->isnull && !ctx->notnull && !ctx->isrange) {
99,952!
1564
    fltError("filterAddGroupUnitFromCtx get invalid ctx : isnull %d, notnull %d, isrange %d",
×
1565
             ctx->isnull, ctx->notnull, ctx->isrange);
1566
    FLT_ERR_RET(TSDB_CODE_APP_ERROR);
×
1567
  }
1568

1569
  if (ctx->isnull) {
99,721✔
1570
    FLT_ERR_RET(filterAddUnit(dst, OP_TYPE_IS_NULL, &left, NULL, &uidx));
211!
1571
    FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
211!
1572
    if (NULL == taosArrayPush(res,g)) {
211!
1573
      FLT_ERR_RET(terrno);
×
1574
    }
1575
  }
1576

1577
  if (ctx->notnull) {
99,721✔
1578
    if (ctx->isrange) {
492!
1579
      fltError("filterAddGroupUnitFromCtx get invalid ctx : isnull %d, notnull %d, isrange %d",
×
1580
               ctx->isnull, ctx->notnull, ctx->isrange);
1581
      FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1582
    }
1583
    (void)memset(g, 0, sizeof(*g));
492✔
1584

1585
    FLT_ERR_RET(filterAddUnit(dst, OP_TYPE_IS_NOT_NULL, &left, NULL, &uidx));
492!
1586
    FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
492!
1587
    if (NULL == taosArrayPush(res,g)) {
492!
1588
      FLT_ERR_RET(terrno);
×
1589
    }
1590
  }
1591

1592
  if (!ctx->isrange) {
99,721✔
1593
    if (!ctx->isnull && !ctx->notnull) {
703!
1594
      fltError("filterAddGroupUnitFromCtx get invalid ctx : isnull %d, notnull %d, isrange %d",
×
1595
               ctx->isnull, ctx->notnull, ctx->isrange);
1596
      FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1597
    }
1598
    g->unitNum = 0;
703✔
1599
    return TSDB_CODE_SUCCESS;
703✔
1600
  }
1601

1602
  SFilterRangeNode *r = ctx->rs;
99,018✔
1603

1604
  while (r) {
198,319✔
1605
    (void)memset(g, 0, sizeof(*g));
99,075✔
1606

1607
    if ((!FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_NULL)) && (!FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_NULL))) {
99,075✔
1608
      __compar_fn_t func = getComparFunc(type, 0);
33,575✔
1609
      if (func == NULL) {
33,569!
1610
        FLT_ERR_RET(terrno);
×
1611
      }
1612
      if (func(&r->ra.s, &r->ra.e) == 0) {
33,569✔
1613
        void *data = taosMemoryMalloc(sizeof(int64_t));
7,701✔
1614
        if (data == NULL) {
7,692!
1615
          FLT_ERR_RET(terrno);
×
1616
        }
1617
        SIMPLE_COPY_VALUES(data, &r->ra.s);
7,692✔
1618
        FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
7,692!
1619
        FLT_ERR_RET(filterAddUnit(dst, OP_TYPE_EQUAL, &left, &right, &uidx));
7,722!
1620
        FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
7,732!
1621
      } else {
1622
        void *data = taosMemoryMalloc(sizeof(int64_t));
25,847✔
1623
        if (data == NULL) {
25,877!
1624
          FLT_ERR_RET(terrno);
×
1625
        }
1626
        SIMPLE_COPY_VALUES(data, &r->ra.s);
25,877✔
1627
        FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
25,877!
1628
        void *data2 = taosMemoryMalloc(sizeof(int64_t));
25,888✔
1629
        if (data2 == NULL) {
25,901!
1630
          FLT_ERR_RET(terrno);
×
1631
        }
1632
        SIMPLE_COPY_VALUES(data2, &r->ra.e);
25,901✔
1633
        FLT_ERR_RET(filterAddField(dst, NULL, &data2, FLD_TYPE_VALUE, &right2, tDataTypes[type].bytes, true, NULL));
25,901!
1634

1635
        FLT_ERR_RET(filterAddUnitImpl(
25,911!
1636
                        dst, FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_GREATER_THAN : OP_TYPE_GREATER_EQUAL, &left,
1637
                        &right, FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_LOWER_THAN : OP_TYPE_LOWER_EQUAL, &right2,
1638
                        &uidx));
1639
        FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
25,919!
1640
      }
1641

1642
      if (NULL == taosArrayPush(res,g)) {
33,620!
1643
        FLT_ERR_RET(terrno);
×
1644
      }
1645

1646
      r = r->next;
33,622✔
1647

1648
      continue;
33,622✔
1649
    }
1650

1651
    if (!FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_NULL)) {
65,500✔
1652
      void *data = taosMemoryMalloc(sizeof(int64_t));
62,480!
1653
      if (data == NULL) {
62,610!
1654
        FLT_ERR_RET(terrno);
×
1655
      }
1656
      SIMPLE_COPY_VALUES(data, &r->ra.s);
62,610✔
1657
      FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
62,610✔
1658
      FLT_ERR_RET(filterAddUnit(dst, FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_GREATER_THAN : OP_TYPE_GREATER_EQUAL,
62,603!
1659
                                &left, &right, &uidx));
1660
      FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
62,684!
1661
    }
1662

1663
    if (!FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_NULL)) {
65,655✔
1664
      void *data = taosMemoryMalloc(sizeof(int64_t));
3,083!
1665
      if (data == NULL) {
3,081!
1666
        FLT_ERR_RET(terrno);
×
1667
      }
1668
      SIMPLE_COPY_VALUES(data, &r->ra.e);
3,081✔
1669
      FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
3,081!
1670
      FLT_ERR_RET(filterAddUnit(dst, FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_LOWER_THAN : OP_TYPE_LOWER_EQUAL,
3,082!
1671
                                &left, &right, &uidx));
1672
      FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
3,083!
1673
    }
1674

1675
    if (g->unitNum <= 0) {
65,655!
1676
      fltError("filterAddGroupUnitFromCtx get invalid filter group unit num %d", g->unitNum);
×
1677
      FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1678
    }
1679

1680
    if (NULL == taosArrayPush(res,g)) {
65,663!
1681
      FLT_ERR_RET(terrno);
×
1682
    }
1683

1684
    r = r->next;
65,679✔
1685
  }
1686

1687
  g->unitNum = 0;
99,244✔
1688

1689
  return TSDB_CODE_SUCCESS;
99,244✔
1690
}
1691

1692
EDealRes fltTreeToGroup(SNode *pNode, void *pContext) {
3,918,417✔
1693
  int32_t            code = TSDB_CODE_SUCCESS;
3,918,417✔
1694
  SArray            *preGroup = NULL;
3,918,417✔
1695
  SArray            *newGroup = NULL;
3,918,417✔
1696
  SArray            *resGroup = NULL;
3,918,417✔
1697
  ENodeType          nType = nodeType(pNode);
3,918,417✔
1698
  SFltBuildGroupCtx *ctx = (SFltBuildGroupCtx *)pContext;
3,918,417✔
1699

1700
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(pNode)) {
3,918,417✔
1701
    SLogicConditionNode *node = (SLogicConditionNode *)pNode;
1,022,590✔
1702
    if (LOGIC_COND_TYPE_AND == node->condType) {
1,022,590✔
1703
      SListCell *cell = node->pParameterList->pHead;
766,274✔
1704
      for (int32_t i = 0; i < node->pParameterList->length; ++i) {
2,640,635✔
1705
        newGroup = taosArrayInit(4, sizeof(SFilterGroup));
1,873,659✔
1706
        if (NULL == newGroup) {
1,873,858!
1707
          FLT_ERR_RET(terrno);
×
1708
        }
1709
        resGroup = taosArrayInit(4, sizeof(SFilterGroup));
1,873,858✔
1710
        if (NULL == resGroup) {
1,874,077!
1711
          FLT_ERR_RET(terrno);
×
1712
        }
1713

1714
        SFltBuildGroupCtx tctx = {.info = ctx->info, .group = newGroup, .ignore = false};
1,874,077✔
1715
        nodesWalkExpr(cell->pNode, fltTreeToGroup, (void *)&tctx);
1,874,077✔
1716
        FLT_ERR_JRET(tctx.code);
1,873,342✔
1717
        if(tctx.ignore) {
1,872,672!
1718
          ctx->ignore = true;
×
1719
          taosArrayDestroyEx(newGroup, filterFreeGroup);
×
1720
          newGroup = NULL;
×
1721
          taosArrayDestroyEx(resGroup, filterFreeGroup);
×
1722
          resGroup = NULL;
×
1723
          break;
×
1724
        }
1725
        FLT_ERR_JRET(filterDetachCnfGroups(resGroup, preGroup, newGroup));
1,872,672!
1726

1727
        taosArrayDestroyEx(newGroup, filterFreeGroup);
1,873,361✔
1728
        newGroup = NULL;
1,874,138✔
1729
        taosArrayDestroyEx(preGroup, filterFreeGroup);
1,874,138✔
1730

1731
        preGroup = resGroup;
1,874,361✔
1732
        resGroup = NULL;
1,874,361✔
1733

1734
        cell = cell->pNext;
1,874,361✔
1735
      }
1736
      if (!ctx->ignore) {
766,976✔
1737
        if (NULL == taosArrayAddAll(ctx->group, preGroup)) {
766,381!
1738
          FLT_ERR_JRET(terrno);
×
1739
        }
1740
      }
1741

1742
      taosArrayDestroy(preGroup);
766,393✔
1743

1744
      return DEAL_RES_IGNORE_CHILD;
766,343✔
1745
    }
1746

1747
    if (LOGIC_COND_TYPE_OR == node->condType) {
256,316✔
1748
      SListCell *cell = node->pParameterList->pHead;
256,110✔
1749
      for (int32_t i = 0; i < node->pParameterList->length; ++i) {
867,183✔
1750
        nodesWalkExpr(cell->pNode, fltTreeToGroup, (void *)pContext);
610,950✔
1751
        if(ctx->ignore) {
611,073!
1752
          ctx->ignore = false;
×
1753
        }
1754
        FLT_ERR_JRET(ctx->code);
611,073!
1755

1756
        cell = cell->pNext;
611,073✔
1757
      }
1758

1759
      return DEAL_RES_IGNORE_CHILD;
256,233✔
1760
    }
1761

1762
    fltError("invalid condition type, type:%d", node->condType);
206!
1763

1764
    FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
1,080!
1765
  }
1766

1767
  if (QUERY_NODE_OPERATOR == nType) {
2,896,907✔
1768
    FLT_ERR_JRET(fltAddGroupUnitFromNode(ctx, ctx->info, pNode, ctx->group));
2,896,887!
1769

1770
    return DEAL_RES_IGNORE_CHILD;
2,896,611✔
1771
  }
1772

1773
  if (QUERY_NODE_VALUE == nType && ((SValueNode*)pNode)->node.resType.type == TSDB_DATA_TYPE_BOOL) {
20!
1774
    if (((SValueNode*)pNode)->datum.b) {
20!
1775
      FILTER_SET_FLAG(ctx->info->status, FI_STATUS_ALL);
×
1776
    } else {
1777
      FILTER_SET_FLAG(ctx->info->status, FI_STATUS_EMPTY);
20✔
1778
    }
1779
    return DEAL_RES_END;
20✔
1780
  }
1781
  
1782
  fltError("invalid node type for filter, type:%d", nodeType(pNode));
×
1783

1784
  code = TSDB_CODE_QRY_INVALID_INPUT;
×
1785

1786
_return:
×
1787

1788
  taosArrayDestroyEx(newGroup, filterFreeGroup);
×
1789
  taosArrayDestroyEx(preGroup, filterFreeGroup);
×
1790
  taosArrayDestroyEx(resGroup, filterFreeGroup);
×
1791

1792
  ctx->code = code;
×
1793

1794
  return DEAL_RES_ERROR;
×
1795
}
1796

1797
int32_t fltConverToStr(char *str, int32_t strMaxLen, int type, void *buf, int32_t bufSize, int32_t *len) {
215,646✔
1798
  int32_t n = 0;
215,646✔
1799

1800
  switch (type) {
215,646!
1801
    case TSDB_DATA_TYPE_NULL:
×
1802
      n = tsnprintf(str, strMaxLen, "null");
×
1803
      break;
×
1804

1805
    case TSDB_DATA_TYPE_BOOL:
4,332✔
1806
      n = tsnprintf(str, strMaxLen, (*(int8_t *)buf) ? "true" : "false");
4,332✔
1807
      break;
4,332✔
1808

1809
    case TSDB_DATA_TYPE_TINYINT:
1,980✔
1810
      n = tsnprintf(str, strMaxLen, "%d", *(int8_t *)buf);
1,980✔
1811
      break;
1,980✔
1812

1813
    case TSDB_DATA_TYPE_SMALLINT:
2,660✔
1814
      n = tsnprintf(str, strMaxLen, "%d", *(int16_t *)buf);
2,660✔
1815
      break;
2,660✔
1816

1817
    case TSDB_DATA_TYPE_INT:
12,425✔
1818
      n = tsnprintf(str, strMaxLen, "%d", *(int32_t *)buf);
12,425✔
1819
      break;
12,425✔
1820

1821
    case TSDB_DATA_TYPE_BIGINT:
168,936✔
1822
    case TSDB_DATA_TYPE_TIMESTAMP:
1823
      n = tsnprintf(str, strMaxLen, "%" PRId64, *(int64_t *)buf);
168,936✔
1824
      break;
168,937✔
1825

1826
    case TSDB_DATA_TYPE_FLOAT:
1,333✔
1827
      n = tsnprintf(str, strMaxLen, "%e", GET_FLOAT_VAL(buf));
1,333✔
1828
      break;
1,333✔
1829

1830
    case TSDB_DATA_TYPE_DOUBLE:
2,898✔
1831
      n = tsnprintf(str, strMaxLen, "%e", GET_DOUBLE_VAL(buf));
2,898✔
1832
      break;
2,898✔
1833

1834
    case TSDB_DATA_TYPE_BINARY:
21,082✔
1835
    case TSDB_DATA_TYPE_VARBINARY:
1836
    case TSDB_DATA_TYPE_NCHAR:
1837
    case TSDB_DATA_TYPE_GEOMETRY:
1838
      if (bufSize < 0) {
21,082!
1839
        //        tscError("invalid buf size");
1840
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1841
      }
1842

1843
      *str = '"';
21,082✔
1844
      (void)memcpy(str + 1, buf, bufSize);
21,082✔
1845
      *(str + bufSize + 1) = '"';
21,082✔
1846
      n = bufSize + 2;
21,082✔
1847
      break;
21,082✔
1848

1849
    case TSDB_DATA_TYPE_UTINYINT:
×
1850
      n = tsnprintf(str, strMaxLen, "%d", *(uint8_t *)buf);
×
1851
      break;
×
1852

1853
    case TSDB_DATA_TYPE_USMALLINT:
×
1854
      n = tsnprintf(str, strMaxLen, "%d", *(uint16_t *)buf);
×
1855
      break;
×
1856

1857
    case TSDB_DATA_TYPE_UINT:
×
1858
      n = tsnprintf(str, strMaxLen, "%u", *(uint32_t *)buf);
×
1859
      break;
×
1860

1861
    case TSDB_DATA_TYPE_UBIGINT:
×
1862
      n = tsnprintf(str, strMaxLen, "%" PRIu64, *(uint64_t *)buf);
×
1863
      break;
×
1864

1865
    default:
×
1866
      //      tscError("unsupported type:%d", type);
1867
      return TSDB_CODE_TSC_INVALID_VALUE;
×
1868
  }
1869

1870
  *len = n;
215,647✔
1871

1872
  return TSDB_CODE_SUCCESS;
215,647✔
1873
}
1874

1875
int32_t filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options) {
3,543,564✔
1876
  if (qDebugFlag & DEBUG_DEBUG) {
3,543,564✔
1877
    if (info == NULL) {
166,108!
1878
      fltDebug("%s - FilterInfo: EMPTY", msg);
×
1879
      return TSDB_CODE_SUCCESS;
×
1880
    }
1881

1882
    if (options == 0) {
166,108✔
1883
      qDebug("%s - FilterInfo:", msg);
151,916!
1884
      qDebug("COLUMN Field Num:%u", info->fields[FLD_TYPE_COLUMN].num);
151,924!
1885
      for (uint32_t i = 0; i < info->fields[FLD_TYPE_COLUMN].num; ++i) {
315,180✔
1886
        SFilterField *field = &info->fields[FLD_TYPE_COLUMN].fields[i];
163,253✔
1887
        SColumnNode  *refNode = (SColumnNode *)field->desc;
163,253✔
1888
        qDebug("COL%d => [%d][%d]", i, refNode->dataBlockId, refNode->slotId);
163,253!
1889
      }
1890

1891
      qDebug("VALUE Field Num:%u", info->fields[FLD_TYPE_VALUE].num);
151,927!
1892
      for (uint32_t i = 0; i < info->fields[FLD_TYPE_VALUE].num; ++i) {
356,706✔
1893
        SFilterField *field = &info->fields[FLD_TYPE_VALUE].fields[i];
204,779✔
1894
        if (field->desc) {
204,779✔
1895
          if (QUERY_NODE_VALUE != nodeType(field->desc)) {
200,436✔
1896
            qDebug("VAL%d => [type:not value node][val:NIL]", i);  // TODO
34!
1897
            continue;
34✔
1898
          }
1899

1900
          SValueNode *var = (SValueNode *)field->desc;
200,402✔
1901
          SDataType  *dType = &var->node.resType;
200,402✔
1902
          qDebug("VAL%d => [type:%d][val:%" PRIx64 "]", i, dType->type, var->datum.i);  // TODO
200,402!
1903
        } else if (field->data) {
4,343!
1904
          qDebug("VAL%d => [type:NIL][val:NIL]", i);                                    // TODO
4,343!
1905
        }
1906
      }
1907

1908
      qDebug("UNIT  Num:%u", info->unitNum);
151,927!
1909
      for (uint32_t i = 0; i < info->unitNum; ++i) {
386,944✔
1910
        SFilterUnit *unit = &info->units[i];
235,017✔
1911
        int32_t      type = FILTER_UNIT_DATA_TYPE(unit);
235,017✔
1912
        int32_t      len = 0;
235,017✔
1913
        int32_t      tlen = 0;
235,017✔
1914
        char         str[512] = {0};
235,017✔
1915

1916
        SFilterField *left = FILTER_UNIT_LEFT_FIELD(info, unit);
235,017✔
1917
        SColumnNode  *refNode = (SColumnNode *)left->desc;
235,017✔
1918
        if (unit->compare.optr <= OP_TYPE_JSON_CONTAINS) {
235,017!
1919
          len += tsnprintf(str, sizeof(str), "UNIT[%d] => [%d][%d]  %s  [", i, refNode->dataBlockId, refNode->slotId,
235,014✔
1920
                          operatorTypeStr(unit->compare.optr));
235,017✔
1921
        }
1922

1923
        if (unit->right.type == FLD_TYPE_VALUE && FILTER_UNIT_OPTR(unit) != OP_TYPE_IN) {
440,455✔
1924
          SFilterField *right = FILTER_UNIT_RIGHT_FIELD(info, unit);
205,441✔
1925
          char         *data = right->data;
205,441✔
1926
          if (IS_VAR_DATA_TYPE(type)) {
205,441!
1927
            tlen = varDataLen(data);
21,082✔
1928
            data += VARSTR_HEADER_SIZE;
21,082✔
1929
          }
1930
          if (data) {
205,441!
1931
            FLT_ERR_RET(fltConverToStr(str + len, sizeof(str) - len, type, data, tlen > 32 ? 32 : tlen, &tlen));
205,442!
1932
            len += tlen;
205,441✔
1933
          }
1934
        } else {
1935
          (void)strncat(str, "NULL", sizeof(str) - len - 1);
29,574✔
1936
          len += 4;
29,574✔
1937
        }
1938
        (void)strncat(str, "]", sizeof(str) - len - 1);
235,014✔
1939
        len += 1;
235,014✔
1940

1941
        if (unit->compare.optr2) {
235,014✔
1942
          (void)strncat(str, " && ", sizeof(str) - len - 1);
806✔
1943
          len += 4;
806✔
1944
          if (unit->compare.optr2 <= OP_TYPE_JSON_CONTAINS) {
806!
1945
            len += tsnprintf(str + len, sizeof(str) - len, "[%d][%d]  %s  [", refNode->dataBlockId,
806✔
1946
                            refNode->slotId, operatorTypeStr(unit->compare.optr2));
806✔
1947
          }
1948

1949
          if (unit->right2.type == FLD_TYPE_VALUE && FILTER_UNIT_OPTR(unit) != OP_TYPE_IN) {
806!
1950
            SFilterField *right = FILTER_UNIT_RIGHT2_FIELD(info, unit);
806✔
1951
            char         *data = right->data;
806✔
1952
            if (IS_VAR_DATA_TYPE(type)) {
806!
1953
              tlen = varDataLen(data);
×
1954
              data += VARSTR_HEADER_SIZE;
×
1955
            }
1956
            FLT_ERR_RET(fltConverToStr(str + len, sizeof(str) - len, type, data, tlen > 32 ? 32 : tlen, &tlen));
806!
1957
            len += tlen;
806✔
1958
          } else {
1959
            (void)strncat(str, "NULL", sizeof(str) - len - 1);
×
1960
            len += 4;
×
1961
          }
1962
          (void)strncat(str, "]", sizeof(str) - len - 1);
806✔
1963
          len += 1;
806✔
1964
        }
1965

1966
        qDebug("%s", str);  // TODO
235,014✔
1967
      }
1968

1969
      qDebug("GROUP Num:%u", info->groupNum);
151,927!
1970
      uint32_t maxDbgGrpNum = TMIN(info->groupNum, 1000);
151,927✔
1971
      for (uint32_t i = 0; i < maxDbgGrpNum; ++i) {
314,270✔
1972
        SFilterGroup *group = &info->groups[i];
162,343✔
1973
        qDebug("Group%d : unit num[%u]", i, group->unitNum);
162,343!
1974

1975
        for (uint32_t u = 0; u < group->unitNum; ++u) {
401,669✔
1976
          qDebug("unit id:%u", group->unitIdxs[u]);
239,326!
1977
        }
1978
      }
1979

1980
      return TSDB_CODE_SUCCESS;
151,927✔
1981
    }
1982

1983
    if (options == 1) {
14,192!
1984
      qDebug("%s - RANGE info:", msg);
14,194!
1985

1986
      qDebug("RANGE Num:%u", info->colRangeNum);
14,194!
1987
      for (uint32_t i = 0; i < info->colRangeNum; ++i) {
20,619✔
1988
        SFilterRangeCtx *ctx = info->colRange[i];
6,425✔
1989
        qDebug("Column ID[%d] RANGE: isnull[%d],notnull[%d],range[%d]", ctx->colId, ctx->isnull, ctx->notnull,
6,425!
1990
               ctx->isrange);
1991
        if (ctx->isrange) {
6,425✔
1992
          SFilterRangeNode *r = ctx->rs;
5,977✔
1993
          int32_t           tlen = 0;
5,977✔
1994
          while (r) {
12,330✔
1995
            char    str[256] = {0};
6,353✔
1996
            int32_t len = 0;
6,353✔
1997
            if (FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_NULL)) {
6,353✔
1998
              (void)strncat(str, "(NULL)", sizeof(str) - len - 1);
1,219✔
1999
              len += 6;
1,219✔
2000
            } else {
2001
              FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_EXCLUDE) ?
5,134✔
2002
                                                              (void)strncat(str, "(", sizeof(str) - len - 1) :
5,134✔
2003
                                                              (void)strncat(str, "[", sizeof(str) - len - 1);
3,202✔
2004
              len += 1;
5,134✔
2005
              FLT_ERR_RET(fltConverToStr(str + len, sizeof(str) - len, ctx->type, &r->ra.s, tlen > 32 ? 32 : tlen, &tlen));
5,134!
2006
              len += tlen;
5,134✔
2007
              FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_EXCLUDE) ?
5,134✔
2008
                                                              (void)strncat(str, ")", sizeof(str) - len - 1) :
5,134✔
2009
                                                              (void)strncat(str, "]", sizeof(str) - len - 1);
3,202✔
2010
              len += 1;
5,134✔
2011
            }
2012
            (void)strncat(str, " - ", sizeof(str) - len - 1);
6,353✔
2013
            len += 3;
6,353✔
2014
            if (FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_NULL)) {
6,353✔
2015
              (void)strncat(str, "(NULL)", sizeof(str) - len - 1);
2,087✔
2016
              len += 6;
2,087✔
2017
            } else {
2018
              FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_EXCLUDE) ?
4,266✔
2019
                                                              (void)strncat(str, "(", sizeof(str) - len - 1) :
4,266✔
2020
                                                              (void)strncat(str, "[", sizeof(str) - len - 1);
3,256✔
2021
              len += 1;
4,266✔
2022
              FLT_ERR_RET(fltConverToStr(str + len, sizeof(str) - len, ctx->type, &r->ra.e, tlen > 32 ? 32 : tlen, &tlen));
4,266!
2023
              len += tlen;
4,266✔
2024
              FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_EXCLUDE) ?
4,266✔
2025
                                                              (void)strncat(str, ")", sizeof(str) - len - 1) :
4,266✔
2026
                                                              (void)strncat(str, "]", sizeof(str) - len - 1);
3,256✔
2027
              len += 1;
4,266✔
2028
            }
2029
            qDebug("range: %s", str);
6,353!
2030

2031
            r = r->next;
6,353✔
2032
          }
2033
        }
2034
      }
2035

2036
      return TSDB_CODE_SUCCESS;
14,194✔
2037
    }
2038

2039
    qDebug("%s - Block Filter info:", msg);
×
2040

2041
    if (FILTER_GET_FLAG(info->blkFlag, FI_STATUS_BLK_ALL)) {
×
2042
      qDebug("Flag:%s", "ALL");
×
2043
      return TSDB_CODE_SUCCESS;
×
2044
    } else if (FILTER_GET_FLAG(info->blkFlag, FI_STATUS_BLK_EMPTY)) {
×
2045
      qDebug("Flag:%s", "EMPTY");
×
2046
      return TSDB_CODE_SUCCESS;
×
2047
    } else if (FILTER_GET_FLAG(info->blkFlag, FI_STATUS_BLK_ACTIVE)) {
×
2048
      qDebug("Flag:%s", "ACTIVE");
×
2049
    }
2050

2051
    qDebug("GroupNum:%d", info->blkGroupNum);
×
2052
    uint32_t *unitIdx = info->blkUnits;
×
2053
    for (uint32_t i = 0; i < info->blkGroupNum; ++i) {
×
2054
      qDebug("Group[%d] UnitNum: %d:", i, *unitIdx);
×
2055
      uint32_t unitNum = *(unitIdx++);
×
2056
      for (uint32_t m = 0; m < unitNum; ++m) {
×
2057
        qDebug("uidx[%d]", *(unitIdx++));
×
2058
      }
2059
    }
2060
  }
2061
  return TSDB_CODE_SUCCESS;
3,377,456✔
2062
}
2063

2064
void filterFreeColInfo(void *data) {
2,798,307✔
2065
  SFilterColInfo *info = (SFilterColInfo *)data;
2,798,307✔
2066

2067
  if (info->info == NULL) {
2,798,307!
2068
    return;
×
2069
  }
2070

2071
  if (info->type == RANGE_TYPE_VAR_HASH) {
2,798,307!
2072
    // TODO
2073
  } else if (info->type == RANGE_TYPE_MR_CTX) {
2,799,803✔
2074
    (void)filterFreeRangeCtx(info->info);  // No need to handle the return value.
2,442,045✔
2075
  } else if (info->type == RANGE_TYPE_UNIT) {
357,758!
2076
    taosArrayDestroy((SArray *)info->info);
358,429✔
2077
  }
2078

2079
  // NO NEED TO FREE UNIT
2080

2081
  info->type = 0;
2,801,737✔
2082
  info->info = NULL;
2,801,737✔
2083
}
2084

2085
void filterFreeColCtx(void *data) {
×
2086
  SFilterColCtx *ctx = (SFilterColCtx *)data;
×
2087

2088
  if (ctx->ctx) {
×
2089
    (void)filterFreeRangeCtx(ctx->ctx);  // No need to handle the return value.
×
2090
  }
2091
}
×
2092

2093
void filterFreeGroupCtx(SFilterGroupCtx *gRes) {
1,639,324✔
2094
  if (gRes == NULL) {
1,639,324!
2095
    return;
×
2096
  }
2097

2098
  taosMemoryFreeClear(gRes->colIdx);
1,639,324!
2099

2100
  int16_t i = 0, j = 0;
1,639,473✔
2101

2102
  while (i < gRes->colNum) {
4,522,026✔
2103
    if (gRes->colInfo[j].info) {
2,880,444✔
2104
      filterFreeColInfo(&gRes->colInfo[j]);
2,795,194✔
2105
      ++i;
2,797,303✔
2106
    }
2107

2108
    ++j;
2,882,553✔
2109
  }
2110

2111
  taosMemoryFreeClear(gRes->colInfo);
1,641,582!
2112
  taosMemoryFreeClear(gRes);
1,641,421!
2113
}
2114

2115
void filterFreeField(SFilterField *field, int32_t type) {
5,489,477✔
2116
  if (field == NULL) {
5,489,477!
2117
    return;
×
2118
  }
2119

2120
  if (!FILTER_GET_FLAG(field->flag, FLD_DATA_NO_FREE)) {
5,489,477✔
2121
    if (FILTER_GET_FLAG(field->flag, FLD_DATA_IS_HASH)) {
3,030,474✔
2122
      taosHashCleanup(field->data);
497✔
2123
    } else {
2124
      taosMemoryFreeClear(field->data);
3,029,977!
2125
    }
2126
  }
2127
}
2128

2129
void filterFreePCtx(SFilterPCtx *pctx) {
4,094,923✔
2130
  taosHashCleanup(pctx->valHash);
4,094,923✔
2131
  taosHashCleanup(pctx->unitHash);
4,095,192✔
2132
}
4,095,803✔
2133

2134
void filterFreeInfo(SFilterInfo *info) {
4,095,147✔
2135
  if (info == NULL) {
4,095,147!
2136
    return;
×
2137
  }
2138

2139
  for (int32_t i = 0; i < taosArrayGetSize(info->sclCtx.fltSclRange); ++i) {
5,089,917✔
2140
    SFltSclColumnRange *colRange = taosArrayGet(info->sclCtx.fltSclRange, i);
994,546✔
2141
    nodesDestroyNode((SNode *)colRange->colNode);
994,329✔
2142
    taosArrayDestroy(colRange->points);
994,690✔
2143
  }
2144
  taosArrayDestroy(info->sclCtx.fltSclRange);
4,094,804✔
2145

2146
  taosMemoryFreeClear(info->cunits);
4,095,558✔
2147
  taosMemoryFreeClear(info->blkUnitRes);
4,095,016!
2148
  taosMemoryFreeClear(info->blkUnits);
4,094,980!
2149

2150
  for (int32_t i = 0; i < FLD_TYPE_MAX; ++i) {
16,381,531✔
2151
    for (uint32_t f = 0; f < info->fields[i].num; ++f) {
17,775,960✔
2152
      filterFreeField(&info->fields[i].fields[f], i);
5,489,982✔
2153
    }
2154

2155
    taosMemoryFreeClear(info->fields[i].fields);
12,285,978!
2156
  }
2157

2158
  for (uint32_t i = 0; i < info->groupNum; ++i) {
6,399,679✔
2159
    filterFreeGroup(&info->groups[i]);
2,303,922✔
2160
  }
2161

2162
  taosMemoryFreeClear(info->groups);
4,095,757✔
2163

2164
  taosMemoryFreeClear(info->units);
4,095,725!
2165

2166
  taosMemoryFreeClear(info->unitRes);
4,095,698!
2167

2168
  taosMemoryFreeClear(info->unitFlags);
4,095,736!
2169

2170
  for (uint32_t i = 0; i < info->colRangeNum; ++i) {
5,440,696✔
2171
    (void)filterFreeRangeCtx(info->colRange[i]);  // No need to handle the return value.
1,344,872✔
2172
  }
2173

2174
  taosMemoryFreeClear(info->colRange);
4,095,824✔
2175

2176
  filterFreePCtx(&info->pctx);
4,095,827✔
2177

2178
  if (!FILTER_GET_FLAG(info->status, FI_STATUS_CLONED)) {
4,095,641✔
2179
    taosMemoryFreeClear(info);
3,919,328!
2180
  }
2181
}
2182

2183
int32_t filterHandleValueExtInfo(SFilterUnit *unit, char extInfo) {
×
2184
  if (extInfo == 0) {
×
2185
    fltError("filterHandleValueExtInfo get invalid extInfo : %d", extInfo);
×
2186
    return TSDB_CODE_APP_ERROR;
×
2187
  }
2188

2189
  uint8_t optr = FILTER_UNIT_OPTR(unit);
×
2190
  switch (optr) {
×
2191
    case OP_TYPE_GREATER_THAN:
×
2192
    case OP_TYPE_GREATER_EQUAL:
2193
      unit->compare.optr = (extInfo > 0) ? FILTER_DUMMY_EMPTY_OPTR : OP_TYPE_IS_NOT_NULL;
×
2194
      break;
×
2195
    case OP_TYPE_LOWER_THAN:
×
2196
    case OP_TYPE_LOWER_EQUAL:
2197
      unit->compare.optr = (extInfo > 0) ? OP_TYPE_IS_NOT_NULL : FILTER_DUMMY_EMPTY_OPTR;
×
2198
      break;
×
2199
    case OP_TYPE_EQUAL:
×
2200
      unit->compare.optr = FILTER_DUMMY_EMPTY_OPTR;
×
2201
      break;
×
2202
    default:
×
2203
      fltError("unsupported operator type");
×
2204
      return TSDB_CODE_APP_ERROR;
×
2205
  }
2206

2207
  return TSDB_CODE_SUCCESS;
×
2208
}
2209

2210
int32_t fltInitValFieldData(SFilterInfo *info) {
1,433,251✔
2211
  for (uint32_t i = 0; i < info->unitNum; ++i) {
4,549,956✔
2212
    SFilterUnit *unit = &info->units[i];
3,116,696✔
2213
    if (unit->right.type != FLD_TYPE_VALUE) {
3,116,696✔
2214
      if (unit->compare.optr != FILTER_DUMMY_EMPTY_OPTR && scalarGetOperatorParamNum(unit->compare.optr) != 1) {
509,185!
2215
        fltError("filterInitValFieldData get invalid operator param num : %d and invalid compare optr %d",
162!
2216
                 scalarGetOperatorParamNum(unit->compare.optr), unit->compare.optr);
2217
        return TSDB_CODE_APP_ERROR;
×
2218
      }
2219
      continue;
509,034✔
2220
    }
2221

2222
    SFilterField *right = FILTER_UNIT_RIGHT_FIELD(info, unit);
2,607,511✔
2223

2224
    if (!FILTER_GET_FLAG(right->flag, FLD_TYPE_VALUE)) {
2,607,511!
2225
      fltError("filterInitValFieldData get invalid field flag : %d", right->flag);
×
2226
      return TSDB_CODE_APP_ERROR;
×
2227
    }
2228

2229
    uint32_t      type = FILTER_UNIT_DATA_TYPE(unit);
2,607,511✔
2230
    int8_t        precision = FILTER_UNIT_DATA_PRECISION(unit);
2,607,511✔
2231
    SFilterField *fi = right;
2,607,511✔
2232

2233
    SValueNode *var = (SValueNode *)fi->desc;
2,607,511✔
2234
    if (var == NULL) {
2,607,511✔
2235
      if (!fi->data) {
444,478!
2236
        fltError("filterInitValFieldData get invalid field data : NULL");
×
2237
        return TSDB_CODE_APP_ERROR;
×
2238
      }
2239
      continue;
444,478✔
2240
    }
2241

2242
    if (unit->compare.optr == OP_TYPE_IN) {
2,163,033✔
2243
      FLT_ERR_RET(scalarGenerateSetFromList((void **)&fi->data, fi->desc, type, 0, 0));
497!
2244
      if (fi->data == NULL) {
495!
2245
        fltError("failed to convert in param");
×
2246
        FLT_ERR_RET(TSDB_CODE_APP_ERROR);
×
2247
      }
2248

2249
      FILTER_SET_FLAG(fi->flag, FLD_DATA_IS_HASH);
495✔
2250

2251
      continue;
495✔
2252
    }
2253

2254
    SDataType *dType = &var->node.resType;
2,162,536✔
2255
    if (dType->type == type) {
2,162,536✔
2256
      size_t bufBytes = TMAX(dType->bytes, sizeof(int64_t));
1,368,617✔
2257
      fi->data = taosMemoryCalloc(1, bufBytes);
1,368,617!
2258
      if (fi->data == NULL) {
1,370,653!
2259
        FLT_ERR_RET(terrno);
×
2260
      }
2261
      assignVal(fi->data, nodesGetValueFromNode(var), dType->bytes, type);
1,370,653✔
2262
    } else {
2263
      SScalarParam out = {.columnData = taosMemoryCalloc(1, sizeof(SColumnInfoData))};
793,919!
2264
      if (out.columnData == NULL) {
794,334!
2265
        FLT_ERR_RET(terrno);
2!
2266
      }
2267
      out.columnData->info.type = type;
794,334✔
2268
      out.columnData->info.precision = precision;
794,334✔
2269
      if (!IS_VAR_DATA_TYPE(type)) {
794,334!
2270
        out.columnData->info.bytes = tDataTypes[type].bytes;
794,347✔
2271
      }
2272

2273
      // todo refactor the convert
2274
      int32_t code = sclConvertValueToSclParam(var, &out, NULL);
794,334✔
2275
      if (code != TSDB_CODE_SUCCESS) {
794,365✔
2276
        colDataDestroy(out.columnData);
111✔
2277
        taosMemoryFree(out.columnData);
2!
2278
        qError("convert value to type[%d] failed", type);
2!
2279
        return code;
2✔
2280
      }
2281

2282
      size_t bufBytes = IS_VAR_DATA_TYPE(type) ? varDataTLen(out.columnData->pData)
794,014!
2283
                                            : TMAX(out.columnData->info.bytes, sizeof(int64_t));
1,588,268✔
2284
      fi->data = taosMemoryCalloc(1, bufBytes);
794,254!
2285
      if (fi->data== NULL) {
794,338!
2286
        FLT_ERR_RET(terrno);
×
2287
      }
2288

2289
      size_t valBytes = IS_VAR_DATA_TYPE(type) ? varDataTLen(out.columnData->pData) : out.columnData->info.bytes;
794,338!
2290
      (void)memcpy(fi->data, out.columnData->pData, valBytes);
794,338✔
2291

2292
      colDataDestroy(out.columnData);
794,338✔
2293
      taosMemoryFree(out.columnData);
794,314!
2294
    }
2295

2296
    // match/nmatch for nchar type need convert from ucs4 to mbs
2297
    if (type == TSDB_DATA_TYPE_NCHAR && (unit->compare.optr == OP_TYPE_MATCH || unit->compare.optr == OP_TYPE_NMATCH)) {
2,163,706!
2298
      char    newValData[TSDB_REGEX_STRING_DEFAULT_LEN * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE] = {0};
1,008✔
2299
      int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(fi->data), varDataLen(fi->data), varDataVal(newValData), NULL);
1,008✔
2300
      if (len < 0) {
×
2301
        qError("filterInitValFieldData taosUcs4ToMbs error 1");
×
2302
        return TSDB_CODE_SCALAR_CONVERT_ERROR;
×
2303
      }
2304
      varDataSetLen(newValData, len);
×
2305
      varDataCopy(fi->data, newValData);
×
2306
    }
2307
  }
2308

2309
  return TSDB_CODE_SUCCESS;
1,433,260✔
2310
}
2311

2312
bool filterDoCompare(__compar_fn_t func, uint8_t optr, void *left, void *right) {
2,147,483,647✔
2313
  int32_t ret = func(left, right);
2,147,483,647✔
2314

2315
  switch (optr) {
2,147,483,647!
2316
    case OP_TYPE_EQUAL: {
563,366,889✔
2317
      return ret == 0;
563,366,889✔
2318
    }
2319
    case OP_TYPE_NOT_EQUAL: {
1,507,485,827✔
2320
      return ret != 0;
1,507,485,827✔
2321
    }
2322
    case OP_TYPE_GREATER_EQUAL: {
285,608,421✔
2323
      return ret >= 0;
285,608,421✔
2324
    }
2325
    case OP_TYPE_GREATER_THAN: {
201,161,899✔
2326
      return ret > 0;
201,161,899✔
2327
    }
2328
    case OP_TYPE_LOWER_EQUAL: {
256,039,830✔
2329
      return ret <= 0;
256,039,830✔
2330
    }
2331
    case OP_TYPE_LOWER_THAN: {
15,033,463✔
2332
      return ret < 0;
15,033,463✔
2333
    }
2334
    case OP_TYPE_LIKE: {
150,998,503✔
2335
      return ret == 0;
150,998,503✔
2336
    }
2337
    case OP_TYPE_NOT_LIKE: {
3,315,044✔
2338
      return ret == 0;
3,315,044✔
2339
    }
2340
    case OP_TYPE_MATCH: {
103,973,319✔
2341
      return ret == 0;
103,973,319✔
2342
    }
2343
    case OP_TYPE_NMATCH: {
73,579,162✔
2344
      return ret == 0;
73,579,162✔
2345
    }
2346
    case OP_TYPE_IN: {
212,801,767✔
2347
      return ret == 1;
212,801,767✔
2348
    }
2349
    case OP_TYPE_NOT_IN: {
2,291,736✔
2350
      return ret == 1;
2,291,736✔
2351
    }
2352

2353
    default:
×
2354
      fltError("unsupported operator type");
×
2355
      return false;
×
2356
  }
2357

2358
  return true;
2359
}
2360

2361
int32_t filterAddUnitRange(SFilterInfo *info, SFilterUnit *u, SFilterRangeCtx *ctx, int32_t optr) {
2,850,183✔
2362
  int32_t      type = FILTER_UNIT_DATA_TYPE(u);
2,850,183✔
2363
  uint8_t      uoptr = FILTER_UNIT_OPTR(u);
2,850,183✔
2364
  void        *val = FILTER_UNIT_VAL_DATA(info, u);
2,850,183✔
2365
  SFilterRange ra = {0};
2,850,183✔
2366
  int64_t      tmp = 0;
2,850,183✔
2367

2368
  switch (uoptr) {
2,850,183!
2369
    case OP_TYPE_GREATER_THAN:
131,573✔
2370
      SIMPLE_COPY_VALUES(&ra.s, val);
131,573✔
2371
      FILTER_SET_FLAG(ra.sflag, RANGE_FLG_EXCLUDE);
131,573✔
2372
      FILTER_SET_FLAG(ra.eflag, RANGE_FLG_NULL);
131,573✔
2373
      break;
131,573✔
2374
    case OP_TYPE_GREATER_EQUAL:
875,408✔
2375
      SIMPLE_COPY_VALUES(&ra.s, val);
875,408✔
2376
      FILTER_SET_FLAG(ra.eflag, RANGE_FLG_NULL);
875,408✔
2377
      break;
875,408✔
2378
    case OP_TYPE_LOWER_THAN:
387,338✔
2379
      SIMPLE_COPY_VALUES(&ra.e, val);
387,338✔
2380
      FILTER_SET_FLAG(ra.eflag, RANGE_FLG_EXCLUDE);
387,338✔
2381
      FILTER_SET_FLAG(ra.sflag, RANGE_FLG_NULL);
387,338✔
2382
      break;
387,338✔
2383
    case OP_TYPE_LOWER_EQUAL:
765,180✔
2384
      SIMPLE_COPY_VALUES(&ra.e, val);
765,180✔
2385
      FILTER_SET_FLAG(ra.sflag, RANGE_FLG_NULL);
765,180✔
2386
      break;
765,180✔
2387
    case OP_TYPE_NOT_EQUAL:
×
2388
      if (type != TSDB_DATA_TYPE_BOOL) {
×
2389
        fltError("filterAddUnitRange get invalid type : %d", type);
×
2390
        return TSDB_CODE_QRY_FILTER_INVALID_TYPE;
×
2391
      }
2392
      if (GET_INT8_VAL(val)) {
×
2393
        SIMPLE_COPY_VALUES(&ra.s, &tmp);
×
2394
        SIMPLE_COPY_VALUES(&ra.e, &tmp);
×
2395
      } else {
2396
        *(bool *)&tmp = true;
×
2397
        SIMPLE_COPY_VALUES(&ra.s, &tmp);
×
2398
        SIMPLE_COPY_VALUES(&ra.e, &tmp);
×
2399
      }
2400
      break;
×
2401
    case OP_TYPE_EQUAL:
694,868✔
2402
      SIMPLE_COPY_VALUES(&ra.s, val);
694,868✔
2403
      SIMPLE_COPY_VALUES(&ra.e, val);
694,868✔
2404
      break;
694,868✔
UNCOV
2405
    default:
×
UNCOV
2406
      fltError("unsupported operator type");
×
2407
      return TSDB_CODE_QRY_FILTER_NOT_SUPPORT_TYPE;
×
2408
  }
2409

2410
  FLT_ERR_RET(filterAddRange(ctx, &ra, optr));
2,854,367✔
2411

2412
  return TSDB_CODE_SUCCESS;
2,854,260✔
2413
}
2414

2415
int32_t filterCompareRangeCtx(SFilterRangeCtx *ctx1, SFilterRangeCtx *ctx2, bool *equal) {
2,096✔
2416
  FLT_CHK_JMP(ctx1->status != ctx2->status);
2,096!
2417
  FLT_CHK_JMP(ctx1->isnull != ctx2->isnull);
2,096!
2418
  FLT_CHK_JMP(ctx1->notnull != ctx2->notnull);
2,096!
2419
  FLT_CHK_JMP(ctx1->isrange != ctx2->isrange);
2,096!
2420

2421
  SFilterRangeNode *r1 = ctx1->rs;
2,096✔
2422
  SFilterRangeNode *r2 = ctx2->rs;
2,096✔
2423

2424
  while (r1 && r2) {
2,104!
2425
    FLT_CHK_JMP(r1->ra.sflag != r2->ra.sflag);
2,096✔
2426
    FLT_CHK_JMP(r1->ra.eflag != r2->ra.eflag);
1,052✔
2427
    FLT_CHK_JMP(r1->ra.s != r2->ra.s);
8!
2428
    FLT_CHK_JMP(r1->ra.e != r2->ra.e);
8!
2429

2430
    r1 = r1->next;
8✔
2431
    r2 = r2->next;
8✔
2432
  }
2433

2434
  FLT_CHK_JMP(r1 != r2);
8!
2435

2436
  *equal = true;
8✔
2437

2438
  return TSDB_CODE_SUCCESS;
8✔
2439

2440
_return:
2,088✔
2441
  *equal = false;
2,088✔
2442
  return TSDB_CODE_SUCCESS;
2,088✔
2443
}
2444

2445
int32_t filterMergeUnits(SFilterInfo *info, SFilterGroupCtx *gRes, uint32_t colIdx, bool *empty) {
2,445,362✔
2446
  SArray          *colArray = (SArray *)gRes->colInfo[colIdx].info;
2,445,362✔
2447
  int32_t          size = (int32_t)taosArrayGetSize(colArray);
2,445,362✔
2448
  int32_t          type = gRes->colInfo[colIdx].dataType;
2,438,088✔
2449
  int32_t          code = TSDB_CODE_SUCCESS;
2,438,088✔
2450
  SFilterRangeCtx *ctx = NULL;
2,438,088✔
2451
  FLT_ERR_JRET(filterInitRangeCtx(type, 0, &ctx));
2,438,088!
2452

2453
  for (uint32_t i = 0; i < size; ++i) {
5,220,593✔
2454
    SFilterUnit *u = taosArrayGetP(colArray, i);
2,784,862✔
2455
    if (NULL == u) {
2,772,643!
2456
      FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE);
×
2457
    }
2458
    uint8_t      optr = FILTER_UNIT_OPTR(u);
2,772,643✔
2459

2460
    FLT_ERR_RET(filterAddRangeOptr(ctx, optr, LOGIC_COND_TYPE_AND, empty, NULL));
2,772,643✔
2461
    FLT_CHK_JMP(*empty);
2,779,041✔
2462

2463
    if (!FILTER_NO_MERGE_OPTR(optr)) {
2,778,841!
2464
      FLT_ERR_JRET(filterAddUnitRange(info, u, ctx, LOGIC_COND_TYPE_AND));
2,197,933!
2465
      FLT_CHK_JMP(MR_EMPTY_RES(ctx));
2,203,183✔
2466
    }
2467
    if (FILTER_UNIT_OPTR(u) == OP_TYPE_EQUAL && !FILTER_NO_MERGE_DATA_TYPE(FILTER_UNIT_DATA_TYPE(u))) {
2,775,135!
2468
      gRes->colInfo[colIdx].optr = OP_TYPE_EQUAL;
686,046✔
2469
      SIMPLE_COPY_VALUES(&gRes->colInfo[colIdx].value, FILTER_UNIT_VAL_DATA(info, u));
686,046✔
2470
    }
2471
  }
2472

2473
  taosArrayDestroy(colArray);
2,435,731✔
2474

2475
  FILTER_PUSH_CTX(gRes->colInfo[colIdx], ctx);
2,437,708✔
2476

2477
  return TSDB_CODE_SUCCESS;
2,437,708✔
2478

2479
_return:
9,156✔
2480

2481
  *empty = true;
9,156✔
2482

2483
  (void)filterFreeRangeCtx(ctx);  // No need to handle the return value.
9,156✔
2484

2485
  return code;
9,173✔
2486
}
2487

2488
int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t *gResNum) {
1,058,990✔
2489
  bool      empty = false;
1,058,990✔
2490
  int32_t   code = TSDB_CODE_SUCCESS;
1,058,990✔
2491
  uint32_t  colIdxi = 0;
1,058,990✔
2492
  uint32_t  gResIdx = 0;
1,058,990✔
2493
  uint32_t *colIdx = taosMemoryMalloc(info->fields[FLD_TYPE_COLUMN].num * sizeof(uint32_t));
1,058,990!
2494
  if (colIdx == NULL) {
1,059,563!
2495
    FLT_ERR_RET(terrno);
×
2496
  }
2497
  for (uint32_t i = 0; i < info->groupNum; ++i) {
2,700,459✔
2498
    SFilterGroup *g = info->groups + i;
1,639,288✔
2499

2500
    gRes[gResIdx] = taosMemoryCalloc(1, sizeof(SFilterGroupCtx));
1,639,288!
2501
    if (gRes[gResIdx] == NULL) {
1,642,140!
2502
      FLT_ERR_JRET(terrno);
×
2503
    }
2504
    gRes[gResIdx]->colInfo = taosMemoryCalloc(info->fields[FLD_TYPE_COLUMN].num, sizeof(SFilterColInfo));
1,642,140✔
2505
    if (gRes[gResIdx]->colInfo == NULL) {
1,641,208!
2506
      FLT_ERR_JRET(terrno);
×
2507
    }
2508
    colIdxi = 0;
1,641,208✔
2509
    empty = false;
1,641,208✔
2510

2511
    for (uint32_t j = 0; j < g->unitNum; ++j) {
4,795,709✔
2512
      SFilterUnit *u = FILTER_GROUP_UNIT(info, g, j);
3,154,652✔
2513
      uint32_t     cidx = FILTER_UNIT_COL_IDX(u);
3,154,652✔
2514

2515
      if (gRes[gResIdx]->colInfo[cidx].info == NULL) {
3,154,652✔
2516
        gRes[gResIdx]->colInfo[cidx].info = (SArray *)taosArrayInit(4, POINTER_BYTES);
2,795,269✔
2517
        if (gRes[gResIdx]->colInfo[cidx].info == NULL) {
2,797,434!
2518
          FLT_ERR_JRET(terrno);
×
2519
        }
2520
        colIdx[colIdxi++] = cidx;
2,796,721✔
2521
        ++gRes[gResIdx]->colNum;
2,796,721✔
2522
      } else {
2523
        if (!FILTER_NO_MERGE_DATA_TYPE(FILTER_UNIT_DATA_TYPE(u))) {
359,383!
2524
          FILTER_SET_FLAG(info->status, FI_STATUS_REWRITE);
343,615✔
2525
        }
2526
      }
2527

2528
      FILTER_PUSH_UNIT(gRes[gResIdx]->colInfo[cidx], u);
6,310,242!
2529
    }
2530

2531
    if (colIdxi > 1) {
1,641,057✔
2532
      __compar_fn_t cmpFn = getComparFunc(TSDB_DATA_TYPE_USMALLINT, 0);
667,975✔
2533
      if (cmpFn == NULL) {
666,861!
2534
        FLT_ERR_JRET(terrno);
×
2535
      }
2536
      taosSort(colIdx, colIdxi, sizeof(uint32_t), cmpFn);
666,861✔
2537
    }
2538

2539
    for (uint32_t l = 0; l < colIdxi; ++l) {
4,416,918✔
2540
      int32_t type = gRes[gResIdx]->colInfo[colIdx[l]].dataType;
2,785,237✔
2541

2542
      if (FILTER_NO_MERGE_DATA_TYPE(type)) {
2,785,237!
2543
        continue;
338,060✔
2544
      }
2545
      SCL_ERR_JRET(filterMergeUnits(info, gRes[gResIdx], colIdx[l], &empty));
2,447,177✔
2546

2547
      if (empty) {
2,447,233✔
2548
        break;
9,171✔
2549
      }
2550
    }
2551

2552
    if (empty) {
1,640,852✔
2553
      FILTER_SET_FLAG(info->status, FI_STATUS_REWRITE);
9,171✔
2554
      filterFreeGroupCtx(gRes[gResIdx]);
9,171✔
2555
      gRes[gResIdx] = NULL;
9,164✔
2556

2557
      continue;
9,164✔
2558
    }
2559

2560
    gRes[gResIdx]->colNum = colIdxi;
1,631,681✔
2561
    FILTER_COPY_IDX(&gRes[gResIdx]->colIdx, colIdx, colIdxi);
1,631,681!
2562
    ++gResIdx;
1,631,732✔
2563
    *gResNum = gResIdx;
1,631,732✔
2564
  }
2565

2566
  if (gResIdx == 0) {
1,061,171✔
2567
    FILTER_SET_FLAG(info->status, FI_STATUS_EMPTY);
4,328✔
2568
  }
2569

2570
_return:
1,056,843✔
2571
  if (code) {
1,061,171!
2572
    filterFreeGroupCtx(gRes[gResIdx]);
×
2573
  }
2574
  taosMemoryFreeClear(colIdx);
1,060,445!
2575
  FLT_RET(code);
1,060,461!
2576
}
2577

2578
bool filterIsSameUnits(SFilterColInfo *pCol1, SFilterColInfo *pCol2) {
1,073,884✔
2579
  if (pCol1->type != pCol2->type) {
1,073,884!
2580
    return false;
×
2581
  }
2582

2583
  if (RANGE_TYPE_MR_CTX == pCol1->type) {
1,073,884!
2584
    SFilterRangeCtx *pCtx1 = (SFilterRangeCtx *)pCol1->info;
1,074,544✔
2585
    SFilterRangeCtx *pCtx2 = (SFilterRangeCtx *)pCol2->info;
1,074,544✔
2586

2587
    if ((pCtx1->isnull != pCtx2->isnull) || (pCtx1->notnull != pCtx2->notnull) || (pCtx1->isrange != pCtx2->isrange)) {
1,074,544!
2588
      return false;
123,466✔
2589
    }
2590

2591
    SFilterRangeNode *pNode1 = pCtx1->rs;
951,078✔
2592
    SFilterRangeNode *pNode2 = pCtx2->rs;
951,078✔
2593

2594
    while (true) {
2595
      if (NULL == pNode1 && NULL == pNode2) {
1,343,662!
2596
        break;
589,429✔
2597
      }
2598

2599
      if (NULL == pNode1 || NULL == pNode2) {
754,233!
2600
        return false;
×
2601
      }
2602

2603
      if (pNode1->ra.s != pNode2->ra.s || pNode1->ra.e != pNode2->ra.e || pNode1->ra.sflag != pNode2->ra.sflag ||
754,233!
2604
          pNode1->ra.eflag != pNode2->ra.eflag) {
392,663✔
2605
        return false;
361,649✔
2606
      }
2607

2608
      pNode1 = pNode1->next;
392,584✔
2609
      pNode2 = pNode2->next;
392,584✔
2610
    }
2611
  }
2612

2613
  return true;
588,769✔
2614
}
2615

2616
void filterCheckColConflict(SFilterGroupCtx *gRes1, SFilterGroupCtx *gRes2, bool *conflict) {
720,734✔
2617
  uint32_t idx1 = 0, idx2 = 0, m = 0, n = 0;
720,734✔
2618
  bool     equal = false;
720,734✔
2619

2620
  for (; m < gRes1->colNum; ++m) {
1,309,163✔
2621
    idx1 = gRes1->colIdx[m];
1,304,265✔
2622

2623
    equal = false;
1,304,265✔
2624

2625
    for (; n < gRes2->colNum; ++n) {
1,329,758✔
2626
      idx2 = gRes2->colIdx[n];
1,316,566✔
2627
      if (idx1 < idx2) {
1,316,566✔
2628
        *conflict = true;
99,418✔
2629
        return;
99,418✔
2630
      }
2631

2632
      if (idx1 > idx2) {
1,217,148✔
2633
        continue;
25,493✔
2634
      }
2635

2636
      if (FILTER_NO_MERGE_DATA_TYPE(gRes1->colInfo[idx1].dataType)) {
1,191,655!
2637
        *conflict = true;
117,318✔
2638
        return;
117,318✔
2639
      }
2640

2641
      if (!filterIsSameUnits(&gRes1->colInfo[idx1], &gRes2->colInfo[idx2])) {
1,074,337✔
2642
        *conflict = true;
485,597✔
2643
        return;
485,597✔
2644
      }
2645

2646
      // for long in operation
2647
      if (gRes1->colInfo[idx1].optr == OP_TYPE_EQUAL && gRes2->colInfo[idx2].optr == OP_TYPE_EQUAL) {
588,157!
2648
        SFilterRangeCtx *ctx = gRes1->colInfo[idx1].info;
8,224✔
2649
        if (ctx->pCompareFunc(&gRes1->colInfo[idx1].value, &gRes2->colInfo[idx2].value)) {
8,224!
2650
          *conflict = true;
×
2651
          return;
×
2652
        }
2653
      }
2654

2655
      ++n;
588,157✔
2656
      equal = true;
588,157✔
2657
      break;
588,157✔
2658
    }
2659

2660
    if (!equal) {
601,349✔
2661
      *conflict = true;
12,920✔
2662
      return;
12,920✔
2663
    }
2664
  }
2665

2666
  *conflict = false;
4,898✔
2667
  return;
4,898✔
2668
}
2669

2670
int32_t filterMergeTwoGroupsImpl(SFilterInfo *info, SFilterRangeCtx **ctx, int32_t optr, uint32_t cidx,
6,085✔
2671
                                 SFilterGroupCtx *gRes1, SFilterGroupCtx *gRes2, bool *empty, bool *all) {
2672
  SFilterField *fi = FILTER_GET_COL_FIELD(info, cidx);
6,085✔
2673
  int32_t       type = FILTER_GET_COL_FIELD_TYPE(fi);
6,085✔
2674

2675
  if ((*ctx) == NULL) {
6,085!
2676
    FLT_ERR_RET(filterInitRangeCtx(type, 0, ctx));
6,085!
2677
  } else {
2678
    FLT_ERR_RET(filterReuseRangeCtx(*ctx, type, 0));
×
2679
  }
2680

2681
  if (gRes2->colInfo[cidx].type != RANGE_TYPE_MR_CTX || gRes1->colInfo[cidx].type != RANGE_TYPE_MR_CTX) {
6,085!
2682
    fltError("filterMergeTwoGroupsImpl get invalid col type : %d and %d",
×
2683
             gRes2->colInfo[cidx].type, gRes1->colInfo[cidx].type);
2684
    return TSDB_CODE_QRY_FILTER_NOT_SUPPORT_TYPE;
×
2685
  }
2686

2687
  FLT_ERR_RET(filterCopyRangeCtx(*ctx, gRes2->colInfo[cidx].info));
6,085!
2688
  FLT_ERR_RET(filterSourceRangeFromCtx(*ctx, gRes1->colInfo[cidx].info, optr, empty, all));
6,085!
2689

2690
  return TSDB_CODE_SUCCESS;
6,085✔
2691
}
2692

2693
int32_t filterMergeTwoGroups(SFilterInfo *info, SFilterGroupCtx **gRes1, SFilterGroupCtx **gRes2, bool *all) {
720,933✔
2694
  bool conflict = false;
720,933✔
2695

2696
  filterCheckColConflict(*gRes1, *gRes2, &conflict);
720,933✔
2697
  if (conflict) {
721,739✔
2698
    return TSDB_CODE_SUCCESS;
715,899✔
2699
  }
2700

2701
  FILTER_SET_FLAG(info->status, FI_STATUS_REWRITE);
5,840✔
2702

2703
  uint32_t         idx1 = 0, idx2 = 0, m = 0, n = 0;
5,840✔
2704
  bool             numEqual = (*gRes1)->colNum == (*gRes2)->colNum;
5,840✔
2705
  bool             equal = false;
5,840✔
2706
  uint32_t         equal1 = 0, equal2 = 0, merNum = 0;
5,840✔
2707
  SFilterRangeCtx *ctx = NULL;
5,840✔
2708
  SFilterColCtx    colCtx = {0};
5,840✔
2709
  int32_t          code = TSDB_CODE_SUCCESS;
5,840✔
2710
  SArray          *colCtxs = taosArrayInit((*gRes2)->colNum, sizeof(SFilterColCtx));
5,840✔
2711
  if (colCtxs == NULL) {
6,085!
2712
    FLT_ERR_JRET(terrno);
×
2713
  }
2714

2715
  for (; m < (*gRes1)->colNum; ++m) {
10,430✔
2716
    idx1 = (*gRes1)->colIdx[m];
6,085✔
2717

2718
    for (; n < (*gRes2)->colNum; ++n) {
6,781!
2719
      idx2 = (*gRes2)->colIdx[n];
6,781✔
2720

2721
      if (idx1 > idx2) {
6,781✔
2722
        continue;
696✔
2723
      }
2724

2725
      if (idx1 != idx2) {
6,085!
2726
        fltError("filterMergeTwoGroups get invalid idx : %d and %d", idx1, idx2);
×
2727
        FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
2728
      }
2729

2730
      ++merNum;
6,085✔
2731

2732
      FLT_ERR_JRET(filterMergeTwoGroupsImpl(info, &ctx, LOGIC_COND_TYPE_OR, idx1, *gRes1, *gRes2, NULL, all));
6,085!
2733

2734
      FLT_CHK_JMP(*all);
6,085!
2735

2736
      if (numEqual) {
6,085✔
2737
        if ((*gRes1)->colNum == 1) {
4,685✔
2738
          ++equal1;
4,337✔
2739
          colCtx.colIdx = idx1;
4,337✔
2740
          colCtx.ctx = ctx;
4,337✔
2741
          if (NULL == taosArrayPush(colCtxs, &colCtx)) {
4,337!
2742
            FLT_ERR_JRET(terrno);
×
2743
          }
2744
          break;
4,337✔
2745
        } else {
2746
          FLT_ERR_JRET(filterCompareRangeCtx(ctx, (*gRes1)->colInfo[idx1].info, &equal));
348!
2747
          if (equal) {
348!
2748
            ++equal1;
×
2749
          }
2750

2751
          FLT_ERR_JRET(filterCompareRangeCtx(ctx, (*gRes2)->colInfo[idx2].info, &equal));
348!
2752
          if (equal) {
348!
2753
            ++equal2;
×
2754
          }
2755

2756
          FLT_CHK_JMP(equal1 != merNum && equal2 != merNum);
348!
2757
          colCtx.colIdx = idx1;
×
2758
          colCtx.ctx = ctx;
×
2759
          ctx = NULL;
×
2760
          if (NULL == taosArrayPush(colCtxs, &colCtx)) {
×
2761
            FLT_ERR_JRET(terrno);
×
2762
          }
2763
        }
2764
      } else {
2765
        FLT_ERR_JRET(filterCompareRangeCtx(ctx, (*gRes1)->colInfo[idx1].info, &equal));
1,400!
2766
        if (equal) {
1,400✔
2767
          ++equal1;
8✔
2768
        }
2769

2770
        FLT_CHK_JMP(equal1 != merNum);
1,400✔
2771
        colCtx.colIdx = idx1;
8✔
2772
        colCtx.ctx = ctx;
8✔
2773
        ctx = NULL;
8✔
2774
        if (NULL == taosArrayPush(colCtxs, &colCtx)) {
8!
2775
          FLT_ERR_JRET(terrno);
×
2776
        }
2777
      }
2778

2779
      ++n;
8✔
2780
      break;
8✔
2781
    }
2782
  }
2783

2784
  if (merNum == 0 || (equal1 != merNum && equal2 != merNum)) {
4,345!
2785
    fltError("filterMergeTwoGroups get invalid merge num : %d, equal1 : %d, equal2 : %d", merNum, equal1, equal2);
×
2786
    FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
2787
  }
2788

2789
  filterFreeGroupCtx(*gRes2);
4,345✔
2790
  *gRes2 = NULL;
4,345✔
2791

2792
  if (!colCtxs || taosArrayGetSize(colCtxs) <= 0) {
4,345!
2793
    fltError("filterMergeTwoGroups get invalid colCtxs with size %zu", taosArrayGetSize(colCtxs));
×
2794
    FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
2795
  }
2796
  SFilterColInfo *colInfo = NULL;
4,345✔
2797
  int32_t        ctxSize = (int32_t)taosArrayGetSize(colCtxs);
4,345✔
2798
  SFilterColCtx *pctx = NULL;
4,345✔
2799

2800
  for (int32_t i = 0; i < ctxSize; ++i) {
8,690✔
2801
    pctx = taosArrayGet(colCtxs, i);
4,345✔
2802
    if (NULL == pctx) {
4,345!
2803
      FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE);
×
2804
    }
2805
    colInfo = &(*gRes1)->colInfo[pctx->colIdx];
4,345✔
2806

2807
    filterFreeColInfo(colInfo);
4,345✔
2808
    FILTER_PUSH_CTX((*gRes1)->colInfo[pctx->colIdx], pctx->ctx);
4,345✔
2809
  }
2810

2811
  taosArrayDestroy(colCtxs);
4,345✔
2812

2813
  return TSDB_CODE_SUCCESS;
4,345✔
2814

2815
_return:
1,740✔
2816

2817
  if (colCtxs) {
1,740!
2818
    if (taosArrayGetSize(colCtxs) > 0) {
1,740!
2819
      taosArrayDestroyEx(colCtxs, filterFreeColCtx);
×
2820
    } else {
2821
      taosArrayDestroy(colCtxs);
1,740✔
2822
    }
2823
  }
2824

2825
  (void)filterFreeRangeCtx(ctx);  // No need to handle the return value.
1,740✔
2826

2827
  return code;
1,740✔
2828
}
2829

2830
int32_t filterMergeGroups(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t *gResNum) {
1,059,029✔
2831
  if (*gResNum <= 1) {
1,059,029✔
2832
    return TSDB_CODE_SUCCESS;
594,634✔
2833
  }
2834

2835
  taosSort(gRes, *gResNum, POINTER_BYTES, filterCompareGroupCtx);
464,395✔
2836

2837
  int32_t  code = TSDB_CODE_SUCCESS;
465,146✔
2838
  int32_t  pEnd = 0, cStart = 0, cEnd = 0;
465,146✔
2839
  uint32_t pColNum = 0, cColNum = 0;
465,146✔
2840
  int32_t  movedNum = 0;
465,146✔
2841
  bool     all = false;
465,146✔
2842

2843
  cColNum = gRes[0]->colNum;
465,146✔
2844

2845
  for (int32_t i = 1; i <= *gResNum; ++i) {
1,041,072✔
2846
    if (i < (*gResNum) && gRes[i]->colNum == cColNum) {
1,040,246✔
2847
      continue;
574,582✔
2848
    }
2849

2850
    cEnd = i - 1;
465,664✔
2851

2852
    movedNum = 0;
465,664✔
2853
    if (pColNum > 0) {
465,664✔
2854
      for (int32_t m = 0; m <= pEnd; ++m) {
3,400✔
2855
        for (int32_t n = cStart; n <= cEnd; ++n) {
8,478✔
2856
          if (m >= n) {
6,503!
2857
            fltError("filterMergeGroups get invalid m : %d and n : %d", m, n);
×
2858
            FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
2859
          }
2860
          FLT_ERR_JRET(filterMergeTwoGroups(info, &gRes[m], &gRes[n], &all));
6,503!
2861

2862
          FLT_CHK_JMP(all);
6,503!
2863

2864
          if (gRes[n] == NULL) {
6,503✔
2865
            if (n < ((*gResNum) - 1)) {
8!
2866
              (void)memmove(&gRes[n], &gRes[n + 1], (*gResNum - n - 1) * POINTER_BYTES);
×
2867
            }
2868

2869
            --cEnd;
8✔
2870
            --(*gResNum);
8✔
2871
            ++movedNum;
8✔
2872
            --n;
8✔
2873
          }
2874
        }
2875
      }
2876
    }
2877

2878
    for (int32_t m = cStart; m < cEnd; ++m) {
1,038,592✔
2879
      for (int32_t n = m + 1; n <= cEnd; ++n) {
1,287,494✔
2880
        if (m >= n) {
714,566!
2881
          fltError("filterMergeGroups get invalid m : %d and n : %d", m, n);
×
2882
          FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
2883
        }
2884
        FLT_ERR_JRET(filterMergeTwoGroups(info, &gRes[m], &gRes[n], &all));
714,566!
2885

2886
        FLT_CHK_JMP(all);
714,997!
2887

2888
        if (gRes[n] == NULL) {
714,997✔
2889
          if (n < ((*gResNum) - 1)) {
4,337✔
2890
            (void)memmove(&gRes[n], &gRes[n + 1], (*gResNum - n - 1) * POINTER_BYTES);
1,798✔
2891
          }
2892

2893
          --cEnd;
4,337✔
2894
          --(*gResNum);
4,337✔
2895
          ++movedNum;
4,337✔
2896
          --n;
4,337✔
2897
        }
2898
      }
2899
    }
2900

2901
    pColNum = cColNum;
466,095✔
2902
    pEnd = cEnd;
466,095✔
2903

2904
    i -= movedNum;
466,095✔
2905

2906
    if (i >= (*gResNum)) {
466,095✔
2907
      break;
464,751✔
2908
    }
2909

2910
    cStart = i;
1,344✔
2911
    cColNum = gRes[i]->colNum;
1,344✔
2912
  }
2913

2914
  return TSDB_CODE_SUCCESS;
465,577✔
2915

2916
_return:
×
2917

2918
  FILTER_SET_FLAG(info->status, FI_STATUS_ALL);
×
2919

2920
  return code;
×
2921
}
2922

2923
int32_t filterConvertGroupFromArray(SFilterInfo *info, SArray *group) {
1,609,373✔
2924
  size_t  groupSize = taosArrayGetSize(group);
1,609,373✔
2925
  int32_t code = TSDB_CODE_SUCCESS;
1,609,285✔
2926

2927
  info->groupNum = (uint32_t)groupSize;
1,609,285✔
2928

2929
  if (info->groupNum > 0) {
1,609,285!
2930
    info->groups = taosMemoryCalloc(info->groupNum, sizeof(*info->groups));
1,609,806!
2931
    if (info->groups == NULL) {
1,612,102!
2932
      FLT_ERR_JRET(terrno);
×
2933
    }
2934
  }
2935

2936
  for (size_t i = 0; i < groupSize; ++i) {
3,914,839✔
2937
    SFilterGroup *pg = taosArrayGet(group, i);
2,301,197✔
2938
    if (NULL == pg) {
2,296,122!
2939
      FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE);
×
2940
    }
2941
    pg->unitFlags = taosMemoryCalloc(pg->unitNum, sizeof(*pg->unitFlags));
2,296,122!
2942
    if (pg->unitFlags == NULL) {
2,303,258!
2943
      pg->unitNum = 0;
×
2944
      FLT_ERR_JRET(terrno);
×
2945
    }
2946
    info->groups[i] = *pg;
2,303,258✔
2947
  }
2948
  return TSDB_CODE_SUCCESS;
1,613,642✔
2949

2950
_return:
×
2951
  info->groupNum = 0;
×
2952
  return code;
×
2953
}
2954

2955
int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t gResNum) {
1,053,951✔
2956
  if (!FILTER_GET_FLAG(info->status, FI_STATUS_REWRITE)) {
1,053,951✔
2957
    qDebug("no need rewrite");
878,217✔
2958
    return TSDB_CODE_SUCCESS;
878,263✔
2959
  }
2960

2961
  SFilterInfo oinfo = *info;
175,734✔
2962

2963
  FILTER_SET_FLAG(oinfo.status, FI_STATUS_CLONED);
175,734✔
2964

2965
  (void)memset(info, 0, sizeof(*info));
175,734✔
2966

2967
  SFilterGroupCtx *res = NULL;
175,734✔
2968
  SFilterColInfo  *colInfo = NULL;
175,734✔
2969
  int32_t          optr = 0;
175,734✔
2970
  uint32_t         uidx = 0;
175,734✔
2971
  uint32_t         code = TSDB_CODE_SUCCESS;
175,734✔
2972
  SArray          *group = taosArrayInit(FILTER_DEFAULT_GROUP_SIZE, sizeof(SFilterGroup));
175,734✔
2973
  SFilterGroup     ng = {0};
176,534✔
2974

2975
  if (group == NULL) {
176,534!
2976
    FLT_ERR_JRET(terrno);
×
2977
  }
2978

2979
  info->colRangeNum = oinfo.colRangeNum;
176,534✔
2980
  info->colRange = oinfo.colRange;
176,534✔
2981
  oinfo.colRangeNum = 0;
176,534✔
2982
  oinfo.colRange = NULL;
176,534✔
2983

2984
  FILTER_SET_FLAG(info->options, FLT_OPTION_NEED_UNIQE);
176,534✔
2985

2986
  FLT_ERR_JRET(filterInitUnitsFields(info));
176,534!
2987

2988
  for (int32_t i = 0; i < gResNum; ++i) {
462,386✔
2989
    res = gRes[i];
285,650✔
2990
    optr = (res->colNum > 1) ? LOGIC_COND_TYPE_AND : LOGIC_COND_TYPE_OR;
285,650✔
2991

2992
    for (uint32_t m = 0; m < res->colNum; ++m) {
918,753✔
2993
      colInfo = &res->colInfo[res->colIdx[m]];
632,692✔
2994
      if (FILTER_NO_MERGE_DATA_TYPE(colInfo->dataType)) {
632,692!
2995
        if (colInfo->type != RANGE_TYPE_UNIT) {
71,601!
2996
          fltError("filterRewrite get invalid col type : %d", colInfo->type);
×
2997
          FLT_ERR_JRET(TSDB_CODE_QRY_FILTER_INVALID_TYPE);
×
2998
        }
2999
        int32_t usize = (int32_t)taosArrayGetSize((SArray *)colInfo->info);
71,601✔
3000

3001
        for (int32_t n = 0; n < usize; ++n) {
151,986✔
3002
          SFilterUnit *u = (SFilterUnit *)taosArrayGetP((SArray *)colInfo->info, n);
79,983✔
3003
          if (NULL == u) {
79,884!
3004
            FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE);
×
3005
          }
3006
          code = filterAddUnitFromUnit(info, &oinfo, u, &uidx);
79,884✔
3007
          FLT_ERR_JRET(code);
80,456!
3008
          code = filterAddUnitToGroup(&ng, uidx);
80,456✔
3009
          FLT_ERR_JRET(code);
80,452!
3010
        }
3011

3012
        continue;
72,003✔
3013
      }
3014

3015
      if (colInfo->type != RANGE_TYPE_MR_CTX) {
561,091!
3016
        fltError("filterRewrite get invalid col type : %d", colInfo->type);
×
3017
        FLT_ERR_JRET(TSDB_CODE_QRY_FILTER_INVALID_TYPE);
×
3018
      }
3019

3020
      code = filterAddGroupUnitFromCtx(info, &oinfo, colInfo->info, res->colIdx[m], &ng, optr, group);
561,091✔
3021
      FLT_ERR_JRET(code);
561,177✔
3022
    }
3023

3024
    if (ng.unitNum > 0) {
286,061✔
3025
      if (NULL == taosArrayPush(group, &ng)) {
185,653!
3026
        FLT_ERR_JRET(terrno);
×
3027
      }
3028
      ng = (SFilterGroup){0};
185,703✔
3029
    }
3030
  }
3031
  FLT_ERR_JRET(filterConvertGroupFromArray(info, group));
176,736!
3032

3033
  taosArrayDestroy(group);
176,699✔
3034

3035
  filterFreeInfo(&oinfo);
176,583✔
3036
  return 0;
176,047✔
3037

3038
_return:
×
3039
  filterFreeGroup((void*)&ng);
×
3040

3041
  taosArrayDestroyEx(group, filterFreeGroup);
×
3042

3043
  filterFreeInfo(&oinfo);
×
3044

3045
  FLT_RET(code);
×
3046
}
3047

3048
int32_t filterGenerateColRange(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t gResNum) {
1,053,850✔
3049
  uint32_t        *idxs = NULL;
1,053,850✔
3050
  uint32_t         colNum = 0;
1,053,850✔
3051
  SFilterGroupCtx *res = NULL;
1,053,850✔
3052
  int32_t         code = TSDB_CODE_SUCCESS;
1,053,850✔
3053
  uint32_t        *idxNum = taosMemoryCalloc(info->fields[FLD_TYPE_COLUMN].num, sizeof(*idxNum));
1,053,850!
3054
  if (idxNum == NULL) {
1,056,227!
3055
    FLT_ERR_JRET(terrno);
×
3056
  }
3057
  for (int32_t i = 0; i < gResNum; ++i) {
2,682,153✔
3058
    for (uint32_t m = 0; m < gRes[i]->colNum; ++m) {
4,392,152✔
3059
      SFilterColInfo *colInfo = &gRes[i]->colInfo[gRes[i]->colIdx[m]];
2,766,226✔
3060
      if (FILTER_NO_MERGE_DATA_TYPE(colInfo->dataType)) {
2,766,226!
3061
        continue;
336,300✔
3062
      }
3063

3064
      ++idxNum[gRes[i]->colIdx[m]];
2,429,926✔
3065
    }
3066
  }
3067

3068
  for (uint32_t i = 0; i < info->fields[FLD_TYPE_COLUMN].num; ++i) {
2,746,979✔
3069
    if (idxNum[i] < gResNum) {
1,688,679✔
3070
      continue;
348,039✔
3071
    }
3072

3073
    if (idxNum[i] != gResNum) {
1,340,640!
3074
      fltError("filterGenerateColRange get invalid idxNum : %d and gResNum : %d", idxNum[i], gResNum);
×
3075
      FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
3076
    }
3077

3078
    if (idxs == NULL) {
1,340,640✔
3079
      idxs = taosMemoryCalloc(info->fields[FLD_TYPE_COLUMN].num, sizeof(*idxs));
886,680!
3080
      if (idxs == NULL) {
888,753!
3081
        FLT_ERR_JRET(terrno);
×
3082
      }
3083
    }
3084

3085
    idxs[colNum++] = i;
1,342,713✔
3086
  }
3087

3088
  FLT_CHK_JMP(colNum <= 0);
1,058,300✔
3089

3090
  info->colRangeNum = colNum;
891,597✔
3091
  info->colRange = taosMemoryCalloc(colNum, POINTER_BYTES);
891,597✔
3092
  if (info->colRange == NULL) {
888,956!
3093
    info->colRangeNum = 0;
×
3094
    FLT_ERR_JRET(terrno);
×
3095
  }
3096

3097
  for (int32_t i = 0; i < gResNum; ++i) {
2,247,966✔
3098
    res = gRes[i];
1,360,502✔
3099
    uint32_t n = 0;
1,360,502✔
3100

3101
    for (uint32_t m = 0; m < info->colRangeNum; ++m) {
3,653,085✔
3102
      for (; n < res->colNum; ++n) {
2,441,171!
3103
        if (res->colIdx[n] < idxs[m]) {
2,442,028✔
3104
          continue;
147,096✔
3105
        }
3106

3107
        if (res->colIdx[n] != idxs[m]) {
2,294,932!
3108
          fltError("filterGenerateColRange get invalid colIdx : %d and idxs : %d", res->colIdx[n], idxs[m]);
×
3109
          SCL_ERR_JRET(TSDB_CODE_APP_ERROR);
48!
3110
        }
3111

3112
        SFilterColInfo *colInfo = &res->colInfo[res->colIdx[n]];
2,294,932✔
3113
        if (info->colRange[m] == NULL) {
2,294,932✔
3114
          FLT_ERR_JRET(filterInitRangeCtx(colInfo->dataType, 0, &(info->colRange[m])));
1,340,161✔
3115
          SFilterField *fi = FILTER_GET_COL_FIELD(info, res->colIdx[n]);
1,343,449✔
3116
          info->colRange[m]->colId = FILTER_GET_COL_FIELD_ID(fi);
1,343,449✔
3117
        }
3118

3119
        if (colInfo->type != RANGE_TYPE_MR_CTX) {
2,298,220!
3120
          fltError("filterGenerateColRange get invalid col type : %d", colInfo->type);
×
3121
          FLT_ERR_JRET(TSDB_CODE_QRY_FILTER_INVALID_TYPE);
×
3122
        }
3123

3124
        bool all = false;
2,298,220✔
3125
        FLT_ERR_JRET(filterSourceRangeFromCtx(info->colRange[m], colInfo->info, LOGIC_COND_TYPE_OR, NULL, &all));
2,298,220✔
3126
        if (all) {
2,293,488✔
3127
          (void)filterFreeRangeCtx(info->colRange[m]);  // No need to handle the return value.
56✔
3128
          info->colRange[m] = NULL;
56✔
3129
          if (m < (info->colRangeNum - 1)) {
56✔
3130
            (void)memmove(&info->colRange[m], &info->colRange[m + 1], (info->colRangeNum - m - 1) * POINTER_BYTES);
8✔
3131
            (void)memmove(&idxs[m], &idxs[m + 1], (info->colRangeNum - m - 1) * sizeof(*idxs));
8✔
3132
          }
3133

3134
          --info->colRangeNum;
56✔
3135
          --m;
56✔
3136

3137
          FLT_CHK_JMP(info->colRangeNum <= 0);
56✔
3138
        }
3139

3140
        ++n;
2,293,440✔
3141
        break;
2,293,440✔
3142
      }
3143
    }
3144
  }
3145

3146
_return:
887,464✔
3147
  taosMemoryFreeClear(idxNum);
1,054,215!
3148
  taosMemoryFreeClear(idxs);
1,054,260!
3149

3150
  return code;
1,054,670✔
3151
}
3152

3153
int32_t filterPostProcessRange(SFilterInfo *info) {
1,054,958✔
3154
  for (uint32_t i = 0; i < info->colRangeNum; ++i) {
2,395,404✔
3155
    SFilterRangeCtx  *ctx = info->colRange[i];
1,341,850✔
3156
    SFilterRangeNode *r = ctx->rs;
1,341,850✔
3157
    while (r) {
2,630,198✔
3158
      r->rc.func = filterGetRangeCompFunc(r->ra.sflag, r->ra.eflag);
1,289,752✔
3159
      r = r->next;
1,288,348✔
3160
    }
3161
  }
3162

3163
  return TSDB_CODE_SUCCESS;
1,053,554✔
3164
}
3165

3166
int32_t filterGenerateComInfo(SFilterInfo *info) {
1,053,666✔
3167
  info->cunits = taosMemoryMalloc(info->unitNum * sizeof(*info->cunits));
1,053,666!
3168
  info->blkUnitRes = taosMemoryMalloc(sizeof(*info->blkUnitRes) * info->unitNum);
1,055,092✔
3169
  info->blkUnits = taosMemoryMalloc(sizeof(*info->blkUnits) * (info->unitNum + 1) * info->groupNum);
1,055,660✔
3170
  if (NULL == info->cunits || NULL == info->blkUnitRes || NULL == info->blkUnits) {
1,055,737!
3171
    return terrno;
243✔
3172
  }
3173

3174
  for (uint32_t i = 0; i < info->unitNum; ++i) {
3,247,550✔
3175
    SFilterUnit *unit = &info->units[i];
2,194,765✔
3176

3177
    FLT_ERR_RET(filterGetCompFuncIdx(FILTER_UNIT_DATA_TYPE(unit), unit->compare.optr, &info->cunits[i].func, false));
2,194,765✔
3178
    info->cunits[i].rfunc = filterGetRangeCompFuncFromOptrs(unit->compare.optr, unit->compare.optr2);
2,192,382✔
3179
    info->cunits[i].optr = FILTER_UNIT_OPTR(unit);
2,192,056✔
3180
    info->cunits[i].colData = NULL;
2,192,056✔
3181
    info->cunits[i].colId = FILTER_UNIT_COL_ID(info, unit);
2,192,056✔
3182

3183
    if (unit->right.type == FLD_TYPE_VALUE) {
2,192,056✔
3184
      info->cunits[i].valData = FILTER_UNIT_VAL_DATA(info, unit);
1,745,478✔
3185
    } else {
3186
      info->cunits[i].valData = NULL;
446,578✔
3187
    }
3188
    if (unit->right2.type == FLD_TYPE_VALUE) {
2,192,056✔
3189
      info->cunits[i].valData2 = FILTER_GET_VAL_FIELD_DATA(FILTER_GET_FIELD(info, unit->right2));
57,673✔
3190
    } else {
3191
      info->cunits[i].valData2 = info->cunits[i].valData;
2,134,383✔
3192
    }
3193

3194
    info->cunits[i].dataSize = FILTER_UNIT_COL_SIZE(info, unit);
2,192,056✔
3195
    info->cunits[i].dataType = FILTER_UNIT_DATA_TYPE(unit);
2,192,056✔
3196
  }
3197

3198
  return TSDB_CODE_SUCCESS;
1,052,785✔
3199
}
3200

3201
int32_t filterUpdateComUnits(SFilterInfo *info) {
5,343,304✔
3202
  for (uint32_t i = 0; i < info->unitNum; ++i) {
7,709,268✔
3203
    SFilterUnit *unit = &info->units[i];
2,365,964✔
3204

3205
    SFilterField *col = FILTER_UNIT_LEFT_FIELD(info, unit);
2,365,964✔
3206
    info->cunits[i].colData = col->data;
2,365,964✔
3207
  }
3208

3209
  return TSDB_CODE_SUCCESS;
5,343,304✔
3210
}
3211

3212
int32_t filterRmUnitByRange(SFilterInfo *info, SColumnDataAgg *pDataStatis, int32_t numOfCols, int32_t numOfRows) {
×
3213
  int32_t rmUnit = 0;
×
3214

3215
  (void)memset(info->blkUnitRes, 0, sizeof(*info->blkUnitRes) * info->unitNum);
×
3216

3217
  for (uint32_t k = 0; k < info->unitNum; ++k) {
×
3218
    int32_t         index = -1;
×
3219
    SFilterComUnit *cunit = &info->cunits[k];
×
3220

3221
    if (FILTER_NO_MERGE_DATA_TYPE(cunit->dataType)) {
×
3222
      continue;
×
3223
    }
3224

3225
    for (int32_t i = 0; i < numOfCols; ++i) {
×
3226
      if (pDataStatis[i].colId == cunit->colId) {
×
3227
        index = i;
×
3228
        break;
×
3229
      }
3230
    }
3231

3232
    if (index == -1) {
×
3233
      continue;
×
3234
    }
3235

3236
    if (pDataStatis[index].numOfNull <= 0) {
×
3237
      if (cunit->optr == OP_TYPE_IS_NULL) {
×
3238
        info->blkUnitRes[k] = -1;
×
3239
        rmUnit = 1;
×
3240
        continue;
×
3241
      }
3242

3243
      if (cunit->optr == OP_TYPE_IS_NOT_NULL) {
×
3244
        info->blkUnitRes[k] = 1;
×
3245
        rmUnit = 1;
×
3246
        continue;
×
3247
      }
3248
    } else {
3249
      if (pDataStatis[index].numOfNull == numOfRows) {
×
3250
        if (cunit->optr == OP_TYPE_IS_NULL) {
×
3251
          info->blkUnitRes[k] = 1;
×
3252
          rmUnit = 1;
×
3253
          continue;
×
3254
        }
3255

3256
        info->blkUnitRes[k] = -1;
×
3257
        rmUnit = 1;
×
3258
        continue;
×
3259
      }
3260
    }
3261

3262
    if (cunit->optr == OP_TYPE_IS_NULL || cunit->optr == OP_TYPE_IS_NOT_NULL || cunit->optr == OP_TYPE_IN ||
×
3263
        cunit->optr == OP_TYPE_LIKE || cunit->optr == OP_TYPE_MATCH || cunit->optr == OP_TYPE_NOT_EQUAL) {
×
3264
      continue;
×
3265
    }
3266

3267
    SColumnDataAgg *pDataBlockst = &pDataStatis[index];
×
3268
    void           *minVal, *maxVal;
3269
    float           minv = 0;
×
3270
    float           maxv = 0;
×
3271

3272
    if (cunit->dataType == TSDB_DATA_TYPE_FLOAT) {
×
3273
      minv = (float)(*(double *)(&pDataBlockst->min));
×
3274
      maxv = (float)(*(double *)(&pDataBlockst->max));
×
3275

3276
      minVal = &minv;
×
3277
      maxVal = &maxv;
×
3278
    } else {
3279
      minVal = &pDataBlockst->min;
×
3280
      maxVal = &pDataBlockst->max;
×
3281
    }
3282

3283
    bool minRes = false, maxRes = false;
×
3284

3285
    if (cunit->rfunc >= 0) {
×
3286
      minRes =
3287
          (*gRangeCompare[cunit->rfunc])(minVal, minVal, cunit->valData, cunit->valData2, gDataCompare[cunit->func]);
×
3288
      maxRes =
3289
          (*gRangeCompare[cunit->rfunc])(maxVal, maxVal, cunit->valData, cunit->valData2, gDataCompare[cunit->func]);
×
3290

3291
      if (minRes && maxRes) {
×
3292
        info->blkUnitRes[k] = 1;
×
3293
        rmUnit = 1;
×
3294
      } else if ((!minRes) && (!maxRes)) {
×
3295
        minRes = filterDoCompare(gDataCompare[cunit->func], OP_TYPE_LOWER_EQUAL, minVal, cunit->valData);
×
3296
        maxRes = filterDoCompare(gDataCompare[cunit->func], OP_TYPE_GREATER_EQUAL, maxVal, cunit->valData2);
×
3297

3298
        if (minRes && maxRes) {
×
3299
          continue;
×
3300
        }
3301

3302
        info->blkUnitRes[k] = -1;
×
3303
        rmUnit = 1;
×
3304
      }
3305
    } else {
3306
      minRes = filterDoCompare(gDataCompare[cunit->func], cunit->optr, minVal, cunit->valData);
×
3307
      maxRes = filterDoCompare(gDataCompare[cunit->func], cunit->optr, maxVal, cunit->valData);
×
3308

3309
      if (minRes && maxRes) {
×
3310
        info->blkUnitRes[k] = 1;
×
3311
        rmUnit = 1;
×
3312
      } else if ((!minRes) && (!maxRes)) {
×
3313
        if (cunit->optr == OP_TYPE_EQUAL) {
×
3314
          minRes = filterDoCompare(gDataCompare[cunit->func], OP_TYPE_GREATER_THAN, minVal, cunit->valData);
×
3315
          maxRes = filterDoCompare(gDataCompare[cunit->func], OP_TYPE_LOWER_THAN, maxVal, cunit->valData);
×
3316
          if (minRes || maxRes) {
×
3317
            info->blkUnitRes[k] = -1;
×
3318
            rmUnit = 1;
×
3319
          }
3320

3321
          continue;
×
3322
        }
3323

3324
        info->blkUnitRes[k] = -1;
×
3325
        rmUnit = 1;
×
3326
      }
3327
    }
3328
  }
3329

3330
  if (rmUnit == 0) {
×
3331
    fltDebug("NO Block Filter APPLY");
×
3332
    FLT_RET(TSDB_CODE_SUCCESS);
×
3333
  }
3334

3335
  info->blkGroupNum = info->groupNum;
×
3336

3337
  uint32_t *unitNum = info->blkUnits;
×
3338
  uint32_t *unitIdx = unitNum + 1;
×
3339
  int32_t   all = 0, empty = 0;
×
3340

3341
  for (uint32_t g = 0; g < info->groupNum; ++g) {
×
3342
    SFilterGroup *group = &info->groups[g];
×
3343
    // first is block unint num for a group, following append unitNum blkUnitIdx for this group
3344
    *unitNum = group->unitNum;
×
3345
    all = 0;
×
3346
    empty = 0;
×
3347

3348
    // save group idx start pointer
3349
    uint32_t *pGroupIdx = unitIdx;
×
3350
    for (uint32_t u = 0; u < group->unitNum; ++u) {
×
3351
      uint32_t uidx = group->unitIdxs[u];
×
3352
      if (info->blkUnitRes[uidx] == 1) {
×
3353
        // blkUnitRes == 1 is always true, so need not compare every time, delete this unit from group
3354
        --(*unitNum);
×
3355
        all = 1;
×
3356
        continue;
×
3357
      } else if (info->blkUnitRes[uidx] == -1) {
×
3358
        // blkUnitRes == -1 is alwary false, so in group is alwary false, need delete this group from blkGroupNum
3359
        *unitNum = 0;
×
3360
        empty = 1;
×
3361
        break;
×
3362
      }
3363

3364
      *(unitIdx++) = uidx;
×
3365
    }
3366

3367
    if (*unitNum == 0) {
×
3368
      // if unit num is zero, reset unitIdx to start on this group
3369
      unitIdx = pGroupIdx;
×
3370

3371
      --info->blkGroupNum;
×
3372
      if (!empty && !all) {
×
3373
        fltError("filterRmUnitByRange get invalid empty and all : %d and %d", empty, all);
×
3374
        FLT_ERR_RET(TSDB_CODE_APP_ERROR);
×
3375
      }
3376

3377
      if (empty) {
×
3378
        FILTER_SET_FLAG(info->blkFlag, FI_STATUS_BLK_EMPTY);
×
3379
      } else {
3380
        FILTER_SET_FLAG(info->blkFlag, FI_STATUS_BLK_ALL);
×
3381
        goto _return;
×
3382
      }
3383

3384
      continue;
×
3385
    }
3386

3387
    unitNum = unitIdx;
×
3388
    ++unitIdx;
×
3389
  }
3390

3391
  if (info->blkGroupNum) {
×
3392
    FILTER_CLR_FLAG(info->blkFlag, FI_STATUS_BLK_EMPTY);
×
3393
    FILTER_SET_FLAG(info->blkFlag, FI_STATUS_BLK_ACTIVE);
×
3394
  }
3395

3396
_return:
×
3397

3398
  FLT_ERR_RET(filterDumpInfoToString(info, "Block Filter", 2));
×
3399

3400
  return TSDB_CODE_SUCCESS;
×
3401
}
3402

3403
bool filterExecuteBasedOnStatisImpl(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes, SColumnDataAgg *statis,
×
3404
                                    int16_t numOfCols) {
3405
  SFilterInfo *info = (SFilterInfo *)pinfo;
×
3406
  bool         all = true;
×
3407
  uint32_t    *unitIdx = NULL;
×
3408

3409
  int8_t *p = (int8_t *)pRes->pData;
×
3410

3411
  for (int32_t i = 0; i < numOfRows; ++i) {
×
3412
    // FILTER_UNIT_CLR_F(info);
3413

3414
    unitIdx = info->blkUnits;
×
3415

3416
    for (uint32_t g = 0; g < info->blkGroupNum; ++g) {
×
3417
      uint32_t unitNum = *(unitIdx++);
×
3418
      for (uint32_t u = 0; u < unitNum; ++u) {
×
3419
        SFilterComUnit *cunit = &info->cunits[*(unitIdx + u)];
×
3420
        void           *colData = colDataGetData((SColumnInfoData *)cunit->colData, i);
×
3421

3422
        // if (FILTER_UNIT_GET_F(info, uidx)) {
3423
        //   p[i] = FILTER_UNIT_GET_R(info, uidx);
3424
        // } else {
3425
        uint8_t optr = cunit->optr;
×
3426

3427
        if (colDataIsNull((SColumnInfoData *)(cunit->colData), 0, i, NULL)) {
×
3428
          p[i] = (optr == OP_TYPE_IS_NULL) ? true : false;
×
3429
        } else {
3430
          if (optr == OP_TYPE_IS_NOT_NULL) {
×
3431
            p[i] = 1;
×
3432
          } else if (optr == OP_TYPE_IS_NULL) {
×
3433
            p[i] = 0;
×
3434
          } else if (cunit->rfunc >= 0) {
×
3435
            p[i] = (*gRangeCompare[cunit->rfunc])(colData, colData, cunit->valData, cunit->valData2,
×
3436
                                                  gDataCompare[cunit->func]);
×
3437
          } else {
3438
            p[i] = filterDoCompare(gDataCompare[cunit->func], cunit->optr, colData, cunit->valData);
×
3439
          }
3440

3441
          // FILTER_UNIT_SET_R(info, uidx, p[i]);
3442
          // FILTER_UNIT_SET_F(info, uidx);
3443
        }
3444

3445
        if (p[i] == 0) {
×
3446
          break;
×
3447
        }
3448
      }
3449

3450
      if (p[i]) {
×
3451
        break;
×
3452
      }
3453

3454
      unitIdx += unitNum;
×
3455
    }
3456

3457
    if (p[i] == 0) {
×
3458
      all = false;
×
3459
    }
3460
  }
3461

3462
  return all;
×
3463
}
3464

3465
int32_t filterExecuteBasedOnStatis(SFilterInfo *info, int32_t numOfRows, SColumnInfoData *p, SColumnDataAgg *statis,
1,301,453✔
3466
                                   int16_t numOfCols, bool *all, int32_t *result) {
3467
  int32_t code = TSDB_CODE_SUCCESS;
1,301,453✔
3468
  *result = 0;
1,301,453✔
3469
  if (statis && numOfRows >= FILTER_RM_UNIT_MIN_ROWS) {
1,301,453!
3470
    info->blkFlag = 0;
×
3471

3472
    FLT_ERR_JRET(filterRmUnitByRange(info, statis, numOfCols, numOfRows));
×
3473

3474
    if (info->blkFlag) {
×
3475
      if (FILTER_GET_FLAG(info->blkFlag, FI_STATUS_BLK_ALL)) {
×
3476
        *all = true;
×
3477
        goto _return;
×
3478
      } else if (FILTER_GET_FLAG(info->blkFlag, FI_STATUS_BLK_EMPTY)) {
×
3479
        *all = false;
×
3480
        goto _return;
×
3481
      }
3482

3483
      if (info->unitNum <= 1) {
×
3484
        fltError("filterExecuteBasedOnStatis get invalid unit num : %d", info->unitNum);
×
3485
        FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
3486
      }
3487

3488
      *all = filterExecuteBasedOnStatisImpl(info, numOfRows, p, statis, numOfCols);
×
3489
      goto _return;
×
3490
    }
3491
  }
3492

3493
  *result = 1;
1,301,439✔
3494
  FLT_RET(TSDB_CODE_SUCCESS);
1,301,439!
3495

3496
_return:
×
3497
  info->blkFlag = 0;
×
3498
  result = 0;
×
3499
  FLT_RET(code);
×
3500
}
3501

3502
static FORCE_INLINE int32_t filterExecuteImplAll(void *info, int32_t numOfRows, SColumnInfoData *p, SColumnDataAgg *statis,
×
3503
                                                 int16_t numOfCols, int32_t *numOfQualified, bool *all) {
3504
  *all = true;
×
3505
  FLT_RET(TSDB_CODE_SUCCESS);
×
3506
}
3507

3508
static FORCE_INLINE int32_t filterExecuteImplEmpty(void *info, int32_t numOfRows, SColumnInfoData *p,
615✔
3509
                                                   SColumnDataAgg *statis, int16_t numOfCols, int32_t *numOfQualified, bool *all) {
3510
  *all = false;
615✔
3511
  FLT_RET(TSDB_CODE_SUCCESS);
615!
3512
}
3513

3514
static FORCE_INLINE int32_t filterExecuteImplIsNull(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes,
11,950✔
3515
                                                    SColumnDataAgg *statis, int16_t numOfCols, int32_t *numOfQualified, bool *all) {
3516
  SFilterInfo *info = (SFilterInfo *)pinfo;
11,950✔
3517
  int8_t      *p = (int8_t *)pRes->pData;
11,950✔
3518
  int32_t      result = 0;
11,950✔
3519

3520
  *all = true;
11,950✔
3521
  FLT_ERR_RET(filterExecuteBasedOnStatis(info, numOfRows, pRes, statis, numOfCols, all, &result));
11,950!
3522
  if (result == 0) {
11,949!
3523
    FLT_RET(TSDB_CODE_SUCCESS);
×
3524
  }
3525

3526
  for (int32_t i = 0; i < numOfRows; ++i) {
13,258,356✔
3527
    uint32_t uidx = info->groups[0].unitIdxs[0];
13,246,407✔
3528

3529
    p[i] = colDataIsNull((SColumnInfoData *)info->cunits[uidx].colData, 0, i, NULL);
13,246,407✔
3530
    if (p[i] == 0) {
13,246,407✔
3531
      *all = false;
8,863,597✔
3532
    } else {
3533
      (*numOfQualified) += 1;
4,382,810✔
3534
    }
3535
  }
3536

3537
  FLT_RET(TSDB_CODE_SUCCESS);
11,949!
3538
}
3539

3540
static FORCE_INLINE int32_t filterExecuteImplNotNull(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes,
166,131✔
3541
                                                     SColumnDataAgg *statis, int16_t numOfCols, int32_t *numOfQualified, bool *all) {
3542
  SFilterInfo *info = (SFilterInfo *)pinfo;
166,131✔
3543
  int32_t      result = 0;
166,131✔
3544

3545
  *all = true;
166,131✔
3546
  FLT_ERR_RET(filterExecuteBasedOnStatis(info, numOfRows, pRes, statis, numOfCols, all, &result));
166,131!
3547
  if (result == 0) {
166,131!
3548
    FLT_RET(TSDB_CODE_SUCCESS);
×
3549
  }
3550

3551
  int8_t *p = (int8_t *)pRes->pData;
166,131✔
3552

3553
  for (int32_t i = 0; i < numOfRows; ++i) {
20,407,656✔
3554
    uint32_t uidx = info->groups[0].unitIdxs[0];
20,241,525✔
3555

3556
    p[i] = !colDataIsNull((SColumnInfoData *)info->cunits[uidx].colData, 0, i, NULL);
20,241,525✔
3557
    if (p[i] == 0) {
20,241,525✔
3558
      *all = false;
43,073✔
3559
    } else {
3560
      (*numOfQualified) += 1;
20,198,452✔
3561
    }
3562
  }
3563

3564
  FLT_RET(TSDB_CODE_SUCCESS);
166,131!
3565
}
3566

3567
int32_t filterExecuteImplRange(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes, SColumnDataAgg *statis,
327,686✔
3568
                            int16_t numOfCols, int32_t *numOfQualified, bool *all) {
3569
  SFilterInfo  *info = (SFilterInfo *)pinfo;
327,686✔
3570
  uint16_t      dataSize = info->cunits[0].dataSize;
327,686✔
3571
  rangeCompFunc rfunc = gRangeCompare[info->cunits[0].rfunc];
327,686✔
3572
  void         *valData = info->cunits[0].valData;
327,686✔
3573
  void         *valData2 = info->cunits[0].valData2;
327,686✔
3574
  __compar_fn_t func = gDataCompare[info->cunits[0].func];
327,686✔
3575
  int32_t       result = 0;
327,686✔
3576

3577
  *all = true;
327,686✔
3578
  FLT_ERR_RET(filterExecuteBasedOnStatis(info, numOfRows, pRes, statis, numOfCols, all, &result));
327,686!
3579
  if (result == 0) {
327,686!
3580
    FLT_RET(TSDB_CODE_SUCCESS);
×
3581
  }
3582

3583
  int8_t *p = (int8_t *)pRes->pData;
327,686✔
3584

3585
  for (int32_t i = 0; i < numOfRows; ++i) {
109,616,150✔
3586
    SColumnInfoData *pData = info->cunits[0].colData;
108,901,909✔
3587

3588
    if (colDataIsNull_s(pData, i)) {
217,803,818✔
3589
      *all = false;
3,993,636✔
3590
      p[i] = 0;
3,993,636✔
3591
      continue;
3,993,636✔
3592
    }
3593

3594
    void *colData = colDataGetData(pData, i);
104,908,273!
3595
    p[i] = (*rfunc)(colData, colData, valData, valData2, func);
104,908,273✔
3596

3597
    if (p[i] == 0) {
105,294,828✔
3598
      *all = false;
37,134,312✔
3599
    } else {
3600
      (*numOfQualified)++;
68,160,516✔
3601
    }
3602
  }
3603

3604
  FLT_RET(TSDB_CODE_SUCCESS);
714,241!
3605
}
3606

3607
int32_t filterExecuteImplMisc(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes, SColumnDataAgg *statis,
192,263✔
3608
                           int16_t numOfCols, int32_t *numOfQualified, bool *all) {
3609
  SFilterInfo *info = (SFilterInfo *)pinfo;
192,263✔
3610
  int32_t      result = 0;
192,263✔
3611

3612
  *all = true;
192,263✔
3613
  FLT_ERR_RET(filterExecuteBasedOnStatis(info, numOfRows, pRes, statis, numOfCols, all, &result));
192,263!
3614
  if (result == 0) {
192,265!
3615
    FLT_RET(TSDB_CODE_SUCCESS);
×
3616
  }
3617

3618
  int8_t *p = (int8_t *)pRes->pData;
192,265✔
3619

3620
  for (int32_t i = 0; i < numOfRows; ++i) {
65,607,007✔
3621
    uint32_t uidx = info->groups[0].unitIdxs[0];
64,938,437✔
3622
    if (colDataIsNull_s((SColumnInfoData *)info->cunits[uidx].colData, i)) {
129,876,874✔
3623
      p[i] = 0;
1,996,205✔
3624
      *all = false;
1,996,205✔
3625
      continue;
1,996,205✔
3626
    }
3627

3628
    void *colData = colDataGetData((SColumnInfoData *)info->cunits[uidx].colData, i);
62,942,232!
3629
    // match/nmatch for nchar type need convert from ucs4 to mbs
3630
    if (info->cunits[uidx].dataType == TSDB_DATA_TYPE_NCHAR &&
62,942,232!
3631
        (info->cunits[uidx].optr == OP_TYPE_MATCH || info->cunits[uidx].optr == OP_TYPE_NMATCH)) {
×
3632
      char   *newColData = taosMemoryCalloc(info->cunits[uidx].dataSize * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE, 1);
×
3633
      if (newColData == NULL) {
×
3634
        FLT_ERR_RET(terrno);
×
3635
      }
3636
      int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(colData), varDataLen(colData), varDataVal(newColData), NULL);
×
3637
      if (len < 0) {
×
3638
        qError("castConvert1 taosUcs4ToMbs error");
×
3639
        taosMemoryFreeClear(newColData);
×
3640
        FLT_ERR_RET(TSDB_CODE_SCALAR_CONVERT_ERROR);
×
3641
      } else {
3642
        varDataSetLen(newColData, len);
×
3643
        p[i] = filterDoCompare(gDataCompare[info->cunits[uidx].func], info->cunits[uidx].optr, newColData,
×
3644
                               info->cunits[uidx].valData);
×
3645
      }
3646
      taosMemoryFreeClear(newColData);
×
3647
    } else {
3648
      p[i] = filterDoCompare(gDataCompare[info->cunits[uidx].func], info->cunits[uidx].optr, colData,
63,418,537✔
3649
                             info->cunits[uidx].valData);
62,942,232✔
3650
    }
3651

3652
    if (p[i] == 0) {
63,418,537✔
3653
      *all = false;
46,613,612✔
3654
    } else {
3655
      (*numOfQualified) += 1;
16,804,925✔
3656
    }
3657
  }
3658

3659
  FLT_RET(TSDB_CODE_SUCCESS);
668,570!
3660
}
3661

3662
int32_t filterExecuteImpl(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes, SColumnDataAgg *statis, int16_t numOfCols,
603,442✔
3663
                       int32_t *numOfQualified, bool *all) {
3664
  SFilterInfo *info = (SFilterInfo *)pinfo;
603,442✔
3665
  int32_t      result = 0;
603,442✔
3666

3667
  *all = true;
603,442✔
3668
  FLT_ERR_RET(filterExecuteBasedOnStatis(info, numOfRows, pRes, statis, numOfCols, all, &result));
603,442✔
3669
  if (result == 0) {
603,436!
3670
    FLT_RET(TSDB_CODE_SUCCESS);
×
3671
  }
3672

3673
  int8_t *p = (int8_t *)pRes->pData;
603,436✔
3674

3675
  for (int32_t i = 0; i < numOfRows; ++i) {
176,604,960✔
3676
    // FILTER_UNIT_CLR_F(info);
3677

3678
    for (uint32_t g = 0; g < info->groupNum; ++g) {
264,945,802✔
3679
      SFilterGroup *group = &info->groups[g];
222,238,117✔
3680
      for (uint32_t u = 0; u < group->unitNum; ++u) {
508,879,005✔
3681
        uint32_t        uidx = group->unitIdxs[u];
375,402,459✔
3682
        SFilterComUnit *cunit = &info->cunits[uidx];
375,402,459✔
3683
        void           *colData = NULL;
375,402,459✔
3684
        bool            isNull = colDataIsNull((SColumnInfoData *)(cunit->colData), 0, i, NULL);
375,402,459✔
3685
        // if (FILTER_UNIT_GET_F(info, uidx)) {
3686
        //   p[i] = FILTER_UNIT_GET_R(info, uidx);
3687
        // } else {
3688
        uint8_t optr = cunit->optr;
375,402,459✔
3689

3690
        if (!isNull) {
375,402,459✔
3691
          colData = colDataGetData((SColumnInfoData *)(cunit->colData), i);
369,821,269!
3692
        }
3693

3694
        if (colData == NULL || isNull) {
375,402,459✔
3695
          p[i] = optr == OP_TYPE_IS_NULL ? true : false;
5,556,389✔
3696
        } else {
3697
          if (optr == OP_TYPE_IS_NOT_NULL) {
369,846,070✔
3698
            p[i] = 1;
59,301,210✔
3699
          } else if (optr == OP_TYPE_IS_NULL) {
310,544,860✔
3700
            p[i] = 0;
28,621✔
3701
          } else if (cunit->rfunc >= 0) {
310,516,239✔
3702
            p[i] = (*gRangeCompare[cunit->rfunc])(colData, colData, cunit->valData, cunit->valData2,
168,349,985✔
3703
                                                  gDataCompare[cunit->func]);
168,345,281✔
3704
          } else {
3705
            if (cunit->dataType == TSDB_DATA_TYPE_NCHAR &&
142,170,958!
3706
                (cunit->optr == OP_TYPE_MATCH || cunit->optr == OP_TYPE_NMATCH)) {
×
3707
              char   *newColData = taosMemoryCalloc(cunit->dataSize * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE, 1);
×
3708
              if (newColData == NULL) {
×
3709
                FLT_ERR_RET(terrno);
×
3710
              }
3711
              int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(colData), varDataLen(colData), varDataVal(newColData), NULL);
×
3712
              if (len < 0) {
×
3713
                qError("castConvert1 taosUcs4ToMbs error");
×
3714
                taosMemoryFreeClear(newColData);
×
3715
                FLT_ERR_RET(TSDB_CODE_SCALAR_CONVERT_ERROR);
×
3716
              } else {
3717
                varDataSetLen(newColData, len);
×
3718
                p[i] = filterDoCompare(gDataCompare[cunit->func], cunit->optr, newColData, cunit->valData);
×
3719
              }
3720
              taosMemoryFreeClear(newColData);
×
3721
            } else {
3722
              p[i] = filterDoCompare(gDataCompare[cunit->func], cunit->optr, colData, cunit->valData);
142,170,958✔
3723
            }
3724
          }
3725

3726
          // FILTER_UNIT_SET_R(info, uidx, p[i]);
3727
          // FILTER_UNIT_SET_F(info, uidx);
3728
        }
3729

3730
        if (p[i] == 0) {
375,645,658✔
3731
          break;
89,004,770✔
3732
        }
3733
      }
3734

3735
      if (p[i]) {
222,481,316✔
3736
        break;
133,293,839✔
3737
      }
3738
    }
3739

3740
    if (p[i] == 0) {
176,001,524✔
3741
      *all = false;
42,484,525✔
3742
    } else {
3743
      (*numOfQualified) += 1;
133,516,999✔
3744
    }
3745
  }
3746

3747
  FLT_RET(TSDB_CODE_SUCCESS);
846,635!
3748
}
3749

3750
int32_t filterSetExecFunc(SFilterInfo *info) {
1,057,230✔
3751
  if (FILTER_ALL_RES(info)) {
1,057,230!
3752
    info->func = filterExecuteImplAll;
×
3753
    return TSDB_CODE_SUCCESS;
×
3754
  }
3755

3756
  if (FILTER_EMPTY_RES(info)) {
1,057,230✔
3757
    info->func = filterExecuteImplEmpty;
4,335✔
3758
    return TSDB_CODE_SUCCESS;
4,335✔
3759
  }
3760

3761
  if (info->unitNum > 1) {
1,052,895✔
3762
    info->func = filterExecuteImpl;
590,720✔
3763
    return TSDB_CODE_SUCCESS;
590,720✔
3764
  }
3765

3766
  if (info->units[0].compare.optr == OP_TYPE_IS_NULL) {
462,175✔
3767
    info->func = filterExecuteImplIsNull;
10,719✔
3768
    return TSDB_CODE_SUCCESS;
10,719✔
3769
  }
3770

3771
  if (info->units[0].compare.optr == OP_TYPE_IS_NOT_NULL) {
451,456✔
3772
    info->func = filterExecuteImplNotNull;
88,388✔
3773
    return TSDB_CODE_SUCCESS;
88,388✔
3774
  }
3775

3776
  if (info->cunits[0].rfunc >= 0) {
363,068✔
3777
    info->func = filterExecuteImplRange;
269,460✔
3778
    return TSDB_CODE_SUCCESS;
269,460✔
3779
  }
3780

3781
  info->func = filterExecuteImplMisc;
93,608✔
3782
  return TSDB_CODE_SUCCESS;
93,608✔
3783
}
3784

3785
int32_t filterPreprocess(SFilterInfo *info) {
1,058,293✔
3786
  int32_t code = TSDB_CODE_SUCCESS;
1,058,293✔
3787
  int32_t           gResNum = 0;
1,058,293✔
3788
  SFilterGroupCtx **gRes = taosMemoryCalloc(info->groupNum, sizeof(SFilterGroupCtx *));
1,058,293!
3789
  if (gRes == NULL) {
1,060,784!
3790
    FLT_ERR_JRET(terrno);
×
3791
  }
3792

3793
  FLT_ERR_JRET(filterMergeGroupUnits(info, gRes, &gResNum));
1,060,784!
3794

3795
  FLT_ERR_JRET(filterMergeGroups(info, gRes, &gResNum));
1,060,384!
3796

3797
  if (FILTER_GET_FLAG(info->status, FI_STATUS_ALL)) {
1,058,446!
3798
    fltInfo("Final - FilterInfo: [ALL]");
×
3799
    goto _return1;
×
3800
  }
3801

3802
  if (FILTER_GET_FLAG(info->status, FI_STATUS_EMPTY)) {
1,058,446✔
3803
    fltInfo("Final - FilterInfo: [EMPTY]");
4,322!
3804
    goto _return1;
4,335✔
3805
  }
3806

3807
  FLT_ERR_JRET(filterGenerateColRange(info, gRes, gResNum));
1,054,124!
3808

3809
  FLT_ERR_JRET(filterDumpInfoToString(info, "Final", 1));
1,056,143!
3810

3811
  FLT_ERR_JRET(filterPostProcessRange(info));
1,055,916!
3812

3813
  FLT_ERR_JRET(filterRewrite(info, gRes, gResNum));
1,053,960!
3814

3815
  FLT_ERR_JRET(filterGenerateComInfo(info));
1,054,671✔
3816

3817
_return1:
1,055,421✔
3818
  FLT_ERR_JRET(filterSetExecFunc(info));
1,059,756!
3819

3820
_return:
1,059,270✔
3821
  for (int32_t i = 0; i < gResNum; ++i) {
2,687,977✔
3822
    filterFreeGroupCtx(gRes[i]);
1,627,259✔
3823
  }
3824

3825
  taosMemoryFreeClear(gRes);
1,060,718!
3826

3827
  return code;
1,060,836✔
3828
}
3829

3830
int32_t fltSetColFieldDataImpl(SFilterInfo *info, void *param, filer_get_col_from_id fp, bool fromColId) {
5,344,090✔
3831
  if (FILTER_ALL_RES(info) || FILTER_EMPTY_RES(info)) {
5,344,090!
3832
    return TSDB_CODE_SUCCESS;
78✔
3833
  }
3834

3835
  for (uint32_t i = 0; i < info->fields[FLD_TYPE_COLUMN].num; ++i) {
7,293,432✔
3836
    SFilterField *fi = &info->fields[FLD_TYPE_COLUMN].fields[i];
1,949,473✔
3837

3838
    if (fromColId) {
1,949,473!
3839
      FLT_ERR_RET((*fp)(param, FILTER_GET_COL_FIELD_ID(fi), &fi->data));
×
3840
    } else {
3841
      FLT_ERR_RET((*fp)(param, FILTER_GET_COL_FIELD_SLOT_ID(fi), &fi->data));
1,949,473!
3842
    }
3843
  }
3844

3845
  FLT_ERR_RET(filterUpdateComUnits(info));
5,343,959✔
3846

3847
  return TSDB_CODE_SUCCESS;
5,343,469✔
3848
}
3849

3850
int32_t fltInitFromNode(SNode *tree, SFilterInfo *info, uint32_t options) {
1,433,218✔
3851
  int32_t code = TSDB_CODE_SUCCESS;
1,433,218✔
3852

3853
  SArray *group = taosArrayInit(FILTER_DEFAULT_GROUP_SIZE, sizeof(SFilterGroup));
1,433,218✔
3854
  if (group == NULL) {
1,434,989!
3855
    FLT_ERR_JRET(terrno);
×
3856
  }
3857

3858
  code = filterInitUnitsFields(info);
1,434,989✔
3859
  if(TSDB_CODE_SUCCESS != code) {
1,434,893!
3860
    taosArrayDestroy(group);
×
3861
    goto _return;
×
3862
  }
3863

3864
  SFltBuildGroupCtx tctx = {.info = info, .group = group, .ignore = false};
1,434,893✔
3865
  nodesWalkExpr(tree, fltTreeToGroup, (void *)&tctx);
1,434,893✔
3866
  if (TSDB_CODE_SUCCESS != tctx.code) {
1,434,905✔
3867
    taosArrayDestroyEx(group, filterFreeGroup);
1,139✔
3868
    code = tctx.code;
×
3869
    goto _return;
×
3870
  }
3871
  if (tctx.ignore) {
1,433,766!
3872
    FILTER_SET_FLAG(info->status, FI_STATUS_EMPTY);
×
3873
  }
3874
  if (FILTER_EMPTY_RES(info)) {
1,433,766✔
3875
    info->func = filterExecuteImplEmpty;
20✔
3876
    taosArrayDestroyEx(group, filterFreeGroup);
20✔
3877
    return TSDB_CODE_SUCCESS;
20✔
3878
  }
3879
  code = filterConvertGroupFromArray(info, group);
1,433,746✔
3880
  if (TSDB_CODE_SUCCESS != code) {
1,435,249!
3881
    taosArrayDestroyEx(group, filterFreeGroup);
×
3882
    goto _return;
×
3883
  }
3884
  taosArrayDestroy(group);
1,435,249✔
3885
  FLT_ERR_JRET(fltInitValFieldData(info));
1,435,292✔
3886

3887
  if (!FILTER_GET_FLAG(info->options, FLT_OPTION_NO_REWRITE)) {
1,433,051✔
3888
    FLT_ERR_JRET(filterDumpInfoToString(info, "Before preprocess", 0));
1,059,677!
3889

3890
    FLT_ERR_JRET(filterPreprocess(info));
1,058,674✔
3891

3892
    FLT_CHK_JMP(FILTER_GET_FLAG(info->status, FI_STATUS_ALL));
1,060,147!
3893

3894
    if (FILTER_GET_FLAG(info->status, FI_STATUS_EMPTY)) {
1,060,147✔
3895
      return code;
4,333✔
3896
    }
3897
  }
3898

3899
  info->unitRes = taosMemoryMalloc(info->unitNum * sizeof(*info->unitRes));
1,429,188!
3900
  if (info->unitRes == NULL) {
1,429,172!
3901
    FLT_ERR_JRET(terrno);
×
3902
  }
3903
  info->unitFlags = taosMemoryMalloc(info->unitNum * sizeof(*info->unitFlags));
1,429,172✔
3904
  if (info->unitFlags == NULL) {
1,429,660!
3905
    FLT_ERR_JRET(terrno);
×
3906
  }
3907
  FLT_ERR_JRET(filterDumpInfoToString(info, "Final", 0));
1,429,660!
3908
  return code;
1,429,017✔
3909

3910
_return:
14✔
3911
  if (code) {
14!
3912
    qInfo("init from node failed, code:%d, %s", code, tstrerror(code));
14!
3913
  }
3914
  return code;
14✔
3915
}
3916

3917
// compare ranges, null < min < val < max. null=null, min=min, max=max
3918
typedef enum {
3919
  FLT_SCL_DATUM_KIND_NULL,
3920
  FLT_SCL_DATUM_KIND_MIN,
3921
  FLT_SCL_DATUM_KIND_INT64,
3922
  FLT_SCL_DATUM_KIND_UINT64,
3923
  FLT_SCL_DATUM_KIND_FLOAT64,
3924
  FLT_SCL_DATUM_KIND_VARCHAR,
3925
  FLT_SCL_DATUM_KIND_NCHAR,
3926
  FLT_SCL_DATUM_KIND_DECIMAL64,
3927
  FLT_SCL_DATUM_KIND_DECIMAL,
3928
  FLT_SCL_DATUM_KIND_MAX,
3929
} SFltSclDatumKind;
3930

3931
typedef struct {
3932
  SFltSclDatumKind kind;
3933
  union {
3934
    int64_t  i;      // for int and bool (1 true, 0 false) and ts
3935
    uint64_t u;      // for uint
3936
    double   d;      // for double
3937
    uint8_t *pData;  // for varchar, nchar, len prefixed
3938
    Decimal dec;     // for decimal
3939
  };
3940
  SDataType type;    // TODO: original data type, may not be used?
3941
} SFltSclDatum;
3942

3943
typedef struct {
3944
  SFltSclDatum val;
3945
  bool         excl;
3946
  bool         start;
3947
} SFltSclPoint;
3948

3949
int32_t fltSclCompareWithFloat64(SFltSclDatum *val1, SFltSclDatum *val2) {
132,509✔
3950
  // val2->kind == float64
3951
  switch (val1->kind) {
132,509!
3952
    case FLT_SCL_DATUM_KIND_UINT64:
×
3953
      return compareUint64Double(&val1->u, &val2->d);
×
3954
    case FLT_SCL_DATUM_KIND_VARCHAR:
75✔
3955
    case FLT_SCL_DATUM_KIND_NCHAR:
3956
    case FLT_SCL_DATUM_KIND_INT64:
3957
      return compareInt64Double(&val1->i, &val2->d);
75✔
3958
    case FLT_SCL_DATUM_KIND_FLOAT64: {
123,390✔
3959
      return compareDoubleVal(&val1->d, &val2->d);
123,390✔
3960
    }
3961
    case FLT_SCL_DATUM_KIND_DECIMAL64: {
2,275✔
3962
      double d = doubleFromDecimal64(&val1->i, val1->type.precision, val1->type.scale);
2,275✔
3963
      return compareDoubleVal(&d, &val2->d);
2,275✔
3964
    }
3965
    case FLT_SCL_DATUM_KIND_DECIMAL: {
6,825✔
3966
      double d = doubleFromDecimal128(&val1->dec, val1->type.precision, val1->type.scale);
6,825✔
3967
      return compareDoubleVal(&d, &val2->d);
6,825✔
3968
    }
3969
    default:
×
3970
      qError("not supported comparsion. kind1 %d, kind2 %d", val1->kind, val2->kind);
×
3971
      return (val1->kind - val2->kind);
×
3972
  }
3973
}
3974

3975
int32_t fltSclCompareWithInt64(SFltSclDatum *val1, SFltSclDatum *val2) {
197,593✔
3976
  // val2->kind == int64
3977
  switch (val1->kind) {
197,593!
3978
    case FLT_SCL_DATUM_KIND_UINT64:
13,690✔
3979
      return compareUint64Int64(&val1->u, &val2->i);
13,690✔
3980
    case FLT_SCL_DATUM_KIND_VARCHAR:
184,011✔
3981
    case FLT_SCL_DATUM_KIND_NCHAR:
3982
    case FLT_SCL_DATUM_KIND_INT64:
3983
      return compareInt64Val(&val1->i, &val2->i);
184,011✔
3984
    case FLT_SCL_DATUM_KIND_FLOAT64: {
×
3985
      return compareDoubleInt64(&val1->d, &val2->i);
×
3986
    }
3987
    default:
×
3988
      qError("not supported comparsion. kind1 %d, kind2 %d", val1->kind, val2->kind);
×
3989
      return (val1->kind - val2->kind);
×
3990
  }
3991
}
3992

3993
int32_t fltSclCompareWithUInt64(SFltSclDatum *val1, SFltSclDatum *val2) {
209✔
3994
  // val2 kind == uint64
3995
  switch (val1->kind) {
209!
3996
    case FLT_SCL_DATUM_KIND_UINT64:
×
3997
      return compareUint64Val(&val1->u, &val2->u);
×
3998
    case FLT_SCL_DATUM_KIND_VARCHAR:
209✔
3999
    case FLT_SCL_DATUM_KIND_NCHAR:
4000
    case FLT_SCL_DATUM_KIND_INT64:
4001
      return compareInt64Uint64(&val1->i, &val2->u);
209✔
4002
    case FLT_SCL_DATUM_KIND_FLOAT64: {
×
4003
      return compareDoubleUint64(&val1->d, &val2->u);
×
4004
    }
4005
    default:
×
4006
      qError("not supported comparsion. kind1 %d, kind2 %d", val1->kind, val2->kind);
×
4007
      return (val1->kind - val2->kind);
×
4008
  }
4009
}
4010

4011
int32_t fltSclCompareWithDecimal(void* pData1, const SDataType* pType1, void* pData2, const SDataType* pType2) {
1,000✔
4012
  SDecimalCompareCtx ctx1 = {.pData = pData1, .type =pType1->type, .typeMod = decimalCalcTypeMod(pType1->precision, pType1->scale)},
1,000✔
4013
                     ctx2 = {.pData = pData2, .type = pType2->type, .typeMod = decimalCalcTypeMod(pType2->precision, pType2->scale)};
1,000✔
4014
  if (decimalCompare(OP_TYPE_GREATER_THAN, &ctx1, &ctx2)) return 1;
1,000✔
4015
  if (decimalCompare(OP_TYPE_EQUAL, &ctx1, &ctx2)) return 0;
440!
4016
  return -1;
440✔
4017
}
4018

4019
int32_t fltSclCompareDatum(SFltSclDatum *val1, SFltSclDatum *val2) {
839,234✔
4020
  if (val2->kind == FLT_SCL_DATUM_KIND_NULL || val2->kind == FLT_SCL_DATUM_KIND_MIN ||
839,234!
4021
      val2->kind == FLT_SCL_DATUM_KIND_MAX) {
637,815✔
4022
    return (val1->kind < val2->kind) ? -1 : ((val1->kind > val2->kind) ? 1 : 0);
299,357✔
4023
  }
4024

4025
  if (val1->kind == FLT_SCL_DATUM_KIND_NULL || val1->kind == FLT_SCL_DATUM_KIND_MIN ||
539,877✔
4026
      val1->kind == FLT_SCL_DATUM_KIND_MAX) {
517,103✔
4027
    return (val1->kind < val2->kind) ? -1 : ((val1->kind > val2->kind) ? 1 : 0);
208,299✔
4028
  }
4029

4030
  switch (val2->kind) {
331,578✔
4031
    case FLT_SCL_DATUM_KIND_UINT64: {
209✔
4032
      return fltSclCompareWithUInt64(val1, val2);
209✔
4033
    }
4034
    case FLT_SCL_DATUM_KIND_NCHAR:
197,601✔
4035
    case FLT_SCL_DATUM_KIND_VARCHAR:
4036
    case FLT_SCL_DATUM_KIND_INT64: {
4037
      return fltSclCompareWithInt64(val1, val2);
197,601✔
4038
    }
4039
    case FLT_SCL_DATUM_KIND_FLOAT64: {
132,488✔
4040
      return fltSclCompareWithFloat64(val1, val2);
132,488✔
4041
    }
4042
    case FLT_SCL_DATUM_KIND_DECIMAL64: {
125✔
4043
      void* pData1 = val1->kind == FLT_SCL_DATUM_KIND_DECIMAL64 ? (void*)&val1->i : (void*)&val1->dec;
125✔
4044
      return fltSclCompareWithDecimal(pData1, &val1->type, &val2->i, &val2->type);
125✔
4045
    }
4046
    case FLT_SCL_DATUM_KIND_DECIMAL: {
875✔
4047
      void* pData1 = val1->kind == FLT_SCL_DATUM_KIND_DECIMAL64 ? (void*)&val1->i : (void*)&val1->dec;
875✔
4048
      return fltSclCompareWithDecimal(pData1, &val1->type, &val2->dec, &val2->type);
875✔
4049
    }
4050
    default:
280✔
4051
      qError("not supported kind when compare datum. kind2 : %d", val2->kind);
280!
4052
      return 0;
×
4053
      break;
4054
  }
4055
  return 0;
4056
}
4057

4058
bool fltSclLessPoint(SFltSclPoint *pt1, SFltSclPoint *pt2) {
839,248✔
4059
  // first value compare
4060
  int32_t cmp = fltSclCompareDatum(&pt1->val, &pt2->val);
839,248✔
4061
  if (cmp != 0) {
841,415✔
4062
    return cmp < 0;
825,643✔
4063
  }
4064

4065
  if (pt1->start && pt2->start) {
15,772✔
4066
    return !pt1->excl && pt2->excl;
922✔
4067
  } else if (pt1->start) {
14,850✔
4068
    return !pt1->excl && !pt2->excl;
123✔
4069
  } else if (pt2->start) {
14,727✔
4070
    return pt1->excl || pt2->excl;
8!
4071
  }
4072
  return pt1->excl && !pt2->excl;
14,719!
4073
}
4074

4075
int32_t fltSclMergeSort(SArray *pts1, SArray *pts2, SArray *result) {
263,030✔
4076
  size_t len1 = taosArrayGetSize(pts1);
263,030✔
4077
  size_t len2 = taosArrayGetSize(pts2);
262,843✔
4078
  size_t i = 0;
261,922✔
4079
  size_t j = 0;
261,922✔
4080
  while (i < len1 && j < len2) {
1,105,737✔
4081
    SFltSclPoint *pt1 = taosArrayGet(pts1, i);
842,773✔
4082
    SFltSclPoint *pt2 = taosArrayGet(pts2, j);
839,582✔
4083
    if (NULL == pt1 || NULL == pt2) {
839,269!
4084
      FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
22!
4085
    }
4086
    bool          less = fltSclLessPoint(pt1, pt2);
839,269✔
4087
    if (less) {
842,001✔
4088
      if (NULL == taosArrayPush(result, pt1)) {
363,802!
4089
        FLT_ERR_RET(terrno);
×
4090
      }
4091
      ++i;
363,791✔
4092
    } else {
4093
      if (NULL == taosArrayPush(result, pt2)) {
479,936!
4094
        FLT_ERR_RET(terrno);
×
4095
      }
4096
      ++j;
480,024✔
4097
    }
4098
  }
4099
  if (i < len1) {
262,964✔
4100
    for (; i < len1; ++i) {
416,450✔
4101
      SFltSclPoint *pt1 = taosArrayGet(pts1, i);
209,559✔
4102
      if (NULL == pt1) {
209,079!
4103
        FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
4104
      }
4105
      if (NULL == taosArrayPush(result, pt1)) {
209,500!
4106
        FLT_ERR_RET(terrno);
×
4107
      }
4108
    }
4109
  }
4110
  if (j < len2) {
262,922✔
4111
    for (; j < len2; ++j) {
113,633✔
4112
      SFltSclPoint *pt2 = taosArrayGet(pts2, j);
57,314✔
4113
      if (NULL == pt2) {
57,312!
4114
        FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
4115
      }
4116
      if (NULL == taosArrayPush(result, pt2)) {
57,315!
4117
        FLT_ERR_RET(terrno);
×
4118
      }
4119
    }
4120
  }
4121
  return TSDB_CODE_SUCCESS;
262,923✔
4122
}
4123

4124
int32_t fltSclMerge(SArray *pts1, SArray *pts2, bool isUnion, SArray *merged) {
263,036✔
4125
  size_t len1 = taosArrayGetSize(pts1);
263,036✔
4126
  size_t len2 = taosArrayGetSize(pts2);
262,751✔
4127
  // first merge sort pts1 and pts2
4128
  SArray *all = taosArrayInit(len1 + len2, sizeof(SFltSclPoint));
262,886✔
4129
  if (all == NULL) {
263,254!
4130
    FLT_ERR_RET(terrno);
×
4131
  }
4132
  FLT_ERR_RET(fltSclMergeSort(pts1, pts2, all));
263,254!
4133
  int32_t countRequired = (isUnion) ? 1 : 2;
262,940!
4134
  int32_t count = 0;
262,940✔
4135
  for (int32_t i = 0; i < taosArrayGetSize(all); ++i) {
1,367,705✔
4136
    SFltSclPoint *pt = taosArrayGet(all, i);
1,104,647✔
4137
    if (NULL == pt) {
1,103,060!
4138
      FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
4139
    }
4140
    if (pt->start) {
1,103,060✔
4141
      ++count;
552,923✔
4142
      if (count == countRequired) {
552,923✔
4143
        if (NULL == taosArrayPush(merged, pt)) {
279,445!
4144
          FLT_ERR_RET(terrno);
×
4145
        }
4146
      }
4147
    } else {
4148
      if (count == countRequired) {
550,137✔
4149
        if (NULL == taosArrayPush(merged, pt)) {
279,455!
4150
          FLT_ERR_RET(terrno);
×
4151
        }
4152
      }
4153
      --count;
553,754✔
4154
    }
4155
  }
4156
  taosArrayDestroy(all);
259,646✔
4157
  return TSDB_CODE_SUCCESS;
263,313✔
4158
}
4159

4160
int32_t fltSclIntersect(SArray *pts1, SArray *pts2, SArray *merged) { return fltSclMerge(pts1, pts2, false, merged); }
263,049✔
4161

4162
int32_t fltSclUnion(SArray *pts1, SArray *pts2, SArray *merged) { return fltSclMerge(pts1, pts2, true, merged); }
×
4163

4164
typedef struct {
4165
  SColumnNode  *colNode;
4166
  SValueNode   *valNode;
4167
  EOperatorType type;
4168
} SFltSclOperator;
4169

4170

4171
int32_t fltSclGetOrCreateColumnRange(SColumnNode *colNode, SArray *colRangeList, SFltSclColumnRange **colRange) {
1,195,445✔
4172
  for (int32_t i = 0; i < taosArrayGetSize(colRangeList); ++i) {
1,841,939✔
4173
    *colRange = taosArrayGet(colRangeList, i);
849,638✔
4174
    if (NULL == colRange) {
848,421!
4175
      return TSDB_CODE_OUT_OF_RANGE;
×
4176
    }
4177
    if (nodesEqualNode((SNode *)(*colRange)->colNode, (SNode *)colNode)) {
848,421✔
4178
      return TSDB_CODE_SUCCESS;
206,001✔
4179
    }
4180
  }
4181
  // TODO(smj):wait for nodesCloneNode change it's return value, use terrno for now.
4182
  terrno = TSDB_CODE_SUCCESS;
986,880✔
4183
  SColumnNode       *pColumnNode = NULL;
990,971✔
4184
  int32_t code = nodesCloneNode((SNode *)colNode, (SNode**)&pColumnNode);
990,971✔
4185
  FLT_ERR_RET(code);
994,601!
4186
  SFltSclColumnRange newColRange = {.colNode = pColumnNode, .points = taosArrayInit(4, sizeof(SFltSclPoint))};
994,601✔
4187
  if (NULL == newColRange.points) {
994,088!
4188
    FLT_ERR_RET(terrno);
×
4189
  }
4190
  if (NULL == taosArrayPush(colRangeList, &newColRange)) {
993,981!
4191
    FLT_ERR_RET(terrno);
×
4192
  }
4193
  *colRange = taosArrayGetLast(colRangeList);
993,981✔
4194
  return TSDB_CODE_SUCCESS;
992,695✔
4195
}
4196

4197
static int32_t fltSclBuildDecimalDatumFromValueNode(SFltSclDatum* datum, SColumnNode* pColNode, SValueNode* valNode) {
4,926✔
4198
  datum->type = pColNode->node.resType;
4,926✔
4199
  SDataType valDt = valNode->node.resType;
4,926✔
4200
  if (valNode->isNull) {
4,926!
4201
    datum->kind = FLT_SCL_DATUM_KIND_NULL;
×
4202
  } else {
4203
    void* pInput = NULL;
4,926✔
4204
    switch (valNode->node.resType.type) {
4,926!
4205
      case TSDB_DATA_TYPE_NULL:
×
4206
        datum->kind = FLT_SCL_DATUM_KIND_NULL;
×
4207
        FLT_RET(0);
×
4208
      case TSDB_DATA_TYPE_BOOL:
463✔
4209
        pInput = &valNode->datum.b;
463✔
4210
        break;
463✔
4211
      case TSDB_DATA_TYPE_TINYINT:
2,426✔
4212
      case TSDB_DATA_TYPE_SMALLINT:
4213
      case TSDB_DATA_TYPE_INT:
4214
      case TSDB_DATA_TYPE_BIGINT:
4215
      case TSDB_DATA_TYPE_TIMESTAMP:
4216
        pInput = &valNode->datum.i;
2,426✔
4217
        break;
2,426✔
4218
      case TSDB_DATA_TYPE_UTINYINT:
×
4219
      case TSDB_DATA_TYPE_USMALLINT:
4220
      case TSDB_DATA_TYPE_UINT:
4221
      case TSDB_DATA_TYPE_UBIGINT:
4222
        pInput = &valNode->datum.u;
×
4223
        break;
×
4224
      case TSDB_DATA_TYPE_FLOAT:
895✔
4225
      case TSDB_DATA_TYPE_DOUBLE:
4226
        datum->kind = FLT_SCL_DATUM_KIND_FLOAT64;
895✔
4227
        datum->type = valDt;
895✔
4228
        datum->d = valNode->datum.d;
895✔
4229
        FLT_RET(0);
895!
4230
      case TSDB_DATA_TYPE_VARCHAR:
1,143✔
4231
        datum->kind = FLT_SCL_DATUM_KIND_FLOAT64;
1,143✔
4232
        datum->type.type = TSDB_DATA_TYPE_DOUBLE;
1,143✔
4233
        datum->type.bytes = DOUBLE_BYTES;
1,143✔
4234
        datum->d = taosStr2Double(valNode->literal, NULL);
1,143✔
4235
        FLT_RET(0);
1,143!
4236
      case TSDB_DATA_TYPE_DECIMAL64:
×
4237
        datum->kind = FLT_SCL_DATUM_KIND_DECIMAL64;
×
4238
        datum->type = valDt;
×
4239
        datum->i = valNode->datum.i;
×
4240
        FLT_RET(0);
×
4241
      case TSDB_DATA_TYPE_DECIMAL:
×
4242
        datum->kind = FLT_SCL_DATUM_KIND_DECIMAL;
×
4243
        datum->type = valDt;
×
4244
        datum->dec = *(Decimal*)valNode->datum.p;
×
4245
        FLT_RET(0);
×
4246
      default:
×
4247
        qError("not supported type %d when build decimal datum from value node", valNode->node.resType.type);
×
4248
        return TSDB_CODE_INVALID_PARA;
×
4249
    }
4250

4251
    void *pData = NULL;
2,889✔
4252
    if (datum->type.type == TSDB_DATA_TYPE_DECIMAL64) {
2,889✔
4253
      pData = &datum->i;
792✔
4254
      datum->kind = FLT_SCL_DATUM_KIND_DECIMAL64;
792✔
4255
    } else if (datum->type.type == TSDB_DATA_TYPE_DECIMAL) {
2,097!
4256
      pData = &datum->dec;
2,097✔
4257
      datum->kind = FLT_SCL_DATUM_KIND_DECIMAL;
2,097✔
4258
    }
4259
    if (datum->kind == FLT_SCL_DATUM_KIND_DECIMAL64 || datum->kind == FLT_SCL_DATUM_KIND_DECIMAL) {
2,889!
4260
      int32_t code = convertToDecimal(pInput, &valDt, pData, &datum->type);
2,889✔
4261
      if (TSDB_CODE_SUCCESS != code) return code;
2,885✔
4262
    }
4263
  }
4264
  FLT_RET(0);
2,665!
4265
}
4266

4267
int32_t fltSclBuildDatumFromValueNode(SFltSclDatum *datum, SColumnNode* pColNode, SValueNode *valNode) {
107,246,610✔
4268
  if (IS_DECIMAL_TYPE(pColNode->node.resType.type)) {
107,246,610!
UNCOV
4269
    return fltSclBuildDecimalDatumFromValueNode(datum, pColNode, valNode);
×
4270
  }
4271
  datum->type = valNode->node.resType;
107,279,917✔
4272

4273
  if (valNode->isNull) {
107,279,917!
4274
    datum->kind = FLT_SCL_DATUM_KIND_NULL;
×
4275
  } else {
4276
    switch (valNode->node.resType.type) {
107,279,917!
4277
      case TSDB_DATA_TYPE_NULL: {
×
4278
        datum->kind = FLT_SCL_DATUM_KIND_NULL;
×
4279
        break;
×
4280
      }
4281
      case TSDB_DATA_TYPE_BOOL: {
12✔
4282
        datum->kind = FLT_SCL_DATUM_KIND_INT64;
12✔
4283
        datum->i = (valNode->datum.b) ? 1 : 0;
12✔
4284
        break;
12✔
4285
      }
4286
      case TSDB_DATA_TYPE_TINYINT:
106,880,312✔
4287
      case TSDB_DATA_TYPE_SMALLINT:
4288
      case TSDB_DATA_TYPE_INT:
4289
      case TSDB_DATA_TYPE_BIGINT:
4290
      case TSDB_DATA_TYPE_TIMESTAMP: {
4291
        datum->kind = FLT_SCL_DATUM_KIND_INT64;
106,880,312✔
4292
        datum->i = valNode->datum.i;
106,880,312✔
4293
        break;
106,880,312✔
4294
      }
4295
      case TSDB_DATA_TYPE_UTINYINT:
139,375✔
4296
      case TSDB_DATA_TYPE_USMALLINT:
4297
      case TSDB_DATA_TYPE_UINT:
4298
      case TSDB_DATA_TYPE_UBIGINT: {
4299
        datum->kind = FLT_SCL_DATUM_KIND_UINT64;
139,375✔
4300
        datum->u = valNode->datum.u;
139,375✔
4301
        break;
139,375✔
4302
      }
4303
      case TSDB_DATA_TYPE_FLOAT:
400,603✔
4304
      case TSDB_DATA_TYPE_DOUBLE: {
4305
        datum->kind = FLT_SCL_DATUM_KIND_FLOAT64;
400,603✔
4306
        datum->d = valNode->datum.d;
400,603✔
4307
        break;
400,603✔
4308
      }
4309
      case TSDB_DATA_TYPE_VARCHAR: {
1,638✔
4310
          datum->kind = FLT_SCL_DATUM_KIND_VARCHAR;
1,638✔
4311
          datum->i = taosStr2Int64(valNode->literal, NULL, 10);
1,638✔
4312
          break;
1,639✔
4313
      }
4314
      case TSDB_DATA_TYPE_NCHAR: {
×
4315
        datum->kind = FLT_SCL_DATUM_KIND_NCHAR;
×
4316
        datum->i = taosStr2Int64(valNode->literal, NULL, 10);
×
4317
        break;
×
4318
      }
UNCOV
4319
      default: {
×
UNCOV
4320
        qDebug("not supported type %d when build datum from value node", valNode->node.resType.type);
×
4321
        break;
×
4322
      }
4323
    }
4324
  }
4325
  return TSDB_CODE_SUCCESS;
107,421,941✔
4326
}
4327

4328
int32_t fltSclBuildDatumFromBlockSmaValue(SFltSclDatum *datum, uint8_t type, void* val) {
114,284✔
4329
  switch (type) {
114,284!
4330
    case TSDB_DATA_TYPE_BOOL:
106,804✔
4331
    case TSDB_DATA_TYPE_TINYINT:
4332
    case TSDB_DATA_TYPE_SMALLINT:
4333
    case TSDB_DATA_TYPE_INT:
4334
    case TSDB_DATA_TYPE_BIGINT:
4335
    case TSDB_DATA_TYPE_TIMESTAMP: {
4336
      datum->kind = FLT_SCL_DATUM_KIND_INT64;
106,804✔
4337
      datum->i = *(int64_t*)val;
106,804✔
4338
      break;
106,804✔
4339
    }
4340
    case TSDB_DATA_TYPE_UTINYINT:
×
4341
    case TSDB_DATA_TYPE_USMALLINT:
4342
    case TSDB_DATA_TYPE_UINT:
4343
    case TSDB_DATA_TYPE_UBIGINT: {
4344
      datum->kind = FLT_SCL_DATUM_KIND_UINT64;
×
4345
      datum->u = *(uint64_t *)val;
×
4346
      break;
×
4347
    }
4348
    case TSDB_DATA_TYPE_FLOAT:
×
4349
    case TSDB_DATA_TYPE_DOUBLE: {
4350
      datum->kind = FLT_SCL_DATUM_KIND_FLOAT64;
×
4351
      datum->d = *(double *)val;
×
4352
      break;
×
4353
    }
4354
    case TSDB_DATA_TYPE_DECIMAL64:
1,760✔
4355
      datum->kind = FLT_SCL_DATUM_KIND_DECIMAL64;
1,760✔
4356
      datum->u = *(uint64_t *)val;
1,760✔
4357
      break;
1,760✔
4358
    case TSDB_DATA_TYPE_DECIMAL:
5,720✔
4359
      datum->kind = FLT_SCL_DATUM_KIND_DECIMAL;
5,720✔
4360
      datum->dec = *(Decimal *)val;
5,720✔
4361
      break;
5,720✔
4362
    case TSDB_DATA_TYPE_VARCHAR: {
×
4363
      datum->kind = FLT_SCL_DATUM_KIND_VARCHAR;
×
4364
      datum->i = *(int64_t*)val;
×
4365
      break;
×
4366
    }
4367
    case TSDB_DATA_TYPE_NCHAR: {
×
4368
      datum->kind = FLT_SCL_DATUM_KIND_NCHAR;
×
4369
      datum->i = *(int64_t*)val;
×
4370
      break;
×
4371
    }
4372
    default: {
×
4373
      datum->kind = FLT_SCL_DATUM_KIND_NULL;
×
4374
      qDebug("not supported type %d when build datum from block sma value", type);
×
4375
      break;
×
4376
    }
4377
  }
4378

4379
  return TSDB_CODE_SUCCESS;
114,284✔
4380
}
4381

4382
int32_t fltSclBuildRangeFromBlockSma(SFltSclColumnRange *colRange, SColumnDataAgg *pAgg, int32_t numOfRows,
57,142✔
4383
                                     SArray *points) {
4384
  if (pAgg->numOfNull == numOfRows) {
57,142!
4385
    SFltSclDatum datum = {.kind = FLT_SCL_DATUM_KIND_NULL};
×
4386
    SFltSclPoint startPt = {.start = true, .excl = false, .val = datum};
×
4387
    SFltSclPoint endPt = {.start = false, .excl = false, .val = datum};
×
4388
    if (NULL == taosArrayPush(points, &startPt)) {
×
4389
      FLT_ERR_RET(terrno);
×
4390
    }
4391
    if (NULL == taosArrayPush(points, &endPt)) {
×
4392
      FLT_ERR_RET(terrno);
×
4393
    }
4394
    return TSDB_CODE_SUCCESS;
×
4395
  }
4396
  if (pAgg->numOfNull > 0) {
57,142✔
4397
    SFltSclDatum nullDatum = {.kind = FLT_SCL_DATUM_KIND_NULL};
8,640✔
4398
    SFltSclPoint startPt = {.start = true, .excl = false, .val = nullDatum};
8,640✔
4399
    SFltSclPoint endPt = {.start = false, .excl = false, .val = nullDatum};
8,640✔
4400
    if (NULL == taosArrayPush(points, &startPt)) {
8,640!
4401
      FLT_ERR_RET(terrno);
×
4402
    }
4403
    if (NULL == taosArrayPush(points, &endPt)) {
8,640!
4404
      FLT_ERR_RET(terrno);
×
4405
    }
4406
  }
4407
  int8_t type = colRange->colNode->node.resType.type;
57,142✔
4408
  SFltSclDatum min = {0};
57,142✔
4409
  min.type = colRange->colNode->node.resType;
57,142✔
4410
  FLT_ERR_RET(fltSclBuildDatumFromBlockSmaValue(&min, type, COL_AGG_GET_MIN_PTR(pAgg, type)));
57,142!
4411
  SFltSclPoint minPt = {.excl = false, .start = true, .val = min};
57,142✔
4412
  SFltSclDatum max = {0};
57,142✔
4413
  max.type = min.type;
57,142✔
4414
  FLT_ERR_RET(fltSclBuildDatumFromBlockSmaValue(&max, type, COL_AGG_GET_MAX_PTR(pAgg, type)));
57,142!
4415
  SFltSclPoint maxPt = {.excl = false, .start = false, .val = max};
57,142✔
4416
  if (NULL == taosArrayPush(points, &minPt)) {
57,142!
4417
    FLT_ERR_RET(terrno);
×
4418
  }
4419
  if (NULL == taosArrayPush(points, &maxPt)) {
57,142!
4420
    FLT_ERR_RET(terrno);
×
4421
  }
4422
  return TSDB_CODE_SUCCESS;
57,142✔
4423
}
4424

4425
int32_t filterRangeExecute(SFilterInfo *info, SColumnDataAgg *pDataStatis, int32_t numOfCols, int32_t numOfRows,
81,961✔
4426
                           bool *keep) {
4427
  if (info->scalarMode) {
81,961✔
4428
    SArray *colRanges = info->sclCtx.fltSclRange;
65,136✔
4429
    for (int32_t i = 0; i < taosArrayGetSize(colRanges); ++i) {
122,250✔
4430
      SFltSclColumnRange *colRange = taosArrayGet(colRanges, i);
57,141✔
4431
      if (NULL == colRange) {
57,142!
4432
        FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
4433
      }
4434
      bool                foundCol = false;
57,142✔
4435
      int32_t             j = 0;
57,142✔
4436
      for (; j < numOfCols; ++j) {
57,194!
4437
        if (pDataStatis[j].colId == colRange->colNode->colId) {
57,194✔
4438
          foundCol = true;
57,142✔
4439
          break;
57,142✔
4440
        }
4441
      }
4442
      if (foundCol) {
57,142!
4443
        SColumnDataAgg *pAgg = &pDataStatis[j];
57,142✔
4444
        SArray         *points = taosArrayInit(2, sizeof(SFltSclPoint));
57,142✔
4445
        if (NULL == points) {
57,142!
4446
          FLT_ERR_RET(terrno);
×
4447
        }
4448
        FLT_ERR_RET(fltSclBuildRangeFromBlockSma(colRange, pAgg, numOfRows, points));
57,142!
4449
        qDebug("column data agg: nulls %d, rows %d, max %" PRId64 " min %" PRId64, pAgg->numOfNull, numOfRows,
57,142✔
4450
               pAgg->max, pAgg->min);
4451

4452
        SArray *merged = taosArrayInit(8, sizeof(SFltSclPoint));
57,142✔
4453
        if (NULL == merged) {
57,141!
4454
          FLT_ERR_RET(terrno);
×
4455
        }
4456
        FLT_ERR_RET(fltSclIntersect(points, colRange->points, merged));
57,141!
4457
        bool isIntersect = taosArrayGetSize(merged) != 0;
57,140✔
4458
        qDebug("filter range execute, scalar mode, column range found. colId: %d colName: %s has overlap: %d",
57,140✔
4459
               colRange->colNode->colId, colRange->colNode->colName, isIntersect);
4460

4461
        taosArrayDestroy(merged);
57,140✔
4462
        taosArrayDestroy(points);
57,142✔
4463
        if (!isIntersect) {
57,140✔
4464
          *keep = false;
26✔
4465
          FLT_RET(TSDB_CODE_SUCCESS);
26!
4466
        }
4467
      }
4468
    }
4469
    *keep = true;
65,108✔
4470
    FLT_RET(TSDB_CODE_SUCCESS);
65,108!
4471
  }
4472

4473
  if (FILTER_EMPTY_RES(info)) {
16,825!
4474
    *keep = false;
×
4475
    FLT_RET(TSDB_CODE_SUCCESS);
×
4476
  }
4477

4478
  if (FILTER_ALL_RES(info)) {
16,825!
4479
    *keep = true;
×
4480
    FLT_RET(TSDB_CODE_SUCCESS);
×
4481
  }
4482

4483
  bool  ret = true;
16,825✔
4484
  void *minVal, *maxVal;
4485

4486
  for (uint32_t k = 0; k < info->colRangeNum; ++k) {
33,570✔
4487
    int32_t          index = -1;
16,742✔
4488
    SFilterRangeCtx *ctx = info->colRange[k];
16,742✔
4489
    for (int32_t i = 0; i < numOfCols; ++i) {
16,762!
4490
      if (pDataStatis[i].colId == ctx->colId) {
16,762✔
4491
        index = i;
16,742✔
4492
        break;
16,742✔
4493
      }
4494
    }
4495

4496
    // no statistics data, load the true data block
4497
    if (index == -1) {
16,742!
4498
      break;
×
4499
    }
4500

4501
    // not support pre-filter operation on binary/nchar data type
4502
    if (FILTER_NO_MERGE_DATA_TYPE(ctx->type)) {
16,742!
4503
      break;
4504
    }
4505

4506
    if (pDataStatis[index].numOfNull <= 0) {
16,743✔
4507
      if (ctx->isnull && !ctx->notnull && !ctx->isrange) {
40!
4508
        ret = false;
×
4509
        break;
×
4510
      }
4511
    } else if (pDataStatis[index].numOfNull > 0) {
16,703✔
4512
      if (pDataStatis[index].numOfNull == numOfRows) {
16,702!
4513
        if ((ctx->notnull || ctx->isrange) && (!ctx->isnull)) {
×
4514
          ret = false;
×
4515
          break;
×
4516
        }
4517

4518
        continue;
2,450✔
4519
      } else {
4520
        if (ctx->isnull) {
16,702✔
4521
          continue;
2,450✔
4522
        }
4523
      }
4524
    }
4525

4526
    SColumnDataAgg *pDataBlockst = &pDataStatis[index];
14,293✔
4527

4528
    SFilterRangeNode *r = ctx->rs;
14,293✔
4529
    float             minv = 0;
14,293✔
4530
    float             maxv = 0;
14,293✔
4531

4532
    if (ctx->type == TSDB_DATA_TYPE_FLOAT) {
14,293!
4533
      minv = (float)(*(double *)(&pDataBlockst->min));
×
4534
      maxv = (float)(*(double *)(&pDataBlockst->max));
×
4535

4536
      minVal = &minv;
×
4537
      maxVal = &maxv;
×
4538
    } else {
4539
      minVal = &pDataBlockst->min;
14,293✔
4540
      maxVal = &pDataBlockst->max;
14,293✔
4541
    }
4542

4543
    while (r) {
14,300✔
4544
      ret = r->rc.func(minVal, maxVal, &r->rc.s, &r->rc.e, ctx->pCompareFunc);
14,274✔
4545
      if (ret) {
14,287✔
4546
        break;
14,280✔
4547
      }
4548
      r = r->next;
7✔
4549
    }
4550

4551
    if (!ret) {
14,306✔
4552
      *keep = ret;
11✔
4553
      FLT_RET(TSDB_CODE_SUCCESS);
11!
4554
    }
4555
  }
4556

4557
  *keep = ret;
16,827✔
4558
  FLT_RET(TSDB_CODE_SUCCESS);
16,827!
4559
}
4560

4561
int32_t filterGetTimeRangeImpl(SFilterInfo *info, STimeWindow *win, bool *isStrict) {
373,993✔
4562
  SFilterRange     ra = {0};
373,993✔
4563
  SFilterRangeCtx *prev = NULL;
373,993✔
4564
  SFilterRangeCtx *tmpc = NULL;
373,993✔
4565
  SFilterRangeCtx *cur = NULL;
373,993✔
4566
  int32_t          num = 0;
373,993✔
4567
  int32_t          optr = 0;
373,993✔
4568
  int32_t          code = 0;
373,993✔
4569
  bool             empty = false, all = false;
373,993✔
4570
  uint32_t         emptyGroups = 0;
373,993✔
4571

4572
  FLT_ERR_JRET(filterInitRangeCtx(TSDB_DATA_TYPE_TIMESTAMP, FLT_OPTION_TIMESTAMP, &prev));
373,993!
4573
  FLT_ERR_JRET(filterInitRangeCtx(TSDB_DATA_TYPE_TIMESTAMP, FLT_OPTION_TIMESTAMP, &tmpc));
374,020!
4574
  for (uint32_t i = 0; i < info->groupNum; ++i) {
737,871✔
4575
    SFilterGroup *group = &info->groups[i];
374,628✔
4576
    if (group->unitNum > 1) {
374,628✔
4577
      cur = tmpc;
305,406✔
4578
      optr = LOGIC_COND_TYPE_AND;
305,406✔
4579
    } else {
4580
      cur = prev;
69,222✔
4581
      optr = LOGIC_COND_TYPE_OR;
69,222✔
4582
    }
4583

4584
    empty = false;
374,628✔
4585
    for (uint32_t u = 0; u < group->unitNum; ++u) {
1,056,879✔
4586
      uint32_t     uidx = group->unitIdxs[u];
682,139✔
4587
      SFilterUnit *unit = &info->units[uidx];
682,139✔
4588

4589
      uint8_t raOptr = FILTER_UNIT_OPTR(unit);
682,139✔
4590

4591
      FLT_ERR_JRET(filterAddRangeOptr(cur, raOptr, LOGIC_COND_TYPE_AND, &empty, NULL));
682,139!
4592
      if (empty) {
682,234✔
4593
        emptyGroups++;
12✔
4594
      }
4595

4596
      if (FILTER_NO_MERGE_OPTR(raOptr)) {
682,234✔
4597
        continue;
28,561✔
4598
      }
4599

4600
      FLT_ERR_JRET(filterAddUnitRange(info, unit, cur, optr));
653,673!
4601
    }
4602

4603
    if (empty) {
374,740✔
4604
      continue;
12✔
4605
    }
4606

4607
    if (cur->notnull) {
374,728✔
4608
      prev->notnull = true;
10,880✔
4609
      break;
10,880✔
4610
    }
4611

4612
    if (group->unitNum > 1) {
363,848✔
4613
      FLT_ERR_JRET(filterSourceRangeFromCtx(prev, cur, LOGIC_COND_TYPE_OR, &empty, &all));
305,401!
4614
      FLT_ERR_JRET(filterResetRangeCtx(cur));
305,422✔
4615
      if (all) {
305,264!
4616
        break;
×
4617
      }
4618
    }
4619
  }
4620

4621
  FLT_CHK_JMP(emptyGroups == info->groupNum);
374,123✔
4622

4623
  if (prev->notnull) {
374,117✔
4624
    TAOS_SET_OBJ_ALIGNED(win, TSWINDOW_INITIALIZER);
10,880✔
4625
  } else {
4626
    FLT_ERR_JRET(filterGetRangeNum(prev, &num));
386,113!
4627

4628
    FLT_CHK_JMP(num < 1);
363,218✔
4629

4630
    if (num > 1) {
340,342✔
4631
      *isStrict = false;
150✔
4632
      qDebug("more than one time range, num:%d", num);
150!
4633
    }
4634

4635
    SFilterRange tra;
4636
    FLT_ERR_JRET(filterGetRangeRes(prev, &tra));
340,342✔
4637
    taosSetInt64Aligned(&win->skey, tra.s);
340,268✔
4638
    taosSetInt64Aligned(&win->ekey, tra.e);
340,268✔
4639
    if (FILTER_GET_FLAG(tra.sflag, RANGE_FLG_EXCLUDE)) {
340,268✔
4640
      win->skey++;
5,126✔
4641
    }
4642
    if (FILTER_GET_FLAG(tra.eflag, RANGE_FLG_EXCLUDE)) {
340,268✔
4643
      win->ekey--;
278,086✔
4644
    }
4645
  }
4646

4647
  (void)filterFreeRangeCtx(prev);  // No need to handle the return value.
351,148✔
4648
  (void)filterFreeRangeCtx(tmpc);  // No need to handle the return value.
351,266✔
4649

4650
  qDebug("qFilter time range:[%" PRId64 "]-[%" PRId64 "]", taosGetInt64Aligned(&win->skey),
552,474✔
4651
         taosGetInt64Aligned(&win->ekey));
4652
  return TSDB_CODE_SUCCESS;
351,272✔
4653

4654
_return:
22,882✔
4655

4656
  TAOS_SET_OBJ_ALIGNED(win, TSWINDOW_DESC_INITIALIZER);
22,882✔
4657

4658
  (void)filterFreeRangeCtx(prev);  // No need to handle the return value.
22,882✔
4659
  (void)filterFreeRangeCtx(tmpc);  // No need to handle the return value.
22,882✔
4660

4661
  qDebug("qFilter time range:[%" PRId64 "]-[%" PRId64 "]", taosGetInt64Aligned(&win->skey),
68,642✔
4662
         taosGetInt64Aligned(&win->ekey));
4663

4664
  return code;
22,882✔
4665
}
4666

4667
static int32_t fltSclGetTimeStampDatum(SFltSclPoint *point, SFltSclDatum *d) {
4,752✔
4668
  *d = point->val;
4,752✔
4669
  d->kind = FLT_SCL_DATUM_KIND_INT64;
4,752✔
4670

4671
  if (point->val.kind == FLT_SCL_DATUM_KIND_MAX) {
4,752✔
4672
    (void)getDataMax(point->val.type.type, &(d->i)); //  No need to handle the return value.
12✔
4673
  } else if (point->val.kind == FLT_SCL_DATUM_KIND_MIN) {
4,740✔
4674
    (void)getDataMin(point->val.type.type, &(d->i)); //  No need to handle the return value.
562✔
4675
  } else if (point->val.kind == FLT_SCL_DATUM_KIND_INT64) {
4,178✔
4676
    if (point->excl) {
2,076✔
4677
      if (point->start) {
12✔
4678
        ++d->i;
10✔
4679
      } else {
4680
        --d->i;
2✔
4681
      }
4682
    }
4683
  } else if (point->val.kind == FLT_SCL_DATUM_KIND_FLOAT64) {
2,102!
4684
    double v = d->d;
2,102✔
4685
    if (point->excl) {
2,102✔
4686
      if (point->start) {
46✔
4687
        d->i = v + 1;
4✔
4688
      }  else {
4689
        d->i = v - 1;
42✔
4690
      }
4691
    } else {
4692
      d->i = v;
2,056✔
4693
    }
4694
  } else if (point->val.kind == FLT_SCL_DATUM_KIND_UINT64) {
×
4695
    uint64_t v = d->u;
×
4696
    if (point->excl) {
×
4697
      if (point->start) {
×
4698
        d->i = v + 1;
×
4699
      }  else {
4700
        d->i = v - 1;
×
4701
      }
4702
    } else {
4703
      d->i = v;
×
4704
    }
4705
  } else {
4706
    qError("not supported type %d when get datum from point", d->type.type);
×
4707
    return TSDB_CODE_FAILED;
×
4708
  }
4709
  return TSDB_CODE_SUCCESS;
4,752✔
4710
}
4711

4712
int32_t filterGetTimeRange(SNode *pNode, STimeWindow *win, bool *isStrict) {
376,711✔
4713
  SFilterInfo *info = NULL;
376,711✔
4714
  int32_t      code = 0;
376,711✔
4715

4716
  *isStrict = true;
376,711✔
4717

4718
  FLT_ERR_JRET(filterInitFromNode(pNode, &info, FLT_OPTION_NO_REWRITE | FLT_OPTION_TIMESTAMP));
376,711✔
4719

4720
  if (info->scalarMode) {
376,680✔
4721
    SArray *colRanges = info->sclCtx.fltSclRange;
2,663✔
4722
    SOperatorNode *optNode = (SOperatorNode *) pNode;
2,663✔
4723
    if (taosArrayGetSize(colRanges) == 1) {
2,663✔
4724
      SFltSclColumnRange *colRange = taosArrayGet(colRanges, 0);
2,439✔
4725
      if (NULL == colRange) {
2,439!
4726
        FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE);
×
4727
      }
4728
      SArray             *points = colRange->points;
2,439✔
4729
      if (taosArrayGetSize(points) == 2) {
2,439✔
4730
        TAOS_SET_OBJ_ALIGNED(win, TSWINDOW_DESC_INITIALIZER);
2,376✔
4731
        SFltSclPoint *startPt = taosArrayGet(points, 0);
2,376✔
4732
        SFltSclPoint *endPt = taosArrayGet(points, 1);
2,376✔
4733
        if (NULL == startPt || NULL == endPt) {
2,376!
4734
          FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE);
×
4735
        }
4736
        SFltSclDatum  start;
4737
        SFltSclDatum  end;
4738
        FLT_ERR_JRET(fltSclGetTimeStampDatum(startPt, &start));
2,376!
4739
        FLT_ERR_JRET(fltSclGetTimeStampDatum(endPt, &end));
2,376!
4740
        taosSetInt64Aligned(&win->skey, start.i);
2,376✔
4741
        taosSetInt64Aligned(&win->ekey, end.i);
2,376✔
4742
        *isStrict = info->isStrict;
2,376✔
4743
        goto _return;
2,376✔
4744
      } else if (taosArrayGetSize(points) == 0) {
63✔
4745
        TAOS_SET_OBJ_ALIGNED(win, TSWINDOW_DESC_INITIALIZER);
20✔
4746
        goto _return;
20✔
4747
      }
4748
    }
4749
    TAOS_SET_OBJ_ALIGNED(win, TSWINDOW_INITIALIZER);
267✔
4750
    *isStrict = false;
267✔
4751
    goto _return;
267✔
4752
  }
4753

4754
  FLT_ERR_JRET(filterGetTimeRangeImpl(info, win, isStrict));
374,017!
4755

4756
_return:
374,001✔
4757

4758
  filterFreeInfo(info);
376,664✔
4759

4760
  FLT_RET(code);
376,800✔
4761
}
4762

4763
int32_t filterConverNcharColumns(SFilterInfo *info, int32_t rows, bool *gotNchar) {
×
4764
  if (FILTER_EMPTY_RES(info) || FILTER_ALL_RES(info)) {
×
4765
    return TSDB_CODE_SUCCESS;
×
4766
  }
4767

4768
  for (uint32_t i = 0; i < info->fields[FLD_TYPE_COLUMN].num; ++i) {
×
4769
    SFilterField *fi = &info->fields[FLD_TYPE_COLUMN].fields[i];
×
4770
    int32_t       type = FILTER_GET_COL_FIELD_TYPE(fi);
×
4771
    if (type == TSDB_DATA_TYPE_NCHAR) {
×
4772
      SFilterField nfi = {0};
×
4773
      nfi.desc = fi->desc;
×
4774
      int32_t bytes = FILTER_GET_COL_FIELD_SIZE(fi);
×
4775
      nfi.data = taosMemoryMalloc(rows * bytes);
×
4776
      if (nfi.data == NULL) {
×
4777
        FLT_ERR_RET(terrno);
×
4778
      }
4779
      int32_t bufSize = bytes - VARSTR_HEADER_SIZE;
×
4780
      for (int32_t j = 0; j < rows; ++j) {
×
4781
        char   *src = FILTER_GET_COL_FIELD_DATA(fi, j);
×
4782
        char   *dst = FILTER_GET_COL_FIELD_DATA(&nfi, j);
×
4783
        int32_t len = 0;
×
4784
        char   *varSrc = varDataVal(src);
×
4785
        size_t  k = 0, varSrcLen = varDataLen(src);
×
4786
        while (k < varSrcLen && varSrc[k++] == -1) {
×
4787
        }
4788
        if (k == varSrcLen) {
×
4789
          /* NULL */
4790
          varDataLen(dst) = (VarDataLenT)varSrcLen;
×
4791
          varDataCopy(dst, src);
×
4792
          continue;
×
4793
        }
4794
        bool ret = taosMbsToUcs4(varDataVal(src), varDataLen(src), (TdUcs4 *)varDataVal(dst), bufSize, &len, NULL);
×
4795
        if (!ret) {
×
4796
          qError("filterConverNcharColumns taosMbsToUcs4 error");
×
4797
          return TSDB_CODE_SCALAR_CONVERT_ERROR;
×
4798
        }
4799
        varDataLen(dst) = len;
×
4800
      }
4801

4802
      fi->data = nfi.data;
×
4803

4804
      *gotNchar = true;
×
4805
    }
4806
  }
4807

4808
  if (*gotNchar) {
×
4809
    FLT_ERR_RET(filterUpdateComUnits(info));
×
4810
  }
4811

4812
  return TSDB_CODE_SUCCESS;
×
4813
}
4814

4815
int32_t filterFreeNcharColumns(SFilterInfo *info) {
×
4816
  for (uint32_t i = 0; i < info->fields[FLD_TYPE_COLUMN].num; ++i) {
×
4817
    SFilterField *fi = &info->fields[FLD_TYPE_COLUMN].fields[i];
×
4818
    int32_t       type = FILTER_GET_COL_FIELD_TYPE(fi);
×
4819
    if (type == TSDB_DATA_TYPE_NCHAR) {
×
4820
      taosMemoryFreeClear(fi->data);
×
4821
    }
4822
  }
4823

4824
  return TSDB_CODE_SUCCESS;
×
4825
}
4826

4827
int32_t fltAddValueNodeToConverList(SFltTreeStat *stat, SValueNode *pNode) {
×
4828
  if (NULL == stat->nodeList) {
×
4829
    stat->nodeList = taosArrayInit(10, POINTER_BYTES);
×
4830
    if (NULL == stat->nodeList) {
×
4831
      FLT_ERR_RET(terrno);
×
4832
    }
4833
  }
4834

4835
  if (NULL == taosArrayPush(stat->nodeList, &pNode)) {
×
4836
    FLT_ERR_RET(terrno);
×
4837
  }
4838

4839
  return TSDB_CODE_SUCCESS;
×
4840
}
4841

4842
EDealRes fltReviseRewriter(SNode **pNode, void *pContext) {
408,801,799✔
4843
  SFltTreeStat *stat = (SFltTreeStat *)pContext;
408,801,799✔
4844

4845
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pNode)) {
408,801,799✔
4846
    SLogicConditionNode *node = (SLogicConditionNode *)*pNode;
3,905,953✔
4847
    SListCell           *cell = node->pParameterList->pHead;
3,905,953✔
4848
    for (int32_t i = 0; i < node->pParameterList->length; ++i) {
16,141,354✔
4849
      if (NULL == cell || NULL == cell->pNode) {
12,234,521!
UNCOV
4850
        fltError("invalid cell");
×
4851
        stat->code = TSDB_CODE_QRY_INVALID_INPUT;
×
4852
        return DEAL_RES_ERROR;
×
4853
      }
4854

4855
      if ((QUERY_NODE_OPERATOR != nodeType(cell->pNode)) && (QUERY_NODE_LOGIC_CONDITION != nodeType(cell->pNode))) {
12,235,401!
4856
        stat->scalarMode = true;
×
4857
      }
4858

4859
      cell = cell->pNext;
12,235,401✔
4860
    }
4861
    if (node->condType == LOGIC_COND_TYPE_NOT) {
3,906,833✔
4862
      stat->scalarMode = true;
1,803✔
4863
    }
4864

4865
    return DEAL_RES_CONTINUE;
3,906,833✔
4866
  }
4867

4868
  if (QUERY_NODE_VALUE == nodeType(*pNode)) {
404,895,846✔
4869
    SValueNode *valueNode = (SValueNode *)*pNode;
378,540,626✔
4870
    if (valueNode->placeholderNo >= 1) {
378,540,626✔
4871
      stat->scalarMode = true;
16✔
4872
      return DEAL_RES_CONTINUE;
16✔
4873
    }
4874
    if (IS_DECIMAL_TYPE(valueNode->node.resType.type)) {
378,540,610!
4875
      stat->scalarMode = true;
137,187✔
4876
      return DEAL_RES_CONTINUE;
137,187✔
4877
    }
4878
    return DEAL_RES_CONTINUE;
378,403,423✔
4879
  }
4880

4881
  if (QUERY_NODE_COLUMN == nodeType(*pNode)) {
26,355,220✔
4882
    SColumnNode *colNode = (SColumnNode *)*pNode;
12,472,133✔
4883
    stat->precision = colNode->node.resType.precision;
12,472,133✔
4884
    if (IS_DECIMAL_TYPE(colNode->node.resType.type)) {
12,472,133✔
4885
      stat->scalarMode = true;
7,499✔
4886
    }
4887
    return DEAL_RES_CONTINUE;
12,472,133✔
4888
  }
4889

4890
  if (QUERY_NODE_NODE_LIST == nodeType(*pNode)) {
13,883,087✔
4891
    SNodeListNode *listNode = (SNodeListNode *)*pNode;
1,665,527✔
4892
    if (QUERY_NODE_VALUE != nodeType(listNode->pNodeList->pHead->pNode)) {
1,665,527!
4893
      stat->scalarMode = true;
×
4894
      return DEAL_RES_CONTINUE;
×
4895
    }
4896

4897
    SValueNode *valueNode = (SValueNode *)listNode->pNodeList->pHead->pNode;
1,665,527✔
4898
    uint8_t     type = valueNode->node.resType.type;
1,665,527✔
4899
    SNode      *node = NULL;
1,665,527✔
4900
    FOREACH(node, listNode->pNodeList) {
373,347,123✔
4901
      uint8_t nodeT = ((SExprNode*)node)->resType.type;
371,682,886✔
4902
      if (type != nodeT || IS_DECIMAL_TYPE(nodeT)) {
371,682,886!
4903
        stat->scalarMode = true;
1,290✔
4904
        return DEAL_RES_CONTINUE;
1,290✔
4905
      }
4906
    }
4907

4908
    return DEAL_RES_CONTINUE;
1,664,237✔
4909
  }
4910

4911
  if (QUERY_NODE_FUNCTION == nodeType(*pNode)) {
12,217,560✔
4912
    stat->scalarMode = true;
231,010✔
4913
    return DEAL_RES_CONTINUE;
231,010✔
4914
  }
4915

4916
  if (QUERY_NODE_CASE_WHEN == nodeType(*pNode) || QUERY_NODE_WHEN_THEN == nodeType(*pNode)) {
11,986,550!
4917
    stat->scalarMode = true;
×
4918
    return DEAL_RES_CONTINUE;
×
4919
  }
4920

4921
  if (QUERY_NODE_OPERATOR == nodeType(*pNode)) {
12,318,664!
4922
    SOperatorNode *node = (SOperatorNode *)*pNode;
12,321,626✔
4923
    if (!FLT_IS_COMPARISON_OPERATOR(node->opType)) {
12,321,626✔
4924
      stat->scalarMode = true;
83,598✔
4925
      return DEAL_RES_CONTINUE;
83,598✔
4926
    }
4927

4928
    if (node->opType == OP_TYPE_NOT_LIKE || node->opType > OP_TYPE_IS_NOT_NULL ||
12,238,028!
4929
        node->opType == OP_TYPE_NOT_EQUAL) {
12,224,128✔
4930
      stat->scalarMode = true;
821,659✔
4931
      return DEAL_RES_CONTINUE;
821,659✔
4932
    }
4933

4934
    if (FILTER_GET_FLAG(stat->info->options, FLT_OPTION_TIMESTAMP) && (node->opType >= OP_TYPE_NOT_EQUAL) &&
11,416,369✔
4935
        (node->opType != OP_TYPE_IS_NULL && node->opType != OP_TYPE_IS_NOT_NULL)) {
29,752✔
4936
      stat->scalarMode = true;
1,182✔
4937
      return DEAL_RES_CONTINUE;
1,182✔
4938
    }
4939

4940
    if (NULL == node->pRight) {
11,415,187✔
4941
      if (scalarGetOperatorParamNum(node->opType) > 1) {
2,020,691✔
4942
        fltError("invalid operator, pRight:%p, nodeType:%d, opType:%d", node->pRight, nodeType(node), node->opType);
736!
4943
        stat->code = TSDB_CODE_APP_ERROR;
×
4944
        return DEAL_RES_ERROR;
×
4945
      }
4946

4947
      if (QUERY_NODE_COLUMN != nodeType(node->pLeft)) {
2,018,885✔
4948
        stat->scalarMode = true;
129,207✔
4949
        return DEAL_RES_CONTINUE;
129,207✔
4950
      }
4951

4952
      if (OP_TYPE_IS_TRUE == node->opType || OP_TYPE_IS_FALSE == node->opType || OP_TYPE_IS_UNKNOWN == node->opType ||
1,889,678!
4953
          OP_TYPE_IS_NOT_TRUE == node->opType || OP_TYPE_IS_NOT_FALSE == node->opType ||
1,891,272✔
4954
          OP_TYPE_IS_NOT_UNKNOWN == node->opType) {
1,890,969✔
4955
        stat->scalarMode = true;
×
4956
        return DEAL_RES_CONTINUE;
×
4957
      }
4958
    } else {
4959
      if ((QUERY_NODE_COLUMN != nodeType(node->pLeft)) && (QUERY_NODE_VALUE != nodeType(node->pLeft))) {
9,394,496✔
4960
        stat->scalarMode = true;
12,080✔
4961
        return DEAL_RES_CONTINUE;
12,080✔
4962
      }
4963

4964
      if ((QUERY_NODE_COLUMN != nodeType(node->pRight)) && (QUERY_NODE_VALUE != nodeType(node->pRight)) &&
9,382,416✔
4965
          (QUERY_NODE_NODE_LIST != nodeType(node->pRight))) {
1,664,700✔
4966
        stat->scalarMode = true;
372✔
4967
        return DEAL_RES_CONTINUE;
372✔
4968
      }
4969

4970
      if (nodeType(node->pLeft) == nodeType(node->pRight)) {
9,382,044✔
4971
        stat->scalarMode = true;
4,202✔
4972
        return DEAL_RES_CONTINUE;
4,202✔
4973
      }
4974

4975
      if (OP_TYPE_JSON_CONTAINS == node->opType) {
9,377,842!
4976
        stat->scalarMode = true;
×
4977
        return DEAL_RES_CONTINUE;
×
4978
      }
4979

4980
      if (QUERY_NODE_COLUMN != nodeType(node->pLeft)) {
9,377,842✔
4981
        SNode *t = node->pLeft;
1,004✔
4982
        node->pLeft = node->pRight;
1,004✔
4983
        node->pRight = t;
1,004✔
4984
        switch (node->opType) {
1,004✔
4985
          case OP_TYPE_GREATER_THAN:
160✔
4986
            node->opType = OP_TYPE_LOWER_THAN;
160✔
4987
            break;
160✔
4988
          case OP_TYPE_LOWER_THAN:
160✔
4989
            node->opType = OP_TYPE_GREATER_THAN;
160✔
4990
            break;
160✔
4991
          case OP_TYPE_GREATER_EQUAL:
162✔
4992
            node->opType = OP_TYPE_LOWER_EQUAL;
162✔
4993
            break;
162✔
4994
          case OP_TYPE_LOWER_EQUAL:
162✔
4995
            node->opType = OP_TYPE_GREATER_EQUAL;
162✔
4996
            break;
162✔
4997
          default:
360✔
4998
            break;
360✔
4999
        }
5000
      }
5001

5002
      if ((OP_TYPE_IN == node->opType || OP_TYPE_NOT_IN == node->opType) && QUERY_NODE_NODE_LIST != nodeType(node->pRight)) {
9,377,842!
5003
        fltError("invalid IN operator node, rightType:%d", nodeType(node->pRight));
×
5004
        stat->code = TSDB_CODE_APP_ERROR;
×
5005
        return DEAL_RES_ERROR;
×
5006
      }
5007

5008
      SColumnNode *refNode = (SColumnNode *)node->pLeft;
9,377,842✔
5009
      SExprNode   *exprNode = NULL;
9,377,842✔
5010
      if (OP_TYPE_IN != node->opType && OP_TYPE_NOT_IN != node->opType) {
17,093,821✔
5011
        SValueNode  *valueNode = (SValueNode *)node->pRight;
7,716,004✔
5012
        if (FILTER_GET_FLAG(stat->info->options, FLT_OPTION_TIMESTAMP) &&
7,716,004✔
5013
            TSDB_DATA_TYPE_UBIGINT == valueNode->node.resType.type && valueNode->datum.u <= INT64_MAX) {
656,174!
5014
          valueNode->node.resType.type = TSDB_DATA_TYPE_BIGINT;
×
5015
        }
5016
        exprNode = &valueNode->node;
7,716,004✔
5017
        int32_t type = vectorGetConvertType(refNode->node.resType.type, exprNode->resType.type);
7,716,004✔
5018
        if (0 != type && type != refNode->node.resType.type) {
7,715,979✔
5019
          stat->scalarMode = true;
1,960,521✔
5020
        }
5021
      } else {
5022
        SNodeListNode *listNode = (SNodeListNode *)node->pRight;
1,661,838✔
5023
        if (LIST_LENGTH(listNode->pNodeList) > 10 || OP_TYPE_NOT_IN == node->opType) {
1,661,838!
5024
          stat->scalarMode = true;
627,811✔
5025
        }
5026
        int32_t type = refNode->node.resType.type;
1,661,838✔
5027
        exprNode = &listNode->node;
1,661,838✔
5028
        SNode* nodeItem = NULL;
1,661,838✔
5029
        FOREACH(nodeItem, listNode->pNodeList) {
373,770,645!
5030
          SValueNode *valueNode = (SValueNode *)nodeItem;
372,094,901✔
5031
          int32_t tmp = vectorGetConvertType(type, valueNode->node.resType.type);
372,094,901✔
5032
          if (tmp != 0){
372,108,807✔
5033
            stat->scalarMode = true;
1,159,379✔
5034
            type = tmp;
1,159,379✔
5035
          }
5036

5037
        }
5038
        if (IS_NUMERIC_TYPE(type)){
1,675,744!
5039
          exprNode->resType.type = type;
1,152,176✔
5040
        }
5041
      }
5042
    }
5043

5044
    return DEAL_RES_CONTINUE;
11,281,401✔
5045
  }
5046

5047
  fltError("invalid node type for filter, type:%d", nodeType(*pNode));
×
5048

5049
  stat->code = TSDB_CODE_QRY_INVALID_INPUT;
×
5050

5051
  return DEAL_RES_ERROR;
×
5052
}
5053

5054
int32_t fltReviseNodes(SFilterInfo *pInfo, SNode **pNode, SFltTreeStat *pStat) {
3,915,168✔
5055
  int32_t code = 0;
3,915,168✔
5056
  nodesRewriteExprPostOrder(pNode, fltReviseRewriter, (void *)pStat);
3,915,168✔
5057

5058
  FLT_ERR_JRET(pStat->code);
3,917,113!
5059

5060
_return:
3,917,113✔
5061

5062
  taosArrayDestroy(pStat->nodeList);
3,917,113✔
5063
  FLT_RET(code);
3,915,613!
5064
}
5065

5066
static int32_t fltSclBuildRangePointsForInOper(SFltSclOperator* oper, SArray* points) {
180,357✔
5067
  SNodeListNode *listNode = (SNodeListNode *)oper->valNode;
180,357✔
5068
  SFltSclDatum minDatum = {.kind = FLT_SCL_DATUM_KIND_INT64, .i = INT64_MAX, .type = oper->colNode->node.resType};
180,357✔
5069
  SFltSclDatum maxDatum = {.kind = FLT_SCL_DATUM_KIND_INT64, .i = INT64_MIN, .type = oper->colNode->node.resType};
180,357✔
5070
  SNode* nodeItem = NULL;
180,357✔
5071
  FOREACH(nodeItem, listNode->pNodeList) {
106,574,766!
5072
    SValueNode *valueNode = (SValueNode *)nodeItem;
106,356,484✔
5073
    SFltSclDatum valDatum;
5074
    FLT_ERR_RET(fltSclBuildDatumFromValueNode(&valDatum, oper->colNode, valueNode));
106,356,484!
5075
    if (valDatum.kind == FLT_SCL_DATUM_KIND_NULL) {
106,388,077!
5076
      continue;
3,165✔
5077
    }
5078
    if (IS_DECIMAL_TYPE(oper->colNode->node.resType.type)) {
106,388,077!
UNCOV
5079
      if (IS_DECIMAL_TYPE(valDatum.type.type)) {
×
UNCOV
5080
        double v = valDatum.type.type == TSDB_DATA_TYPE_DECIMAL64
×
5081
                       ? doubleFromDecimal64(&valDatum.i, valDatum.type.precision, valDatum.type.scale)
627✔
UNCOV
5082
                       : doubleFromDecimal128(&valDatum.dec, valDatum.type.precision, valDatum.type.scale);
×
5083
        if (minDatum.kind == FLT_SCL_DATUM_KIND_FLOAT64) {
2,227✔
5084
          minDatum.d = TMIN(v, minDatum.d);
1,808✔
5085
          maxDatum.d = TMAX(v, maxDatum.d);
1,808✔
5086
        } else if (minDatum.kind == FLT_SCL_DATUM_KIND_INT64) {
419!
5087
          minDatum.d = v;
419✔
5088
          maxDatum.d = v;
419✔
5089
          minDatum.kind = FLT_SCL_DATUM_KIND_FLOAT64;
419✔
5090
          maxDatum.kind = FLT_SCL_DATUM_KIND_FLOAT64;
419✔
5091
        }
5092
      } else if (valDatum.kind == FLT_SCL_DATUM_KIND_FLOAT64) {
938!
5093
        if (minDatum.kind == FLT_SCL_DATUM_KIND_INT64) {
938✔
5094
          minDatum.kind = FLT_SCL_DATUM_KIND_FLOAT64;
181✔
5095
          maxDatum.kind = FLT_SCL_DATUM_KIND_FLOAT64;
181✔
5096
          minDatum.d = TMIN(valDatum.d, minDatum.d);
181!
5097
          maxDatum.d = TMAX(valDatum.d, maxDatum.d);
181✔
5098
        } else {
5099
          minDatum.d = TMIN(valDatum.d, minDatum.d);
757✔
5100
          maxDatum.d = TMAX(valDatum.d, maxDatum.d);
757✔
5101
        }
5102
      }
5103
      continue;
3,165✔
5104
    }
5105
    if(valueNode->node.resType.type == TSDB_DATA_TYPE_FLOAT || valueNode->node.resType.type == TSDB_DATA_TYPE_DOUBLE) {
106,391,244✔
5106
      minDatum.i = TMIN(minDatum.i, valDatum.d);
97,064✔
5107
      maxDatum.i = TMAX(maxDatum.i, valDatum.d);
97,064✔
5108
    } else {
5109
      minDatum.i = TMIN(minDatum.i, valDatum.i);
106,294,180✔
5110
      maxDatum.i = TMAX(maxDatum.i, valDatum.i);
106,294,180✔
5111
    }
5112
  }
5113
  SFltSclPoint startPt = {.start = true, .excl = false, .val = minDatum};
218,282✔
5114
  SFltSclPoint endPt = {.start = false, .excl = false, .val = maxDatum};
218,282✔
5115
  if (NULL == taosArrayPush(points, &startPt)) {
180,438!
5116
    FLT_ERR_RET(terrno);
×
5117
  }
5118
  if (NULL == taosArrayPush(points, &endPt)) {
180,432!
5119
    FLT_ERR_RET(terrno);
×
5120
  }
5121
  FLT_RET(0);
180,430!
5122
}
5123

5124
int32_t fltSclBuildRangePoints(SFltSclOperator *oper, SArray *points) {
1,199,667✔
5125
  switch (oper->type) {
1,199,667!
5126
    case OP_TYPE_GREATER_THAN: {
9,191✔
5127
      SFltSclDatum start;
5128
      FLT_ERR_RET(fltSclBuildDatumFromValueNode(&start, oper->colNode, oper->valNode));
9,191✔
5129
      SFltSclPoint startPt = {.start = true, .excl = true, .val = start};
9,150✔
5130
      SFltSclDatum end = {.kind = FLT_SCL_DATUM_KIND_MAX, .type = oper->colNode->node.resType};
9,150✔
5131
      SFltSclPoint endPt = {.start = false, .excl = false, .val = end};
9,150✔
5132
      if (NULL == taosArrayPush(points, &startPt)) {
9,152!
5133
        FLT_ERR_RET(terrno);
×
5134
      }
5135
      if (NULL == taosArrayPush(points, &endPt)) {
9,151!
5136
        FLT_ERR_RET(terrno);
×
5137
      }
5138
      break;
9,150✔
5139
    }
5140
    case OP_TYPE_GREATER_EQUAL: {
375,032✔
5141
      SFltSclDatum start;
5142
      FLT_ERR_RET(fltSclBuildDatumFromValueNode(&start, oper->colNode, oper->valNode));
375,032✔
5143
      SFltSclPoint startPt = {.start = true, .excl = false, .val = start};
374,901✔
5144
      SFltSclDatum end = {.kind = FLT_SCL_DATUM_KIND_MAX, .type = oper->colNode->node.resType};
374,901✔
5145
      SFltSclPoint endPt = {.start = false, .excl = false, .val = end};
374,901✔
5146
      if (NULL == taosArrayPush(points, &startPt)) {
375,228!
5147
        FLT_ERR_RET(terrno);
×
5148
      }
5149
      if (NULL == taosArrayPush(points, &endPt)) {
375,141!
5150
        FLT_ERR_RET(terrno);
×
5151
      }
5152
      break;
374,991✔
5153
    }
5154
    case OP_TYPE_LOWER_THAN: {
11,425✔
5155
      SFltSclDatum end;
5156
      FLT_ERR_RET(fltSclBuildDatumFromValueNode(&end, oper->colNode, oper->valNode));
11,425✔
5157
      SFltSclPoint endPt = {.start = false, .excl = true, .val = end};
11,386✔
5158
      SFltSclDatum start = {.kind = FLT_SCL_DATUM_KIND_MIN, .type = oper->colNode->node.resType};
11,386✔
5159
      SFltSclPoint startPt = {.start = true, .excl = false, .val = start};
11,386✔
5160
      if (NULL == taosArrayPush(points, &startPt)) {
11,388!
5161
        FLT_ERR_RET(terrno);
×
5162
      }
5163
      if (NULL == taosArrayPush(points, &endPt)) {
11,387!
5164
        FLT_ERR_RET(terrno);
×
5165
      }
5166
      break;
11,387✔
5167
    }
5168
    case OP_TYPE_LOWER_EQUAL: {
379,092✔
5169
      SFltSclDatum end;
5170
      FLT_ERR_RET(fltSclBuildDatumFromValueNode(&end, oper->colNode, oper->valNode));
379,092✔
5171
      SFltSclPoint endPt = {.start = false, .excl = false, .val = end};
379,120✔
5172
      SFltSclDatum start = {.kind = FLT_SCL_DATUM_KIND_MIN, .type = oper->colNode->node.resType};
379,120✔
5173
      SFltSclPoint startPt = {.start = true, .excl = false, .val = start};
379,120✔
5174
      if (NULL == taosArrayPush(points, &startPt)) {
379,295!
5175
        FLT_ERR_RET(terrno);
×
5176
      }
5177
      if (NULL == taosArrayPush(points, &endPt)) {
379,288!
5178
        FLT_ERR_RET(terrno);
×
5179
      }
5180
      break;
378,944✔
5181
    }
5182
    case OP_TYPE_EQUAL: {
7,627✔
5183
      SFltSclDatum valDatum;
5184
      FLT_ERR_RET(fltSclBuildDatumFromValueNode(&valDatum, oper->colNode, oper->valNode));
7,627✔
5185
      SFltSclPoint startPt = {.start = true, .excl = false, .val = valDatum};
7,584✔
5186
      SFltSclPoint endPt = {.start = false, .excl = false, .val = valDatum};
7,584✔
5187
      if (NULL == taosArrayPush(points, &startPt)) {
7,594!
5188
        FLT_ERR_RET(terrno);
×
5189
      }
5190
      if (NULL == taosArrayPush(points, &endPt)) {
7,591!
5191
        FLT_ERR_RET(terrno);
×
5192
      }
5193
      break;
7,586✔
5194
    }
5195
    case OP_TYPE_NOT_EQUAL: {
236,506✔
5196
      SFltSclDatum valDatum;
5197
      FLT_ERR_RET(fltSclBuildDatumFromValueNode(&valDatum, oper->colNode, oper->valNode));
236,506✔
5198
      {
5199
        SFltSclDatum start = {.kind = FLT_SCL_DATUM_KIND_MIN, .type = oper->colNode->node.resType};
236,456✔
5200
        SFltSclPoint startPt = {.start = true, .excl = false, .val = start};
236,456✔
5201
        SFltSclPoint endPt = {.start = false, .excl = true, .val = valDatum};
236,456✔
5202
        if (NULL == taosArrayPush(points, &startPt)) {
236,592!
5203
          FLT_ERR_RET(terrno);
×
5204
        }
5205
        if (NULL == taosArrayPush(points, &endPt)) {
236,608!
5206
          FLT_ERR_RET(terrno);
×
5207
        }
5208
      }
5209
      {
5210
        SFltSclPoint startPt = {.start = true, .excl = true, .val = valDatum};
236,608✔
5211
        SFltSclDatum end = {.kind = FLT_SCL_DATUM_KIND_MAX, .type = oper->colNode->node.resType};
236,608✔
5212
        SFltSclPoint endPt = {.start = false, .excl = false, .val = end};
236,608✔
5213
        if (NULL == taosArrayPush(points, &startPt)) {
236,554!
5214
          FLT_ERR_RET(terrno);
×
5215
        }
5216
        if (NULL == taosArrayPush(points, &endPt)) {
236,390!
5217
          FLT_ERR_RET(terrno);
×
5218
        }
5219
      }
5220
      break;
236,400✔
5221
    }
5222
    case OP_TYPE_IS_NULL: {
×
5223
      SFltSclDatum nullDatum = {.kind = FLT_SCL_DATUM_KIND_NULL};
×
5224
      SFltSclPoint startPt = {.start = true, .excl = false, .val = nullDatum};
×
5225
      SFltSclPoint endPt = {.start = false, .excl = false, .val = nullDatum};
×
5226
      if (NULL == taosArrayPush(points, &startPt)) {
×
5227
        FLT_ERR_RET(terrno);
×
5228
      }
5229
      if (NULL == taosArrayPush(points, &endPt)) {
×
5230
        FLT_ERR_RET(terrno);
×
5231
      }
5232
      break;
×
5233
    }
5234
    case OP_TYPE_IS_NOT_NULL: {
×
5235
      SFltSclDatum minDatum = {.kind = FLT_SCL_DATUM_KIND_MIN, .type = oper->colNode->node.resType};
×
5236
      SFltSclPoint startPt = {.start = true, .excl = false, .val = minDatum};
×
5237
      SFltSclDatum maxDatum = {.kind = FLT_SCL_DATUM_KIND_MAX, .type = oper->colNode->node.resType};
×
5238
      SFltSclPoint endPt = {.start = false, .excl = false, .val = maxDatum};
×
5239
      if (NULL == taosArrayPush(points, &startPt)) {
×
5240
        FLT_ERR_RET(terrno);
×
5241
      }
5242
      if (NULL == taosArrayPush(points, &endPt)) {
×
5243
        FLT_ERR_RET(terrno);
×
5244
      }
5245
      break;
×
5246
    }
5247
    case OP_TYPE_IN: {
180,367✔
5248
      FLT_ERR_RET(fltSclBuildRangePointsForInOper(oper, points));
180,367!
5249
      break;
180,426✔
5250
    }
5251
    default: {
427✔
5252
      qError("not supported operator type : %d when build range points", oper->type);
427!
5253
      break;
×
5254
    }
5255
  }
5256
  return TSDB_CODE_SUCCESS;
1,198,884✔
5257
}
5258

5259
// TODO: process DNF composed of CNF
5260
static int32_t fltSclProcessCNF(SFilterInfo *pInfo, SArray *sclOpListCNF, SArray *colRangeList) {
2,480,212✔
5261
  pInfo->isStrict = true;
2,480,212✔
5262
  size_t sz = taosArrayGetSize(sclOpListCNF);
2,480,212✔
5263
  for (int32_t i = 0; i < sz; ++i) {
3,675,295✔
5264
    SFltSclOperator    *sclOper = taosArrayGet(sclOpListCNF, i);
1,199,228✔
5265
    if (NULL == sclOper) {
1,195,562!
5266
      FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
3,955!
5267
    }
5268

5269
    SFltSclColumnRange *colRange = NULL;
1,195,562✔
5270
    FLT_ERR_RET(fltSclGetOrCreateColumnRange(sclOper->colNode, colRangeList, &colRange));
1,195,562!
5271
    SArray             *points = taosArrayInit(4, sizeof(SFltSclPoint));
1,198,304✔
5272
    if (NULL == points) {
1,199,882!
5273
      FLT_ERR_RET(terrno);
×
5274
    }
5275
    int32_t code = fltSclBuildRangePoints(sclOper, points);
1,199,882✔
5276
    if (code != 0) {
1,199,030✔
5277
      taosArrayDestroy(points);
220✔
5278
      FLT_ERR_RET(code);
220!
5279
    }
5280
    if (taosArrayGetSize(colRange->points) != 0) {
1,198,810✔
5281
      SArray *merged = taosArrayInit(4, sizeof(SFltSclPoint));
205,633✔
5282
      if (NULL == merged) {
206,099!
5283
        FLT_ERR_RET(terrno);
×
5284
      }
5285
      FLT_ERR_RET(fltSclIntersect(colRange->points, points, merged));
206,099!
5286
      taosArrayDestroy(colRange->points);
206,185✔
5287
      taosArrayDestroy(points);
206,199✔
5288
      colRange->points = merged;
206,197✔
5289
      if(merged->size == 0) {
206,197✔
5290
        return TSDB_CODE_SUCCESS;
3,735✔
5291
      }
5292
    } else {
5293
      taosArrayDestroy(colRange->points);
991,266✔
5294
      colRange->points = points;
993,791✔
5295
    }
5296
    if (sclOper->type == OP_TYPE_IN) {
1,196,253✔
5297
      pInfo->isStrict = false;
179,681✔
5298
    }
5299
  }
5300
  return TSDB_CODE_SUCCESS;
2,476,067✔
5301
}
5302

5303
static bool fltSclIsCollectableNode(SNode *pNode) {
6,218,570✔
5304
  if (nodeType(pNode) != QUERY_NODE_OPERATOR) {
6,218,570✔
5305
    return false;
242,112✔
5306
  }
5307

5308
  SOperatorNode *pOper = (SOperatorNode *)pNode;
5,976,458✔
5309
  if (pOper->pLeft == NULL || pOper->pRight == NULL) {
5,976,458!
5310
    return false;
1,032,387✔
5311
  }
5312

5313
  if (!(pOper->opType == OP_TYPE_GREATER_THAN || pOper->opType == OP_TYPE_GREATER_EQUAL ||
4,944,071✔
5314
        pOper->opType == OP_TYPE_LOWER_THAN || pOper->opType == OP_TYPE_LOWER_EQUAL ||
3,425,925✔
5315
        pOper->opType == OP_TYPE_NOT_EQUAL || pOper->opType == OP_TYPE_EQUAL ||
1,982,673✔
5316
        pOper->opType == OP_TYPE_IN)) {
1,226,495✔
5317
    return false;
354,664✔
5318
  }
5319

5320
  if (!((nodeType(pOper->pLeft) == QUERY_NODE_COLUMN && nodeType(pOper->pRight) == QUERY_NODE_VALUE) ||
4,589,407✔
5321
        (nodeType(pOper->pLeft) == QUERY_NODE_COLUMN && nodeType(pOper->pRight) == QUERY_NODE_NODE_LIST))) {
884,494✔
5322
    return false;
12,290✔
5323
  }
5324
  return true;
4,577,117✔
5325
}
5326

5327
static int32_t fltSclCollectOperatorFromNode(SNode *pNode, SArray *sclOpList) {
1,621,256✔
5328
  if (!fltSclIsCollectableNode(pNode)) {
1,621,256✔
5329
    return TSDB_CODE_SUCCESS;
94,803✔
5330
  }
5331

5332
  SOperatorNode *pOper = (SOperatorNode *)pNode;
1,526,761✔
5333

5334
  SExprNode* pLeft = (SExprNode*)pOper->pLeft;
1,526,761✔
5335
  if (IS_NUMERIC_TYPE(pLeft->resType.type) || pLeft->resType.type == TSDB_DATA_TYPE_TIMESTAMP) {
1,526,761✔
5336
    SNode* pLeft = NULL, *pRight = NULL;
1,203,590✔
5337
    int32_t code = nodesCloneNode(pOper->pLeft, &pLeft);
1,203,590✔
5338
    if (TSDB_CODE_SUCCESS != code) {
1,203,665!
5339
      FLT_ERR_RET(code);
×
5340
    }
5341
    code = nodesCloneNode(pOper->pRight, &pRight);
1,203,665✔
5342
    if (TSDB_CODE_SUCCESS != code) {
1,202,965!
5343
      nodesDestroyNode(pLeft);
×
5344
      FLT_ERR_RET(code);
×
5345
    }
5346
    SFltSclOperator sclOp = {.colNode = (SColumnNode *)pLeft,
1,202,965✔
5347
                             .valNode = (SValueNode *)pRight,
5348
                             .type = pOper->opType};
1,202,965✔
5349
    if (NULL == taosArrayPush(sclOpList, &sclOp)) {
1,202,895!
5350
      nodesDestroyNode(pLeft);
×
5351
      nodesDestroyNode(pRight);
×
5352
      FLT_ERR_RET(terrno);
×
5353
    }
5354
  }
5355

5356
  return TSDB_CODE_SUCCESS;
1,526,173✔
5357
}
5358

5359
static int32_t fltSclCollectOperatorsFromLogicCond(SNode *pNode, SArray *sclOpList) {
2,230,725✔
5360
  if (nodeType(pNode) != QUERY_NODE_LOGIC_CONDITION) {
2,230,725!
5361
    return TSDB_CODE_SUCCESS;
×
5362
  }
5363
  SLogicConditionNode *pLogicCond = (SLogicConditionNode *)pNode;
2,230,725✔
5364
  // TODO: support LOGIC_COND_TYPE_OR
5365
  if (pLogicCond->condType != LOGIC_COND_TYPE_AND) {
2,230,725✔
5366
    return TSDB_CODE_SUCCESS;
233,241✔
5367
  }
5368
  SNode *pExpr = NULL;
1,997,484✔
5369
  FOREACH(pExpr, pLogicCond->pParameterList) {
5,047,721!
5370
    if (!fltSclIsCollectableNode(pExpr)) {
4,600,601✔
5371
      return TSDB_CODE_SUCCESS;
1,549,481✔
5372
    }
5373
  }
5374
  FOREACH(pExpr, pLogicCond->pParameterList) {
1,818,278!
5375
    FLT_ERR_RET(fltSclCollectOperatorFromNode(pExpr, sclOpList));
1,371,069!
5376
  }
5377
  return TSDB_CODE_SUCCESS;
447,209✔
5378
}
5379

5380
static int32_t fltSclCollectOperators(SNode *pNode, SArray *sclOpList) {
2,480,534✔
5381
  if (nodeType(pNode) == QUERY_NODE_OPERATOR) {
2,480,534✔
5382
    FLT_ERR_RET(fltSclCollectOperatorFromNode(pNode, sclOpList));
250,046!
5383
  } else if (nodeType(pNode) == QUERY_NODE_LOGIC_CONDITION) {
2,230,488!
5384
    FLT_ERR_RET(fltSclCollectOperatorsFromLogicCond(pNode, sclOpList));
2,230,667!
5385
  }
5386
  return TSDB_CODE_SUCCESS;
2,481,949✔
5387
}
5388

5389
int32_t fltOptimizeNodes(SFilterInfo *pInfo, SNode **pNode, SFltTreeStat *pStat) {
2,479,252✔
5390
  SArray *sclOpList = taosArrayInit(16, sizeof(SFltSclOperator));
2,479,252✔
5391
  int32_t code = TSDB_CODE_SUCCESS;
2,480,944✔
5392
  if (NULL == sclOpList) {
2,480,944!
5393
    FLT_ERR_RET(terrno);
×
5394
  }
5395
  FLT_ERR_JRET(fltSclCollectOperators(*pNode, sclOpList));
2,480,944!
5396
  SArray *colRangeList = taosArrayInit(16, sizeof(SFltSclColumnRange));
2,482,039✔
5397
  if (NULL == colRangeList) {
2,480,634!
5398
    FLT_ERR_JRET(terrno);
×
5399
  }
5400
  FLT_ERR_JRET(fltSclProcessCNF(pInfo, sclOpList, colRangeList));
2,480,634✔
5401
  pInfo->sclCtx.fltSclRange = colRangeList;
2,479,080✔
5402
  colRangeList = NULL;
2,479,080✔
5403

5404
_return:
2,479,300✔
5405
  for (int32_t i = 0; i < taosArrayGetSize(sclOpList); ++i) {
3,683,270✔
5406
    SFltSclOperator *sclOp = taosArrayGet(sclOpList, i);
1,199,311✔
5407
    if (NULL == sclOp) {
1,198,789!
5408
      code = TSDB_CODE_OUT_OF_RANGE;
×
5409
      break;
×
5410
    }
5411
    nodesDestroyNode((SNode *)sclOp->colNode);
1,198,789✔
5412
    nodesDestroyNode((SNode *)sclOp->valNode);
1,203,112✔
5413
  }
5414

5415
  for (int32_t i = 0; i < taosArrayGetSize(colRangeList); ++i) {
2,478,930✔
5416
    SFltSclColumnRange *colRange = taosArrayGet(colRangeList, i);
220✔
5417
    nodesDestroyNode((SNode *)colRange->colNode);
220✔
5418
    taosArrayDestroy(colRange->points);
220✔
5419
  }
5420
  taosArrayDestroy(colRangeList);
2,479,266✔
5421
  taosArrayDestroy(sclOpList);
2,479,830✔
5422
  return code;
2,482,709✔
5423
}
5424

5425
int32_t fltGetDataFromColId(void *param, int32_t id, void **data) {
×
5426
  int32_t numOfCols = ((SFilterColumnParam *)param)->numOfCols;
×
5427
  SArray *pDataBlock = ((SFilterColumnParam *)param)->pDataBlock;
×
5428

5429
  for (int32_t j = 0; j < numOfCols; ++j) {
×
5430
    SColumnInfoData *pColInfo = taosArrayGet(pDataBlock, j);
×
5431
    if (NULL == pColInfo) {
×
5432
      FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
5433
    }
5434
    if (id == pColInfo->info.colId) {
×
5435
      *data = pColInfo;
×
5436
      break;
×
5437
    }
5438
  }
5439

5440
  return TSDB_CODE_SUCCESS;
×
5441
}
5442

5443
int32_t fltGetDataFromSlotId(void *param, int32_t id, void **data) {
1,949,480✔
5444
  int32_t numOfCols = ((SFilterColumnParam *)param)->numOfCols;
1,949,480✔
5445
  SArray *pDataBlock = ((SFilterColumnParam *)param)->pDataBlock;
1,949,480✔
5446
  if (id < 0 || id >= numOfCols || id >= taosArrayGetSize(pDataBlock)) {
1,949,480!
5447
    fltError("invalid slot id, id:%d, numOfCols:%d, arraySize:%d", id, numOfCols,
×
5448
             (int32_t)taosArrayGetSize(pDataBlock));
5449
    return TSDB_CODE_APP_ERROR;
×
5450
  }
5451

5452
  SColumnInfoData *pColInfo = taosArrayGet(pDataBlock, id);
1,949,469✔
5453
  if (NULL == pColInfo) {
1,949,416!
5454
    return TSDB_CODE_OUT_OF_RANGE;
×
5455
  }
5456
  *data = pColInfo;
1,949,416✔
5457

5458
  return TSDB_CODE_SUCCESS;
1,949,416✔
5459
}
5460

5461
int32_t filterSetDataFromSlotId(SFilterInfo *info, void *param) {
5,344,138✔
5462
  if (NULL == info) {
5,344,138!
5463
    return TSDB_CODE_QRY_INVALID_INPUT;
×
5464
  }
5465

5466
  return fltSetColFieldDataImpl(info, param, fltGetDataFromSlotId, false);
5,344,138✔
5467
}
5468

5469
int32_t filterSetDataFromColId(SFilterInfo *info, void *param) {
×
5470
  return fltSetColFieldDataImpl(info, param, fltGetDataFromColId, true);
×
5471
}
5472

5473
int32_t filterInitFromNode(SNode *pNode, SFilterInfo **pInfo, uint32_t options) {
19,558,040✔
5474
  SFilterInfo *info = NULL;
19,558,040✔
5475
  if (pNode == NULL) {
19,558,040✔
5476
    return TSDB_CODE_SUCCESS;
15,654,391✔
5477
  }
5478

5479
  int32_t code = 0;
3,903,649✔
5480
  if (pNode == NULL || pInfo == NULL) {
3,903,649!
5481
    fltError("invalid param");
×
5482
    FLT_ERR_RET(TSDB_CODE_APP_ERROR);
×
5483
  }
5484

5485
  if (*pInfo == NULL) {
3,903,649!
5486
    *pInfo = taosMemoryCalloc(1, sizeof(SFilterInfo));
3,913,599!
5487
    if (NULL == *pInfo) {
3,915,621!
5488
      fltError("taosMemoryCalloc %d failed", (int32_t)sizeof(SFilterInfo));
×
5489
      FLT_ERR_RET(terrno);
×
5490
    }
5491
  }
5492

5493
  info = *pInfo;
3,905,671✔
5494
  info->options = options;
3,905,671✔
5495

5496
  SFltTreeStat stat = {0};
3,905,671✔
5497
  stat.precision = -1;
3,905,671✔
5498
  stat.info = info;
3,905,671✔
5499

5500
  FLT_ERR_JRET(fltReviseNodes(info, &pNode, &stat));
3,905,671✔
5501
  if (tsFilterScalarMode) {
3,912,407✔
5502
    info->scalarMode = true;
1,113✔
5503
  } else {
5504
    info->scalarMode = stat.scalarMode;
3,911,294✔
5505
  }
5506
  fltDebug("scalar mode: %d", info->scalarMode);
3,912,407✔
5507

5508
  if (!info->scalarMode) {
3,916,022✔
5509
    FLT_ERR_JRET(fltInitFromNode(pNode, info, options));
1,434,441✔
5510
  } else {
5511
    info->sclCtx.node = pNode;
2,481,581✔
5512
    FLT_ERR_JRET(fltOptimizeNodes(info, &info->sclCtx.node, &stat));
2,481,581✔
5513
  }
5514

5515
  return TSDB_CODE_SUCCESS;
3,914,596✔
5516

5517
_return:
234✔
5518

5519
  filterFreeInfo(*pInfo);
234✔
5520
  *pInfo = NULL;
234✔
5521
  FLT_RET(code);
234!
5522
}
5523

5524
int32_t filterExecute(SFilterInfo *info, SSDataBlock *pSrc, SColumnInfoData **p, SColumnDataAgg *statis,
5,344,005✔
5525
                      int16_t numOfCols, int32_t *pResultStatus) {
5526
  if (NULL == info) {
5,344,005!
5527
    *pResultStatus = FILTER_RESULT_ALL_QUALIFIED;
×
5528
    return TSDB_CODE_SUCCESS;
×
5529
  }
5530
  int32_t      code = TSDB_CODE_SUCCESS;
5,344,005✔
5531
  SScalarParam output = {0};
5,344,005✔
5532
  SDataType    type = {.type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)};
5,344,005✔
5533

5534
  FLT_ERR_JRET(sclCreateColumnInfoData(&type, pSrc->info.rows, &output));
5,344,005!
5535

5536
  if (info->scalarMode) {
5,344,826✔
5537
    SArray *pList = taosArrayInit(1, POINTER_BYTES);
4,042,709✔
5538
    if (NULL == pList) {
4,042,781!
5539
      FLT_ERR_JRET(terrno);
×
5540
    }
5541
    if (NULL == taosArrayPush(pList, &pSrc)) {
4,042,457!
5542
      taosArrayDestroy(pList);
×
5543
      FLT_ERR_JRET(terrno);
×
5544
    }
5545

5546
    code = scalarCalculate(info->sclCtx.node, pList, &output);
4,042,457✔
5547
    taosArrayDestroy(pList);
4,042,591✔
5548

5549
    *p = output.columnData;
4,042,890✔
5550

5551
    FLT_ERR_JRET(code);
4,042,890✔
5552

5553
    if (output.numOfQualified == output.numOfRows) {
4,042,889✔
5554
      *pResultStatus = FILTER_RESULT_ALL_QUALIFIED;
3,183,828✔
5555
    } else if (output.numOfQualified == 0) {
859,061✔
5556
      *pResultStatus = FILTER_RESULT_NONE_QUALIFIED;
518,444✔
5557
    } else {
5558
      *pResultStatus = FILTER_RESULT_PARTIAL_QUALIFIED;
340,617✔
5559
    }
5560
    return TSDB_CODE_SUCCESS;
4,042,889✔
5561
  }
5562

5563
  *p = output.columnData;
1,302,117✔
5564
  output.numOfRows = pSrc->info.rows;
1,302,117✔
5565

5566
  if (*p == NULL) {
1,302,117!
5567
    fltError("filterExecute failed, column data is NULL");
×
5568
    FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
5569
  }
5570

5571
  bool keepAll = false;
1,302,117✔
5572
  FLT_ERR_JRET((info->func)(info, pSrc->info.rows, *p, statis, numOfCols, &output.numOfQualified, &keepAll));
1,302,117✔
5573

5574
  // todo this should be return during filter procedure
5575
  if (keepAll) {
1,302,119✔
5576
    *pResultStatus = FILTER_RESULT_ALL_QUALIFIED;
945,846✔
5577
  } else {
5578
    int32_t num = 0;
356,273✔
5579
    for (int32_t i = 0; i < output.numOfRows; ++i) {
211,090,403✔
5580
      if (((int8_t *)((*p)->pData))[i] == 1) {
210,734,130✔
5581
        ++num;
64,726,366✔
5582
      }
5583
    }
5584

5585
    if (num == output.numOfRows) {
356,273!
5586
      *pResultStatus = FILTER_RESULT_ALL_QUALIFIED;
×
5587
    } else if (num == 0) {
356,273✔
5588
      *pResultStatus = FILTER_RESULT_NONE_QUALIFIED;
64,285✔
5589
    } else {
5590
      *pResultStatus = FILTER_RESULT_PARTIAL_QUALIFIED;
291,988✔
5591
    }
5592
  }
5593

5594
  return TSDB_CODE_SUCCESS;
1,302,119✔
5595
_return:
1✔
5596
  sclFreeParam(&output);
1✔
5597
  *p = NULL;
1✔
5598
  return code;
1✔
5599
}
5600

5601
typedef struct SClassifyConditionCxt {
5602
  bool hasPrimaryKey;
5603
  bool hasTagIndexCol;
5604
  bool hasTagCol;
5605
  bool hasOtherCol;
5606
} SClassifyConditionCxt;
5607

5608
static EDealRes classifyConditionImpl(SNode *pNode, void *pContext) {
6,488,187✔
5609
  SClassifyConditionCxt *pCxt = (SClassifyConditionCxt *)pContext;
6,488,187✔
5610
  if (QUERY_NODE_COLUMN == nodeType(pNode)) {
6,488,187✔
5611
    SColumnNode *pCol = (SColumnNode *)pNode;
2,083,906✔
5612
    if (PRIMARYKEY_TIMESTAMP_COL_ID == pCol->colId && TSDB_SYSTEM_TABLE != pCol->tableType) {
2,083,906✔
5613
      pCxt->hasPrimaryKey = true;
690,973✔
5614
    } else if (pCol->hasIndex) {
1,392,933✔
5615
      pCxt->hasTagIndexCol = true;
12,792✔
5616
      pCxt->hasTagCol = true;
12,792✔
5617
    } else if (COLUMN_TYPE_TAG == pCol->colType || COLUMN_TYPE_TBNAME == pCol->colType) {
1,380,141✔
5618
      pCxt->hasTagCol = true;
168,845✔
5619
    } else {
5620
      pCxt->hasOtherCol = true;
1,211,296✔
5621
    }
5622
  } else if (QUERY_NODE_FUNCTION == nodeType(pNode)) {
4,404,281✔
5623
    SFunctionNode *pFunc = (SFunctionNode *)pNode;
240,268✔
5624
    if (fmIsPseudoColumnFunc(pFunc->funcId)) {
240,268✔
5625
      if (FUNCTION_TYPE_TBNAME == pFunc->funcType) {
9,345!
5626
        pCxt->hasTagCol = true;
9,345✔
5627
      } else {
5628
        pCxt->hasOtherCol = true;
×
5629
      }
5630
    }
5631
  }
5632
  return DEAL_RES_CONTINUE;
6,488,187✔
5633
}
5634

5635

5636
EConditionType filterClassifyCondition(SNode *pNode) {
1,731,104✔
5637
  SClassifyConditionCxt cxt = {.hasPrimaryKey = false, .hasTagIndexCol = false, .hasOtherCol = false};
1,731,104✔
5638
  nodesWalkExpr(pNode, classifyConditionImpl, &cxt);
1,731,104✔
5639
  return cxt.hasOtherCol ? COND_TYPE_NORMAL
1,731,197✔
5640
                         : (cxt.hasPrimaryKey && cxt.hasTagCol
2,613,764✔
5641
                                ? COND_TYPE_NORMAL
5642
                                : (cxt.hasPrimaryKey ? COND_TYPE_PRIMARY_KEY
882,567✔
5643
                                                     : (cxt.hasTagIndexCol ? COND_TYPE_TAG_INDEX : COND_TYPE_TAG)));
198,203✔
5644
}
5645

5646
int32_t filterIsMultiTableColsCond(SNode *pCond, bool *res) {
1,792,831✔
5647
  SNodeList *pCondCols = NULL;
1,792,831✔
5648
  int32_t code = nodesMakeList(&pCondCols);
1,792,831✔
5649
  if (TSDB_CODE_SUCCESS!= code) {
1,792,930!
5650
    return code;
×
5651
  }
5652
  code = nodesCollectColumnsFromNode(pCond, NULL, COLLECT_COL_TYPE_ALL, &pCondCols);
1,792,930✔
5653
  if (code == TSDB_CODE_SUCCESS) {
1,792,940✔
5654
    if (LIST_LENGTH(pCondCols) >= 2) {
1,792,904✔
5655
      SColumnNode *pFirstCol = (SColumnNode *)nodesListGetNode(pCondCols, 0);
129,547✔
5656
      SNode       *pColNode = NULL;
129,547✔
5657
      FOREACH(pColNode, pCondCols) {
374,712!
5658
        if (strcmp(((SColumnNode *)pColNode)->dbName, pFirstCol->dbName) != 0 ||
306,882✔
5659
            strcmp(((SColumnNode *)pColNode)->tableAlias, pFirstCol->tableAlias) != 0) {
306,813✔
5660
          nodesDestroyList(pCondCols);
61,717✔
5661
          *res = true;
61,717✔
5662
          return TSDB_CODE_SUCCESS;
61,717✔
5663
        }
5664
      }
5665
    }
5666
    nodesDestroyList(pCondCols);
1,731,187✔
5667
  }
5668
  *res = false;
1,731,178✔
5669
  return code;
1,731,178✔
5670
}
5671

5672
static int32_t partitionLogicCond(SNode **pCondition, SNode **pPrimaryKeyCond, SNode **pTagIndexCond, SNode **pTagCond,
586,674✔
5673
                                  SNode **pOtherCond) {
5674
  SLogicConditionNode *pLogicCond = (SLogicConditionNode *)(*pCondition);
586,674✔
5675

5676
  int32_t code = TSDB_CODE_SUCCESS;
586,674✔
5677

5678
  SNodeList *pPrimaryKeyConds = NULL;
586,674✔
5679
  SNodeList *pTagIndexConds = NULL;
586,674✔
5680
  SNodeList *pTagConds = NULL;
586,674✔
5681
  SNodeList *pOtherConds = NULL;
586,674✔
5682
  SNode     *pCond = NULL;
586,674✔
5683
  FOREACH(pCond, pLogicCond->pParameterList) {
1,857,790!
5684
    bool result = false;
1,271,196✔
5685
    code = filterIsMultiTableColsCond(pCond, &result);
1,271,196✔
5686
    if (TSDB_CODE_SUCCESS != code) {
1,271,142!
5687
      break;
×
5688
    }
5689
    if (result) {
1,271,142✔
5690
      if (NULL != pOtherCond) {
61,050✔
5691
        SNode* pNew = NULL;
4✔
5692
        code = nodesCloneNode(pCond, &pNew);
4✔
5693
        if (TSDB_CODE_SUCCESS == code) {
4!
5694
          code = nodesListMakeAppend(&pOtherConds, pNew);
4✔
5695
        }
5696
      }
5697
    } else {
5698
      switch (filterClassifyCondition(pCond)) {
1,210,092✔
5699
        case COND_TYPE_PRIMARY_KEY:
625,094✔
5700
          if (NULL != pPrimaryKeyCond) {
625,094✔
5701
            SNode* pNew = NULL;
625,033✔
5702
            code = nodesCloneNode(pCond, &pNew);
625,033✔
5703
            if (TSDB_CODE_SUCCESS == code) {
625,068!
5704
              code = nodesListMakeAppend(&pPrimaryKeyConds, pNew);
625,071✔
5705
            }
5706
          }
5707
          break;
625,074✔
5708
        case COND_TYPE_TAG_INDEX:
3,640✔
5709
          if (NULL != pTagIndexCond) {
3,640✔
5710
            SNode* pNew = NULL;
1,269✔
5711
            code = nodesCloneNode(pCond, &pNew);
1,269✔
5712
            if (TSDB_CODE_SUCCESS == code) {
1,269!
5713
              code = nodesListMakeAppend(&pTagIndexConds, pNew);
1,269✔
5714
            }
5715
          }
5716
          if (NULL != pTagCond) {
3,640✔
5717
            SNode* pNew = NULL;
1,269✔
5718
            code = nodesCloneNode(pCond, &pNew);
1,269✔
5719
            if (TSDB_CODE_SUCCESS == code) {
1,269!
5720
              code = nodesListMakeAppend(&pTagConds, pNew);
1,269✔
5721
            }
5722
          }
5723
          break;
3,640✔
5724
        case COND_TYPE_TAG:
131,583✔
5725
          if (NULL != pTagCond) {
131,583✔
5726
            SNode* pNew = NULL;
61,458✔
5727
            code = nodesCloneNode(pCond, &pNew);
61,458✔
5728
            if (TSDB_CODE_SUCCESS == code) {
61,458!
5729
              code = nodesListMakeAppend(&pTagConds, pNew);
61,458✔
5730
            }
5731
          }
5732
          break;
131,583✔
5733
        case COND_TYPE_NORMAL:
449,767✔
5734
        default:
5735
          if (NULL != pOtherCond) {
449,767✔
5736
            SNode* pNew = NULL;
249,649✔
5737
            code = nodesCloneNode(pCond, &pNew);
249,649✔
5738
            if (TSDB_CODE_SUCCESS == code) {
249,651!
5739
              code = nodesListMakeAppend(&pOtherConds, pNew);
249,651✔
5740
            }
5741
          }
5742
          break;
449,769✔
5743
      }
5744
    }
5745
    if (TSDB_CODE_SUCCESS != code) {
1,271,116!
5746
      break;
×
5747
    }
5748
  }
5749

5750
  SNode *pTempPrimaryKeyCond = NULL;
586,594✔
5751
  SNode *pTempTagIndexCond = NULL;
586,594✔
5752
  SNode *pTempTagCond = NULL;
586,594✔
5753
  SNode *pTempOtherCond = NULL;
586,594✔
5754
  if (TSDB_CODE_SUCCESS == code) {
586,594!
5755
    code = nodesMergeConds(&pTempPrimaryKeyCond, &pPrimaryKeyConds);
586,684✔
5756
  }
5757
  if (TSDB_CODE_SUCCESS == code) {
586,572!
5758
    code = nodesMergeConds(&pTempTagIndexCond, &pTagIndexConds);
586,665✔
5759
  }
5760
  if (TSDB_CODE_SUCCESS == code) {
586,579!
5761
    code = nodesMergeConds(&pTempTagCond, &pTagConds);
586,658✔
5762
  }
5763
  if (TSDB_CODE_SUCCESS == code) {
586,591!
5764
    code = nodesMergeConds(&pTempOtherCond, &pOtherConds);
586,672✔
5765
  }
5766

5767
  if (TSDB_CODE_SUCCESS == code) {
586,670!
5768
    if (NULL != pPrimaryKeyCond) {
586,670✔
5769
      *pPrimaryKeyCond = pTempPrimaryKeyCond;
586,663✔
5770
    }
5771
    if (NULL != pTagIndexCond) {
586,670✔
5772
      *pTagIndexCond = pTempTagIndexCond;
274,249✔
5773
    }
5774
    if (NULL != pTagCond) {
586,670✔
5775
      *pTagCond = pTempTagCond;
323,966✔
5776
    }
5777
    if (NULL != pOtherCond) {
586,670✔
5778
      *pOtherCond = pTempOtherCond;
323,953✔
5779
    }
5780
    nodesDestroyNode(*pCondition);
586,670✔
5781
    *pCondition = NULL;
586,676✔
5782
  } else {
5783
    nodesDestroyList(pPrimaryKeyConds);
×
5784
    nodesDestroyList(pTagIndexConds);
×
5785
    nodesDestroyList(pTagConds);
×
5786
    nodesDestroyList(pOtherConds);
×
5787
    nodesDestroyNode(pTempPrimaryKeyCond);
×
5788
    nodesDestroyNode(pTempTagIndexCond);
×
5789
    nodesDestroyNode(pTempTagCond);
×
5790
    nodesDestroyNode(pTempOtherCond);
×
5791
  }
5792

5793
  return code;
586,671✔
5794
}
5795

5796
int32_t filterPartitionCond(SNode **pCondition, SNode **pPrimaryKeyCond, SNode **pTagIndexCond, SNode **pTagCond,
1,108,342✔
5797
                            SNode **pOtherCond) {
5798
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pCondition) &&
1,108,342✔
5799
      LOGIC_COND_TYPE_AND == ((SLogicConditionNode *)*pCondition)->condType) {
703,935✔
5800
    return partitionLogicCond(pCondition, pPrimaryKeyCond, pTagIndexCond, pTagCond, pOtherCond);
586,697✔
5801
  }
5802

5803
  bool needOutput = false;
521,645✔
5804
  bool result = false;
521,645✔
5805
  FLT_ERR_RET(filterIsMultiTableColsCond(*pCondition, &result));
521,645✔
5806
  if (result) {
521,749✔
5807
    if (NULL != pOtherCond) {
667✔
5808
      *pOtherCond = *pCondition;
63✔
5809
      needOutput = true;
63✔
5810
    }
5811
  } else {
5812
    switch (filterClassifyCondition(*pCondition)) {
521,082✔
5813
      case COND_TYPE_PRIMARY_KEY:
59,318✔
5814
        if (NULL != pPrimaryKeyCond) {
59,318!
5815
          *pPrimaryKeyCond = *pCondition;
59,318✔
5816
          needOutput = true;
59,318✔
5817
        }
5818
        break;
59,318✔
5819
      case COND_TYPE_TAG_INDEX:
8,517✔
5820
        if (NULL != pTagIndexCond) {
8,517✔
5821
          *pTagIndexCond = *pCondition;
4,638✔
5822
          needOutput = true;
4,638✔
5823
        }
5824
        if (NULL != pTagCond) {
8,517✔
5825
          SNode *pTempCond = *pCondition;
4,794✔
5826
          if (NULL != pTagIndexCond) {
4,794✔
5827
            pTempCond = NULL;
4,638✔
5828
            int32_t code = nodesCloneNode(*pCondition, &pTempCond);
4,638✔
5829
            if (NULL == pTempCond) {
4,638!
5830
              return code;
×
5831
            }
5832
          }
5833
          *pTagCond = pTempCond;
4,794✔
5834
          needOutput = true;
4,794✔
5835
        }
5836
        break;
8,517✔
5837
      case COND_TYPE_TAG:
54,462✔
5838
        if (NULL != pTagCond) {
54,462✔
5839
          *pTagCond = *pCondition;
19,660✔
5840
          needOutput = true;
19,660✔
5841
        }
5842
        break;
54,462✔
5843
      case COND_TYPE_NORMAL:
398,780✔
5844
      default:
5845
        if (NULL != pOtherCond) {
398,780✔
5846
          *pOtherCond = *pCondition;
206,412✔
5847
          needOutput = true;
206,412✔
5848
        }
5849
        break;
398,780✔
5850
    }
5851
  }
5852
  if (needOutput) {
521,744✔
5853
    *pCondition = NULL;
290,246✔
5854
  }
5855

5856
  return TSDB_CODE_SUCCESS;
521,744✔
5857
}
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

© 2025 Coveralls, Inc