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

taosdata / TDengine / #5011

03 Apr 2026 03:59PM UTC coverage: 72.3% (+0.008%) from 72.292%
#5011

push

travis-ci

web-flow
merge: from main to 3.0 branch #35067

4053 of 5985 new or added lines in 68 files covered. (67.72%)

732 existing lines in 143 files now uncovered.

257430 of 356056 relevant lines covered (72.3%)

131834103.52 hits per line

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

77.36
/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) {
1,671,028,591✔
32
  int32_t result = cfunc(maxv, minr);
1,671,028,591✔
33
  return result >= 0;
1,671,015,618✔
34
}
35
bool filterRangeCompGe(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
2,147,483,647✔
36
  int32_t result = cfunc(maxv, minr);
2,147,483,647✔
37
  return result > 0;
2,147,483,647✔
38
}
39
bool filterRangeCompLi(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
2,147,483,647✔
40
  int32_t result = cfunc(minv, maxr);
2,147,483,647✔
41
  return result <= 0;
2,147,483,647✔
42
}
43
bool filterRangeCompLe(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
1,537,733,637✔
44
  int32_t result = cfunc(minv, maxr);
1,537,733,637✔
45
  return result < 0;
1,537,730,008✔
46
}
47
bool filterRangeCompii(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
257,689,794✔
48
  return cfunc(maxv, minr) >= 0 && cfunc(minv, maxr) <= 0;
257,689,794✔
49
}
50
bool filterRangeCompee(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
332,106,539✔
51
  return cfunc(maxv, minr) > 0 && cfunc(minv, maxr) < 0;
332,106,539✔
52
}
53
bool filterRangeCompei(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
440,226,476✔
54
  return cfunc(maxv, minr) > 0 && cfunc(minv, maxr) <= 0;
440,226,476✔
55
}
56
bool filterRangeCompie(const void *minv, const void *maxv, const void *minr, const void *maxr, __compar_fn_t cfunc) {
2,042,455,407✔
57
  return cfunc(maxv, minr) >= 0 && cfunc(minv, maxr) < 0;
2,042,455,407✔
58
}
59

60
rangeCompFunc filterGetRangeCompFunc(char sflag, char eflag) {
21,306,967✔
61
  if (FILTER_GET_FLAG(sflag, RANGE_FLG_NULL)) {
21,306,967✔
62
    if (FILTER_GET_FLAG(eflag, RANGE_FLG_EXCLUDE)) {
4,082,473✔
63
      return filterRangeCompLe;
791,528✔
64
    }
65

66
    return filterRangeCompLi;
3,290,945✔
67
  }
68

69
  if (FILTER_GET_FLAG(eflag, RANGE_FLG_NULL)) {
17,224,494✔
70
    if (FILTER_GET_FLAG(sflag, RANGE_FLG_EXCLUDE)) {
8,393,582✔
71
      return filterRangeCompGe;
3,831,076✔
72
    }
73

74
    return filterRangeCompGi;
4,562,506✔
75
  }
76

77
  if (FILTER_GET_FLAG(sflag, RANGE_FLG_EXCLUDE)) {
8,830,912✔
78
    if (FILTER_GET_FLAG(eflag, RANGE_FLG_EXCLUDE)) {
130,713✔
79
      return filterRangeCompee;
111,404✔
80
    }
81

82
    return filterRangeCompei;
19,309✔
83
  }
84

85
  if (FILTER_GET_FLAG(eflag, RANGE_FLG_EXCLUDE)) {
8,700,199✔
86
    return filterRangeCompie;
101,297✔
87
  }
88

89
  return filterRangeCompii;
8,598,902✔
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) {
63,742,881✔
96
  if (optr2) {
63,742,881✔
97
    if (optr2 != OP_TYPE_LOWER_THAN && optr2 != OP_TYPE_LOWER_EQUAL) {
2,502,021✔
98
      return -1;
×
99
    }
100

101
    if (optr == OP_TYPE_GREATER_THAN) {
2,502,021✔
102
      if (optr2 == OP_TYPE_LOWER_THAN) {
144,553✔
103
        return 0;
125,244✔
104
      }
105

106
      return 1;
19,309✔
107
    }
108

109
    if (optr2 == OP_TYPE_LOWER_THAN) {
2,357,468✔
110
      return 2;
103,625✔
111
    }
112

113
    return 3;
2,253,843✔
114
  } else {
115
    switch (optr) {
61,240,860✔
116
      case OP_TYPE_GREATER_THAN:
6,392,532✔
117
        return 4;
6,392,532✔
118
      case OP_TYPE_GREATER_EQUAL:
6,750,008✔
119
        return 5;
6,750,008✔
120
      case OP_TYPE_LOWER_THAN:
3,162,468✔
121
        return 6;
3,162,468✔
122
      case OP_TYPE_LOWER_EQUAL:
3,337,534✔
123
        return 7;
3,337,534✔
124
      default:
41,598,318✔
125
        break;
41,598,318✔
126
    }
127
  }
128

129
  return -1;
41,598,318✔
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) {
136,844,972✔
186
  int32_t code = TSDB_CODE_SUCCESS;
136,844,972✔
187
  if (optr == OP_TYPE_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_VARBINARY &&
136,844,972✔
188
                             type != TSDB_DATA_TYPE_NCHAR && type != TSDB_DATA_TYPE_GEOMETRY)) {
10,043,795✔
189
    switch (type) {
10,008,370✔
190
      case TSDB_DATA_TYPE_BOOL:
531,366✔
191
      case TSDB_DATA_TYPE_TINYINT:
192
      case TSDB_DATA_TYPE_UTINYINT:
193
        *comparFn = 15;
531,366✔
194
        break;
531,366✔
195
      case TSDB_DATA_TYPE_SMALLINT:
346,632✔
196
      case TSDB_DATA_TYPE_USMALLINT:
197
        *comparFn = 16;
346,632✔
198
        break;
346,632✔
199
      case TSDB_DATA_TYPE_INT:
1,594,467✔
200
      case TSDB_DATA_TYPE_UINT:
201
      case TSDB_DATA_TYPE_FLOAT:
202
        *comparFn = 17;
1,594,467✔
203
        break;
1,594,467✔
204
      case TSDB_DATA_TYPE_BIGINT:
7,034,932✔
205
      case TSDB_DATA_TYPE_UBIGINT:
206
      case TSDB_DATA_TYPE_DOUBLE:
207
      case TSDB_DATA_TYPE_TIMESTAMP:
208
        *comparFn = 18;
7,034,932✔
209
        break;
7,037,695✔
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:
497,475✔
215
      case TSDB_DATA_TYPE_DECIMAL:
216
        *comparFn = 33;
497,475✔
217
        break;
497,475✔
218
      default:
3,498✔
219
        *comparFn = 0;
3,498✔
220
        break;
×
221
    }
222
    return code;
10,007,635✔
223
  }
224

225
  if (optr == OP_TYPE_NOT_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_VARBINARY &&
126,836,602✔
226
                                 type != TSDB_DATA_TYPE_NCHAR && type != TSDB_DATA_TYPE_GEOMETRY)) {
4,299,634✔
227
    switch (type) {
4,285,230✔
228
      case TSDB_DATA_TYPE_BOOL:
138,450✔
229
      case TSDB_DATA_TYPE_TINYINT:
230
      case TSDB_DATA_TYPE_UTINYINT:
231
        *comparFn = 21;
138,450✔
232
        break;
138,450✔
233
      case TSDB_DATA_TYPE_SMALLINT:
173,600✔
234
      case TSDB_DATA_TYPE_USMALLINT:
235
        *comparFn = 22;
173,600✔
236
        break;
173,600✔
237
      case TSDB_DATA_TYPE_INT:
733,144✔
238
      case TSDB_DATA_TYPE_UINT:
239
      case TSDB_DATA_TYPE_FLOAT:
240
        *comparFn = 23;
733,144✔
241
        break;
733,144✔
242
      case TSDB_DATA_TYPE_BIGINT:
2,967,261✔
243
      case TSDB_DATA_TYPE_UBIGINT:
244
      case TSDB_DATA_TYPE_DOUBLE:
245
      case TSDB_DATA_TYPE_TIMESTAMP:
246
        *comparFn = 24;
2,967,261✔
247
        break;
2,967,261✔
248
      case TSDB_DATA_TYPE_JSON:
×
249
        *comparFn = 0;
×
250
        code = TSDB_CODE_QRY_JSON_IN_ERROR;
×
251
        break;
×
252
      case TSDB_DATA_TYPE_DECIMAL64:
272,131✔
253
      case TSDB_DATA_TYPE_DECIMAL:
254
        *comparFn = 34;
272,131✔
255
        break;
272,131✔
256
      default:
644✔
257
        *comparFn = 0;
644✔
258
        break;
×
259
    }
260
    return code;
4,284,586✔
261
  }
262

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

267
  switch (type) {
122,551,372✔
268
    case TSDB_DATA_TYPE_NULL:
244,772✔
269
    case TSDB_DATA_TYPE_JSON: 
270
      // ignore types
271
      *comparFn = 0;
244,772✔
272
      break;
244,772✔
273
    case TSDB_DATA_TYPE_BOOL:
14,641,716✔
274
    case TSDB_DATA_TYPE_TINYINT:
275
      *comparFn = 1;
14,641,716✔
276
      break;
14,641,037✔
277
    case TSDB_DATA_TYPE_SMALLINT:
5,522,560✔
278
      *comparFn = 2;
5,522,560✔
279
      break;
5,523,247✔
280
    case TSDB_DATA_TYPE_INT:
10,582,620✔
281
      *comparFn = 0;
10,582,620✔
282
      break;
10,588,111✔
283
    case TSDB_DATA_TYPE_BIGINT:
36,557,566✔
284
    case TSDB_DATA_TYPE_TIMESTAMP:
285
      *comparFn = 3;
36,557,566✔
286
      break;
36,563,887✔
287
    case TSDB_DATA_TYPE_FLOAT:
2,809,360✔
288
      *comparFn = 4;
2,809,360✔
289
      break;
2,810,651✔
290
    case TSDB_DATA_TYPE_DOUBLE:
9,870,460✔
291
      *comparFn = 5;
9,870,460✔
292
      break;
9,891,747✔
293
    case TSDB_DATA_TYPE_VARBINARY: {
1,335,359✔
294
      if (optr == OP_TYPE_IN) {
1,335,359✔
295
        *comparFn = 8;
103,572✔
296
      } else if (optr == OP_TYPE_NOT_IN) {
1,231,787✔
297
        *comparFn = 25;
50,620✔
298
      } else { /* normal relational comparFn */
299
        *comparFn = 30;
1,181,167✔
300
      }
301
      break;
1,335,359✔
302
    }
303
    case TSDB_DATA_TYPE_BINARY: {
32,465,386✔
304
      if (optr == OP_TYPE_MATCH) {
32,465,386✔
305
        *comparFn = 19;
6,861,750✔
306
      } else if (optr == OP_TYPE_NMATCH) {
25,603,636✔
307
        *comparFn = 20;
1,453,350✔
308
      } else if (optr == OP_TYPE_LIKE) { /* wildcard query using like operator */
24,150,286✔
309
        *comparFn = 7;
6,491,427✔
310
      } else if (optr == OP_TYPE_NOT_LIKE) { /* wildcard query using like operator */
17,658,859✔
311
        *comparFn = 26;
73,274✔
312
      } else if (optr == OP_TYPE_IN) {
17,585,585✔
313
        *comparFn = 8;
371,334✔
314
      } else if (optr == OP_TYPE_NOT_IN) {
17,214,251✔
315
        *comparFn = 25;
210,599✔
316
      } else { /* normal relational comparFn */
317
        *comparFn = 6;
17,003,652✔
318
      }
319

320
      break;
32,465,385✔
321
    }
322

323
    case TSDB_DATA_TYPE_NCHAR: {
1,691,628✔
324
      if (optr == OP_TYPE_MATCH) {
1,691,628✔
325
        *comparFn = scalarMode ? 28 : 19;
400✔
326
      } else if (optr == OP_TYPE_NMATCH) {
1,691,228✔
327
        *comparFn = scalarMode ? 29 : 20;
400✔
328
      } else if (optr == OP_TYPE_LIKE) {
1,690,828✔
329
        *comparFn = 9;
400✔
330
      } else if (optr == OP_TYPE_NOT_LIKE) {
1,690,428✔
331
        *comparFn = 27;
400✔
332
      } else if (optr == OP_TYPE_IN) {
1,690,028✔
333
        *comparFn = 8;
26,654✔
334
      } else if (optr == OP_TYPE_NOT_IN) {
1,663,374✔
335
        *comparFn = 25;
11,954✔
336
      } else {
337
        *comparFn = 10;
1,651,420✔
338
      }
339
      break;
1,691,628✔
340
    }
341

342
    case TSDB_DATA_TYPE_GEOMETRY: {
389,619✔
343
      if (optr == OP_TYPE_EQUAL || optr == OP_TYPE_NOT_EQUAL || optr == OP_TYPE_IS_NULL ||
389,619✔
344
          optr == OP_TYPE_IS_NOT_NULL) {
345
        *comparFn = 30;
320,343✔
346
      } else if (optr == OP_TYPE_IN) {
69,276✔
347
        *comparFn = 8;
35,804✔
348
      } else if (optr == OP_TYPE_NOT_IN) {
33,472✔
349
        *comparFn = 25;
14,404✔
350
      } else {
351
        *comparFn = 0;
19,068✔
352
        code = TSDB_CODE_QRY_GEO_NOT_SUPPORT_ERROR;
19,068✔
353
      }
354
      break;
389,619✔
355
    }
356

357
    case TSDB_DATA_TYPE_UTINYINT:
1,098,284✔
358
      *comparFn = 11;
1,098,284✔
359
      break;
1,098,284✔
360
    case TSDB_DATA_TYPE_USMALLINT:
1,098,646✔
361
      *comparFn = 12;
1,098,646✔
362
      break;
1,098,646✔
363
    case TSDB_DATA_TYPE_UINT:
1,118,776✔
364
      *comparFn = 13;
1,118,776✔
365
      break;
1,118,776✔
366
    case TSDB_DATA_TYPE_UBIGINT:
1,406,559✔
367
      *comparFn = 14;
1,406,559✔
368
      break;
1,406,559✔
369
    case TSDB_DATA_TYPE_DECIMAL64:
50,082✔
370
      *comparFn = 31;
50,082✔
371
      break;
50,082✔
372
    case TSDB_DATA_TYPE_DECIMAL:
1,605,757✔
373
      *comparFn = 32;
1,605,757✔
374
      break;
1,605,757✔
375
    default:
62,338✔
376
      *comparFn = 0;
62,338✔
377
      code = TSDB_CODE_SCALAR_CONVERT_ERROR;
14✔
378
      break;
14✔
379
  }
380

381
  return code;
122,523,561✔
382
}
383

384
int32_t filterGetCompFunc(__compar_fn_t *func, int32_t type, int32_t optr) {
73,098,541✔
385
  int8_t  compFuncIdx = 0;
73,098,541✔
386
  int32_t code = filterGetCompFuncIdx(type, optr, &compFuncIdx, true);
73,111,872✔
387
  if (TSDB_CODE_SUCCESS == code) *func = gDataCompare[compFuncIdx];
73,085,183✔
388
  return code;
73,068,422✔
389
}
390

391
__compar_fn_t filterGetCompFuncEx(int32_t lType, int32_t rType, int32_t optr) {
73,311,908✔
392
  if (TSDB_DATA_TYPE_NULL == rType || TSDB_DATA_TYPE_JSON == rType) {
73,311,908✔
393
    return NULL;
5,410,354✔
394
  }
395

396
  switch (lType) {
67,903,096✔
397
    case TSDB_DATA_TYPE_TINYINT: {
1,597,413✔
398
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
1,597,413✔
399
        return gInt8SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
1,160,802✔
400
      } else {
401
        return gInt8UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
436,611✔
402
      }
403
      break;
404
    }
405
    case TSDB_DATA_TYPE_SMALLINT: {
2,306,915✔
406
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
2,306,915✔
407
        return gInt16SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
2,162,051✔
408
      } else {
409
        return gInt16UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
144,864✔
410
      }
411
      break;
412
    }
413
    case TSDB_DATA_TYPE_INT: {
15,273,880✔
414
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
15,273,880✔
415
        return gInt32SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
15,127,269✔
416
      } else {
417
        return gInt32UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
146,611✔
418
      }
419
      break;
420
    }
421
    case TSDB_DATA_TYPE_BIGINT: {
9,261,891✔
422
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
9,261,891✔
423
        return gInt64SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
8,971,628✔
424
      } else {
425
        return gInt64UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
290,263✔
426
      }
427
      break;
428
    }
429
    case TSDB_DATA_TYPE_FLOAT: {
8,159,634✔
430
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
8,159,634✔
431
        return gFloatSignCompare[rType - TSDB_DATA_TYPE_TINYINT];
7,869,906✔
432
      } else {
433
        return gFloatUsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
289,728✔
434
      }
435
      break;
436
    }
437
    case TSDB_DATA_TYPE_DOUBLE: {
18,092,932✔
438
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
18,092,932✔
439
        return gDoubleSignCompare[rType - TSDB_DATA_TYPE_TINYINT];
17,948,068✔
440
      } else {
441
        return gDoubleUsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
144,864✔
442
      }
443
      break;
444
    }
445
    case TSDB_DATA_TYPE_UTINYINT: {
6,743,290✔
446
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
6,743,290✔
447
        return gUint8SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
6,634,642✔
448
      } else {
449
        return gUint8UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
108,648✔
450
      }
451
      break;
452
    }
453
    case TSDB_DATA_TYPE_USMALLINT: {
2,301,500✔
454
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
2,301,500✔
455
        return gUint16SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
2,192,652✔
456
      } else {
457
        return gUint16UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
108,848✔
458
      }
459
      break;
460
    }
461
    case TSDB_DATA_TYPE_UINT: {
1,936,650✔
462
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
1,936,650✔
463
        return gUint32SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
1,828,002✔
464
      } else {
465
        return gUint32UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
108,648✔
466
      }
467
      break;
468
    }
469
    case TSDB_DATA_TYPE_UBIGINT: {
1,002,677✔
470
      if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
1,002,677✔
471
        return gUint64SignCompare[rType - TSDB_DATA_TYPE_TINYINT];
894,029✔
472
      } else {
473
        return gUint64UsignCompare[rType - TSDB_DATA_TYPE_UTINYINT];
108,648✔
474
      }
475
      break;
476
    }
477
    default:
1,226,314✔
478
      break;
1,226,314✔
479
  }
480
  return NULL;
1,226,314✔
481
}
482

483
static FORCE_INLINE int32_t filterCompareGroupCtx(const void *pLeft, const void *pRight) {
18,827,612✔
484
  SFilterGroupCtx *left = *((SFilterGroupCtx **)pLeft), *right = *((SFilterGroupCtx **)pRight);
18,827,612✔
485
  if (left->colNum > right->colNum) return 1;
18,831,266✔
486
  if (left->colNum < right->colNum) return -1;
18,603,147✔
487
  return 0;
18,475,459✔
488
}
489

490
int32_t filterInitUnitsFields(SFilterInfo *info) {
97,462,961✔
491
  info->unitSize = FILTER_DEFAULT_UNIT_SIZE;
97,462,961✔
492
  info->units = taosMemoryCalloc(info->unitSize, sizeof(SFilterUnit));
97,471,689✔
493
  if (info->units == NULL) {
97,419,324✔
494
    return terrno;
×
495
  }
496

497
  info->fields[FLD_TYPE_COLUMN].num = 0;
97,423,640✔
498
  info->fields[FLD_TYPE_COLUMN].size = FILTER_DEFAULT_FIELD_SIZE;
97,448,027✔
499
  info->fields[FLD_TYPE_COLUMN].fields = taosMemoryCalloc(info->fields[FLD_TYPE_COLUMN].size, sizeof(SFilterField));
97,448,164✔
500
  if (info->fields[FLD_TYPE_COLUMN].fields == NULL) {
97,434,117✔
501
    return terrno;
×
502
  }
503
  info->fields[FLD_TYPE_VALUE].num = 0;
97,457,123✔
504
  info->fields[FLD_TYPE_VALUE].size = FILTER_DEFAULT_FIELD_SIZE;
97,465,921✔
505
  info->fields[FLD_TYPE_VALUE].fields = taosMemoryCalloc(info->fields[FLD_TYPE_VALUE].size, sizeof(SFilterField));
97,444,484✔
506
  if (info->fields[FLD_TYPE_VALUE].fields == NULL) {
97,439,410✔
507
    return terrno;
×
508
  }
509

510
  return TSDB_CODE_SUCCESS;
97,436,289✔
511
}
512

513
static FORCE_INLINE int32_t filterNewRange(SFilterRangeCtx *ctx, SFilterRange *ra, SFilterRangeNode **r) {
514
  if (ctx->rf) {
95,605,996✔
515
    *r = ctx->rf;
81,730✔
516
    ctx->rf = ctx->rf->next;
81,730✔
517
    (*r)->prev = NULL;
81,730✔
518
    (*r)->next = NULL;
81,730✔
519
  } else {
520
    *r = taosMemoryCalloc(1, sizeof(SFilterRangeNode));
95,501,252✔
521
    if (*r == NULL) {
95,507,007✔
522
      return terrno;
×
523
    }
524
  }
525

526
  FILTER_COPY_RA(&(*r)->ra, ra);
95,590,893✔
527

528
  return TSDB_CODE_SUCCESS;
95,537,190✔
529
}
530

531
int32_t filterInitRangeCtx(int32_t type, int32_t options, SFilterRangeCtx **ctx) {
141,476,555✔
532
  if (type > TSDB_DATA_TYPE_UBIGINT || type < TSDB_DATA_TYPE_BOOL || type == TSDB_DATA_TYPE_BINARY ||
141,476,555✔
533
      type == TSDB_DATA_TYPE_VARBINARY || type == TSDB_DATA_TYPE_NCHAR || type == TSDB_DATA_TYPE_GEOMETRY) {
141,481,504✔
534
    qError("not supported range type:%d", type);
10,343✔
535
    return TSDB_CODE_QRY_FILTER_NOT_SUPPORT_TYPE;
×
536
  }
537

538
  *ctx = taosMemoryCalloc(1, sizeof(SFilterRangeCtx));
141,466,501✔
539
  if (*ctx == NULL) {
141,518,215✔
540
    return terrno;
×
541
  }
542
  (*ctx)->type = type;
141,503,554✔
543
  (*ctx)->options = options;
141,526,522✔
544
  (*ctx)->pCompareFunc = getComparFunc(type, 0);
141,514,944✔
545
  if ((*ctx)->pCompareFunc == NULL) {
141,515,909✔
546
    taosMemoryFree(*ctx);
39✔
547
    return terrno;
×
548
  }
549

550
  return TSDB_CODE_SUCCESS;
141,518,699✔
551
}
552

553
int32_t filterResetRangeCtx(SFilterRangeCtx *ctx) {
15,796,065✔
554
  ctx->status = 0;
15,796,065✔
555

556
  if (ctx->rf == NULL) {
15,797,041✔
557
    ctx->rf = ctx->rs;
15,529,333✔
558
    ctx->rs = NULL;
15,529,770✔
559
    return TSDB_CODE_SUCCESS;
15,529,770✔
560
  }
561

562
  ctx->isnull = false;
267,241✔
563
  ctx->notnull = false;
267,241✔
564
  ctx->isrange = false;
267,241✔
565

566
  SFilterRangeNode *r = ctx->rf;
267,241✔
567

568
  while (r && r->next) {
267,241✔
569
    r = r->next;
×
570
  }
571

572
  r->next = ctx->rs;
267,241✔
573
  ctx->rs = NULL;
267,241✔
574
  return TSDB_CODE_SUCCESS;
267,241✔
575
}
576

577
int32_t filterReuseRangeCtx(SFilterRangeCtx *ctx, int32_t type, int32_t options) {
×
578
  FLT_ERR_RET(filterResetRangeCtx(ctx));
×
579

580
  ctx->type = type;
×
581
  ctx->options = options;
×
582
  ctx->pCompareFunc = getComparFunc(type, 0);
×
583

584
  if (ctx->pCompareFunc == NULL) {
×
585
    return terrno;
×
586
  }
587
  return TSDB_CODE_SUCCESS;
×
588
}
589

590
int32_t filterConvertRange(SFilterRangeCtx *cur, SFilterRange *ra, bool *notNull) {
2,786,847✔
591
  int64_t tmp = 0;
2,786,847✔
592

593
  if (!FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL)) {
2,788,506✔
594
    int32_t sr = cur->pCompareFunc(&ra->s, getDataMin(cur->type, &tmp));
459,693✔
595
    if (sr == 0) {
459,110✔
596
      FILTER_SET_FLAG(ra->sflag, RANGE_FLG_NULL);
122,870✔
597
    }
598
  }
599

600
  if (!FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL)) {
2,787,845✔
601
    int32_t er = cur->pCompareFunc(&ra->e, getDataMax(cur->type, &tmp));
2,071,154✔
602
    if (er == 0) {
2,072,483✔
603
      FILTER_SET_FLAG(ra->eflag, RANGE_FLG_NULL);
1,802,249✔
604
    }
605
  }
606

607
  if (FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL) && FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL)) {
2,786,556✔
608
    *notNull = true;
2,266,077✔
609
  } else {
610
    *notNull = false;
518,287✔
611
  }
612

613
  return TSDB_CODE_SUCCESS;
2,783,203✔
614
}
615

616
int32_t filterAddRangeOptr(void *h, uint8_t raOptr, int32_t optr, bool *empty, bool *all) {
159,357,639✔
617
  SFilterRangeCtx *ctx = (SFilterRangeCtx *)h;
159,357,639✔
618

619
  if (optr == LOGIC_COND_TYPE_AND) {
159,357,639✔
620
    SET_AND_OPTR(ctx, raOptr);
101,072,382✔
621
    if (CHK_AND_OPTR(ctx) || (raOptr == FILTER_DUMMY_EMPTY_OPTR)) {
101,078,963✔
622
      FILTER_SET_FLAG(ctx->status, MR_ST_EMPTY);
26,797✔
623
      *empty = true;
15,592✔
624
    }
625
  } else {
626
    SET_OR_OPTR(ctx, raOptr);
58,285,257✔
627
    if (CHK_OR_OPTR(ctx)) {
58,285,540✔
628
      FILTER_SET_FLAG(ctx->status, MR_ST_ALL);
20,336✔
629
      *all = true;
20,336✔
630
    }
631
  }
632

633
  return TSDB_CODE_SUCCESS;
159,363,351✔
634
}
635

636
int32_t filterAddRangeImpl(void *h, SFilterRange *ra, int32_t optr) {
123,192,173✔
637
  SFilterRangeCtx *ctx = (SFilterRangeCtx *)h;
123,192,173✔
638

639
  if (ctx->rs == NULL) {
123,192,173✔
640
    if ((FILTER_GET_FLAG(ctx->status, MR_ST_START) == 0) ||
93,860,231✔
641
        (FILTER_GET_FLAG(ctx->status, MR_ST_ALL) && (optr == LOGIC_COND_TYPE_AND)) ||
1,140✔
642
        ((!FILTER_GET_FLAG(ctx->status, MR_ST_ALL)) && (optr == LOGIC_COND_TYPE_OR))) {
1,140✔
643
      APPEND_RANGE(ctx, ctx->rs, ra);
187,673,103✔
644
      FILTER_SET_FLAG(ctx->status, MR_ST_START);
93,860,583✔
645
    }
646

647
    return TSDB_CODE_SUCCESS;
93,849,865✔
648
  }
649

650
  SFilterRangeNode *r = ctx->rs;
29,357,711✔
651
  SFilterRangeNode *rn = NULL;
29,352,510✔
652
  int32_t           cr = 0;
29,352,510✔
653

654
  if (optr == LOGIC_COND_TYPE_AND) {
29,352,510✔
655
    while (r != NULL) {
32,092,483✔
656
      cr = ctx->pCompareFunc(&r->ra.s, &ra->e);
24,985,924✔
657
      if (FILTER_GREATER(cr, r->ra.sflag, ra->eflag)) {
24,973,679✔
658
        FREE_FROM_RANGE(ctx, r);
624,129✔
659
        break;
312,399✔
660
      }
661

662
      cr = ctx->pCompareFunc(&ra->s, &r->ra.e);
24,661,949✔
663
      if (FILTER_GREATER(cr, ra->sflag, r->ra.eflag)) {
24,675,356✔
664
        rn = r->next;
94,873✔
665
        FREE_RANGE(ctx, r);
98,174✔
666
        r = rn;
98,174✔
667
        continue;
98,174✔
668
      }
669

670
      cr = ctx->pCompareFunc(&ra->s, &r->ra.s);
24,580,483✔
671
      if (FILTER_GREATER(cr, ra->sflag, r->ra.sflag)) {
24,571,792✔
672
        SIMPLE_COPY_VALUES((char *)&r->ra.s, &ra->s);
801,837✔
673
        cr == 0 ? (r->ra.sflag |= ra->sflag) : (r->ra.sflag = ra->sflag);
802,795✔
674
      }
675

676
      cr = ctx->pCompareFunc(&r->ra.e, &ra->e);
24,574,663✔
677
      if (FILTER_GREATER(cr, r->ra.eflag, ra->eflag)) {
24,569,722✔
678
        SIMPLE_COPY_VALUES((char *)&r->ra.e, &ra->e);
17,560,868✔
679
        cr == 0 ? (r->ra.eflag |= ra->eflag) : (r->ra.eflag = ra->eflag);
17,560,260✔
680
        break;
17,561,879✔
681
      }
682

683
      r = r->next;
7,013,723✔
684
    }
685

686
    return TSDB_CODE_SUCCESS;
24,980,837✔
687
  }
688

689
  // TSDB_RELATION_OR
690

691
  bool smerged = false;
4,362,504✔
692
  bool emerged = false;
4,362,504✔
693

694
  while (r != NULL) {
5,106,260✔
695
    cr = ctx->pCompareFunc(&r->ra.s, &ra->e);
4,513,916✔
696
    if (FILTER_GREATER(cr, r->ra.sflag, ra->eflag)) {
4,510,297✔
697
      if (emerged == false) {
1,017,287✔
698
        INSERT_RANGE(ctx, r, ra);
2,040,066✔
699
      }
700

701
      break;
1,018,159✔
702
    }
703

704
    if (smerged == false) {
3,493,010✔
705
      cr = ctx->pCompareFunc(&ra->s, &r->ra.e);
3,485,805✔
706
      if (FILTER_GREATER(cr, ra->sflag, r->ra.eflag)) {
3,476,301✔
707
        if (r->next) {
616,527✔
708
          r = r->next;
147,474✔
709
          continue;
147,474✔
710
        }
711

712
        APPEND_RANGE(ctx, r, ra);
949,246✔
713
        break;
474,041✔
714
      }
715

716
      cr = ctx->pCompareFunc(&r->ra.s, &ra->s);
2,859,774✔
717
      if (FILTER_GREATER(cr, r->ra.sflag, ra->sflag)) {
2,853,442✔
718
        SIMPLE_COPY_VALUES((char *)&r->ra.s, &ra->s);
129,616✔
719
        cr == 0 ? (r->ra.sflag &= ra->sflag) : (r->ra.sflag = ra->sflag);
137,857✔
720
      }
721

722
      smerged = true;
2,861,683✔
723
    }
724

725
    if (emerged == false) {
2,868,888✔
726
      cr = ctx->pCompareFunc(&ra->e, &r->ra.e);
2,862,072✔
727
      if (FILTER_GREATER(cr, ra->eflag, r->ra.eflag)) {
2,848,933✔
728
        SIMPLE_COPY_VALUES((char *)&r->ra.e, &ra->e);
2,317,233✔
729
        if (cr == 0) {
2,321,889✔
730
          r->ra.eflag &= ra->eflag;
1,729,476✔
731
          break;
1,731,279✔
732
        }
733

734
        r->ra.eflag = ra->eflag;
592,413✔
735
        emerged = true;
595,311✔
736
        r = r->next;
595,311✔
737
        continue;
594,010✔
738
      }
739

740
      break;
537,989✔
741
    }
742

743
    cr = ctx->pCompareFunc(&ra->e, &r->ra.e);
6,816✔
744
    if (FILTER_GREATER(cr, ra->eflag, r->ra.eflag)) {
6,816✔
745
      rn = r->next;
2,272✔
746
      FREE_RANGE(ctx, r);
2,272✔
747
      r = rn;
2,272✔
748

749
      continue;
2,272✔
750
    } else {
751
      SIMPLE_COPY_VALUES(&r->prev->ra.e, (char *)&r->ra.e);
4,544✔
752
      cr == 0 ? (r->prev->ra.eflag &= r->ra.eflag) : (r->prev->ra.eflag = r->ra.eflag);
4,544✔
753
      FREE_RANGE(ctx, r);
4,544✔
754

755
      break;
4,544✔
756
    }
757
  }
758

759
  if (ctx->rs && ctx->rs->next == NULL) {
4,358,356✔
760
    bool notnull;
2,786,632✔
761
    FLT_ERR_RET(filterConvertRange(ctx, &ctx->rs->ra, &notnull));
2,786,565✔
762
    if (notnull) {
2,788,271✔
763
      bool all = false;
2,278,773✔
764
      FREE_FROM_RANGE(ctx, ctx->rs);
4,542,158✔
765
      FLT_ERR_RET(filterAddRangeOptr(h, OP_TYPE_IS_NOT_NULL, optr, NULL, &all));
2,273,105✔
766
      if (all) {
2,272,253✔
767
        FILTER_SET_FLAG(ctx->status, MR_ST_ALL);
2,328✔
768
      }
769
    }
770
  }
771

772
  return TSDB_CODE_SUCCESS;
4,359,047✔
773
}
774

775
int32_t filterAddRange(void *h, SFilterRange *ra, int32_t optr) {
123,177,619✔
776
  SFilterRangeCtx *ctx = (SFilterRangeCtx *)h;
123,177,619✔
777
  int64_t          tmp = 0;
123,177,619✔
778

779
  if (FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL)) {
123,188,361✔
780
    SIMPLE_COPY_VALUES(&ra->s, getDataMin(ctx->type, &tmp));
41,507,291✔
781
    // FILTER_CLR_FLAG(ra->sflag, RA_NULL);
782
  }
783

784
  if (FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL)) {
123,167,065✔
785
    SIMPLE_COPY_VALUES(&ra->e, getDataMax(ctx->type, &tmp));
44,863,542✔
786
    // FILTER_CLR_FLAG(ra->eflag, RA_NULL);
787
  }
788

789
  return filterAddRangeImpl(h, ra, optr);
123,192,395✔
790
}
791

792
int32_t filterAddRangeCtx(void *dst, void *src, int32_t optr) {
42,168,726✔
793
  SFilterRangeCtx *dctx = (SFilterRangeCtx *)dst;
42,168,726✔
794
  SFilterRangeCtx *sctx = (SFilterRangeCtx *)src;
42,168,726✔
795

796
  if (optr != LOGIC_COND_TYPE_OR) {
42,168,726✔
797
    fltError("filterAddRangeCtx get invalid optr:%d", optr);
×
798
    return TSDB_CODE_QRY_FILTER_WRONG_OPTR_TYPE;
×
799
  }
800

801
  if (sctx->rs == NULL) {
42,168,726✔
802
    return TSDB_CODE_SUCCESS;
267,241✔
803
  }
804

805
  SFilterRangeNode *r = sctx->rs;
41,878,994✔
806

807
  while (r) {
83,808,629✔
808
    FLT_ERR_RET(filterAddRange(dctx, &r->ra, optr));
41,909,332✔
809
    r = r->next;
41,918,891✔
810
  }
811

812
  return TSDB_CODE_SUCCESS;
41,899,297✔
813
}
814

815
int32_t filterCopyRangeCtx(void *dst, void *src) {
259,708✔
816
  SFilterRangeCtx *dctx = (SFilterRangeCtx *)dst;
259,708✔
817
  SFilterRangeCtx *sctx = (SFilterRangeCtx *)src;
259,708✔
818

819
  dctx->status = sctx->status;
259,708✔
820

821
  dctx->isnull = sctx->isnull;
259,127✔
822
  dctx->notnull = sctx->notnull;
259,708✔
823
  dctx->isrange = sctx->isrange;
259,708✔
824

825
  SFilterRangeNode *r = sctx->rs;
259,708✔
826
  SFilterRangeNode *dr = dctx->rs;
259,708✔
827

828
  while (r) {
514,760✔
829
    APPEND_RANGE(dctx, dr, &r->ra);
510,104✔
830
    if (dr == NULL) {
255,052✔
831
      dr = dctx->rs;
255,052✔
832
    } else {
833
      dr = dr->next;
×
834
    }
835
    r = r->next;
255,052✔
836
  }
837

838
  return TSDB_CODE_SUCCESS;
259,708✔
839
}
840

841
int32_t filterFinishRange(void *h) {
50,869,129✔
842
  SFilterRangeCtx *ctx = (SFilterRangeCtx *)h;
50,869,129✔
843

844
  if (FILTER_GET_FLAG(ctx->status, MR_ST_FIN)) {
50,869,129✔
845
    return TSDB_CODE_SUCCESS;
23,751,299✔
846
  }
847

848
  if (FILTER_GET_FLAG(ctx->options, FLT_OPTION_TIMESTAMP)) {
27,117,287✔
849
    SFilterRangeNode *r = ctx->rs;
27,116,758✔
850
    SFilterRangeNode *rn = NULL;
27,118,372✔
851

852
    while (r && r->next) {
27,184,476✔
853
      int64_t tmp = 1;
66,143✔
854
      int32_t code = operateVal(&tmp, &r->ra.e, &tmp, OP_TYPE_ADD, ctx->type);
66,143✔
855
      if (code != 0) {
66,143✔
856
        return TSDB_CODE_APP_ERROR;
×
857
      }
858
      if (ctx->pCompareFunc(&tmp, &r->next->ra.s) == 0) {
66,143✔
859
        rn = r->next;
4,544✔
860
        SIMPLE_COPY_VALUES((char *)&r->next->ra.s, (char *)&r->ra.s);
4,544✔
861
        FREE_RANGE(ctx, r);
4,544✔
862
        r = rn;
4,544✔
863

864
        continue;
4,544✔
865
      }
866

867
      r = r->next;
61,599✔
868
    }
869
  }
870

871
  FILTER_SET_FLAG(ctx->status, MR_ST_FIN);
27,119,409✔
872

873
  return TSDB_CODE_SUCCESS;
27,118,317✔
874
}
875

876
int32_t filterGetRangeNum(void *h, int32_t *num) {
27,118,874✔
877
  FLT_ERR_RET(filterFinishRange(h));
27,118,874✔
878

879
  SFilterRangeCtx *ctx = (SFilterRangeCtx *)h;
27,117,698✔
880

881
  *num = 0;
27,117,698✔
882

883
  SFilterRangeNode *r = ctx->rs;
27,118,367✔
884

885
  while (r) {
50,929,131✔
886
    ++(*num);
23,811,825✔
887
    r = r->next;
23,812,231✔
888
  }
889

890
  return TSDB_CODE_SUCCESS;
27,117,306✔
891
}
892

893
int32_t filterGetRangeRes(void *h, SFilterRange *ra) {
23,751,370✔
894
  FLT_ERR_RET(filterFinishRange(h));
23,751,370✔
895

896
  SFilterRangeCtx  *ctx = (SFilterRangeCtx *)h;
23,751,307✔
897
  uint32_t          num = 0;
23,751,307✔
898
  SFilterRangeNode *r = ctx->rs;
23,751,307✔
899

900
  while (r) {
47,564,791✔
901
    if (num) {
23,812,969✔
902
      ra->e = r->ra.e;
61,599✔
903
      ra->eflag = r->ra.eflag;
61,599✔
904
    } else {
905
      FILTER_COPY_RA(ra, &r->ra);
23,751,370✔
906
    }
907

908
    ++num;
23,812,770✔
909
    r = r->next;
23,812,770✔
910
  }
911

912
  if (num == 0) {
23,751,822✔
913
    qError("no range result");
×
914
    return TSDB_CODE_APP_ERROR;
×
915
  }
916

917
  return TSDB_CODE_SUCCESS;
23,751,822✔
918
}
919

920
int32_t filterSourceRangeFromCtx(SFilterRangeCtx *ctx, void *sctx, int32_t optr, bool *empty, bool *all) {
56,045,431✔
921
  SFilterRangeCtx *src = (SFilterRangeCtx *)sctx;
56,045,431✔
922

923
  if (src->isnull) {
56,045,431✔
924
    FLT_ERR_RET(filterAddRangeOptr(ctx, OP_TYPE_IS_NULL, optr, empty, all));
6,008,170✔
925
    if (FILTER_GET_FLAG(ctx->status, MR_ST_ALL)) {
6,007,220✔
926
      *all = true;
9,312✔
927
    }
928
  }
929

930
  if (src->notnull) {
56,048,666✔
931
    FLT_ERR_RET(filterAddRangeOptr(ctx, OP_TYPE_IS_NOT_NULL, optr, empty, all));
7,845,479✔
932
    if (FILTER_GET_FLAG(ctx->status, MR_ST_ALL)) {
7,844,003✔
933
      *all = true;
8,696✔
934
    }
935
  }
936

937
  if (src->isrange) {
56,043,723✔
938
    FLT_ERR_RET(filterAddRangeOptr(ctx, 0, optr, empty, all));
42,183,761✔
939

940
    if (!(optr == LOGIC_COND_TYPE_OR && ctx->notnull)) {
42,167,802✔
941
      FLT_ERR_RET(filterAddRangeCtx(ctx, src, optr));
42,187,928✔
942
    }
943

944
    if (FILTER_GET_FLAG(ctx->status, MR_ST_ALL)) {
42,170,247✔
945
      *all = true;
2,328✔
946
    }
947
  }
948

949
  return TSDB_CODE_SUCCESS;
56,039,777✔
950
}
951

952
int32_t filterFreeRangeCtx(void *h) {
141,543,238✔
953
  if (h == NULL) {
141,543,238✔
954
    return TSDB_CODE_SUCCESS;
×
955
  }
956

957
  SFilterRangeCtx  *ctx = (SFilterRangeCtx *)h;
141,543,238✔
958
  SFilterRangeNode *r = ctx->rs;
141,543,238✔
959
  SFilterRangeNode *rn = NULL;
141,540,558✔
960

961
  while (r) {
218,907,972✔
962
    rn = r->next;
77,383,076✔
963
    taosMemoryFree(r);
77,367,642✔
964
    r = rn;
77,367,414✔
965
  }
966

967
  r = ctx->rf;
141,524,896✔
968
  while (r) {
159,692,245✔
969
    rn = r->next;
18,151,002✔
970
    taosMemoryFree(r);
18,150,963✔
971
    r = rn;
18,149,895✔
972
  }
973

974
  taosMemoryFree(ctx);
141,541,243✔
975

976
  return TSDB_CODE_SUCCESS;
141,512,612✔
977
}
978

979
int32_t filterDetachCnfGroup(SFilterGroup *gp1, SFilterGroup *gp2, SArray *group) {
28,812,674✔
980
  SFilterGroup gp = {0};
28,812,674✔
981

982
  gp.unitNum = gp1->unitNum + gp2->unitNum;
28,815,226✔
983
  gp.unitIdxs = taosMemoryCalloc(gp.unitNum, sizeof(*gp.unitIdxs));
28,818,390✔
984
  if (NULL == gp.unitIdxs) {
28,812,028✔
985
    FLT_ERR_RET(terrno);
×
986
  }
987
  (void)memcpy(gp.unitIdxs, gp1->unitIdxs, gp1->unitNum * sizeof(*gp.unitIdxs));
28,812,028✔
988
  (void)memcpy(gp.unitIdxs + gp1->unitNum, gp2->unitIdxs, gp2->unitNum * sizeof(*gp.unitIdxs));
28,812,561✔
989

990
  gp.unitFlags = NULL;
28,816,071✔
991

992
  if (NULL == taosArrayPush(group, &gp)) {
28,815,453✔
993
    taosMemoryFreeClear(gp.unitIdxs);
×
994
    FLT_ERR_RET(terrno);
×
995
  }
996

997
  return TSDB_CODE_SUCCESS;
28,813,794✔
998
}
999

1000
int32_t filterDetachCnfGroups(SArray *group, SArray *left, SArray *right) {
55,436,998✔
1001
  int32_t leftSize = (int32_t)taosArrayGetSize(left);
55,436,998✔
1002
  int32_t rightSize = (int32_t)taosArrayGetSize(right);
55,436,048✔
1003

1004
  if (taosArrayGetSize(left) <= 0) {
55,440,170✔
1005
    if (taosArrayGetSize(right) <= 0) {
27,566,660✔
1006
      fltDebug("both groups are empty");
4,807✔
1007
      return TSDB_CODE_SUCCESS;
×
1008
    }
1009

1010
    SFilterGroup *gp = NULL;
27,562,223✔
1011
    while ((gp = (SFilterGroup *)taosArrayPop(right)) != NULL) {
56,726,076✔
1012
      if (NULL == taosArrayPush(group, gp)) {
29,163,853✔
1013
        FLT_ERR_RET(terrno);
×
1014
      }
1015
    }
1016

1017
    return TSDB_CODE_SUCCESS;
27,571,468✔
1018
  }
1019

1020
  if (taosArrayGetSize(right) <= 0) {
27,872,272✔
1021
    SFilterGroup *gp = NULL;
×
1022
    while ((gp = (SFilterGroup *)taosArrayPop(left)) != NULL) {
×
1023
      if (NULL == taosArrayPush(group, gp)) {
×
1024
        FLT_ERR_RET(terrno);
×
1025
      }
1026
    }
1027

1028
    return TSDB_CODE_SUCCESS;
×
1029
  }
1030

1031
  for (int32_t l = 0; l < leftSize; ++l) {
56,073,329✔
1032
    SFilterGroup *gp1 = taosArrayGet(left, l);
28,200,740✔
1033
    if (NULL == gp1) {
28,200,233✔
1034
      FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
1035
    }
1036

1037
    for (int32_t r = 0; r < rightSize; ++r) {
57,016,512✔
1038
      SFilterGroup *gp2 = taosArrayGet(right, r);
28,814,007✔
1039
      if (NULL == gp2) {
28,810,976✔
1040
        FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
1041
      }
1042

1043
      FLT_ERR_RET(filterDetachCnfGroup(gp1, gp2, group));
28,810,976✔
1044
    }
1045
  }
1046

1047
  return TSDB_CODE_SUCCESS;
27,872,589✔
1048
}
1049

1050
int32_t filterGetFiledByDesc(SFilterFields *fields, int32_t type, void *v) {
37,843,305✔
1051
  for (uint32_t i = 0; i < fields->num; ++i) {
49,085,391✔
1052
    if (nodesEqualNode(fields->fields[i].desc, v)) {
42,192,752✔
1053
      return i;
30,938,385✔
1054
    }
1055
  }
1056

1057
  return -1;
6,897,762✔
1058
}
1059

1060
int32_t filterGetFiledByData(SFilterInfo *info, int32_t type, void *v, int32_t dataLen, bool *sameBuf) {
5,255,029✔
1061
  if (type == FLD_TYPE_VALUE) {
5,255,029✔
1062
    if (info->pctx.valHash == false) {
5,255,029✔
1063
      qError("value hash is empty");
×
1064
      return -1;
×
1065
    }
1066

1067
    SFilterDataInfo *dInfo = taosHashGet(info->pctx.valHash, v, dataLen);
5,250,098✔
1068
    if (dInfo) {
5,255,610✔
1069
      *sameBuf = (dInfo->addr == v);
2,540,518✔
1070
      return dInfo->idx;
2,540,518✔
1071
    }
1072
  }
1073

1074
  return -1;
2,715,092✔
1075
}
1076

1077
// In the params, we should use void *data instead of void **data, there is no need to use taosMemoryFreeClear(*data) to
1078
// set *data = 0 Besides, fields data value is a pointer, so dataLen should be POINTER_BYTES for better.
1079
int32_t filterAddField(SFilterInfo *info, void *desc, void **data, int32_t type, SFilterFieldId *fid, int32_t dataLen,
234,061,799✔
1080
                       bool freeIfExists, int16_t *srcFlag) {
1081
  int32_t   idx = -1;
234,061,799✔
1082
  uint32_t *num;
1083
  bool      sameBuf = false;
234,061,799✔
1084

1085
  num = &info->fields[type].num;
234,065,796✔
1086

1087
  if (*num > 0) {
234,047,843✔
1088
    if (type == FLD_TYPE_COLUMN) {
79,050,737✔
1089
      idx = filterGetFiledByDesc(&info->fields[type], type, desc);
37,849,768✔
1090
    } else if (data && (*data) && dataLen > 0 && FILTER_GET_FLAG(info->options, FLT_OPTION_NEED_UNIQE)) {
41,200,969✔
1091
      idx = filterGetFiledByData(info, type, *data, dataLen, &sameBuf);
5,251,230✔
1092
    }
1093
  }
1094

1095
  if (idx < 0) {
234,062,353✔
1096
    idx = *num;
200,589,773✔
1097
    if (idx >= info->fields[type].size) {
200,600,142✔
1098
      info->fields[type].size += FILTER_DEFAULT_FIELD_SIZE;
291,876✔
1099
      info->fields[type].fields =
291,459✔
1100
          taosMemoryRealloc(info->fields[type].fields, info->fields[type].size * sizeof(SFilterField));
290,781✔
1101
      if (info->fields[type].fields == NULL) {
291,876✔
1102
        *num = 0;
×
1103
        fltError("taosMemoryRealloc failed, size:%d", (int32_t)(info->fields[type].size * sizeof(SFilterField)));
×
1104
        FLT_ERR_RET(terrno);
×
1105
      }
1106
    }
1107

1108
    info->fields[type].fields[idx].flag = type;
200,586,252✔
1109
    info->fields[type].fields[idx].desc = desc;
200,587,972✔
1110
    info->fields[type].fields[idx].data = data ? *data : NULL;
200,590,155✔
1111

1112
    if (type == FLD_TYPE_COLUMN) {
200,597,722✔
1113
      FILTER_SET_FLAG(info->fields[type].fields[idx].flag, FLD_DATA_NO_FREE);
96,216,789✔
1114
    }
1115

1116
    ++(*num);
200,583,324✔
1117

1118
    if (data && (*data) && dataLen > 0 && FILTER_GET_FLAG(info->options, FLT_OPTION_NEED_UNIQE)) {
200,585,293✔
1119
      if (info->pctx.valHash == NULL) {
9,915,176✔
1120
        info->pctx.valHash = taosHashInit(FILTER_DEFAULT_GROUP_SIZE * FILTER_DEFAULT_VALUE_SIZE,
7,198,743✔
1121
                                          taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, false);
1122
        if (NULL == info->pctx.valHash) {
7,199,546✔
1123
          fltError("taosHashInit failed, size:%d", FILTER_DEFAULT_GROUP_SIZE * FILTER_DEFAULT_VALUE_SIZE);
×
1124
          if (srcFlag) {
×
1125
            FILTER_SET_FLAG(*srcFlag, FLD_DATA_NO_FREE);
×
1126
          }
1127
          FLT_ERR_RET(terrno);
×
1128
        }
1129
      }
1130

1131
      SFilterDataInfo dInfo = {idx, *data};
9,909,619✔
1132
      if (taosHashPut(info->pctx.valHash, *data, dataLen, &dInfo, sizeof(dInfo))) {
9,915,697✔
1133
        fltError("taosHashPut to set failed");
×
1134
        if (srcFlag) {
×
1135
          FILTER_SET_FLAG(*srcFlag, FLD_DATA_NO_FREE);
×
1136
        }
1137
        FLT_ERR_RET(terrno);
×
1138
      }
1139
      if (srcFlag) {
9,912,824✔
1140
        FILTER_SET_FLAG(*srcFlag, FLD_DATA_NO_FREE);
63,856✔
1141
      }
1142
    }
1143
  } else if (type != FLD_TYPE_COLUMN && data) {
33,472,580✔
1144
    if (freeIfExists) {
2,540,518✔
1145
      taosMemoryFreeClear(*data);
2,444,428✔
1146
    } else if (sameBuf && srcFlag) {
96,090✔
1147
      FILTER_SET_FLAG(*srcFlag, FLD_DATA_NO_FREE);
32,030✔
1148
    }
1149
  }
1150

1151
  fid->type = type;
234,055,088✔
1152
  fid->idx = idx;
234,062,845✔
1153

1154
  return TSDB_CODE_SUCCESS;
234,065,384✔
1155
}
1156

1157
static FORCE_INLINE int32_t filterAddColFieldFromField(SFilterInfo *info, SFilterField *field, SFilterFieldId *fid) {
1158
  int32_t code = filterAddField(info, field->desc, &field->data, FILTER_GET_TYPE(field->flag), fid, 0, false, NULL);
9,710,552✔
1159

1160
  FILTER_SET_FLAG(field->flag, FLD_DATA_NO_FREE);
9,712,206✔
1161

1162
  return code;
9,711,827✔
1163
}
1164

1165
int32_t filterAddFieldFromNode(SFilterInfo *info, SNode *node, SFilterFieldId *fid) {
233,387,109✔
1166
  if (node == NULL) {
233,387,109✔
1167
    fltDebug("empty node");
24,029,381✔
1168
    goto _return;
24,029,790✔
1169
  }
1170

1171
  if (nodeType(node) != QUERY_NODE_COLUMN && nodeType(node) != QUERY_NODE_VALUE &&
209,357,728✔
1172
      nodeType(node) != QUERY_NODE_NODE_LIST) {
88,184✔
1173
    goto _return;
×
1174
  }
1175

1176
  int32_t type;
1177
  void   *v;
1178

1179
  if (nodeType(node) == QUERY_NODE_COLUMN) {
209,362,299✔
1180
    type = FLD_TYPE_COLUMN;
117,283,310✔
1181
    v = node;
117,283,310✔
1182
  } else {
1183
    type = FLD_TYPE_VALUE;
92,069,214✔
1184
    v = node;
92,069,214✔
1185
  }
1186

1187
  FLT_ERR_RET(filterAddField(info, v, NULL, type, fid, 0, true, NULL));
209,352,524✔
1188

1189
_return:
209,371,943✔
1190
  return TSDB_CODE_SUCCESS;
233,401,733✔
1191
}
1192

1193
int32_t filterAddUnitImpl(SFilterInfo *info, uint8_t optr, SFilterFieldId *left, SFilterFieldId *right, uint8_t optr2,
128,363,323✔
1194
                          SFilterFieldId *right2, uint32_t *uidx) {
1195
  if (FILTER_GET_FLAG(info->options, FLT_OPTION_NEED_UNIQE)) {
128,363,323✔
1196
    if (info->pctx.unitHash == NULL) {
9,871,771✔
1197
      info->pctx.unitHash = taosHashInit(FILTER_DEFAULT_GROUP_SIZE * FILTER_DEFAULT_UNIT_SIZE,
7,210,107✔
1198
                                         taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, false);
1199
      if (NULL == info->pctx.unitHash) {
7,208,369✔
1200
        fltError("taosHashInit failed, size:%d", FILTER_DEFAULT_GROUP_SIZE * FILTER_DEFAULT_UNIT_SIZE);
×
1201
        FLT_ERR_RET(terrno);
×
1202
      }
1203
    } else {
1204
      char v[14] = {0};
2,663,584✔
1205
      FLT_PACKAGE_UNIT_HASH_KEY(&v, optr, optr2, left->idx, (right ? right->idx : -1), (right2 ? right2->idx : -1));
2,663,003✔
1206
      void *hu = taosHashGet(info->pctx.unitHash, v, sizeof(v));
2,663,584✔
1207
      if (hu) {
2,663,584✔
1208
        *uidx = *(uint32_t *)hu;
724,188✔
1209
        return TSDB_CODE_SUCCESS;
724,188✔
1210
      }
1211
    }
1212
  }
1213

1214
  if (info->unitNum >= info->unitSize) {
127,645,679✔
1215
    uint32_t psize = info->unitSize;
257,576✔
1216
    info->unitSize += FILTER_DEFAULT_UNIT_SIZE;
257,576✔
1217

1218
    void *tmp = taosMemoryRealloc(info->units, info->unitSize * sizeof(SFilterUnit));
257,159✔
1219
    if (tmp == NULL) {
257,159✔
1220
      return terrno;
×
1221
    }
1222
    info->units = (SFilterUnit *)tmp;
257,159✔
1223
    (void)memset(info->units + psize, 0, sizeof(*info->units) * FILTER_DEFAULT_UNIT_SIZE);
257,576✔
1224
  }
1225

1226
  SFilterUnit *u = &info->units[info->unitNum];
127,641,444✔
1227

1228
  u->compare.optr = optr;
127,621,857✔
1229
  u->left = *left;
127,597,297✔
1230
  if (right) {
127,630,178✔
1231
    u->right = *right;
127,579,934✔
1232
  }
1233
  u->compare.optr2 = optr2;
127,659,560✔
1234
  if (right2) {
127,613,709✔
1235
    u->right2 = *right2;
2,504,289✔
1236
  }
1237

1238
  if (u->right.type == FLD_TYPE_VALUE) {
127,611,885✔
1239
    SFilterField *val = FILTER_UNIT_RIGHT_FIELD(info, u);
103,596,181✔
1240
    if (!FILTER_GET_FLAG(val->flag, FLD_TYPE_VALUE)) {
103,579,042✔
1241
      fltError("filterAddUnitImpl get invalid flag : %d in val", val->flag);
×
1242
      return TSDB_CODE_APP_ERROR;
×
1243
    }
1244
  } else {
1245
    int32_t paramNum = scalarGetOperatorParamNum(optr);
24,033,977✔
1246
    if (1 != paramNum) {
24,038,870✔
1247
      fltError("invalid right field in unit, operator:%s, rightType:%d", operatorTypeStr(optr), u->right.type);
26✔
1248
      return TSDB_CODE_APP_ERROR;
×
1249
    }
1250
  }
1251

1252
  SFilterField *col = FILTER_UNIT_LEFT_FIELD(info, u);
127,616,814✔
1253
  if (!FILTER_GET_FLAG(col->flag, FLD_TYPE_COLUMN)) {
127,619,880✔
1254
    fltError("filterAddUnitImpl get invalid flag : %d in col", col->flag);
×
1255
    return TSDB_CODE_APP_ERROR;
×
1256
  }
1257

1258
  info->units[info->unitNum].compare.type = FILTER_GET_COL_FIELD_TYPE(col);
127,594,802✔
1259
  info->units[info->unitNum].compare.precision = FILTER_GET_COL_FIELD_PRECISION(col);
127,616,876✔
1260

1261
  *uidx = info->unitNum;
127,608,192✔
1262

1263
  if (FILTER_GET_FLAG(info->options, FLT_OPTION_NEED_UNIQE)) {
127,647,900✔
1264
    char v[14] = {0};
9,149,710✔
1265
    FLT_PACKAGE_UNIT_HASH_KEY(&v, optr, optr2, left->idx, (right ? right->idx : -1), (right2 ? right2->idx : -1));
9,150,847✔
1266
    if (taosHashPut(info->pctx.unitHash, v, sizeof(v), uidx, sizeof(*uidx))) {
9,147,964✔
1267
      fltError("taosHashPut to set failed");
×
1268
      FLT_ERR_RET(terrno);
×
1269
    }
1270
  }
1271

1272
  ++info->unitNum;
127,627,969✔
1273

1274
  return TSDB_CODE_SUCCESS;
127,621,036✔
1275
}
1276

1277
int32_t filterAddUnit(SFilterInfo *info, uint8_t optr, SFilterFieldId *left, SFilterFieldId *right, uint32_t *uidx) {
125,765,329✔
1278
  return filterAddUnitImpl(info, optr, left, right, 0, NULL, uidx);
125,765,329✔
1279
}
1280

1281
int32_t filterAddUnitToGroup(SFilterGroup *group, uint32_t unitIdx) {
128,362,666✔
1282
  if (group->unitNum >= group->unitSize) {
128,362,666✔
1283
    group->unitSize += FILTER_DEFAULT_UNIT_SIZE;
127,728,769✔
1284

1285
    void *tmp = taosMemoryRealloc(group->unitIdxs, group->unitSize * sizeof(*group->unitIdxs));
127,732,958✔
1286
    if (tmp == NULL) {
127,702,675✔
1287
      return terrno;
×
1288
    }
1289
    group->unitIdxs = tmp;
127,702,675✔
1290
  }
1291

1292
  group->unitIdxs[group->unitNum++] = unitIdx;
128,356,516✔
1293

1294
  return TSDB_CODE_SUCCESS;
128,357,901✔
1295
}
1296

1297
static void filterFreeGroup(void *pItem) {
156,554,354✔
1298
  if (pItem == NULL) {
156,554,354✔
1299
    return;
×
1300
  }
1301

1302
  SFilterGroup *p = (SFilterGroup *)pItem;
156,554,354✔
1303
  taosMemoryFreeClear(p->unitIdxs);
156,554,354✔
1304
  taosMemoryFreeClear(p->unitFlags);
156,527,069✔
1305
}
1306

1307
int32_t fltAddGroupUnitFromNode(void *pContext, SFilterInfo *info, SNode *tree, SArray *group) {
117,290,152✔
1308
  SFltBuildGroupCtx *ctx = (SFltBuildGroupCtx *)pContext;
117,290,152✔
1309
  SOperatorNode     *node = (SOperatorNode *)tree;
117,290,152✔
1310
  int32_t            ret = TSDB_CODE_SUCCESS;
117,290,152✔
1311
  SFilterFieldId     left = {0}, right = {0};
117,290,152✔
1312
  FLT_ERR_RET(filterAddFieldFromNode(info, node->pLeft, &left));
117,264,924✔
1313
  uint8_t  type = FILTER_GET_COL_FIELD_TYPE(FILTER_GET_FIELD(info, left));
117,269,496✔
1314
  int32_t  len = 0;
117,270,819✔
1315
  uint32_t uidx = 0;
117,270,819✔
1316
  int32_t  code = 0;
117,286,259✔
1317

1318
  if (node->opType == OP_TYPE_IN && (!IS_VAR_DATA_TYPE(type))) {
118,456,646✔
1319
    SNodeListNode *listNode = (SNodeListNode *)node->pRight;
1,171,337✔
1320

1321
    SScalarParam out = {.columnData = taosMemoryCalloc(1, sizeof(SColumnInfoData))};
1,171,337✔
1322
    if (out.columnData == NULL) {
1,170,271✔
1323
      return terrno;
×
1324
    }
1325
    out.columnData->info.type = type;
1,170,271✔
1326
    out.columnData->info.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes;  // reserved space for simple_copy
1,170,804✔
1327

1328
    int32_t overflowCount = 0;
1,171,337✔
1329
    SNode  *nodeItem = NULL;
1,171,337✔
1330
    FOREACH(nodeItem, listNode->pNodeList) {
3,551,986✔
1331
      SValueNode *valueNode = (SValueNode *)nodeItem;
2,381,483✔
1332
      if (valueNode->node.resType.type != type) {
2,381,483✔
1333
        int8_t overflow = 0;
×
1334
        code = sclConvertValueToSclParam(valueNode, &out, &overflow);
×
1335
        if (TSDB_CODE_SUCCESS != code) {
×
1336
          //        fltError("convert from %d to %d failed", in.type, out.type);
1337
          break;
×
1338
        }
1339

1340
        if (overflow) {
×
1341
          ++overflowCount;
×
1342
          continue;
×
1343
        }
1344

1345
        len = tDataTypes[type].bytes;
×
1346

1347
        code = filterAddField(info, NULL, (void **)&out.columnData->pData, FLD_TYPE_VALUE, &right, len, true, NULL);
×
1348
        if (TSDB_CODE_SUCCESS != code) {
×
1349
          break;
×
1350
        }
1351
        out.columnData->pData = NULL;
×
1352
      } else {
1353
        void *data = taosMemoryCalloc(1, tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes);  // reserved space for simple_copy
2,379,884✔
1354
        if (NULL == data) {
2,382,016✔
1355
          code = terrno;
×
1356
          break;
×
1357
        }
1358
        (void)memcpy(data, nodesGetValueFromNode(valueNode), tDataTypes[type].bytes);
2,382,016✔
1359
        code = filterAddField(info, NULL, (void **)&data, FLD_TYPE_VALUE, &right, len, true, NULL);
2,381,066✔
1360
        if (TSDB_CODE_SUCCESS != code) {
2,381,599✔
1361
          break;
×
1362
        }
1363
      }
1364
      code = filterAddUnit(info, OP_TYPE_EQUAL, &left, &right, &uidx);
2,382,549✔
1365
      if (TSDB_CODE_SUCCESS != code) {
2,380,571✔
1366
        break;
×
1367
      }
1368
      SFilterGroup fgroup = {0};
2,380,571✔
1369
      code = filterAddUnitToGroup(&fgroup, uidx);
2,381,104✔
1370
      if (TSDB_CODE_SUCCESS != code) {
2,382,016✔
1371
        filterFreeGroup((void *)&fgroup);
×
1372
        break;
×
1373
      }
1374
      if (NULL == taosArrayPush(group, &fgroup)) {
2,381,066✔
1375
        filterFreeGroup((void *)&fgroup);
×
1376
        code = terrno;
×
1377
        break;
×
1378
      }
1379
    }
1380
    if (overflowCount == listNode->pNodeList->length) {
1,171,986✔
1381
      ctx->ignore = true;
×
1382
    }
1383
    colDataDestroy(out.columnData);
1,171,453✔
1384
    taosMemoryFree(out.columnData);
1,170,541✔
1385
    FLT_ERR_RET(code);
1,170,387✔
1386
  } else {
1387
    FLT_ERR_RET(filterAddFieldFromNode(info, node->pRight, &right));
116,100,912✔
1388

1389
    FLT_ERR_RET(filterAddUnit(info, node->opType, &left, &right, &uidx));
116,112,491✔
1390
    SFilterGroup fgroup = {0};
116,071,166✔
1391
    FLT_ERR_RET(filterAddUnitToGroup(&fgroup, uidx));
116,084,833✔
1392

1393
    if (NULL == taosArrayPush(group, &fgroup)) {
116,105,603✔
1394
      FLT_ERR_RET(terrno);
×
1395
    }
1396
  }
1397

1398
  return TSDB_CODE_SUCCESS;
117,287,963✔
1399
}
1400

1401
int32_t filterAddUnitFromUnit(SFilterInfo *dst, SFilterInfo *src, SFilterUnit *u, uint32_t *uidx) {
159,946✔
1402
  SFilterFieldId left, right, *pright = &right;
159,946✔
1403
  uint8_t        type = FILTER_UNIT_DATA_TYPE(u);
159,946✔
1404
  uint16_t       flag = 0;
159,946✔
1405

1406
  FLT_ERR_RET(filterAddField(dst, FILTER_UNIT_COL_DESC(src, u), NULL, FLD_TYPE_COLUMN, &left, 0, false, NULL));
159,946✔
1407
  SFilterField *t = FILTER_UNIT_LEFT_FIELD(src, u);
159,946✔
1408

1409
  if (u->right.type == FLD_TYPE_VALUE) {
159,946✔
1410
    void         *data = FILTER_UNIT_VAL_DATA(src, u);
159,946✔
1411
    SFilterField *rField = FILTER_UNIT_RIGHT_FIELD(src, u);
159,946✔
1412

1413
    if (IS_VAR_DATA_TYPE(type)) {
159,946✔
1414
      if (FILTER_UNIT_OPTR(u) == OP_TYPE_IN) {
159,946✔
1415
        FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, POINTER_BYTES, false, &rField->flag));
1,166✔
1416
        // POINTER_BYTES should be sizeof(SHashObj), but POINTER_BYTES is also right.
1417

1418
        t = FILTER_GET_FIELD(dst, right);
1,166✔
1419
        FILTER_SET_FLAG(t->flag, FLD_DATA_IS_HASH);
1,166✔
1420
      } else {
1421
        FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, varDataTLen(data), false, &rField->flag));
158,780✔
1422
      }
1423
    } else {
1424
      FLT_ERR_RET(
×
1425
          filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, false, &rField->flag));
1426
    }
1427
  } else {
1428
    pright = NULL;
×
1429
  }
1430

1431
  return filterAddUnit(dst, FILTER_UNIT_OPTR(u), &left, pright, uidx);
159,946✔
1432
}
1433

1434
int32_t filterAddUnitRight(SFilterInfo *info, uint8_t optr, SFilterFieldId *right, uint32_t uidx) {
×
1435
  SFilterUnit *u = &info->units[uidx];
×
1436
  u->compare.optr2 = optr;
×
1437
  u->right2 = *right;
×
1438

1439
  return TSDB_CODE_SUCCESS;
×
1440
}
1441

1442
int32_t filterAddGroupUnitFromCtx(SFilterInfo *dst, SFilterInfo *src, SFilterRangeCtx *ctx, uint32_t cidx,
9,709,969✔
1443
                                  SFilterGroup *g, int32_t optr, SArray *res) {
1444
  SFilterFieldId left, right, right2;
9,709,773✔
1445
  uint32_t       uidx = 0;
9,713,092✔
1446

1447
  SFilterField *col = FILTER_GET_COL_FIELD(src, cidx);
9,712,528✔
1448

1449
  FLT_ERR_RET(filterAddColFieldFromField(dst, col, &left));
9,711,827✔
1450

1451
  int32_t type = FILTER_GET_COL_FIELD_TYPE(FILTER_GET_FIELD(dst, left));
9,711,827✔
1452

1453
  if (optr == LOGIC_COND_TYPE_AND) {
9,692,239✔
1454
    if (ctx->isnull) {
1,056,010✔
1455
      if (ctx->notnull || ctx->isrange) {
×
1456
        fltError("filterAddGroupUnitFromCtx get invalid ctx : isnull %d, notnull %d, isrange %d", ctx->isnull,
×
1457
                 ctx->notnull, ctx->isrange);
1458
        FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1459
      }
1460
      FLT_ERR_RET(filterAddUnit(dst, OP_TYPE_IS_NULL, &left, NULL, &uidx));
×
1461
      FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
×
1462
      return TSDB_CODE_SUCCESS;
×
1463
    }
1464

1465
    if (ctx->notnull) {
1,056,010✔
1466
      if (ctx->isnull || ctx->isrange) {
×
1467
        fltError("filterAddGroupUnitFromCtx get invalid ctx : isnull %d, notnull %d, isrange %d", ctx->isnull,
×
1468
                 ctx->notnull, ctx->isrange);
1469
        FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1470
      }
1471
      FLT_ERR_RET(filterAddUnit(dst, OP_TYPE_IS_NOT_NULL, &left, NULL, &uidx));
×
1472
      FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
×
1473
      return TSDB_CODE_SUCCESS;
×
1474
    }
1475

1476
    if (!ctx->isrange) {
1,056,010✔
1477
      if (!ctx->isnull && !ctx->notnull) {
×
1478
        fltError("filterAddGroupUnitFromCtx get invalid ctx : isnull %d, notnull %d, isrange %d", ctx->isnull,
×
1479
                 ctx->notnull, ctx->isrange);
1480
        FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1481
      }
1482
      return TSDB_CODE_SUCCESS;
×
1483
    }
1484

1485
    if (!ctx->rs || ctx->rs->next != NULL) {
1,056,010✔
1486
      fltError("filterAddGroupUnitFromCtx get invalid range node with rs:%p", ctx->rs);
×
1487
      FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1488
    }
1489

1490
    SFilterRange *ra = &ctx->rs->ra;
1,056,010✔
1491

1492
    if (((FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL)) && (FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL)))) {
1,056,010✔
1493
      fltError("filterAddGroupUnitFromCtx get invalid range with sflag:%d, eflag:%d",
×
1494
               FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL), FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL));
1495
      FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1496
    }
1497

1498
    if ((!FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL)) && (!FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL))) {
1,056,010✔
1499
      __compar_fn_t func = getComparFunc(type, 0);
582,791✔
1500
      if (func == NULL) {
582,791✔
1501
        FLT_ERR_RET(terrno);
×
1502
      }
1503
      if (func(&ra->s, &ra->e) == 0) {
582,791✔
1504
        void *data = taosMemoryMalloc(sizeof(int64_t));
438,144✔
1505
        if (data == NULL) {
438,144✔
1506
          FLT_ERR_RET(terrno);
×
1507
        }
1508
        SIMPLE_COPY_VALUES(data, &ra->s);
438,144✔
1509
        FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
438,144✔
1510
        FLT_ERR_RET(filterAddUnit(dst, OP_TYPE_EQUAL, &left, &right, &uidx));
438,144✔
1511
        FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
438,144✔
1512
        return TSDB_CODE_SUCCESS;
438,144✔
1513
      } else {
1514
        void *data = taosMemoryMalloc(sizeof(int64_t));
144,647✔
1515
        if (data == NULL) {
144,647✔
1516
          FLT_ERR_RET(terrno);
×
1517
        }
1518
        SIMPLE_COPY_VALUES(data, &ra->s);
144,647✔
1519
        FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
144,647✔
1520
        void *data2 = taosMemoryMalloc(sizeof(int64_t));
144,647✔
1521
        if (data2 == NULL) {
144,647✔
1522
          FLT_ERR_RET(terrno);
×
1523
        }
1524
        SIMPLE_COPY_VALUES(data2, &ra->e);
144,647✔
1525
        FLT_ERR_RET(filterAddField(dst, NULL, &data2, FLD_TYPE_VALUE, &right2, tDataTypes[type].bytes, true, NULL));
144,647✔
1526

1527
        FLT_ERR_RET(filterAddUnitImpl(
144,647✔
1528
            dst, FILTER_GET_FLAG(ra->sflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_GREATER_THAN : OP_TYPE_GREATER_EQUAL, &left,
1529
            &right, FILTER_GET_FLAG(ra->eflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_LOWER_THAN : OP_TYPE_LOWER_EQUAL, &right2,
1530
            &uidx));
1531
        FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
144,647✔
1532
        return TSDB_CODE_SUCCESS;
144,647✔
1533
      }
1534
    }
1535

1536
    if (!FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL)) {
473,219✔
1537
      void *data = taosMemoryMalloc(sizeof(int64_t));
361,942✔
1538
      if (data == NULL) {
361,942✔
1539
        FLT_ERR_RET(terrno);
×
1540
      }
1541
      SIMPLE_COPY_VALUES(data, &ra->s);
361,942✔
1542
      FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
361,942✔
1543
      FLT_ERR_RET(filterAddUnit(
361,472✔
1544
          dst, FILTER_GET_FLAG(ra->sflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_GREATER_THAN : OP_TYPE_GREATER_EQUAL, &left,
1545
          &right, &uidx));
1546
      FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
361,942✔
1547
    }
1548

1549
    if (!FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL)) {
472,749✔
1550
      void *data = taosMemoryMalloc(sizeof(int64_t));
111,277✔
1551
      if (data == NULL) {
111,277✔
1552
        FLT_ERR_RET(terrno);
×
1553
      }
1554
      SIMPLE_COPY_VALUES(data, &ra->e);
111,277✔
1555
      FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
111,277✔
1556
      FLT_ERR_RET(
111,277✔
1557
          filterAddUnit(dst, FILTER_GET_FLAG(ra->eflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_LOWER_THAN : OP_TYPE_LOWER_EQUAL,
1558
                        &left, &right, &uidx));
1559
      FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
111,277✔
1560
    }
1561

1562
    return TSDB_CODE_SUCCESS;
473,219✔
1563
  }
1564

1565
  // OR PROCESS
1566

1567
  SFilterGroup ng = {0};
8,636,229✔
1568
  g = &ng;
8,646,877✔
1569

1570
  if (!ctx->isnull && !ctx->notnull && !ctx->isrange) {
8,646,877✔
1571
    fltError("filterAddGroupUnitFromCtx get invalid ctx : isnull %d, notnull %d, isrange %d", ctx->isnull, ctx->notnull,
×
1572
             ctx->isrange);
1573
    FLT_ERR_RET(TSDB_CODE_APP_ERROR);
×
1574
  }
1575

1576
  if (ctx->isnull) {
8,640,999✔
1577
    FLT_ERR_RET(filterAddUnit(dst, OP_TYPE_IS_NULL, &left, NULL, &uidx));
4,656✔
1578
    FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
4,656✔
1579
    if (NULL == taosArrayPush(res, g)) {
4,656✔
1580
      FLT_ERR_RET(terrno);
×
1581
    }
1582
  }
1583

1584
  if (ctx->notnull) {
8,653,246✔
1585
    if (ctx->isrange) {
4,656✔
1586
      fltError("filterAddGroupUnitFromCtx get invalid ctx : isnull %d, notnull %d, isrange %d", ctx->isnull,
×
1587
               ctx->notnull, ctx->isrange);
1588
      FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1589
    }
1590
    (void)memset(g, 0, sizeof(*g));
4,656✔
1591

1592
    FLT_ERR_RET(filterAddUnit(dst, OP_TYPE_IS_NOT_NULL, &left, NULL, &uidx));
4,656✔
1593
    FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
4,656✔
1594
    if (NULL == taosArrayPush(res, g)) {
4,656✔
1595
      FLT_ERR_RET(terrno);
×
1596
    }
1597
  }
1598

1599
  if (!ctx->isrange) {
8,653,102✔
1600
    if (!ctx->isnull && !ctx->notnull) {
9,312✔
1601
      fltError("filterAddGroupUnitFromCtx get invalid ctx : isnull %d, notnull %d, isrange %d", ctx->isnull,
×
1602
               ctx->notnull, ctx->isrange);
1603
      FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1604
    }
1605
    g->unitNum = 0;
9,312✔
1606
    return TSDB_CODE_SUCCESS;
9,312✔
1607
  }
1608

1609
  SFilterRangeNode *r = ctx->rs;
8,643,740✔
1610

1611
  while (r) {
17,283,201✔
1612
    (void)memset(g, 0, sizeof(*g));
8,644,062✔
1613

1614
    if ((!FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_NULL)) && (!FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_NULL))) {
8,644,062✔
1615
      __compar_fn_t func = getComparFunc(type, 0);
2,661,762✔
1616
      if (func == NULL) {
2,660,311✔
1617
        FLT_ERR_RET(terrno);
×
1618
      }
1619
      if (func(&r->ra.s, &r->ra.e) == 0) {
2,660,311✔
1620
        void *data = taosMemoryMalloc(sizeof(int64_t));
217,568✔
1621
        if (data == NULL) {
217,568✔
1622
          FLT_ERR_RET(terrno);
×
1623
        }
1624
        SIMPLE_COPY_VALUES(data, &r->ra.s);
217,568✔
1625
        FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
217,568✔
1626
        FLT_ERR_RET(filterAddUnit(dst, OP_TYPE_EQUAL, &left, &right, &uidx));
217,568✔
1627
        FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
217,568✔
1628
      } else {
1629
        void *data = taosMemoryMalloc(sizeof(int64_t));
2,443,090✔
1630
        if (data == NULL) {
2,447,429✔
1631
          FLT_ERR_RET(terrno);
×
1632
        }
1633
        SIMPLE_COPY_VALUES(data, &r->ra.s);
2,447,429✔
1634
        FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
2,448,111✔
1635
        void *data2 = taosMemoryMalloc(sizeof(int64_t));
2,447,055✔
1636
        if (data2 == NULL) {
2,446,540✔
1637
          FLT_ERR_RET(terrno);
×
1638
        }
1639
        SIMPLE_COPY_VALUES(data2, &r->ra.e);
2,446,540✔
1640
        FLT_ERR_RET(filterAddField(dst, NULL, &data2, FLD_TYPE_VALUE, &right2, tDataTypes[type].bytes, true, NULL));
2,446,485✔
1641

1642
        FLT_ERR_RET(filterAddUnitImpl(
2,448,500✔
1643
            dst, FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_GREATER_THAN : OP_TYPE_GREATER_EQUAL, &left,
1644
            &right, FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_LOWER_THAN : OP_TYPE_LOWER_EQUAL, &right2,
1645
            &uidx));
1646
        FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
2,448,879✔
1647
      }
1648

1649
      if (NULL == taosArrayPush(res, g)) {
2,666,447✔
1650
        FLT_ERR_RET(terrno);
×
1651
      }
1652

1653
      r = r->next;
2,666,447✔
1654

1655
      continue;
2,666,293✔
1656
    }
1657

1658
    if (!FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_NULL)) {
5,978,448✔
1659
      void *data = taosMemoryMalloc(sizeof(int64_t));
5,965,098✔
1660
      if (data == NULL) {
5,966,381✔
1661
        FLT_ERR_RET(terrno);
×
1662
      }
1663
      SIMPLE_COPY_VALUES(data, &r->ra.s);
5,966,381✔
1664
      FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
5,964,319✔
1665
      FLT_ERR_RET(filterAddUnit(
5,965,322✔
1666
          dst, FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_GREATER_THAN : OP_TYPE_GREATER_EQUAL, &left,
1667
          &right, &uidx));
1668
      FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
5,969,885✔
1669
    }
1670

1671
    if (!FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_NULL)) {
5,981,121✔
1672
      void *data = taosMemoryMalloc(sizeof(int64_t));
13,968✔
1673
      if (data == NULL) {
13,968✔
1674
        FLT_ERR_RET(terrno);
×
1675
      }
1676
      SIMPLE_COPY_VALUES(data, &r->ra.e);
13,968✔
1677
      FLT_ERR_RET(filterAddField(dst, NULL, &data, FLD_TYPE_VALUE, &right, tDataTypes[type].bytes, true, NULL));
13,968✔
1678
      FLT_ERR_RET(
13,968✔
1679
          filterAddUnit(dst, FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_EXCLUDE) ? OP_TYPE_LOWER_THAN : OP_TYPE_LOWER_EQUAL,
1680
                        &left, &right, &uidx));
1681
      FLT_ERR_RET(filterAddUnitToGroup(g, uidx));
13,968✔
1682
    }
1683

1684
    if (g->unitNum <= 0) {
5,980,723✔
1685
      fltError("filterAddGroupUnitFromCtx get invalid filter group unit num %d", g->unitNum);
×
1686
      FLT_ERR_RET(TSDB_CODE_QRY_FILTER_RANGE_ERROR);
×
1687
    }
1688

1689
    if (NULL == taosArrayPush(res, g)) {
5,976,580✔
1690
      FLT_ERR_RET(terrno);
×
1691
    }
1692

1693
    r = r->next;
5,976,580✔
1694
  }
1695

1696
  g->unitNum = 0;
8,639,139✔
1697

1698
  return TSDB_CODE_SUCCESS;
8,645,440✔
1699
}
1700

1701
EDealRes fltTreeToGroup(SNode *pNode, void *pContext) {
159,408,128✔
1702
  int32_t            code = TSDB_CODE_SUCCESS;
159,408,128✔
1703
  SArray            *preGroup = NULL;
159,408,128✔
1704
  SArray            *newGroup = NULL;
159,408,128✔
1705
  SArray            *resGroup = NULL;
159,408,128✔
1706
  ENodeType          nType = nodeType(pNode);
159,408,128✔
1707
  SFltBuildGroupCtx *ctx = (SFltBuildGroupCtx *)pContext;
159,411,158✔
1708

1709
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(pNode)) {
159,411,158✔
1710
    SLogicConditionNode *node = (SLogicConditionNode *)pNode;
33,963,226✔
1711
    if (LOGIC_COND_TYPE_AND == node->condType) {
33,963,226✔
1712
      SListCell *cell = node->pParameterList->pHead;
27,564,597✔
1713
      for (int32_t i = 0; i < node->pParameterList->length; ++i) {
82,987,853✔
1714
        newGroup = taosArrayInit(4, sizeof(SFilterGroup));
55,430,186✔
1715
        if (NULL == newGroup) {
55,426,856✔
1716
          FLT_ERR_RET(terrno);
×
1717
        }
1718
        resGroup = taosArrayInit(4, sizeof(SFilterGroup));
55,426,856✔
1719
        if (NULL == resGroup) {
55,434,337✔
1720
          FLT_ERR_RET(terrno);
×
1721
        }
1722

1723
        SFltBuildGroupCtx tctx = {.info = ctx->info, .group = newGroup, .ignore = false};
55,434,337✔
1724
        nodesWalkExpr(cell->pNode, fltTreeToGroup, (void *)&tctx);
55,438,272✔
1725
        FLT_ERR_JRET(tctx.code);
55,438,319✔
1726
        if (tctx.ignore) {
55,438,319✔
1727
          ctx->ignore = true;
×
1728
          taosArrayDestroyEx(newGroup, filterFreeGroup);
×
1729
          newGroup = NULL;
×
1730
          taosArrayDestroyEx(resGroup, filterFreeGroup);
×
1731
          resGroup = NULL;
×
1732
          break;
×
1733
        }
1734
        FLT_ERR_JRET(filterDetachCnfGroups(resGroup, preGroup, newGroup));
55,438,319✔
1735

1736
        taosArrayDestroyEx(newGroup, filterFreeGroup);
55,423,745✔
1737
        newGroup = NULL;
55,419,763✔
1738
        taosArrayDestroyEx(preGroup, filterFreeGroup);
55,419,763✔
1739

1740
        preGroup = resGroup;
55,411,706✔
1741
        resGroup = NULL;
55,411,706✔
1742

1743
        cell = cell->pNext;
55,411,706✔
1744
      }
1745
      if (!ctx->ignore) {
27,559,803✔
1746
        if (NULL == taosArrayAddAll(ctx->group, preGroup)) {
27,562,421✔
1747
          FLT_ERR_JRET(terrno);
×
1748
        }
1749
      }
1750

1751
      taosArrayDestroy(preGroup);
27,572,167✔
1752

1753
      return DEAL_RES_IGNORE_CHILD;
27,556,297✔
1754
    }
1755

1756
    if (LOGIC_COND_TYPE_OR == node->condType) {
6,395,607✔
1757
      SListCell *cell = node->pParameterList->pHead;
6,403,518✔
1758
      for (int32_t i = 0; i < node->pParameterList->length; ++i) {
20,111,382✔
1759
        nodesWalkExpr(cell->pNode, fltTreeToGroup, (void *)pContext);
13,708,333✔
1760
        if (ctx->ignore) {
13,713,721✔
1761
          ctx->ignore = false;
×
1762
        }
1763
        FLT_ERR_JRET(ctx->code);
13,713,486✔
1764

1765
        cell = cell->pNext;
13,706,837✔
1766
      }
1767

1768
      return DEAL_RES_IGNORE_CHILD;
6,406,228✔
1769
    }
1770

1771
    fltError("invalid condition type, type:%d", node->condType);
×
1772

UNCOV
1773
    FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
1774
  }
1775

1776
  if (QUERY_NODE_OPERATOR == nType) {
125,447,125✔
1777
    FLT_ERR_JRET(fltAddGroupUnitFromNode(ctx, ctx->info, pNode, ctx->group));
117,291,596✔
1778

1779
    return DEAL_RES_IGNORE_CHILD;
117,263,729✔
1780
  }
1781

1782
  if (QUERY_NODE_VALUE == nType && ((SValueNode *)pNode)->node.resType.type == TSDB_DATA_TYPE_BOOL) {
8,155,529✔
1783
    if (((SValueNode *)pNode)->datum.b) {
8,155,529✔
1784
      FILTER_SET_FLAG(ctx->info->status, FI_STATUS_ALL);
9,968✔
1785
    } else {
1786
      FILTER_SET_FLAG(ctx->info->status, FI_STATUS_EMPTY);
8,145,561✔
1787
    }
1788
    return DEAL_RES_END;
8,155,529✔
1789
  }
1790

1791
  fltError("invalid node type for filter, type:%d", nodeType(pNode));
×
1792

1793
  code = TSDB_CODE_QRY_INVALID_INPUT;
×
1794

1795
_return:
×
1796

1797
  taosArrayDestroyEx(newGroup, filterFreeGroup);
×
1798
  taosArrayDestroyEx(preGroup, filterFreeGroup);
×
1799
  taosArrayDestroyEx(resGroup, filterFreeGroup);
×
1800

1801
  ctx->code = code;
×
1802

1803
  return DEAL_RES_ERROR;
×
1804
}
1805

1806
int32_t fltConverToStr(char *str, int32_t strMaxLen, int type, void *buf, int32_t bufSize, int32_t *len) {
139,978,759✔
1807
  int32_t n = 0;
139,978,759✔
1808

1809
  switch (type) {
139,978,759✔
1810
    case TSDB_DATA_TYPE_NULL:
×
1811
      n = snprintf(str, strMaxLen, "null");
×
1812
      break;
×
1813

1814
    case TSDB_DATA_TYPE_BOOL:
6,693,622✔
1815
      n = snprintf(str, strMaxLen, (*(int8_t *)buf) ? "true" : "false");
6,693,622✔
1816
      break;
6,693,622✔
1817

1818
    case TSDB_DATA_TYPE_TINYINT:
4,217,210✔
1819
      n = snprintf(str, strMaxLen, "%d", *(int8_t *)buf);
4,217,210✔
1820
      break;
4,217,210✔
1821

1822
    case TSDB_DATA_TYPE_SMALLINT:
5,803,417✔
1823
      n = snprintf(str, strMaxLen, "%d", *(int16_t *)buf);
5,803,417✔
1824
      break;
5,803,417✔
1825

1826
    case TSDB_DATA_TYPE_INT:
14,273,135✔
1827
      n = snprintf(str, strMaxLen, "%d", *(int32_t *)buf);
14,273,135✔
1828
      break;
14,273,135✔
1829

1830
    case TSDB_DATA_TYPE_BIGINT:
74,250,046✔
1831
    case TSDB_DATA_TYPE_TIMESTAMP:
1832
      n = snprintf(str, strMaxLen, "%" PRId64, *(int64_t *)buf);
74,250,046✔
1833
      break;
74,250,046✔
1834

1835
    case TSDB_DATA_TYPE_FLOAT:
1,010,961✔
1836
      n = snprintf(str, strMaxLen, "%e", GET_FLOAT_VAL(buf));
1,010,961✔
1837
      break;
1,010,961✔
1838

1839
    case TSDB_DATA_TYPE_DOUBLE:
8,608,902✔
1840
      n = snprintf(str, strMaxLen, "%e", GET_DOUBLE_VAL(buf));
8,608,902✔
1841
      break;
8,608,902✔
1842

1843
    case TSDB_DATA_TYPE_BINARY:
25,120,151✔
1844
    case TSDB_DATA_TYPE_VARBINARY:
1845
    case TSDB_DATA_TYPE_NCHAR:
1846
    case TSDB_DATA_TYPE_GEOMETRY:
1847
      if (bufSize < 0) {
25,120,151✔
1848
        //        tscError("invalid buf size");
1849
        return TSDB_CODE_TSC_INVALID_VALUE;
×
1850
      }
1851

1852
      *str = '"';
25,120,151✔
1853
      (void)memcpy(str + 1, buf, bufSize);
25,120,684✔
1854
      *(str + bufSize + 1) = '"';
25,120,684✔
1855
      n = bufSize + 2;
25,120,151✔
1856
      break;
25,120,151✔
1857

1858
    case TSDB_DATA_TYPE_UTINYINT:
×
1859
      n = snprintf(str, strMaxLen, "%d", *(uint8_t *)buf);
×
1860
      break;
×
1861

1862
    case TSDB_DATA_TYPE_USMALLINT:
×
1863
      n = snprintf(str, strMaxLen, "%d", *(uint16_t *)buf);
×
1864
      break;
×
1865

1866
    case TSDB_DATA_TYPE_UINT:
×
1867
      n = snprintf(str, strMaxLen, "%u", *(uint32_t *)buf);
×
1868
      break;
×
1869

1870
    case TSDB_DATA_TYPE_UBIGINT:
×
1871
      n = snprintf(str, strMaxLen, "%" PRIu64, *(uint64_t *)buf);
×
1872
      break;
×
1873
      
1874
    default:
1,315✔
1875
      //      tscError("unsupported type:%d", type);
1876
      return TSDB_CODE_TSC_INVALID_VALUE;
1,315✔
1877
  }
1878

1879
  *len = n;
139,977,444✔
1880

1881
  return TSDB_CODE_SUCCESS;
139,977,591✔
1882
}
1883

1884
int32_t filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options) {
186,907,968✔
1885
  if (qDebugFlag & DEBUG_DEBUG) {
186,907,968✔
1886
    if (info == NULL) {
119,053,281✔
1887
      fltDebug("%s - FilterInfo: EMPTY", msg);
×
1888
      return TSDB_CODE_SUCCESS;
×
1889
    }
1890

1891
    if (options == 0) {
119,053,281✔
1892
      qDebug("%s - FilterInfo:", msg);
88,454,433✔
1893
      qDebug("COLUMN Field Num:%u", info->fields[FLD_TYPE_COLUMN].num);
88,477,637✔
1894
      for (uint32_t i = 0; i < info->fields[FLD_TYPE_COLUMN].num; ++i) {
185,508,971✔
1895
        SFilterField *field = &info->fields[FLD_TYPE_COLUMN].fields[i];
97,018,841✔
1896
        SColumnNode  *refNode = (SColumnNode *)field->desc;
97,018,841✔
1897
        qDebug("COL%d => [%" PRId64 "][%d]", i, refNode->dataBlockId, refNode->slotId);
97,020,065✔
1898
      }
1899

1900
      qDebug("VALUE Field Num:%u", info->fields[FLD_TYPE_VALUE].num);
88,488,918✔
1901
      for (uint32_t i = 0; i < info->fields[FLD_TYPE_VALUE].num; ++i) {
203,925,758✔
1902
        SFilterField *field = &info->fields[FLD_TYPE_VALUE].fields[i];
115,436,309✔
1903
        if (field->desc) {
115,436,309✔
1904
          if (QUERY_NODE_VALUE != nodeType(field->desc)) {
106,667,146✔
1905
            qDebug("VAL%d => [type:not value node][val:NIL]", i);  // TODO
175,202✔
1906
            continue;
175,202✔
1907
          }
1908

1909
          SValueNode *var = (SValueNode *)field->desc;
106,491,944✔
1910
          SDataType  *dType = &var->node.resType;
106,491,944✔
1911
          qDebug("VAL%d => [type:%d][val:%" PRIx64 "]", i, dType->type, var->datum.i);  // TODO
106,491,944✔
1912
        } else if (field->data) {
8,769,163✔
1913
          qDebug("VAL%d => [type:NIL][val:NIL]", i);  // TODO
8,769,163✔
1914
        }
1915
      }
1916

1917
      qDebug("UNIT  Num:%u", info->unitNum);
88,489,169✔
1918
      for (uint32_t i = 0; i < info->unitNum; ++i) {
213,903,066✔
1919
        SFilterUnit *unit = &info->units[i];
125,414,034✔
1920
        int32_t      type = FILTER_UNIT_DATA_TYPE(unit);
125,413,527✔
1921
        int32_t      len = 0;
125,413,527✔
1922
        int32_t      tlen = 0;
125,413,527✔
1923
        char         str[512] = {0};
125,414,034✔
1924

1925
        SFilterField *left = FILTER_UNIT_LEFT_FIELD(info, unit);
125,414,034✔
1926
        SColumnNode  *refNode = (SColumnNode *)left->desc;
125,413,503✔
1927
        if (unit->compare.optr <= OP_TYPE_JSON_CONTAINS) {
125,414,034✔
1928
          len += tsnprintf(str, sizeof(str), "UNIT[%d] => [%" PRId64 "][%d]  %s  [", i, refNode->dataBlockId, refNode->slotId,
125,412,542✔
1929
                           operatorTypeStr(unit->compare.optr));
125,414,034✔
1930
        }
1931

1932
        if (unit->right.type == FLD_TYPE_VALUE && FILTER_UNIT_OPTR(unit) != OP_TYPE_IN) {
240,134,517✔
1933
          SFilterField *right = FILTER_UNIT_RIGHT_FIELD(info, unit);
114,727,279✔
1934
          char         *data = right->data;
114,724,716✔
1935
          if (IS_VAR_DATA_TYPE(type)) {
114,724,819✔
1936
            if (IS_STR_DATA_BLOB(type)) {
25,120,220✔
1937
              tlen = blobDataLen(data);
118✔
1938
              data += BLOBSTR_HEADER_SIZE;
×
1939
            } else {
1940
              tlen = varDataLen(data);
25,120,151✔
1941
              data += VARSTR_HEADER_SIZE;
25,120,684✔
1942
            }
1943
          }
1944
          if (data) {
114,724,750✔
1945
            FLT_ERR_RET(fltConverToStr(str + len, sizeof(str) - len, type, data, tlen > 32 ? 32 : tlen, &tlen));
114,724,033✔
1946
            len += tlen;
114,722,427✔
1947
          }
1948
        } else {
1949
          (void)strncat(str, "NULL", sizeof(str) - len - 1);
10,685,114✔
1950
          len += 4;
10,685,114✔
1951
        }
1952
        (void)strncat(str, "]", sizeof(str) - len - 1);
125,408,258✔
1953
        len += 1;
125,408,258✔
1954

1955
        if (unit->compare.optr2) {
125,408,258✔
1956
          (void)strncat(str, " && ", sizeof(str) - len - 1);
1,561,735✔
1957
          len += 4;
1,561,735✔
1958
          if (unit->compare.optr2 <= OP_TYPE_JSON_CONTAINS) {
1,561,735✔
1959
            len += tsnprintf(str + len, sizeof(str) - len, "[%" PRId64 "][%d]  %s  [", refNode->dataBlockId, refNode->slotId,
1,561,735✔
1960
                             operatorTypeStr(unit->compare.optr2));
1,561,735✔
1961
          }
1962

1963
          if (unit->right2.type == FLD_TYPE_VALUE && FILTER_UNIT_OPTR(unit) != OP_TYPE_IN) {
1,561,735✔
1964
            SFilterField *right = FILTER_UNIT_RIGHT2_FIELD(info, unit);
1,561,735✔
1965
            char         *data = right->data;
1,561,735✔
1966
            if (IS_VAR_DATA_TYPE(type)) {
1,561,735✔
1967
              if (IS_STR_DATA_BLOB(type)) {
×
1968
                tlen = blobDataLen(data);
×
1969
                data += BLOBSTR_HEADER_SIZE;
×
1970

1971
              } else {
1972
                tlen = varDataLen(data);
×
1973
                data += VARSTR_HEADER_SIZE;
×
1974
              }
1975
            }
1976
            FLT_ERR_RET(fltConverToStr(str + len, sizeof(str) - len, type, data, tlen > 32 ? 32 : tlen, &tlen));
1,561,735✔
1977
            len += tlen;
1,561,735✔
1978
          } else {
1979
            (void)strncat(str, "NULL", sizeof(str) - len - 1);
×
1980
            len += 4;
×
1981
          }
1982
          (void)strncat(str, "]", sizeof(str) - len - 1);
1,561,735✔
1983
          len += 1;
1,561,735✔
1984
        }
1985

1986
        qDebug("%s", str);  // TODO
125,408,867✔
1987
      }
1988

1989
      qDebug("GROUP Num:%u", info->groupNum);
88,489,449✔
1990
      uint32_t maxDbgGrpNum = TMIN(info->groupNum, 1000);
88,489,449✔
1991
      for (uint32_t i = 0; i < maxDbgGrpNum; ++i) {
187,759,395✔
1992
        SFilterGroup *group = &info->groups[i];
99,269,946✔
1993
        qDebug("Group%d : unit num[%u]", i, group->unitNum);
99,269,946✔
1994

1995
        for (uint32_t u = 0; u < group->unitNum; ++u) {
226,729,691✔
1996
          qDebug("unit id:%u", group->unitIdxs[u]);
127,459,745✔
1997
        }
1998
      }
1999

2000
      return TSDB_CODE_SUCCESS;
88,489,449✔
2001
    }
2002

2003
    if (options == 1) {
30,598,848✔
2004
      qDebug("%s - RANGE info:", msg);
30,597,763✔
2005

2006
      qDebug("RANGE Num:%u", info->colRangeNum);
30,614,045✔
2007
      for (uint32_t i = 0; i < info->colRangeNum; ++i) {
49,805,619✔
2008
        SFilterRangeCtx *ctx = info->colRange[i];
19,188,155✔
2009
        qDebug("Column ID[%d] RANGE: isnull[%d],notnull[%d],range[%d]", ctx->colId, ctx->isnull, ctx->notnull,
19,188,155✔
2010
               ctx->isrange);
2011
        if (ctx->isrange) {
19,188,155✔
2012
          SFilterRangeNode *r = ctx->rs;
15,868,290✔
2013
          int32_t           tlen = 0;
15,868,290✔
2014
          while (r) {
32,692,589✔
2015
            char    str[256] = {0};
16,824,299✔
2016
            int32_t len = 0;
16,824,299✔
2017
            if (FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_NULL)) {
16,824,299✔
2018
              (void)strncat(str, "(NULL)", sizeof(str) - len - 1);
3,629,702✔
2019
              len += 6;
3,629,702✔
2020
            } else {
2021
              FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_EXCLUDE) ? (void)strncat(str, "(", sizeof(str) - len - 1)
16,965,214✔
2022
                                                              : (void)strncat(str, "[", sizeof(str) - len - 1);
13,194,597✔
2023
              len += 1;
13,194,597✔
2024
              FLT_ERR_RET(
13,194,597✔
2025
                  fltConverToStr(str + len, sizeof(str) - len, ctx->type, &r->ra.s, tlen > 32 ? 32 : tlen, &tlen));
2026
              len += tlen;
13,194,597✔
2027
              FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_EXCLUDE) ? (void)strncat(str, ")", sizeof(str) - len - 1)
16,965,214✔
2028
                                                              : (void)strncat(str, "]", sizeof(str) - len - 1);
13,194,597✔
2029
              len += 1;
13,194,597✔
2030
            }
2031
            (void)strncat(str, " - ", sizeof(str) - len - 1);
16,824,299✔
2032
            len += 3;
16,824,299✔
2033
            if (FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_NULL)) {
16,824,299✔
2034
              (void)strncat(str, "(NULL)", sizeof(str) - len - 1);
6,325,338✔
2035
              len += 6;
6,325,338✔
2036
            } else {
2037
              FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_EXCLUDE) ? (void)strncat(str, "(", sizeof(str) - len - 1)
11,260,826✔
2038
                                                              : (void)strncat(str, "[", sizeof(str) - len - 1);
10,498,961✔
2039
              len += 1;
10,498,961✔
2040
              FLT_ERR_RET(
10,498,961✔
2041
                  fltConverToStr(str + len, sizeof(str) - len, ctx->type, &r->ra.e, tlen > 32 ? 32 : tlen, &tlen));
2042
              len += tlen;
10,498,961✔
2043
              FILTER_GET_FLAG(r->ra.eflag, RANGE_FLG_EXCLUDE) ? (void)strncat(str, ")", sizeof(str) - len - 1)
11,260,826✔
2044
                                                              : (void)strncat(str, "]", sizeof(str) - len - 1);
10,498,418✔
2045
              len += 1;
10,498,418✔
2046
            }
2047
            qDebug("range: %s", str);
16,823,756✔
2048

2049
            r = r->next;
16,823,756✔
2050
          }
2051
        }
2052
      }
2053

2054
      return TSDB_CODE_SUCCESS;
30,617,464✔
2055
    }
2056

2057
    qDebug("%s - Block Filter info:", msg);
1,219✔
2058

2059
    if (FILTER_GET_FLAG(info->blkFlag, FI_STATUS_BLK_ALL)) {
1,219✔
2060
      qDebug("Flag:%s", "ALL");
×
2061
      return TSDB_CODE_SUCCESS;
×
2062
    } else if (FILTER_GET_FLAG(info->blkFlag, FI_STATUS_BLK_EMPTY)) {
×
2063
      qDebug("Flag:%s", "EMPTY");
×
2064
      return TSDB_CODE_SUCCESS;
×
2065
    } else if (FILTER_GET_FLAG(info->blkFlag, FI_STATUS_BLK_ACTIVE)) {
×
2066
      qDebug("Flag:%s", "ACTIVE");
×
2067
    }
2068

2069
    qDebug("GroupNum:%d", info->blkGroupNum);
×
2070
    uint32_t *unitIdx = info->blkUnits;
×
2071
    for (uint32_t i = 0; i < info->blkGroupNum; ++i) {
×
2072
      qDebug("Group[%d] UnitNum: %d:", i, *unitIdx);
×
2073
      uint32_t unitNum = *(unitIdx++);
×
2074
      for (uint32_t m = 0; m < unitNum; ++m) {
×
2075
        qDebug("uidx[%d]", *(unitIdx++));
×
2076
      }
2077
    }
2078
  }
2079
  return TSDB_CODE_SUCCESS;
67,856,302✔
2080
}
2081

2082
void filterFreeColInfo(void *data) {
65,019,303✔
2083
  SFilterColInfo *info = (SFilterColInfo *)data;
65,019,303✔
2084

2085
  if (info->info == NULL) {
65,019,303✔
2086
    return;
×
2087
  }
2088

2089
  if (info->type == RANGE_TYPE_VAR_HASH) {
65,018,990✔
2090
    // TODO
2091
  } else if (info->type == RANGE_TYPE_MR_CTX) {
65,013,735✔
2092
    (void)filterFreeRangeCtx(info->info);  // No need to handle the return value.
45,910,380✔
2093
  } else if (info->type == RANGE_TYPE_UNIT) {
19,106,782✔
2094
    taosArrayDestroy((SArray *)info->info);
19,105,822✔
2095
  }
2096

2097
  // NO NEED TO FREE UNIT
2098

2099
  info->type = 0;
64,971,777✔
2100
  info->info = NULL;
65,003,599✔
2101
}
2102

2103
void filterFreeColCtx(void *data) {
×
2104
  SFilterColCtx *ctx = (SFilterColCtx *)data;
×
2105

2106
  if (ctx->ctx) {
×
2107
    (void)filterFreeRangeCtx(ctx->ctx);  // No need to handle the return value.
×
2108
  }
2109
}
×
2110

2111
void filterFreeGroupCtx(SFilterGroupCtx *gRes) {
61,241,645✔
2112
  if (gRes == NULL) {
61,241,645✔
2113
    return;
×
2114
  }
2115

2116
  taosMemoryFreeClear(gRes->colIdx);
61,241,645✔
2117

2118
  int16_t i = 0, j = 0;
61,255,206✔
2119

2120
  while (i < gRes->colNum) {
130,079,898✔
2121
    if (gRes->colInfo[j].info) {
68,857,956✔
2122
      filterFreeColInfo(&gRes->colInfo[j]);
64,982,420✔
2123
      ++i;
65,008,402✔
2124
    }
2125

2126
    ++j;
68,824,692✔
2127
  }
2128

2129
  taosMemoryFreeClear(gRes->colInfo);
61,218,744✔
2130
  taosMemoryFreeClear(gRes);
61,229,318✔
2131
}
2132

2133
void filterFreeField(SFilterField *field, int32_t type) {
200,596,908✔
2134
  if (field == NULL) {
200,596,908✔
2135
    return;
×
2136
  }
2137

2138
  if (!FILTER_GET_FLAG(field->flag, FLD_DATA_NO_FREE)) {
200,596,908✔
2139
    if (FILTER_GET_FLAG(field->flag, FLD_DATA_IS_HASH)) {
104,317,490✔
2140
      taosHashCleanup(field->data);
88,184✔
2141
    } else {
2142
      taosMemoryFreeClear(field->data);
104,230,732✔
2143
    }
2144
  }
2145
}
2146

2147
void filterFreePCtx(SFilterPCtx *pctx) {
144,777,883✔
2148
  taosHashCleanup(pctx->valHash);
144,777,883✔
2149
  taosHashCleanup(pctx->unitHash);
144,763,789✔
2150
}
144,758,913✔
2151

2152
void filterFreeInfo(SFilterInfo *info) {
150,743,343✔
2153
  if (info == NULL) {
150,743,343✔
2154
    return;
5,963,639✔
2155
  }
2156

2157
  for (int32_t i = 0; i < taosArrayGetSize(info->sclCtx.fltSclRange); ++i) {
152,628,016✔
2158
    SFltSclColumnRange *colRange = taosArrayGet(info->sclCtx.fltSclRange, i);
7,849,244✔
2159
    nodesDestroyNode((SNode *)colRange->colNode);
7,848,701✔
2160
    taosArrayDestroy(colRange->points);
7,849,244✔
2161
  }
2162
  taosArrayDestroy(info->sclCtx.fltSclRange);
144,774,885✔
2163

2164
  taosMemoryFreeClear(info->cunits);
144,777,885✔
2165
  taosMemoryFreeClear(info->blkUnitRes);
144,785,492✔
2166
  taosMemoryFreeClear(info->blkUnits);
144,778,035✔
2167

2168
  for (int32_t i = 0; i < FLD_TYPE_MAX; ++i) {
579,116,214✔
2169
    for (uint32_t f = 0; f < info->fields[i].num; ++f) {
634,912,907✔
2170
      filterFreeField(&info->fields[i].fields[f], i);
200,595,913✔
2171
    }
2172

2173
    taosMemoryFreeClear(info->fields[i].fields);
434,333,130✔
2174
  }
2175

2176
  for (uint32_t i = 0; i < info->groupNum; ++i) {
245,058,778✔
2177
    filterFreeGroup(&info->groups[i]);
100,288,745✔
2178
  }
2179

2180
  taosMemoryFreeClear(info->groups);
144,773,181✔
2181

2182
  taosMemoryFreeClear(info->units);
144,781,362✔
2183

2184
  taosMemoryFreeClear(info->unitRes);
144,780,797✔
2185

2186
  taosMemoryFreeClear(info->unitFlags);
144,769,870✔
2187

2188
  for (uint32_t i = 0; i < info->colRangeNum; ++i) {
180,714,527✔
2189
    (void)filterFreeRangeCtx(info->colRange[i]);  // No need to handle the return value.
35,947,660✔
2190
  }
2191

2192
  taosMemoryFreeClear(info->colRange);
144,778,233✔
2193

2194
  filterFreePCtx(&info->pctx);
144,774,363✔
2195

2196
  if (!FILTER_GET_FLAG(info->status, FI_STATUS_CLONED)) {
144,767,691✔
2197
    taosMemoryFreeClear(info);
137,574,123✔
2198
  }
2199
}
2200

2201
int32_t filterHandleValueExtInfo(SFilterUnit *unit, char extInfo) {
×
2202
  if (extInfo == 0) {
×
2203
    fltError("filterHandleValueExtInfo get invalid extInfo : %d", extInfo);
×
2204
    return TSDB_CODE_APP_ERROR;
×
2205
  }
2206

2207
  uint8_t optr = FILTER_UNIT_OPTR(unit);
×
2208
  switch (optr) {
×
2209
    case OP_TYPE_GREATER_THAN:
×
2210
    case OP_TYPE_GREATER_EQUAL:
2211
      unit->compare.optr = (extInfo > 0) ? FILTER_DUMMY_EMPTY_OPTR : OP_TYPE_IS_NOT_NULL;
×
2212
      break;
×
2213
    case OP_TYPE_LOWER_THAN:
×
2214
    case OP_TYPE_LOWER_EQUAL:
2215
      unit->compare.optr = (extInfo > 0) ? OP_TYPE_IS_NOT_NULL : FILTER_DUMMY_EMPTY_OPTR;
×
2216
      break;
×
2217
    case OP_TYPE_EQUAL:
×
2218
      unit->compare.optr = FILTER_DUMMY_EMPTY_OPTR;
×
2219
      break;
×
2220
    default:
×
2221
      fltError("unsupported operator type");
×
2222
      return TSDB_CODE_APP_ERROR;
×
2223
  }
2224

2225
  return TSDB_CODE_SUCCESS;
×
2226
}
2227

2228
int32_t fltInitValFieldData(SFilterInfo *info) {
82,101,606✔
2229
  for (uint32_t i = 0; i < info->unitNum; ++i) {
200,566,774✔
2230
    SFilterUnit *unit = &info->units[i];
118,487,395✔
2231
    if (unit->right.type != FLD_TYPE_VALUE) {
118,455,849✔
2232
      if (unit->compare.optr != FILTER_DUMMY_EMPTY_OPTR && scalarGetOperatorParamNum(unit->compare.optr) != 1) {
24,029,755✔
2233
        fltError("filterInitValFieldData get invalid operator param num : %d and invalid compare optr %d",
×
2234
                 scalarGetOperatorParamNum(unit->compare.optr), unit->compare.optr);
2235
        return TSDB_CODE_APP_ERROR;
×
2236
      }
2237
      continue;
24,028,655✔
2238
    }
2239

2240
    SFilterField *right = FILTER_UNIT_RIGHT_FIELD(info, unit);
94,414,822✔
2241

2242
    if (!FILTER_GET_FLAG(right->flag, FLD_TYPE_VALUE)) {
94,426,259✔
2243
      fltError("filterInitValFieldData get invalid field flag : %d", right->flag);
×
2244
      return TSDB_CODE_APP_ERROR;
×
2245
    }
2246

2247
    uint32_t      type = FILTER_UNIT_DATA_TYPE(unit);
94,397,983✔
2248
    int8_t        precision = FILTER_UNIT_DATA_PRECISION(unit);
94,444,675✔
2249
    SFilterField *fi = right;
94,454,969✔
2250

2251
    if (fi->desc == NULL) {
94,454,969✔
2252
      if (!fi->data) {
2,378,439✔
2253
        fltError("filterInitValFieldData get invalid field data : NULL");
×
2254
        return TSDB_CODE_APP_ERROR;
×
2255
      }
2256
      continue;
2,378,176✔
2257
    }
2258

2259
    if (unit->compare.optr == OP_TYPE_IN) {
92,020,339✔
2260
      // QUERY_NODE_NODE_LIST
2261
      FLT_ERR_RET(scalarGenerateSetFromList((void **)&fi->data, fi->desc, type, 0, 0));
87,509✔
2262
      if (fi->data == NULL) {
87,509✔
2263
        fltError("failed to convert in param");
×
2264
        FLT_ERR_RET(TSDB_CODE_APP_ERROR);
×
2265
      }
2266

2267
      FILTER_SET_FLAG(fi->flag, FLD_DATA_IS_HASH);
88,184✔
2268

2269
      continue;
86,926✔
2270
    }
2271

2272
    if ((nodeType(fi->desc) != QUERY_NODE_VALUE)) {
91,979,775✔
2273
      fltError("filterInitValFieldData get invalid field desc node type : %d", nodeType(fi->desc));
×
2274
      return TSDB_CODE_APP_ERROR;
×
2275
    }
2276
    SValueNode *var = (SValueNode *)fi->desc;
91,981,253✔
2277
    if (var->isNull) {
91,986,654✔
2278
      fltError("filterInitValFieldData get value data is null");
×
2279
      return TSDB_CODE_APP_ERROR;
×
2280
    }
2281

2282
    SDataType *dType = &var->node.resType;
91,933,756✔
2283
    if (dType->type == type) {
91,985,475✔
2284
      size_t bufBytes = TMAX(dType->bytes, sizeof(int64_t));
60,981,549✔
2285
      fi->data = taosMemoryCalloc(1, bufBytes);
60,985,530✔
2286
      if (fi->data == NULL) {
60,983,185✔
2287
        FLT_ERR_RET(terrno);
×
2288
      }
2289
      assignVal(fi->data, nodesGetValueFromNode(var), dType->bytes, type);
60,987,814✔
2290
    } else {
2291
      SScalarParam out = {.columnData = taosMemoryCalloc(1, sizeof(SColumnInfoData))};
30,977,287✔
2292
      if (out.columnData == NULL) {
30,990,146✔
2293
        FLT_ERR_RET(terrno);
×
2294
      }
2295
      out.columnData->info.type = type;
30,990,146✔
2296
      out.columnData->info.precision = precision;
30,992,797✔
2297
      if (!IS_VAR_DATA_TYPE(type)) {
30,987,662✔
2298
        out.columnData->info.bytes = tDataTypes[type].bytes;
30,964,885✔
2299
      }
2300

2301
      // todo refactor the convert
2302
      int32_t code = sclConvertValueToSclParam(var, &out, NULL);
30,986,880✔
2303
      if (code != TSDB_CODE_SUCCESS) {
30,976,929✔
2304
        colDataDestroy(out.columnData);
×
2305
        taosMemoryFree(out.columnData);
×
2306
        qError("convert value to type[%d] failed", type);
×
2307
        return code;
×
2308
      }
2309

2310
      size_t bufBytes = 0;
30,976,929✔
2311
      if (IS_VAR_DATA_TYPE(type)) {
30,976,929✔
2312
        bufBytes = IS_STR_DATA_BLOB(type) ? blobDataTLen(out.columnData->pData) : varDataTLen(out.columnData->pData);
29,383✔
2313
      } else {
2314
        bufBytes = TMAX(out.columnData->info.bytes, sizeof(int64_t));
30,947,546✔
2315
      }
2316

2317
      fi->data = taosMemoryCalloc(1, bufBytes);
30,989,830✔
2318
      if (fi->data == NULL) {
30,986,996✔
2319
        FLT_ERR_RET(terrno);
×
2320
      }
2321

2322
      size_t valBytes = 0;
30,983,870✔
2323
      if (IS_VAR_DATA_TYPE(type)) {
30,983,870✔
2324
        valBytes = IS_STR_DATA_BLOB(type) ? blobDataTLen(out.columnData->pData) : varDataTLen(out.columnData->pData);
30,136✔
2325
      } else {
2326
        valBytes = out.columnData->info.bytes;
30,953,734✔
2327
      }
2328

2329
      (void)memcpy(fi->data, out.columnData->pData, valBytes);
30,994,332✔
2330

2331
      colDataDestroy(out.columnData);
30,976,364✔
2332
      taosMemoryFree(out.columnData);
30,971,983✔
2333
    }
2334

2335
    // match/nmatch for nchar type need convert from ucs4 to mbs
2336
    if (type == TSDB_DATA_TYPE_NCHAR && (unit->compare.optr == OP_TYPE_MATCH || unit->compare.optr == OP_TYPE_NMATCH)) {
91,972,317✔
2337
      char    newValData[TSDB_REGEX_STRING_DEFAULT_LEN * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE] = {0};
×
2338
      int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(fi->data), varDataLen(fi->data), varDataVal(newValData), NULL);
×
2339
      if (len < 0) {
×
2340
        qError("filterInitValFieldData taosUcs4ToMbs error 1");
×
2341
        return TSDB_CODE_SCALAR_CONVERT_ERROR;
×
2342
      }
2343
      varDataSetLen(newValData, len);
×
2344
      varDataCopy(fi->data, newValData);
×
2345
    }
2346
  }
2347

2348
  return TSDB_CODE_SUCCESS;
82,105,181✔
2349
}
2350

2351
bool filterDoCompare(__compar_fn_t func, uint8_t optr, void *left, void *right) {
2,147,483,647✔
2352
  int32_t ret = func(left, right);
2,147,483,647✔
2353

2354
  switch (optr) {
2,147,483,647✔
2355
    case OP_TYPE_EQUAL: {
2,147,483,647✔
2356
      return ret == 0;
2,147,483,647✔
2357
    }
2358
    case OP_TYPE_NOT_EQUAL: {
2,147,483,647✔
2359
      return ret != 0;
2,147,483,647✔
2360
    }
2361
    case OP_TYPE_GREATER_EQUAL: {
2,147,483,647✔
2362
      return ret >= 0;
2,147,483,647✔
2363
    }
2364
    case OP_TYPE_GREATER_THAN: {
2,147,483,647✔
2365
      return ret > 0;
2,147,483,647✔
2366
    }
2367
    case OP_TYPE_LOWER_EQUAL: {
658,314,740✔
2368
      return ret <= 0;
658,314,740✔
2369
    }
2370
    case OP_TYPE_LOWER_THAN: {
1,329,918,545✔
2371
      return ret < 0;
1,329,918,545✔
2372
    }
2373
    case OP_TYPE_LIKE: {
481,019,263✔
2374
      return ret == 0;
481,019,263✔
2375
    }
2376
    case OP_TYPE_NOT_LIKE: {
204,420✔
2377
      return ret == 0;
204,420✔
2378
    }
2379
    case OP_TYPE_MATCH: {
638,872,250✔
2380
      return ret == 0;
638,872,250✔
2381
    }
2382
    case OP_TYPE_NMATCH: {
122,979,726✔
2383
      return ret == 0;
122,979,726✔
2384
    }
2385
    case OP_TYPE_IN: {
675,801,009✔
2386
      return ret == 1;
675,801,009✔
2387
    }
2388
    case OP_TYPE_NOT_IN: {
355,674,142✔
2389
      return ret == 1;
355,674,142✔
2390
    }
2391

2392
    default:
536,027✔
2393
      fltError("unsupported operator type");
536,027✔
2394
      return false;
×
2395
  }
2396

2397
  return true;
2398
}
2399

2400
int32_t filterAddUnitRange(SFilterInfo *info, SFilterUnit *u, SFilterRangeCtx *ctx, int32_t optr) {
81,295,645✔
2401
  int32_t      type = FILTER_UNIT_DATA_TYPE(u);
81,295,645✔
2402
  uint8_t      uoptr = FILTER_UNIT_OPTR(u);
81,292,307✔
2403
  void        *val = FILTER_UNIT_VAL_DATA(info, u);
81,296,488✔
2404
  SFilterRange ra = {0};
81,262,490✔
2405
  int64_t      tmp = 0;
81,254,423✔
2406

2407
  switch (uoptr) {
81,261,088✔
2408
    case OP_TYPE_GREATER_THAN:
8,917,843✔
2409
      SIMPLE_COPY_VALUES(&ra.s, val);
8,917,843✔
2410
      FILTER_SET_FLAG(ra.sflag, RANGE_FLG_EXCLUDE);
8,918,386✔
2411
      FILTER_SET_FLAG(ra.eflag, RANGE_FLG_NULL);
8,918,386✔
2412
      break;
8,918,386✔
2413
    case OP_TYPE_GREATER_EQUAL:
25,071,083✔
2414
      SIMPLE_COPY_VALUES(&ra.s, val);
25,071,083✔
2415
      FILTER_SET_FLAG(ra.eflag, RANGE_FLG_NULL);
25,075,064✔
2416
      break;
25,075,064✔
2417
    case OP_TYPE_LOWER_THAN:
11,233,292✔
2418
      SIMPLE_COPY_VALUES(&ra.e, val);
11,233,292✔
2419
      FILTER_SET_FLAG(ra.eflag, RANGE_FLG_EXCLUDE);
11,238,180✔
2420
      FILTER_SET_FLAG(ra.sflag, RANGE_FLG_NULL);
11,238,180✔
2421
      break;
11,238,180✔
2422
    case OP_TYPE_LOWER_EQUAL:
23,840,759✔
2423
      SIMPLE_COPY_VALUES(&ra.e, val);
23,840,759✔
2424
      FILTER_SET_FLAG(ra.sflag, RANGE_FLG_NULL);
23,850,410✔
2425
      break;
23,850,410✔
2426
    case OP_TYPE_NOT_EQUAL:
×
2427
      if (type != TSDB_DATA_TYPE_BOOL) {
×
2428
        fltError("filterAddUnitRange get invalid type : %d", type);
×
2429
        return TSDB_CODE_QRY_FILTER_INVALID_TYPE;
×
2430
      }
2431
      if (GET_INT8_VAL(val)) {
×
2432
        SIMPLE_COPY_VALUES(&ra.s, &tmp);
×
2433
        SIMPLE_COPY_VALUES(&ra.e, &tmp);
×
2434
      } else {
2435
        *(bool *)&tmp = true;
×
2436
        SIMPLE_COPY_VALUES(&ra.s, &tmp);
×
2437
        SIMPLE_COPY_VALUES(&ra.e, &tmp);
×
2438
      }
2439
      break;
×
2440
    case OP_TYPE_EQUAL:
12,198,072✔
2441
      SIMPLE_COPY_VALUES(&ra.s, val);
12,198,072✔
2442
      SIMPLE_COPY_VALUES(&ra.e, val);
12,207,220✔
2443
      break;
12,206,993✔
2444
    default:
39✔
2445
      fltError("unsupported operator type");
39✔
2446
      return TSDB_CODE_QRY_FILTER_NOT_SUPPORT_TYPE;
×
2447
  }
2448

2449
  FLT_ERR_RET(filterAddRange(ctx, &ra, optr));
81,289,033✔
2450

2451
  return TSDB_CODE_SUCCESS;
81,282,905✔
2452
}
2453

2454
int32_t filterCompareRangeCtx(SFilterRangeCtx *ctx1, SFilterRangeCtx *ctx2, bool *equal) {
297,216✔
2455
  FLT_CHK_JMP(ctx1->status != ctx2->status);
297,216✔
2456
  FLT_CHK_JMP(ctx1->isnull != ctx2->isnull);
297,216✔
2457
  FLT_CHK_JMP(ctx1->notnull != ctx2->notnull);
297,216✔
2458
  FLT_CHK_JMP(ctx1->isrange != ctx2->isrange);
297,216✔
2459

2460
  SFilterRangeNode *r1 = ctx1->rs;
297,216✔
2461
  SFilterRangeNode *r2 = ctx2->rs;
297,216✔
2462

2463
  while (r1 && r2) {
299,544✔
2464
    FLT_CHK_JMP(r1->ra.sflag != r2->ra.sflag);
297,216✔
2465
    FLT_CHK_JMP(r1->ra.eflag != r2->ra.eflag);
149,772✔
2466
    FLT_CHK_JMP(r1->ra.s != r2->ra.s);
2,328✔
2467
    FLT_CHK_JMP(r1->ra.e != r2->ra.e);
2,328✔
2468

2469
    r1 = r1->next;
2,328✔
2470
    r2 = r2->next;
2,328✔
2471
  }
2472

2473
  FLT_CHK_JMP(r1 != r2);
2,328✔
2474

2475
  *equal = true;
2,328✔
2476

2477
  return TSDB_CODE_SUCCESS;
2,328✔
2478

2479
_return:
294,888✔
2480
  *equal = false;
294,888✔
2481
  return TSDB_CODE_SUCCESS;
294,888✔
2482
}
2483

2484
int32_t filterMergeUnits(SFilterInfo *info, SFilterGroupCtx *gRes, uint32_t colIdx, bool *empty) {
46,063,594✔
2485
  SArray          *colArray = (SArray *)gRes->colInfo[colIdx].info;
46,063,594✔
2486
  int32_t          size = (int32_t)taosArrayGetSize(colArray);
46,063,959✔
2487
  int32_t          type = gRes->colInfo[colIdx].dataType;
46,043,006✔
2488
  int32_t          code = TSDB_CODE_SUCCESS;
46,032,780✔
2489
  SFilterRangeCtx *ctx = NULL;
46,032,780✔
2490
  FLT_ERR_JRET(filterInitRangeCtx(type, 0, &ctx));
46,061,095✔
2491

2492
  for (uint32_t i = 0; i < size; ++i) {
101,020,795✔
2493
    SFilterUnit *u = taosArrayGetP(colArray, i);
55,157,394✔
2494
    if (NULL == u) {
55,158,045✔
2495
      FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE);
×
2496
    }
2497
    uint8_t optr = FILTER_UNIT_OPTR(u);
55,158,045✔
2498

2499
    FLT_ERR_RET(filterAddRangeOptr(ctx, optr, LOGIC_COND_TYPE_AND, empty, NULL));
55,158,925✔
2500
    FLT_CHK_JMP(*empty);
55,153,364✔
2501

2502
    if (!FILTER_NO_MERGE_OPTR(optr)) {
55,135,973✔
2503
      FLT_ERR_JRET(filterAddUnitRange(info, u, ctx, LOGIC_COND_TYPE_AND));
41,213,097✔
2504
      FLT_CHK_JMP(MR_EMPTY_RES(ctx));
41,198,356✔
2505
    }
2506
    if (FILTER_UNIT_OPTR(u) == OP_TYPE_EQUAL && !FILTER_NO_MERGE_DATA_TYPE(FILTER_UNIT_DATA_TYPE(u))) {
55,002,898✔
2507
      gRes->colInfo[colIdx].optr = OP_TYPE_EQUAL;
9,669,985✔
2508
      SIMPLE_COPY_VALUES(&gRes->colInfo[colIdx].value, FILTER_UNIT_VAL_DATA(info, u));
9,661,844✔
2509
    }
2510
  }
2511

2512
  taosArrayDestroy(colArray);
45,863,401✔
2513

2514
  FILTER_PUSH_CTX(gRes->colInfo[colIdx], ctx);
45,869,061✔
2515

2516
  return TSDB_CODE_SUCCESS;
45,912,774✔
2517

2518
_return:
154,972✔
2519

2520
  *empty = true;
154,972✔
2521

2522
  (void)filterFreeRangeCtx(ctx);  // No need to handle the return value.
154,972✔
2523

2524
  return code;
154,972✔
2525
}
2526

2527
int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t *gResNum) {
52,486,878✔
2528
  bool      empty = false;
52,486,878✔
2529
  int32_t   code = TSDB_CODE_SUCCESS;
52,490,884✔
2530
  uint32_t  colIdxi = 0;
52,490,884✔
2531
  uint32_t  gResIdx = 0;
52,490,884✔
2532
  uint32_t *colIdx = taosMemoryMalloc(info->fields[FLD_TYPE_COLUMN].num * sizeof(uint32_t));
52,490,884✔
2533
  if (colIdx == NULL) {
52,484,456✔
2534
    FLT_ERR_RET(terrno);
×
2535
  }
2536
  for (uint32_t i = 0; i < info->groupNum; ++i) {
113,719,331✔
2537
    SFilterGroup *g = info->groups + i;
61,262,883✔
2538

2539
    gRes[gResIdx] = taosMemoryCalloc(1, sizeof(SFilterGroupCtx));
61,240,277✔
2540
    if (gRes[gResIdx] == NULL) {
61,240,101✔
2541
      FLT_ERR_JRET(terrno);
×
2542
    }
2543
    gRes[gResIdx]->colInfo = taosMemoryCalloc(info->fields[FLD_TYPE_COLUMN].num, sizeof(SFilterColInfo));
61,242,350✔
2544
    if (gRes[gResIdx]->colInfo == NULL) {
61,240,453✔
2545
      FLT_ERR_JRET(terrno);
×
2546
    }
2547
    colIdxi = 0;
61,263,478✔
2548
    empty = false;
61,263,478✔
2549

2550
    for (uint32_t j = 0; j < g->unitNum; ++j) {
135,498,656✔
2551
      SFilterUnit *u = FILTER_GROUP_UNIT(info, g, j);
74,249,231✔
2552
      uint32_t     cidx = FILTER_UNIT_COL_IDX(u);
74,229,301✔
2553

2554
      if (gRes[gResIdx]->colInfo[cidx].info == NULL) {
74,219,840✔
2555
        gRes[gResIdx]->colInfo[cidx].info = (SArray *)taosArrayInit(4, POINTER_BYTES);
65,003,510✔
2556
        if (gRes[gResIdx]->colInfo[cidx].info == NULL) {
65,010,457✔
2557
          FLT_ERR_JRET(terrno);
×
2558
        }
2559
        colIdx[colIdxi++] = cidx;
65,027,488✔
2560
        ++gRes[gResIdx]->colNum;
65,021,009✔
2561
      } else {
2562
        if (!FILTER_NO_MERGE_DATA_TYPE(FILTER_UNIT_DATA_TYPE(u))) {
9,225,273✔
2563
          FILTER_SET_FLAG(info->status, FI_STATUS_REWRITE);
9,107,276✔
2564
        }
2565
      }
2566

2567
      FILTER_PUSH_UNIT(gRes[gResIdx]->colInfo[cidx], u);
148,504,767✔
2568
    }
2569

2570
    if (colIdxi > 1) {
61,269,084✔
2571
      __compar_fn_t cmpFn = getComparFunc(TSDB_DATA_TYPE_USMALLINT, 0);
3,225,480✔
2572
      if (cmpFn == NULL) {
3,225,010✔
2573
        FLT_ERR_JRET(terrno);
×
2574
      }
2575
      taosSort(colIdx, colIdxi, sizeof(uint32_t), cmpFn);
3,225,010✔
2576
    }
2577

2578
    for (uint32_t l = 0; l < colIdxi; ++l) {
126,081,357✔
2579
      int32_t type = gRes[gResIdx]->colInfo[colIdx[l]].dataType;
65,015,018✔
2580

2581
      if (FILTER_NO_MERGE_DATA_TYPE(type)) {
65,013,735✔
2582
        continue;
18,950,393✔
2583
      }
2584
      SCL_ERR_JRET(filterMergeUnits(info, gRes[gResIdx], colIdx[l], &empty));
46,063,342✔
2585

2586
      if (empty) {
46,019,510✔
2587
        break;
154,972✔
2588
      }
2589
    }
2590

2591
    if (empty) {
61,221,311✔
2592
      FILTER_SET_FLAG(info->status, FI_STATUS_REWRITE);
154,972✔
2593
      filterFreeGroupCtx(gRes[gResIdx]);
154,972✔
2594
      gRes[gResIdx] = NULL;
154,972✔
2595

2596
      continue;
156,645✔
2597
    }
2598

2599
    gRes[gResIdx]->colNum = colIdxi;
61,066,339✔
2600
    FILTER_COPY_IDX(&gRes[gResIdx]->colIdx, colIdx, colIdxi);
61,097,214✔
2601
    ++gResIdx;
61,111,135✔
2602
    *gResNum = gResIdx;
61,111,135✔
2603
  }
2604

2605
  if (gResIdx == 0) {
52,456,364✔
2606
    FILTER_SET_FLAG(info->status, FI_STATUS_EMPTY);
45,952✔
2607
  }
2608

2609
_return:
52,457,491✔
2610
  if (code) {
52,475,916✔
2611
    filterFreeGroupCtx(gRes[gResIdx]);
×
2612
  }
2613
  taosMemoryFreeClear(colIdx);
52,470,199✔
2614
  FLT_RET(code);
52,464,831✔
2615
}
2616

2617
bool filterIsSameUnits(SFilterColInfo *pCol1, SFilterColInfo *pCol2) {
6,949,369✔
2618
  if (pCol1->type != pCol2->type) {
6,949,369✔
2619
    return false;
×
2620
  }
2621

2622
  if (RANGE_TYPE_MR_CTX == pCol1->type) {
6,942,036✔
2623
    SFilterRangeCtx *pCtx1 = (SFilterRangeCtx *)pCol1->info;
6,944,952✔
2624
    SFilterRangeCtx *pCtx2 = (SFilterRangeCtx *)pCol2->info;
6,942,524✔
2625

2626
    if ((pCtx1->isnull != pCtx2->isnull) || (pCtx1->notnull != pCtx2->notnull) || (pCtx1->isrange != pCtx2->isrange)) {
6,950,482✔
2627
      return false;
133,592✔
2628
    }
2629

2630
    SFilterRangeNode *pNode1 = pCtx1->rs;
6,820,823✔
2631
    SFilterRangeNode *pNode2 = pCtx2->rs;
6,809,491✔
2632

2633
    while (true) {
2634
      if (NULL == pNode1 && NULL == pNode2) {
7,577,843✔
2635
        break;
785,014✔
2636
      }
2637

2638
      if (NULL == pNode1 || NULL == pNode2) {
6,792,829✔
2639
        return false;
×
2640
      }
2641

2642
      if (pNode1->ra.s != pNode2->ra.s || pNode1->ra.e != pNode2->ra.e || pNode1->ra.sflag != pNode2->ra.sflag ||
6,792,829✔
2643
          pNode1->ra.eflag != pNode2->ra.eflag) {
771,393✔
2644
        return false;
6,032,248✔
2645
      }
2646

2647
      pNode1 = pNode1->next;
771,393✔
2648
      pNode2 = pNode2->next;
771,393✔
2649
    }
2650
  }
2651

2652
  return true;
785,595✔
2653
}
2654

2655
void filterCheckColConflict(SFilterGroupCtx *gRes1, SFilterGroupCtx *gRes2, bool *conflict) {
14,343,071✔
2656
  uint32_t idx1 = 0, idx2 = 0, m = 0, n = 0;
14,343,071✔
2657
  bool     equal = false;
14,343,071✔
2658

2659
  for (; m < gRes1->colNum; ++m) {
15,127,502✔
2660
    idx1 = gRes1->colIdx[m];
14,865,062✔
2661

2662
    equal = false;
14,852,854✔
2663

2664
    for (; n < gRes2->colNum; ++n) {
17,333,138✔
2665
      idx2 = gRes2->colIdx[n];
15,932,446✔
2666
      if (idx1 < idx2) {
15,932,143✔
2667
        *conflict = true;
4,632,473✔
2668
        return;
4,632,473✔
2669
      }
2670

2671
      if (idx1 > idx2) {
11,299,670✔
2672
        continue;
2,480,284✔
2673
      }
2674

2675
      if (FILTER_NO_MERGE_DATA_TYPE(gRes1->colInfo[idx1].dataType)) {
8,819,386✔
2676
        *conflict = true;
1,882,069✔
2677
        return;
1,873,364✔
2678
      }
2679

2680
      if (!filterIsSameUnits(&gRes1->colInfo[idx1], &gRes2->colInfo[idx2])) {
6,949,274✔
2681
        *conflict = true;
6,165,153✔
2682
        return;
6,166,269✔
2683
      }
2684

2685
      // for long in operation
2686
      if (gRes1->colInfo[idx1].optr == OP_TYPE_EQUAL && gRes2->colInfo[idx2].optr == OP_TYPE_EQUAL) {
785,595✔
2687
        SFilterRangeCtx *ctx = gRes1->colInfo[idx1].info;
599,248✔
2688
        if (ctx->pCompareFunc(&gRes1->colInfo[idx1].value, &gRes2->colInfo[idx2].value)) {
599,248✔
2689
          *conflict = true;
×
2690
          return;
×
2691
        }
2692
      }
2693

2694
      ++n;
784,431✔
2695
      equal = true;
784,431✔
2696
      break;
784,431✔
2697
    }
2698

2699
    if (!equal) {
2,197,146✔
2700
      *conflict = true;
1,412,715✔
2701
      return;
1,412,715✔
2702
    }
2703
  }
2704

2705
  *conflict = false;
255,444✔
2706
  return;
259,127✔
2707
}
2708

2709
int32_t filterMergeTwoGroupsImpl(SFilterInfo *info, SFilterRangeCtx **ctx, int32_t optr, uint32_t cidx,
259,708✔
2710
                                 SFilterGroupCtx *gRes1, SFilterGroupCtx *gRes2, bool *empty, bool *all) {
2711
  SFilterField *fi = FILTER_GET_COL_FIELD(info, cidx);
259,708✔
2712
  int32_t       type = FILTER_GET_COL_FIELD_TYPE(fi);
259,708✔
2713

2714
  if ((*ctx) == NULL) {
259,708✔
2715
    FLT_ERR_RET(filterInitRangeCtx(type, 0, ctx));
259,708✔
2716
  } else {
2717
    FLT_ERR_RET(filterReuseRangeCtx(*ctx, type, 0));
×
2718
  }
2719

2720
  if (gRes2->colInfo[cidx].type != RANGE_TYPE_MR_CTX || gRes1->colInfo[cidx].type != RANGE_TYPE_MR_CTX) {
259,708✔
2721
    fltError("filterMergeTwoGroupsImpl get invalid col type : %d and %d", gRes2->colInfo[cidx].type,
×
2722
             gRes1->colInfo[cidx].type);
2723
    return TSDB_CODE_QRY_FILTER_NOT_SUPPORT_TYPE;
×
2724
  }
2725

2726
  FLT_ERR_RET(filterCopyRangeCtx(*ctx, gRes2->colInfo[cidx].info));
259,127✔
2727
  FLT_ERR_RET(filterSourceRangeFromCtx(*ctx, gRes1->colInfo[cidx].info, optr, empty, all));
259,708✔
2728

2729
  return TSDB_CODE_SUCCESS;
259,708✔
2730
}
2731

2732
int32_t filterMergeTwoGroups(SFilterInfo *info, SFilterGroupCtx **gRes1, SFilterGroupCtx **gRes2, bool *all) {
14,342,488✔
2733
  bool conflict = false;
14,342,488✔
2734

2735
  filterCheckColConflict(*gRes1, *gRes2, &conflict);
14,340,165✔
2736
  if (conflict) {
14,339,654✔
2737
    return TSDB_CODE_SUCCESS;
14,080,527✔
2738
  }
2739

2740
  FILTER_SET_FLAG(info->status, FI_STATUS_REWRITE);
259,127✔
2741

2742
  uint32_t         idx1 = 0, idx2 = 0, m = 0, n = 0;
259,708✔
2743
  bool             numEqual = (*gRes1)->colNum == (*gRes2)->colNum;
259,708✔
2744
  bool             equal = false;
259,708✔
2745
  uint32_t         equal1 = 0, equal2 = 0, merNum = 0;
259,127✔
2746
  SFilterRangeCtx *ctx = NULL;
259,127✔
2747
  SFilterColCtx    colCtx = {0};
259,708✔
2748
  int32_t          code = TSDB_CODE_SUCCESS;
259,708✔
2749
  SArray          *colCtxs = taosArrayInit((*gRes2)->colNum, sizeof(SFilterColCtx));
259,708✔
2750
  if (colCtxs == NULL) {
259,708✔
2751
    FLT_ERR_JRET(terrno);
×
2752
  }
2753

2754
  for (; m < (*gRes1)->colNum; ++m) {
273,095✔
2755
    idx1 = (*gRes1)->colIdx[m];
259,708✔
2756

2757
    for (; n < (*gRes2)->colNum; ++n) {
358,004✔
2758
      idx2 = (*gRes2)->colIdx[n];
358,004✔
2759

2760
      if (idx1 > idx2) {
358,004✔
2761
        continue;
98,296✔
2762
      }
2763

2764
      if (idx1 != idx2) {
259,708✔
2765
        fltError("filterMergeTwoGroups get invalid idx : %d and %d", idx1, idx2);
×
2766
        FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
2767
      }
2768

2769
      ++merNum;
259,708✔
2770

2771
      FLT_ERR_JRET(filterMergeTwoGroupsImpl(info, &ctx, LOGIC_COND_TYPE_OR, idx1, *gRes1, *gRes2, NULL, all));
259,708✔
2772

2773
      FLT_CHK_JMP(*all);
259,127✔
2774

2775
      if (numEqual) {
259,708✔
2776
        if ((*gRes1)->colNum == 1) {
60,207✔
2777
          ++equal1;
11,059✔
2778
          colCtx.colIdx = idx1;
11,059✔
2779
          colCtx.ctx = ctx;
11,059✔
2780
          if (NULL == taosArrayPush(colCtxs, &colCtx)) {
11,640✔
2781
            FLT_ERR_JRET(terrno);
×
2782
          }
2783
          break;
11,640✔
2784
        } else {
2785
          FLT_ERR_JRET(filterCompareRangeCtx(ctx, (*gRes1)->colInfo[idx1].info, &equal));
49,148✔
2786
          if (equal) {
49,148✔
2787
            ++equal1;
×
2788
          }
2789

2790
          FLT_ERR_JRET(filterCompareRangeCtx(ctx, (*gRes2)->colInfo[idx2].info, &equal));
49,148✔
2791
          if (equal) {
49,148✔
2792
            ++equal2;
×
2793
          }
2794

2795
          FLT_CHK_JMP(equal1 != merNum && equal2 != merNum);
49,148✔
2796
          colCtx.colIdx = idx1;
×
2797
          colCtx.ctx = ctx;
×
2798
          ctx = NULL;
×
2799
          if (NULL == taosArrayPush(colCtxs, &colCtx)) {
×
2800
            FLT_ERR_JRET(terrno);
×
2801
          }
2802
        }
2803
      } else {
2804
        FLT_ERR_JRET(filterCompareRangeCtx(ctx, (*gRes1)->colInfo[idx1].info, &equal));
199,501✔
2805
        if (equal) {
198,920✔
2806
          ++equal1;
2,328✔
2807
        }
2808

2809
        FLT_CHK_JMP(equal1 != merNum);
198,920✔
2810
        colCtx.colIdx = idx1;
2,328✔
2811
        colCtx.ctx = ctx;
2,328✔
2812
        ctx = NULL;
2,328✔
2813
        if (NULL == taosArrayPush(colCtxs, &colCtx)) {
2,328✔
2814
          FLT_ERR_JRET(terrno);
×
2815
        }
2816
      }
2817

2818
      ++n;
2,328✔
2819
      break;
2,328✔
2820
    }
2821
  }
2822

2823
  if (merNum == 0 || (equal1 != merNum && equal2 != merNum)) {
13,387✔
2824
    fltError("filterMergeTwoGroups get invalid merge num : %d, equal1 : %d, equal2 : %d", merNum, equal1, equal2);
×
2825
    FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
2826
  }
2827

2828
  filterFreeGroupCtx(*gRes2);
13,387✔
2829
  *gRes2 = NULL;
13,968✔
2830

2831
  if (!colCtxs || taosArrayGetSize(colCtxs) <= 0) {
13,968✔
2832
    fltError("filterMergeTwoGroups get invalid colCtxs with size %zu", taosArrayGetSize(colCtxs));
×
2833
    FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
2834
  }
2835
  SFilterColInfo *colInfo = NULL;
13,968✔
2836
  int32_t         ctxSize = (int32_t)taosArrayGetSize(colCtxs);
13,968✔
2837
  SFilterColCtx  *pctx = NULL;
13,968✔
2838

2839
  for (int32_t i = 0; i < ctxSize; ++i) {
27,936✔
2840
    pctx = taosArrayGet(colCtxs, i);
13,968✔
2841
    if (NULL == pctx) {
13,968✔
2842
      FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE);
×
2843
    }
2844
    colInfo = &(*gRes1)->colInfo[pctx->colIdx];
13,968✔
2845

2846
    filterFreeColInfo(colInfo);
13,968✔
2847
    FILTER_PUSH_CTX((*gRes1)->colInfo[pctx->colIdx], pctx->ctx);
13,968✔
2848
  }
2849

2850
  taosArrayDestroy(colCtxs);
13,968✔
2851

2852
  return TSDB_CODE_SUCCESS;
13,968✔
2853

2854
_return:
245,740✔
2855

2856
  if (colCtxs) {
245,740✔
2857
    if (taosArrayGetSize(colCtxs) > 0) {
245,740✔
2858
      taosArrayDestroyEx(colCtxs, filterFreeColCtx);
×
2859
    } else {
2860
      taosArrayDestroy(colCtxs);
245,740✔
2861
    }
2862
  }
2863

2864
  (void)filterFreeRangeCtx(ctx);  // No need to handle the return value.
245,740✔
2865

2866
  return code;
245,740✔
2867
}
2868

2869
int32_t filterMergeGroups(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t *gResNum) {
52,474,749✔
2870
  if (*gResNum <= 1) {
52,474,749✔
2871
    return TSDB_CODE_SUCCESS;
46,096,200✔
2872
  }
2873

2874
  taosSort(gRes, *gResNum, POINTER_BYTES, filterCompareGroupCtx);
6,384,991✔
2875

2876
  int32_t  code = TSDB_CODE_SUCCESS;
6,376,040✔
2877
  int32_t  pEnd = 0, cStart = 0, cEnd = 0;
6,376,040✔
2878
  uint32_t pColNum = 0, cColNum = 0;
6,376,040✔
2879
  int32_t  movedNum = 0;
6,376,040✔
2880
  bool     all = false;
6,376,040✔
2881

2882
  cColNum = gRes[0]->colNum;
6,376,858✔
2883

2884
  for (int32_t i = 1; i <= *gResNum; ++i) {
15,035,561✔
2885
    if (i < (*gResNum) && gRes[i]->colNum == cColNum) {
15,040,692✔
2886
      continue;
8,635,359✔
2887
    }
2888

2889
    cEnd = i - 1;
6,417,549✔
2890

2891
    movedNum = 0;
6,417,549✔
2892
    if (pColNum > 0) {
6,417,549✔
2893
      for (int32_t m = 0; m <= pEnd; ++m) {
149,361✔
2894
        for (int32_t n = cStart; n <= cEnd; ++n) {
811,082✔
2895
          if (m >= n) {
701,557✔
2896
            fltError("filterMergeGroups get invalid m : %d and n : %d", m, n);
×
2897
            FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
2898
          }
2899
          FLT_ERR_JRET(filterMergeTwoGroups(info, &gRes[m], &gRes[n], &all));
701,557✔
2900

2901
          FLT_CHK_JMP(all);
701,557✔
2902

2903
          if (gRes[n] == NULL) {
701,557✔
2904
            if (n < ((*gResNum) - 1)) {
2,328✔
2905
              (void)memmove(&gRes[n], &gRes[n + 1], (*gResNum - n - 1) * POINTER_BYTES);
×
2906
            }
2907

2908
            --cEnd;
2,328✔
2909
            --(*gResNum);
2,328✔
2910
            ++movedNum;
2,328✔
2911
            --n;
2,328✔
2912
          }
2913
        }
2914
      }
2915
    }
2916

2917
    for (int32_t m = cStart; m < cEnd; ++m) {
15,025,643✔
2918
      for (int32_t n = m + 1; n <= cEnd; ++n) {
22,249,402✔
2919
        if (m >= n) {
13,641,308✔
2920
          fltError("filterMergeGroups get invalid m : %d and n : %d", m, n);
×
2921
          FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
2922
        }
2923
        FLT_ERR_JRET(filterMergeTwoGroups(info, &gRes[m], &gRes[n], &all));
13,641,308✔
2924

2925
        FLT_CHK_JMP(all);
13,641,562✔
2926

2927
        if (gRes[n] == NULL) {
13,641,562✔
2928
          if (n < ((*gResNum) - 1)) {
11,059✔
2929
            (void)memmove(&gRes[n], &gRes[n + 1], (*gResNum - n - 1) * POINTER_BYTES);
2,328✔
2930
          }
2931

2932
          --cEnd;
11,059✔
2933
          --(*gResNum);
11,059✔
2934
          ++movedNum;
1,187✔
2935
          --n;
1,187✔
2936
        }
2937
      }
2938
    }
2939

2940
    pColNum = cColNum;
6,401,452✔
2941
    pEnd = cEnd;
6,401,452✔
2942

2943
    i -= movedNum;
6,401,452✔
2944

2945
    if (i >= (*gResNum)) {
6,401,452✔
2946
      break;
6,364,852✔
2947
    }
2948

2949
    cStart = i;
40,445✔
2950
    cColNum = gRes[i]->colNum;
40,445✔
2951
  }
2952

2953
  return TSDB_CODE_SUCCESS;
6,364,305✔
2954

2955
_return:
×
2956

2957
  FILTER_SET_FLAG(info->status, FI_STATUS_ALL);
×
2958

2959
  return code;
×
2960
}
2961

2962
int32_t filterConvertGroupFromArray(SFilterInfo *info, SArray *group) {
89,299,949✔
2963
  size_t  groupSize = taosArrayGetSize(group);
89,299,949✔
2964
  int32_t code = TSDB_CODE_SUCCESS;
89,307,822✔
2965

2966
  info->groupNum = (uint32_t)groupSize;
89,307,822✔
2967

2968
  if (info->groupNum > 0) {
89,312,884✔
2969
    info->groups = taosMemoryCalloc(info->groupNum, sizeof(*info->groups));
89,303,611✔
2970
    if (info->groups == NULL) {
89,275,690✔
2971
      FLT_ERR_JRET(terrno);
×
2972
    }
2973
  }
2974

2975
  for (size_t i = 0; i < groupSize; ++i) {
189,534,314✔
2976
    SFilterGroup *pg = taosArrayGet(group, i);
100,241,922✔
2977
    if (NULL == pg) {
100,248,455✔
2978
      FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE);
×
2979
    }
2980
    pg->unitFlags = taosMemoryCalloc(pg->unitNum, sizeof(*pg->unitFlags));
100,248,455✔
2981
    if (pg->unitFlags == NULL) {
100,255,760✔
2982
      pg->unitNum = 0;
×
2983
      FLT_ERR_JRET(terrno);
×
2984
    }
2985
    info->groups[i] = *pg;
100,253,590✔
2986
  }
2987
  return TSDB_CODE_SUCCESS;
89,292,392✔
2988

2989
_return:
×
2990
  info->groupNum = 0;
×
2991
  return code;
×
2992
}
2993

2994
int32_t filterRewrite(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t gResNum) {
52,439,277✔
2995
  if (!FILTER_GET_FLAG(info->status, FI_STATUS_REWRITE)) {
52,439,277✔
2996
    qDebug("no need rewrite");
45,224,353✔
2997
    return TSDB_CODE_SUCCESS;
45,219,298✔
2998
  }
2999

3000
  SFilterInfo oinfo = *info;
7,193,938✔
3001

3002
  FILTER_SET_FLAG(oinfo.status, FI_STATUS_CLONED);
7,199,183✔
3003

3004
  (void)memset(info, 0, sizeof(*info));
7,199,183✔
3005

3006
  SFilterGroupCtx *res = NULL;
7,199,183✔
3007
  SFilterColInfo  *colInfo = NULL;
7,199,183✔
3008
  int32_t          optr = 0;
7,199,183✔
3009
  uint32_t         uidx = 0;
7,199,183✔
3010
  uint32_t         code = TSDB_CODE_SUCCESS;
7,208,506✔
3011
  SArray          *group = taosArrayInit(FILTER_DEFAULT_GROUP_SIZE, sizeof(SFilterGroup));
7,208,506✔
3012
  SFilterGroup     ng = {0};
7,204,351✔
3013

3014
  if (group == NULL) {
7,204,730✔
3015
    FLT_ERR_JRET(terrno);
×
3016
  }
3017

3018
  info->colRangeNum = oinfo.colRangeNum;
7,204,730✔
3019
  info->colRange = oinfo.colRange;
7,208,480✔
3020
  oinfo.colRangeNum = 0;
7,203,429✔
3021
  oinfo.colRange = NULL;
7,203,429✔
3022

3023
  FILTER_SET_FLAG(info->options, FLT_OPTION_NEED_UNIQE);
7,203,429✔
3024

3025
  FLT_ERR_JRET(filterInitUnitsFields(info));
7,208,624✔
3026

3027
  for (int32_t i = 0; i < gResNum; ++i) {
16,427,963✔
3028
    res = gRes[i];
9,237,584✔
3029
    optr = (res->colNum > 1) ? LOGIC_COND_TYPE_AND : LOGIC_COND_TYPE_OR;
9,232,992✔
3030

3031
    for (uint32_t m = 0; m < res->colNum; ++m) {
19,101,943✔
3032
      colInfo = &res->colInfo[res->colIdx[m]];
9,872,670✔
3033
      if (FILTER_NO_MERGE_DATA_TYPE(colInfo->dataType)) {
9,869,767✔
3034
        if (colInfo->type != RANGE_TYPE_UNIT) {
181,478✔
3035
          fltError("filterRewrite get invalid col type : %d", colInfo->type);
×
3036
          FLT_ERR_JRET(TSDB_CODE_QRY_FILTER_INVALID_TYPE);
×
3037
        }
3038
        int32_t usize = (int32_t)taosArrayGetSize((SArray *)colInfo->info);
159,946✔
3039

3040
        for (int32_t n = 0; n < usize; ++n) {
319,892✔
3041
          SFilterUnit *u = (SFilterUnit *)taosArrayGetP((SArray *)colInfo->info, n);
159,946✔
3042
          if (NULL == u) {
159,946✔
3043
            FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE);
×
3044
          }
3045
          code = filterAddUnitFromUnit(info, &oinfo, u, &uidx);
159,946✔
3046
          FLT_ERR_JRET(code);
159,946✔
3047
          code = filterAddUnitToGroup(&ng, uidx);
159,946✔
3048
          FLT_ERR_JRET(code);
159,946✔
3049
        }
3050

3051
        continue;
159,946✔
3052
      }
3053

3054
      if (colInfo->type != RANGE_TYPE_MR_CTX) {
9,698,296✔
3055
        fltError("filterRewrite get invalid col type : %d", colInfo->type);
×
3056
        FLT_ERR_JRET(TSDB_CODE_QRY_FILTER_INVALID_TYPE);
×
3057
      }
3058

3059
      code = filterAddGroupUnitFromCtx(info, &oinfo, colInfo->info, res->colIdx[m], &ng, optr, group);
9,709,159✔
3060
      FLT_ERR_JRET(code);
9,705,697✔
3061
    }
3062

3063
    if (ng.unitNum > 0) {
9,227,824✔
3064
      if (NULL == taosArrayPush(group, &ng)) {
582,370✔
3065
        FLT_ERR_JRET(terrno);
×
3066
      }
3067
      ng = (SFilterGroup){0};
582,370✔
3068
    }
3069
  }
3070
  FLT_ERR_JRET(filterConvertGroupFromArray(info, group));
7,190,379✔
3071

3072
  taosArrayDestroy(group);
7,208,002✔
3073

3074
  filterFreeInfo(&oinfo);
7,195,911✔
3075
  return 0;
7,194,108✔
3076

3077
_return:
×
3078
  filterFreeGroup((void *)&ng);
×
3079

3080
  taosArrayDestroyEx(group, filterFreeGroup);
×
3081

3082
  filterFreeInfo(&oinfo);
×
3083

3084
  FLT_RET(code);
×
3085
}
3086

3087
int32_t filterGenerateColRange(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t gResNum) {
52,427,204✔
3088
  uint32_t        *idxs = NULL;
52,427,204✔
3089
  uint32_t         colNum = 0;
52,427,204✔
3090
  SFilterGroupCtx *res = NULL;
52,427,204✔
3091
  int32_t          code = TSDB_CODE_SUCCESS;
52,427,204✔
3092
  uint32_t        *idxNum = taosMemoryCalloc(info->fields[FLD_TYPE_COLUMN].num, sizeof(*idxNum));
52,427,204✔
3093
  if (idxNum == NULL) {
52,401,867✔
3094
    FLT_ERR_JRET(terrno);
×
3095
  }
3096
  for (int32_t i = 0; i < gResNum; ++i) {
113,466,389✔
3097
    for (uint32_t m = 0; m < gRes[i]->colNum; ++m) {
125,873,166✔
3098
      SFilterColInfo *colInfo = &gRes[i]->colInfo[gRes[i]->colIdx[m]];
64,799,372✔
3099
      if (FILTER_NO_MERGE_DATA_TYPE(colInfo->dataType)) {
64,808,609✔
3100
        continue;
18,953,191✔
3101
      }
3102

3103
      ++idxNum[gRes[i]->colIdx[m]];
45,883,870✔
3104
    }
3105
  }
3106

3107
  for (uint32_t i = 0; i < info->fields[FLD_TYPE_COLUMN].num; ++i) {
110,106,193✔
3108
    if (idxNum[i] < gResNum) {
57,756,379✔
3109
      continue;
21,797,539✔
3110
    }
3111

3112
    if (idxNum[i] != gResNum) {
35,947,092✔
3113
      fltError("filterGenerateColRange get invalid idxNum : %d and gResNum : %d", idxNum[i], gResNum);
×
3114
      FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
3115
    }
3116

3117
    if (idxs == NULL) {
35,924,698✔
3118
      idxs = taosMemoryCalloc(info->fields[FLD_TYPE_COLUMN].num, sizeof(*idxs));
35,176,827✔
3119
      if (idxs == NULL) {
35,162,527✔
3120
        FLT_ERR_JRET(terrno);
×
3121
      }
3122
    }
3123

3124
    idxs[colNum++] = i;
35,910,398✔
3125
  }
3126

3127
  FLT_CHK_JMP(colNum <= 0);
52,401,242✔
3128

3129
  info->colRangeNum = colNum;
35,157,515✔
3130
  info->colRange = taosMemoryCalloc(colNum, POINTER_BYTES);
35,170,024✔
3131
  if (info->colRange == NULL) {
35,164,490✔
3132
    info->colRangeNum = 0;
×
3133
    FLT_ERR_JRET(terrno);
×
3134
  }
3135

3136
  for (int32_t i = 0; i < gResNum; ++i) {
74,249,275✔
3137
    res = gRes[i];
39,095,038✔
3138
    uint32_t n = 0;
39,091,416✔
3139

3140
    for (uint32_t m = 0; m < info->colRangeNum; ++m) {
79,052,496✔
3141
      for (; n < res->colNum; ++n) {
40,169,532✔
3142
        if (res->colIdx[n] < idxs[m]) {
40,176,952✔
3143
          continue;
244,048✔
3144
        }
3145

3146
        if (res->colIdx[n] != idxs[m]) {
39,982,534✔
3147
          fltError("filterGenerateColRange get invalid colIdx : %d and idxs : %d", res->colIdx[n], idxs[m]);
×
3148
          SCL_ERR_JRET(TSDB_CODE_APP_ERROR);
×
3149
        }
3150

3151
        SFilterColInfo *colInfo = &res->colInfo[res->colIdx[n]];
39,955,502✔
3152
        if (info->colRange[m] == NULL) {
39,945,788✔
3153
          FLT_ERR_JRET(filterInitRangeCtx(colInfo->dataType, 0, &(info->colRange[m])));
35,954,583✔
3154
          SFilterField *fi = FILTER_GET_COL_FIELD(info, res->colIdx[n]);
35,928,739✔
3155
          info->colRange[m]->colId = FILTER_GET_COL_FIELD_ID(fi);
35,944,622✔
3156
        }
3157

3158
        if (colInfo->type != RANGE_TYPE_MR_CTX) {
39,973,703✔
3159
          fltError("filterGenerateColRange get invalid col type : %d", colInfo->type);
×
3160
          FLT_ERR_JRET(TSDB_CODE_QRY_FILTER_INVALID_TYPE);
×
3161
        }
3162

3163
        bool all = false;
39,987,977✔
3164
        FLT_ERR_JRET(filterSourceRangeFromCtx(info->colRange[m], colInfo->info, LOGIC_COND_TYPE_OR, NULL, &all));
39,990,572✔
3165
        if (all) {
39,987,205✔
3166
          (void)filterFreeRangeCtx(info->colRange[m]);  // No need to handle the return value.
20,336✔
3167
          info->colRange[m] = NULL;
20,336✔
3168
          if (m < (info->colRangeNum - 1)) {
20,336✔
3169
            (void)memmove(&info->colRange[m], &info->colRange[m + 1], (info->colRangeNum - m - 1) * POINTER_BYTES);
2,328✔
3170
            (void)memmove(&idxs[m], &idxs[m + 1], (info->colRangeNum - m - 1) * sizeof(*idxs));
2,328✔
3171
          }
3172

3173
          --info->colRangeNum;
20,336✔
3174
          --m;
20,336✔
3175

3176
          FLT_CHK_JMP(info->colRangeNum <= 0);
20,336✔
3177
        }
3178

3179
        ++n;
39,967,813✔
3180
        break;
39,967,813✔
3181
      }
3182
    }
3183
  }
3184

3185
_return:
35,154,237✔
3186
  taosMemoryFreeClear(idxNum);
52,439,882✔
3187
  taosMemoryFreeClear(idxs);
52,411,079✔
3188

3189
  return code;
52,389,688✔
3190
}
3191

3192
int32_t filterPostProcessRange(SFilterInfo *info) {
52,438,888✔
3193
  for (uint32_t i = 0; i < info->colRangeNum; ++i) {
88,348,587✔
3194
    SFilterRangeCtx  *ctx = info->colRange[i];
35,938,427✔
3195
    SFilterRangeNode *r = ctx->rs;
35,923,924✔
3196
    while (r) {
57,219,313✔
3197
      r->rc.func = filterGetRangeCompFunc(r->ra.sflag, r->ra.eflag);
21,309,614✔
3198
      r = r->next;
21,282,803✔
3199
    }
3200
  }
3201

3202
  return TSDB_CODE_SUCCESS;
52,413,630✔
3203
}
3204

3205
int32_t filterGenerateComInfo(SFilterInfo *info) {
52,420,048✔
3206
  info->cunits = taosMemoryMalloc(info->unitNum * sizeof(*info->cunits));
52,420,048✔
3207
  info->blkUnitRes = taosMemoryMalloc(sizeof(*info->blkUnitRes) * info->unitNum);
52,430,495✔
3208
  info->blkUnits = taosMemoryMalloc(sizeof(*info->blkUnits) * (info->unitNum + 1) * info->groupNum);
52,413,149✔
3209
  if (NULL == info->cunits || NULL == info->blkUnitRes || NULL == info->blkUnits) {
52,434,220✔
3210
    return terrno;
1,208✔
3211
  }
3212

3213
  for (uint32_t i = 0; i < info->unitNum; ++i) {
116,169,792✔
3214
    SFilterUnit *unit = &info->units[i];
63,747,937✔
3215

3216
    FLT_ERR_RET(filterGetCompFuncIdx(FILTER_UNIT_DATA_TYPE(unit), unit->compare.optr, &info->cunits[i].func, false));
63,736,769✔
3217
    info->cunits[i].rfunc = filterGetRangeCompFuncFromOptrs(unit->compare.optr, unit->compare.optr2);
63,711,495✔
3218
    info->cunits[i].optr = FILTER_UNIT_OPTR(unit);
63,737,897✔
3219
    info->cunits[i].colData = NULL;
63,739,296✔
3220
    info->cunits[i].colId = FILTER_UNIT_COL_ID(info, unit);
63,747,807✔
3221

3222
    if (unit->right.type == FLD_TYPE_VALUE) {
63,738,472✔
3223
      info->cunits[i].valData = FILTER_UNIT_VAL_DATA(info, unit);
45,571,949✔
3224
    } else {
3225
      info->cunits[i].valData = NULL;
18,153,928✔
3226
    }
3227
    if (unit->right2.type == FLD_TYPE_VALUE) {
63,728,941✔
3228
      info->cunits[i].valData2 = FILTER_GET_VAL_FIELD_DATA(FILTER_GET_FIELD(info, unit->right2));
2,502,622✔
3229
    } else {
3230
      info->cunits[i].valData2 = info->cunits[i].valData;
61,200,498✔
3231
    }
3232

3233
    info->cunits[i].dataSize = FILTER_UNIT_COL_SIZE(info, unit);
63,749,178✔
3234
    info->cunits[i].dataType = FILTER_UNIT_DATA_TYPE(unit);
63,754,222✔
3235
  }
3236

3237
  return TSDB_CODE_SUCCESS;
52,410,197✔
3238
}
3239

3240
int32_t filterUpdateComUnits(SFilterInfo *info) {
173,459,208✔
3241
  for (uint32_t i = 0; i < info->unitNum; ++i) {
265,929,795✔
3242
    SFilterUnit *unit = &info->units[i];
92,480,190✔
3243

3244
    SFilterField *col = FILTER_UNIT_LEFT_FIELD(info, unit);
92,471,841✔
3245
    info->cunits[i].colData = col->data;
92,470,236✔
3246
  }
3247

3248
  return TSDB_CODE_SUCCESS;
173,458,507✔
3249
}
3250

3251
int32_t filterRmUnitByRange(SFilterInfo *info, SColumnDataAgg *pDataStatis, int32_t numOfCols, int32_t numOfRows) {
×
3252
  int32_t rmUnit = 0;
×
3253

3254
  (void)memset(info->blkUnitRes, 0, sizeof(*info->blkUnitRes) * info->unitNum);
×
3255

3256
  for (uint32_t k = 0; k < info->unitNum; ++k) {
×
3257
    int32_t         index = -1;
×
3258
    SFilterComUnit *cunit = &info->cunits[k];
×
3259

3260
    if (FILTER_NO_MERGE_DATA_TYPE(cunit->dataType)) {
×
3261
      continue;
×
3262
    }
3263

3264
    for (int32_t i = 0; i < numOfCols; ++i) {
×
3265
      if (pDataStatis[i].colId == cunit->colId) {
×
3266
        index = i;
×
3267
        break;
×
3268
      }
3269
    }
3270

3271
    if (index == -1) {
×
3272
      continue;
×
3273
    }
3274

3275
    if (pDataStatis[index].numOfNull <= 0) {
×
3276
      if (cunit->optr == OP_TYPE_IS_NULL) {
×
3277
        info->blkUnitRes[k] = -1;
×
3278
        rmUnit = 1;
×
3279
        continue;
×
3280
      }
3281

3282
      if (cunit->optr == OP_TYPE_IS_NOT_NULL) {
×
3283
        info->blkUnitRes[k] = 1;
×
3284
        rmUnit = 1;
×
3285
        continue;
×
3286
      }
3287
    } else {
3288
      if (pDataStatis[index].numOfNull == numOfRows) {
×
3289
        if (cunit->optr == OP_TYPE_IS_NULL) {
×
3290
          info->blkUnitRes[k] = 1;
×
3291
          rmUnit = 1;
×
3292
          continue;
×
3293
        }
3294

3295
        info->blkUnitRes[k] = -1;
×
3296
        rmUnit = 1;
×
3297
        continue;
×
3298
      }
3299
    }
3300

3301
    if (cunit->optr == OP_TYPE_IS_NULL || cunit->optr == OP_TYPE_IS_NOT_NULL || cunit->optr == OP_TYPE_IN ||
×
3302
        cunit->optr == OP_TYPE_LIKE || cunit->optr == OP_TYPE_MATCH || cunit->optr == OP_TYPE_NOT_EQUAL) {
×
3303
      continue;
×
3304
    }
3305

3306
    SColumnDataAgg *pDataBlockst = &pDataStatis[index];
×
3307
    void           *minVal, *maxVal;
3308
    float           minv = 0;
×
3309
    float           maxv = 0;
×
3310

3311
    if (cunit->dataType == TSDB_DATA_TYPE_FLOAT) {
×
3312
      minv = (float)(*(double *)(&pDataBlockst->min));
×
3313
      maxv = (float)(*(double *)(&pDataBlockst->max));
×
3314

3315
      minVal = &minv;
×
3316
      maxVal = &maxv;
×
3317
    } else {
3318
      minVal = &pDataBlockst->min;
×
3319
      maxVal = &pDataBlockst->max;
×
3320
    }
3321

3322
    bool minRes = false, maxRes = false;
×
3323

3324
    if (cunit->rfunc >= 0) {
×
3325
      minRes =
3326
          (*gRangeCompare[cunit->rfunc])(minVal, minVal, cunit->valData, cunit->valData2, gDataCompare[cunit->func]);
×
3327
      maxRes =
3328
          (*gRangeCompare[cunit->rfunc])(maxVal, maxVal, cunit->valData, cunit->valData2, gDataCompare[cunit->func]);
×
3329

3330
      if (minRes && maxRes) {
×
3331
        info->blkUnitRes[k] = 1;
×
3332
        rmUnit = 1;
×
3333
      } else if ((!minRes) && (!maxRes)) {
×
3334
        minRes = filterDoCompare(gDataCompare[cunit->func], OP_TYPE_LOWER_EQUAL, minVal, cunit->valData);
×
3335
        maxRes = filterDoCompare(gDataCompare[cunit->func], OP_TYPE_GREATER_EQUAL, maxVal, cunit->valData2);
×
3336

3337
        if (minRes && maxRes) {
×
3338
          continue;
×
3339
        }
3340

3341
        info->blkUnitRes[k] = -1;
×
3342
        rmUnit = 1;
×
3343
      }
3344
    } else {
3345
      minRes = filterDoCompare(gDataCompare[cunit->func], cunit->optr, minVal, cunit->valData);
×
3346
      maxRes = filterDoCompare(gDataCompare[cunit->func], cunit->optr, maxVal, cunit->valData);
×
3347

3348
      if (minRes && maxRes) {
×
3349
        info->blkUnitRes[k] = 1;
×
3350
        rmUnit = 1;
×
3351
      } else if ((!minRes) && (!maxRes)) {
×
3352
        if (cunit->optr == OP_TYPE_EQUAL) {
×
3353
          minRes = filterDoCompare(gDataCompare[cunit->func], OP_TYPE_GREATER_THAN, minVal, cunit->valData);
×
3354
          maxRes = filterDoCompare(gDataCompare[cunit->func], OP_TYPE_LOWER_THAN, maxVal, cunit->valData);
×
3355
          if (minRes || maxRes) {
×
3356
            info->blkUnitRes[k] = -1;
×
3357
            rmUnit = 1;
×
3358
          }
3359

3360
          continue;
×
3361
        }
3362

3363
        info->blkUnitRes[k] = -1;
×
3364
        rmUnit = 1;
×
3365
      }
3366
    }
3367
  }
3368

3369
  if (rmUnit == 0) {
×
3370
    fltDebug("NO Block Filter APPLY");
×
3371
    FLT_RET(TSDB_CODE_SUCCESS);
×
3372
  }
3373

3374
  info->blkGroupNum = info->groupNum;
×
3375

3376
  uint32_t *unitNum = info->blkUnits;
×
3377
  uint32_t *unitIdx = unitNum + 1;
×
3378
  int32_t   all = 0, empty = 0;
×
3379

3380
  for (uint32_t g = 0; g < info->groupNum; ++g) {
×
3381
    SFilterGroup *group = &info->groups[g];
×
3382
    // first is block unint num for a group, following append unitNum blkUnitIdx for this group
3383
    *unitNum = group->unitNum;
×
3384
    all = 0;
×
3385
    empty = 0;
×
3386

3387
    // save group idx start pointer
3388
    uint32_t *pGroupIdx = unitIdx;
×
3389
    for (uint32_t u = 0; u < group->unitNum; ++u) {
×
3390
      uint32_t uidx = group->unitIdxs[u];
×
3391
      if (info->blkUnitRes[uidx] == 1) {
×
3392
        // blkUnitRes == 1 is always true, so need not compare every time, delete this unit from group
3393
        --(*unitNum);
×
3394
        all = 1;
×
3395
        continue;
×
3396
      } else if (info->blkUnitRes[uidx] == -1) {
×
3397
        // blkUnitRes == -1 is alwary false, so in group is alwary false, need delete this group from blkGroupNum
3398
        *unitNum = 0;
×
3399
        empty = 1;
×
3400
        break;
×
3401
      }
3402

3403
      *(unitIdx++) = uidx;
×
3404
    }
3405

3406
    if (*unitNum == 0) {
×
3407
      // if unit num is zero, reset unitIdx to start on this group
3408
      unitIdx = pGroupIdx;
×
3409

3410
      --info->blkGroupNum;
×
3411
      if (!empty && !all) {
×
3412
        fltError("filterRmUnitByRange get invalid empty and all : %d and %d", empty, all);
×
3413
        FLT_ERR_RET(TSDB_CODE_APP_ERROR);
×
3414
      }
3415

3416
      if (empty) {
×
3417
        FILTER_SET_FLAG(info->blkFlag, FI_STATUS_BLK_EMPTY);
×
3418
      } else {
3419
        FILTER_SET_FLAG(info->blkFlag, FI_STATUS_BLK_ALL);
×
3420
        goto _return;
×
3421
      }
3422

3423
      continue;
×
3424
    }
3425

3426
    unitNum = unitIdx;
×
3427
    ++unitIdx;
×
3428
  }
3429

3430
  if (info->blkGroupNum) {
×
3431
    FILTER_CLR_FLAG(info->blkFlag, FI_STATUS_BLK_EMPTY);
×
3432
    FILTER_SET_FLAG(info->blkFlag, FI_STATUS_BLK_ACTIVE);
×
3433
  }
3434

3435
_return:
×
3436

3437
  FLT_ERR_RET(filterDumpInfoToString(info, "Block Filter", 2));
×
3438

3439
  return TSDB_CODE_SUCCESS;
×
3440
}
3441

3442
bool filterExecuteBasedOnStatisImpl(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes, SColumnDataAgg *statis,
×
3443
                                    int16_t numOfCols) {
3444
  SFilterInfo *info = (SFilterInfo *)pinfo;
×
3445
  bool         all = true;
×
3446
  uint32_t    *unitIdx = NULL;
×
3447

3448
  int8_t *p = (int8_t *)pRes->pData;
×
3449

3450
  for (int32_t i = 0; i < numOfRows; ++i) {
×
3451
    // FILTER_UNIT_CLR_F(info);
3452

3453
    unitIdx = info->blkUnits;
×
3454

3455
    for (uint32_t g = 0; g < info->blkGroupNum; ++g) {
×
3456
      uint32_t unitNum = *(unitIdx++);
×
3457
      for (uint32_t u = 0; u < unitNum; ++u) {
×
3458
        SFilterComUnit *cunit = &info->cunits[*(unitIdx + u)];
×
3459
        void           *colData = colDataGetData((SColumnInfoData *)cunit->colData, i);
×
3460

3461
        // if (FILTER_UNIT_GET_F(info, uidx)) {
3462
        //   p[i] = FILTER_UNIT_GET_R(info, uidx);
3463
        // } else {
3464
        uint8_t optr = cunit->optr;
×
3465

3466
        if (colDataIsNull((SColumnInfoData *)(cunit->colData), 0, i, NULL)) {
×
3467
          p[i] = (optr == OP_TYPE_IS_NULL) ? true : false;
×
3468
        } else {
3469
          if (optr == OP_TYPE_IS_NOT_NULL) {
×
3470
            p[i] = 1;
×
3471
          } else if (optr == OP_TYPE_IS_NULL) {
×
3472
            p[i] = 0;
×
3473
          } else if (cunit->rfunc >= 0) {
×
3474
            p[i] = (*gRangeCompare[cunit->rfunc])(colData, colData, cunit->valData, cunit->valData2,
×
3475
                                                  gDataCompare[cunit->func]);
×
3476
          } else {
3477
            p[i] = filterDoCompare(gDataCompare[cunit->func], cunit->optr, colData, cunit->valData);
×
3478
          }
3479

3480
          // FILTER_UNIT_SET_R(info, uidx, p[i]);
3481
          // FILTER_UNIT_SET_F(info, uidx);
3482
        }
3483

3484
        if (p[i] == 0) {
×
3485
          break;
×
3486
        }
3487
      }
3488

3489
      if (p[i]) {
×
3490
        break;
×
3491
      }
3492

3493
      unitIdx += unitNum;
×
3494
    }
3495

3496
    if (p[i] == 0) {
×
3497
      all = false;
×
3498
    }
3499
  }
3500

3501
  return all;
×
3502
}
3503

3504
int32_t filterExecuteBasedOnStatis(SFilterInfo *info, int32_t numOfRows, SColumnInfoData *p, SColumnDataAgg *statis,
72,916,622✔
3505
                                   int16_t numOfCols, bool *all, int32_t *result) {
3506
  int32_t code = TSDB_CODE_SUCCESS;
72,916,622✔
3507
  *result = 0;
72,916,622✔
3508
  if (statis && numOfRows >= FILTER_RM_UNIT_MIN_ROWS) {
72,919,760✔
3509
    info->blkFlag = 0;
×
3510

3511
    FLT_ERR_JRET(filterRmUnitByRange(info, statis, numOfCols, numOfRows));
×
3512

3513
    if (info->blkFlag) {
×
3514
      if (FILTER_GET_FLAG(info->blkFlag, FI_STATUS_BLK_ALL)) {
×
3515
        *all = true;
×
3516
        goto _return;
×
3517
      } else if (FILTER_GET_FLAG(info->blkFlag, FI_STATUS_BLK_EMPTY)) {
×
3518
        *all = false;
×
3519
        goto _return;
×
3520
      }
3521

3522
      if (info->unitNum <= 1) {
×
3523
        fltError("filterExecuteBasedOnStatis get invalid unit num : %d", info->unitNum);
×
3524
        FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
3525
      }
3526

3527
      *all = filterExecuteBasedOnStatisImpl(info, numOfRows, p, statis, numOfCols);
×
3528
      goto _return;
×
3529
    }
3530
  }
3531

3532
  *result = 1;
72,919,760✔
3533
  FLT_RET(TSDB_CODE_SUCCESS);
72,917,488✔
3534

3535
_return:
×
3536
  info->blkFlag = 0;
×
3537
  result = 0;
×
3538
  FLT_RET(code);
×
3539
}
3540

3541
static FORCE_INLINE int32_t filterExecuteImplAll(void *info, int32_t numOfRows, SColumnInfoData *p,
59,808✔
3542
                                                 SColumnDataAgg *statis, int16_t numOfCols, int32_t *numOfQualified,
3543
                                                 bool *all) {
3544
  *all = true;
59,808✔
3545
  FLT_RET(TSDB_CODE_SUCCESS);
59,808✔
3546
}
3547

3548
static FORCE_INLINE int32_t filterExecuteImplEmpty(void *info, int32_t numOfRows, SColumnInfoData *p,
8,304,585✔
3549
                                                   SColumnDataAgg *statis, int16_t numOfCols, int32_t *numOfQualified,
3550
                                                   bool *all) {
3551
  *all = false;
8,304,585✔
3552
  FLT_RET(TSDB_CODE_SUCCESS);
8,304,585✔
3553
}
3554

3555
static FORCE_INLINE int32_t filterExecuteImplIsNull(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes,
8,078,098✔
3556
                                                    SColumnDataAgg *statis, int16_t numOfCols, int32_t *numOfQualified,
3557
                                                    bool *all) {
3558
  SFilterInfo *info = (SFilterInfo *)pinfo;
8,078,098✔
3559
  int8_t      *p = (int8_t *)pRes->pData;
8,078,098✔
3560
  int32_t      result = 0;
8,078,098✔
3561

3562
  *all = true;
8,078,098✔
3563
  FLT_ERR_RET(filterExecuteBasedOnStatis(info, numOfRows, pRes, statis, numOfCols, all, &result));
8,075,648✔
3564
  if (result == 0) {
8,078,098✔
3565
    FLT_RET(TSDB_CODE_SUCCESS);
×
3566
  }
3567

3568
  for (int32_t i = 0; i < numOfRows; ++i) {
1,639,907,543✔
3569
    uint32_t uidx = info->groups[0].unitIdxs[0];
1,631,832,328✔
3570

3571
    p[i] = colDataIsNull((SColumnInfoData *)info->cunits[uidx].colData, 0, i, NULL);
2,147,483,647✔
3572
    if (p[i] == 0) {
1,631,830,654✔
3573
      *all = false;
1,450,163,168✔
3574
    } else {
3575
      (*numOfQualified) += 1;
181,667,954✔
3576
    }
3577
  }
3578

3579
  FLT_RET(TSDB_CODE_SUCCESS);
8,075,215✔
3580
}
3581

3582
static FORCE_INLINE int32_t filterExecuteImplNotNull(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes,
12,742,640✔
3583
                                                     SColumnDataAgg *statis, int16_t numOfCols, int32_t *numOfQualified,
3584
                                                     bool *all) {
3585
  SFilterInfo *info = (SFilterInfo *)pinfo;
12,742,640✔
3586
  int32_t      result = 0;
12,742,640✔
3587

3588
  *all = true;
12,743,284✔
3589
  FLT_ERR_RET(filterExecuteBasedOnStatis(info, numOfRows, pRes, statis, numOfCols, all, &result));
12,743,284✔
3590
  if (result == 0) {
12,742,640✔
3591
    FLT_RET(TSDB_CODE_SUCCESS);
×
3592
  }
3593

3594
  int8_t *p = (int8_t *)pRes->pData;
12,742,640✔
3595

3596
  for (int32_t i = 0; i < numOfRows; ++i) {
771,005,454✔
3597
    uint32_t uidx = info->groups[0].unitIdxs[0];
758,266,288✔
3598

3599
    p[i] = !colDataIsNull((SColumnInfoData *)info->cunits[uidx].colData, 0, i, NULL);
1,515,866,906✔
3600
    if (p[i] == 0) {
758,217,764✔
3601
      *all = false;
19,621,502✔
3602
    } else {
3603
      (*numOfQualified) += 1;
738,638,633✔
3604
    }
3605
  }
3606

3607
  FLT_RET(TSDB_CODE_SUCCESS);
12,739,166✔
3608
}
3609

3610
int32_t filterExecuteImplRange(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes, SColumnDataAgg *statis,
16,149,443✔
3611
                               int16_t numOfCols, int32_t *numOfQualified, bool *all) {
3612
  SFilterInfo  *info = (SFilterInfo *)pinfo;
16,149,443✔
3613
  uint16_t      dataSize = info->cunits[0].dataSize;
16,149,443✔
3614
  rangeCompFunc rfunc = gRangeCompare[info->cunits[0].rfunc];
16,149,001✔
3615
  void         *valData = info->cunits[0].valData;
16,149,265✔
3616
  void         *valData2 = info->cunits[0].valData2;
16,150,763✔
3617
  __compar_fn_t func = gDataCompare[info->cunits[0].func];
16,150,763✔
3618
  int32_t       result = 0;
16,149,888✔
3619

3620
  *all = true;
16,147,126✔
3621
  FLT_ERR_RET(filterExecuteBasedOnStatis(info, numOfRows, pRes, statis, numOfCols, all, &result));
16,147,126✔
3622
  if (result == 0) {
16,149,559✔
3623
    FLT_RET(TSDB_CODE_SUCCESS);
×
3624
  }
3625

3626
  int8_t *p = (int8_t *)pRes->pData;
16,149,559✔
3627

3628
  for (int32_t i = 0; i < numOfRows; ++i) {
2,147,483,647✔
3629
    SColumnInfoData *pData = info->cunits[0].colData;
2,147,483,647✔
3630

3631
    if (colDataIsNull_s(pData, i)) {
2,147,483,647✔
3632
      *all = false;
2,147,483,647✔
3633
      p[i] = 0;
2,147,483,647✔
3634
      colDataSetNULL(pRes, i);
2,147,483,647✔
3635
      continue;
2,147,483,647✔
3636
    }
3637

3638
    void *colData = colDataGetData(pData, i);
2,147,483,647✔
3639
    p[i] = (*rfunc)(colData, colData, valData, valData2, func);
2,147,483,647✔
3640

3641
    if (p[i] == 0) {
2,147,483,647✔
3642
      *all = false;
2,147,483,647✔
3643
    } else {
3644
      (*numOfQualified)++;
2,147,483,647✔
3645
    }
3646
  }
3647

3648
  FLT_RET(TSDB_CODE_SUCCESS);
16,131,560✔
3649
}
3650

3651
int32_t filterExecuteImplMisc(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes, SColumnDataAgg *statis,
22,021,623✔
3652
                              int16_t numOfCols, int32_t *numOfQualified, bool *all) {
3653
  SFilterInfo *info = (SFilterInfo *)pinfo;
22,021,623✔
3654
  int32_t      result = 0;
22,021,623✔
3655

3656
  *all = true;
22,022,322✔
3657
  FLT_ERR_RET(filterExecuteBasedOnStatis(info, numOfRows, pRes, statis, numOfCols, all, &result));
22,023,531✔
3658
  if (result == 0) {
22,019,352✔
3659
    FLT_RET(TSDB_CODE_SUCCESS);
×
3660
  }
3661

3662
  int8_t *p = (int8_t *)pRes->pData;
22,019,352✔
3663

3664
  for (int32_t i = 0; i < numOfRows; ++i) {
2,147,483,647✔
3665
    uint32_t uidx = info->groups[0].unitIdxs[0];
2,147,483,647✔
3666
    if (colDataIsNull_s((SColumnInfoData *)info->cunits[uidx].colData, i)) {
2,147,483,647✔
3667
      p[i] = 0;
1,296,067,184✔
3668
      colDataSetNULL(pRes, i);
1,296,067,184✔
3669
      *all = false;
1,296,067,184✔
3670
      continue;
1,296,067,184✔
3671
    }
3672

3673
    void *colData = colDataGetData((SColumnInfoData *)info->cunits[uidx].colData, i);
2,147,483,647✔
3674
    // match/nmatch for nchar type need convert from ucs4 to mbs
3675
    if (info->cunits[uidx].dataType == TSDB_DATA_TYPE_NCHAR &&
2,147,483,647✔
3676
        (info->cunits[uidx].optr == OP_TYPE_MATCH || info->cunits[uidx].optr == OP_TYPE_NMATCH)) {
×
3677
      char *newColData = taosMemoryCalloc(info->cunits[uidx].dataSize * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE, 1);
×
3678
      if (newColData == NULL) {
×
3679
        FLT_ERR_RET(terrno);
×
3680
      }
3681
      int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(colData), varDataLen(colData), varDataVal(newColData), NULL);
×
3682
      if (len < 0) {
×
3683
        qError("castConvert1 taosUcs4ToMbs error");
×
3684
        taosMemoryFreeClear(newColData);
×
3685
        FLT_ERR_RET(TSDB_CODE_SCALAR_CONVERT_ERROR);
×
3686
      } else {
3687
        varDataSetLen(newColData, len);
×
3688
        p[i] = filterDoCompare(gDataCompare[info->cunits[uidx].func], info->cunits[uidx].optr, newColData,
×
3689
                               info->cunits[uidx].valData);
×
3690
      }
3691
      taosMemoryFreeClear(newColData);
×
3692
    } else {
3693
      p[i] = filterDoCompare(gDataCompare[info->cunits[uidx].func], info->cunits[uidx].optr, colData,
2,147,483,647✔
3694
                             info->cunits[uidx].valData);
2,147,483,647✔
3695
    }
3696

3697
    if (p[i] == 0) {
2,147,483,647✔
3698
      *all = false;
2,147,483,647✔
3699
    } else {
3700
      (*numOfQualified) += 1;
1,609,991,568✔
3701
    }
3702
  }
3703

3704
  FLT_RET(TSDB_CODE_SUCCESS);
22,010,855✔
3705
}
3706

3707
int32_t filterExecuteImpl(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes, SColumnDataAgg *statis,
13,925,862✔
3708
                          int16_t numOfCols, int32_t *numOfQualified, bool *all) {
3709
  SFilterInfo *info = (SFilterInfo *)pinfo;
13,925,862✔
3710
  int32_t      result = 0;
13,925,862✔
3711

3712
  *all = true;
13,927,105✔
3713
  FLT_ERR_RET(filterExecuteBasedOnStatis(info, numOfRows, pRes, statis, numOfCols, all, &result));
13,929,044✔
3714
  if (result == 0) {
13,921,858✔
3715
    FLT_RET(TSDB_CODE_SUCCESS);
×
3716
  }
3717

3718
  int8_t *p = (int8_t *)pRes->pData;
13,921,858✔
3719

3720
  for (int32_t i = 0; i < numOfRows; ++i) {
2,147,483,647✔
3721
    // FILTER_UNIT_CLR_F(info);
3722

3723
    for (uint32_t g = 0; g < info->groupNum; ++g) {
2,147,483,647✔
3724
      SFilterGroup *group = &info->groups[g];
2,147,483,647✔
3725
      for (uint32_t u = 0; u < group->unitNum; ++u) {
2,147,483,647✔
3726
        uint32_t        uidx = group->unitIdxs[u];
2,147,483,647✔
3727
        SFilterComUnit *cunit = &info->cunits[uidx];
2,147,483,647✔
3728
        void           *colData = NULL;
2,147,483,647✔
3729
        bool            isNull = colDataIsNull((SColumnInfoData *)(cunit->colData), 0, i, NULL);
2,147,483,647✔
3730
        // if (FILTER_UNIT_GET_F(info, uidx)) {
3731
        //   p[i] = FILTER_UNIT_GET_R(info, uidx);
3732
        // } else {
3733
        uint8_t optr = cunit->optr;
2,147,483,647✔
3734

3735
        if (!isNull) {
2,147,483,647✔
3736
          colData = colDataGetData((SColumnInfoData *)(cunit->colData), i);
2,147,483,647✔
3737
        }
3738

3739
        if (colData == NULL || isNull) {
2,147,483,647✔
3740
          if (optr == OP_TYPE_IS_NULL) {
498,719,299✔
3741
            p[i] = true;
35,763,440✔
3742
          } else {
3743
            p[i] = false;
462,955,859✔
3744
            if (optr != OP_TYPE_IS_NOT_NULL) {
462,955,859✔
3745
              colDataSetNULL(pRes, i);
428,172,317✔
3746
            }
3747
          }
3748
        } else {
3749
          if (optr == OP_TYPE_IS_NOT_NULL) {
2,147,483,647✔
3750
            p[i] = 1;
350,091,315✔
3751
          } else if (optr == OP_TYPE_IS_NULL) {
2,147,483,647✔
3752
            p[i] = 0;
17,957,700✔
3753
          } else if (cunit->rfunc >= 0) {
2,147,483,647✔
3754
            p[i] = (*gRangeCompare[cunit->rfunc])(colData, colData, cunit->valData, cunit->valData2,
2,147,483,647✔
3755
                                                  gDataCompare[cunit->func]);
2,147,483,647✔
3756
          } else {
3757
            if (cunit->dataType == TSDB_DATA_TYPE_NCHAR &&
2,147,483,647✔
3758
                (cunit->optr == OP_TYPE_MATCH || cunit->optr == OP_TYPE_NMATCH)) {
×
3759
              char *newColData = taosMemoryCalloc(cunit->dataSize * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE, 1);
×
3760
              if (newColData == NULL) {
×
3761
                FLT_ERR_RET(terrno);
×
3762
              }
3763
              int32_t len =
3764
                  taosUcs4ToMbs((TdUcs4 *)varDataVal(colData), varDataLen(colData), varDataVal(newColData), NULL);
×
3765
              if (len < 0) {
×
3766
                qError("castConvert1 taosUcs4ToMbs error");
×
3767
                taosMemoryFreeClear(newColData);
×
3768
                FLT_ERR_RET(TSDB_CODE_SCALAR_CONVERT_ERROR);
×
3769
              } else {
3770
                varDataSetLen(newColData, len);
×
3771
                p[i] = filterDoCompare(gDataCompare[cunit->func], cunit->optr, newColData, cunit->valData);
×
3772
              }
3773
              taosMemoryFreeClear(newColData);
×
3774
            } else {
3775
              p[i] = filterDoCompare(gDataCompare[cunit->func], cunit->optr, colData, cunit->valData);
2,147,483,647✔
3776
            }
3777
          }
3778

3779
          // FILTER_UNIT_SET_R(info, uidx, p[i]);
3780
          // FILTER_UNIT_SET_F(info, uidx);
3781
        }
3782

3783
        if (p[i] == 0) {
2,147,483,647✔
3784
          break;
2,147,483,647✔
3785
        }
3786
      }
3787

3788
      if (p[i]) {
2,147,483,647✔
3789
        break;
1,897,056,263✔
3790
      }
3791
    }
3792

3793
    if (p[i] == 0) {
2,147,483,647✔
3794
      *all = false;
2,147,483,647✔
3795
    } else {
3796
      (*numOfQualified) += 1;
1,897,055,172✔
3797
    }
3798
  }
3799

3800
  FLT_RET(TSDB_CODE_SUCCESS);
15,381,695✔
3801
}
3802

3803
int32_t filterSetExecFunc(SFilterInfo *info) {
52,462,611✔
3804
  if (FILTER_ALL_RES(info)) {
52,462,611✔
3805
    info->func = filterExecuteImplAll;
9,968✔
3806
    return TSDB_CODE_SUCCESS;
9,968✔
3807
  }
3808

3809
  if (FILTER_EMPTY_RES(info)) {
52,418,606✔
3810
    info->func = filterExecuteImplEmpty;
35,984✔
3811
    return TSDB_CODE_SUCCESS;
35,984✔
3812
  }
3813

3814
  if (info->unitNum > 1) {
52,420,311✔
3815
    info->func = filterExecuteImpl;
8,748,143✔
3816
    return TSDB_CODE_SUCCESS;
8,738,111✔
3817
  }
3818

3819
  if (info->units[0].compare.optr == OP_TYPE_IS_NULL) {
43,644,758✔
3820
    info->func = filterExecuteImplIsNull;
7,530,000✔
3821
    return TSDB_CODE_SUCCESS;
7,529,452✔
3822
  }
3823

3824
  if (info->units[0].compare.optr == OP_TYPE_IS_NOT_NULL) {
36,112,486✔
3825
    info->func = filterExecuteImplNotNull;
10,383,194✔
3826
    return TSDB_CODE_SUCCESS;
10,381,920✔
3827
  }
3828

3829
  if (info->cunits[0].rfunc >= 0) {
25,732,444✔
3830
    info->func = filterExecuteImplRange;
13,331,638✔
3831
    return TSDB_CODE_SUCCESS;
13,326,841✔
3832
  }
3833

3834
  info->func = filterExecuteImplMisc;
12,420,820✔
3835
  return TSDB_CODE_SUCCESS;
12,416,952✔
3836
}
3837

3838
int32_t filterPreprocess(SFilterInfo *info) {
52,487,795✔
3839
  int32_t           code = TSDB_CODE_SUCCESS;
52,487,795✔
3840
  int32_t           gResNum = 0;
52,487,795✔
3841
  SFilterGroupCtx **gRes = taosMemoryCalloc(info->groupNum, sizeof(SFilterGroupCtx *));
52,492,862✔
3842
  if (gRes == NULL) {
52,474,780✔
3843
    FLT_ERR_JRET(terrno);
×
3844
  }
3845

3846
  FLT_ERR_JRET(filterMergeGroupUnits(info, gRes, &gResNum));
52,474,780✔
3847

3848
  FLT_ERR_JRET(filterMergeGroups(info, gRes, &gResNum));
52,469,483✔
3849

3850
  if (FILTER_GET_FLAG(info->status, FI_STATUS_ALL)) {
52,470,729✔
3851
    fltInfo("Final - FilterInfo: [ALL]");
9,968✔
3852
    goto _return1;
9,968✔
3853
  }
3854

3855
  if (FILTER_GET_FLAG(info->status, FI_STATUS_EMPTY)) {
52,420,159✔
3856
    fltInfo("Final - FilterInfo: [EMPTY]");
35,984✔
3857
    goto _return1;
35,984✔
3858
  }
3859

3860
  FLT_ERR_JRET(filterGenerateColRange(info, gRes, gResNum));
52,384,909✔
3861

3862
  FLT_ERR_JRET(filterDumpInfoToString(info, "Final", 1));
52,383,498✔
3863

3864
  FLT_ERR_JRET(filterPostProcessRange(info));
52,435,065✔
3865

3866
  FLT_ERR_JRET(filterRewrite(info, gRes, gResNum));
52,406,821✔
3867

3868
  FLT_ERR_JRET(filterGenerateComInfo(info));
52,428,370✔
3869

3870
_return1:
52,449,915✔
3871
  FLT_ERR_JRET(filterSetExecFunc(info));
52,453,404✔
3872

3873
_return:
52,406,904✔
3874
  for (int32_t i = 0; i < gResNum; ++i) {
113,480,203✔
3875
    filterFreeGroupCtx(gRes[i]);
61,034,924✔
3876
  }
3877

3878
  taosMemoryFreeClear(gRes);
52,445,279✔
3879

3880
  return code;
52,446,232✔
3881
}
3882

3883
int32_t fltSetColFieldDataImpl(SFilterInfo *info, void *param, filer_get_col_from_id fp, bool fromColId) {
181,820,055✔
3884
  if (FILTER_ALL_RES(info) || FILTER_EMPTY_RES(info)) {
181,820,055✔
3885
    return TSDB_CODE_SUCCESS;
8,364,393✔
3886
  }
3887

3888
  for (uint32_t i = 0; i < info->fields[FLD_TYPE_COLUMN].num; ++i) {
258,711,337✔
3889
    SFilterField *fi = &info->fields[FLD_TYPE_COLUMN].fields[i];
85,244,039✔
3890

3891
    if (fromColId) {
85,229,532✔
3892
      FLT_ERR_RET((*fp)(param, FILTER_GET_COL_FIELD_ID(fi), &fi->data));
×
3893
    } else {
3894
      FLT_ERR_RET((*fp)(param, FILTER_GET_COL_FIELD_SLOT_ID(fi), &fi->data));
85,229,532✔
3895
    }
3896
  }
3897

3898
  FLT_ERR_RET(filterUpdateComUnits(info));
173,473,447✔
3899

3900
  return TSDB_CODE_SUCCESS;
173,460,161✔
3901
}
3902

3903
int32_t fltInitFromNode(SNode *tree, SFilterInfo *info, uint32_t options) {
90,261,493✔
3904
  int32_t code = TSDB_CODE_SUCCESS;
90,261,493✔
3905

3906
  SArray *group = taosArrayInit(FILTER_DEFAULT_GROUP_SIZE, sizeof(SFilterGroup));
90,261,493✔
3907
  if (group == NULL) {
90,240,180✔
3908
    FLT_ERR_JRET(terrno);
×
3909
  }
3910

3911
  code = filterInitUnitsFields(info);
90,240,180✔
3912
  if (TSDB_CODE_SUCCESS != code) {
90,254,920✔
3913
    taosArrayDestroy(group);
×
3914
    goto _return;
×
3915
  }
3916

3917
  SFltBuildGroupCtx tctx = {.info = info, .group = group, .ignore = false};
90,254,920✔
3918
  nodesWalkExpr(tree, fltTreeToGroup, (void *)&tctx);
90,258,137✔
3919
  if (TSDB_CODE_SUCCESS != tctx.code) {
90,250,649✔
3920
    taosArrayDestroyEx(group, filterFreeGroup);
13✔
3921
    code = tctx.code;
×
3922
    goto _return;
×
3923
  }
3924
  if (tctx.ignore) {
90,250,636✔
3925
    FILTER_SET_FLAG(info->status, FI_STATUS_EMPTY);
×
3926
  }
3927
  if (FILTER_EMPTY_RES(info)) {
90,250,636✔
3928
    info->func = filterExecuteImplEmpty;
8,145,561✔
3929
    taosArrayDestroyEx(group, filterFreeGroup);
8,145,561✔
3930
    return TSDB_CODE_SUCCESS;
8,145,561✔
3931
  }
3932
  code = filterConvertGroupFromArray(info, group);
82,084,037✔
3933
  if (TSDB_CODE_SUCCESS != code) {
82,097,897✔
3934
    taosArrayDestroyEx(group, filterFreeGroup);
×
3935
    goto _return;
×
3936
  }
3937
  taosArrayDestroy(group);
82,097,897✔
3938
  FLT_ERR_JRET(fltInitValFieldData(info));
82,075,895✔
3939

3940
  if (!FILTER_GET_FLAG(info->options, FLT_OPTION_NO_REWRITE)) {
82,106,064✔
3941
    FLT_ERR_JRET(filterDumpInfoToString(info, "Before preprocess", 0));
52,463,266✔
3942

3943
    FLT_ERR_JRET(filterPreprocess(info));
52,457,778✔
3944

3945
    FLT_CHK_JMP(FILTER_GET_FLAG(info->status, FI_STATUS_ALL));
52,441,934✔
3946

3947
    if (FILTER_GET_FLAG(info->status, FI_STATUS_EMPTY)) {
52,425,274✔
3948
      return code;
35,984✔
3949
    }
3950
  }
3951

3952
  info->unitRes = taosMemoryMalloc(info->unitNum * sizeof(*info->unitRes));
82,059,018✔
3953
  if (info->unitRes == NULL) {
82,014,919✔
3954
    FLT_ERR_JRET(terrno);
×
3955
  }
3956
  info->unitFlags = taosMemoryMalloc(info->unitNum * sizeof(*info->unitFlags));
82,043,207✔
3957
  if (info->unitFlags == NULL) {
82,023,768✔
3958
    FLT_ERR_JRET(terrno);
×
3959
  }
3960
  FLT_ERR_JRET(filterDumpInfoToString(info, "Final", 0));
82,021,990✔
3961
  return code;
82,064,129✔
3962

3963
_return:
16,964✔
3964
  if (code) {
16,964✔
3965
    qInfo("init from node failed, code:%d, %s", code, tstrerror(code));
6,996✔
3966
  }
3967
  return code;
16,964✔
3968
}
3969

3970
// compare ranges, null < min < val < max. null=null, min=min, max=max
3971
typedef enum {
3972
  FLT_SCL_DATUM_KIND_NULL,
3973
  FLT_SCL_DATUM_KIND_MIN,
3974
  FLT_SCL_DATUM_KIND_INT64,
3975
  FLT_SCL_DATUM_KIND_UINT64,
3976
  FLT_SCL_DATUM_KIND_FLOAT64,
3977
  FLT_SCL_DATUM_KIND_VARCHAR,
3978
  FLT_SCL_DATUM_KIND_NCHAR,
3979
  FLT_SCL_DATUM_KIND_DECIMAL64,
3980
  FLT_SCL_DATUM_KIND_DECIMAL,
3981
  FLT_SCL_DATUM_KIND_MAX,
3982
} SFltSclDatumKind;
3983

3984
typedef struct {
3985
  SFltSclDatumKind kind;
3986
  union {
3987
    int64_t  i;      // for int and bool (1 true, 0 false) and ts
3988
    uint64_t u;      // for uint
3989
    double   d;      // for double
3990
    uint8_t *pData;  // for varchar, nchar, len prefixed
3991
    Decimal  dec;    // for decimal
3992
  };
3993
  SDataType type;  // TODO: original data type, may not be used?
3994
} SFltSclDatum;
3995

3996
typedef struct {
3997
  SFltSclDatum val;
3998
  bool         excl;
3999
  bool         start;
4000
} SFltSclPoint;
4001

4002
int32_t fltSclCompareWithFloat64(SFltSclDatum *val1, SFltSclDatum *val2) {
2,212,222✔
4003
  // val2->kind == float64
4004
  switch (val1->kind) {
2,212,222✔
4005
    case FLT_SCL_DATUM_KIND_UINT64:
×
4006
      return compareUint64Double(&val1->u, &val2->d);
×
4007
    case FLT_SCL_DATUM_KIND_VARCHAR:
8,275✔
4008
    case FLT_SCL_DATUM_KIND_NCHAR:
4009
    case FLT_SCL_DATUM_KIND_INT64:
4010
      return compareInt64Double(&val1->i, &val2->d);
8,275✔
4011
    case FLT_SCL_DATUM_KIND_FLOAT64: {
1,189,310✔
4012
      return compareDoubleVal(&val1->d, &val2->d);
1,189,310✔
4013
    }
4014
    case FLT_SCL_DATUM_KIND_DECIMAL64: {
253,110✔
4015
      double d = doubleFromDecimal64(&val1->i, val1->type.precision, val1->type.scale);
253,110✔
4016
      return compareDoubleVal(&d, &val2->d);
253,110✔
4017
    }
4018
    case FLT_SCL_DATUM_KIND_DECIMAL: {
759,330✔
4019
      double d = doubleFromDecimal128(&val1->dec, val1->type.precision, val1->type.scale);
759,330✔
4020
      return compareDoubleVal(&d, &val2->d);
759,330✔
4021
    }
4022
    default:
2,197✔
4023
      qError("not supported comparsion. kind1 %d, kind2 %d", val1->kind, val2->kind);
2,197✔
4024
      return (val1->kind - val2->kind);
2,197✔
4025
  }
4026
}
4027

4028
int32_t fltSclCompareWithInt64(SFltSclDatum *val1, SFltSclDatum *val2) {
6,692,132✔
4029
  // val2->kind == int64
4030
  switch (val1->kind) {
6,692,132✔
4031
    case FLT_SCL_DATUM_KIND_UINT64:
1,863,648✔
4032
      return compareUint64Int64(&val1->u, &val2->i);
1,863,648✔
4033
    case FLT_SCL_DATUM_KIND_VARCHAR:
4,302,497✔
4034
    case FLT_SCL_DATUM_KIND_NCHAR:
4035
    case FLT_SCL_DATUM_KIND_INT64:
4036
      return compareInt64Val(&val1->i, &val2->i);
4,302,497✔
4037
    case FLT_SCL_DATUM_KIND_FLOAT64: {
525,987✔
4038
      return compareDoubleInt64(&val1->d, &val2->i);
525,987✔
4039
    }
UNCOV
4040
    default:
×
UNCOV
4041
      qError("not supported comparsion. kind1 %d, kind2 %d", val1->kind, val2->kind);
×
UNCOV
4042
      return (val1->kind - val2->kind);
×
4043
  }
4044
}
4045

4046
int32_t fltSclCompareWithUInt64(SFltSclDatum *val1, SFltSclDatum *val2) {
535✔
4047
  // val2 kind == uint64
4048
  switch (val1->kind) {
535✔
4049
    case FLT_SCL_DATUM_KIND_UINT64:
×
4050
      return compareUint64Val(&val1->u, &val2->u);
×
4051
    case FLT_SCL_DATUM_KIND_VARCHAR:
535✔
4052
    case FLT_SCL_DATUM_KIND_NCHAR:
4053
    case FLT_SCL_DATUM_KIND_INT64:
4054
      return compareInt64Uint64(&val1->i, &val2->u);
535✔
4055
    case FLT_SCL_DATUM_KIND_FLOAT64: {
×
4056
      return compareDoubleUint64(&val1->d, &val2->u);
×
4057
    }
4058
    default:
×
4059
      qError("not supported comparsion. kind1 %d, kind2 %d", val1->kind, val2->kind);
×
4060
      return (val1->kind - val2->kind);
×
4061
  }
4062
}
4063

4064
int32_t fltSclCompareWithDecimal(void *pData1, const SDataType *pType1, void *pData2, const SDataType *pType2) {
×
4065
  SDecimalCompareCtx ctx1 = {.pData = pData1,
×
4066
                             .type = pType1->type,
×
4067
                             .typeMod = decimalCalcTypeMod(pType1->precision, pType1->scale)},
×
4068
                     ctx2 = {.pData = pData2,
×
4069
                             .type = pType2->type,
×
4070
                             .typeMod = decimalCalcTypeMod(pType2->precision, pType2->scale)};
×
4071
  if (decimalCompare(OP_TYPE_GREATER_THAN, &ctx1, &ctx2)) return 1;
×
4072
  if (decimalCompare(OP_TYPE_EQUAL, &ctx1, &ctx2)) return 0;
×
4073
  return -1;
×
4074
}
4075

4076
int32_t fltSclCompareDatum(SFltSclDatum *val1, SFltSclDatum *val2) {
16,743,408✔
4077
  if (val2->kind == FLT_SCL_DATUM_KIND_NULL || val2->kind == FLT_SCL_DATUM_KIND_MIN ||
16,743,408✔
4078
      val2->kind == FLT_SCL_DATUM_KIND_MAX) {
11,792,192✔
4079
    return (val1->kind < val2->kind) ? -1 : ((val1->kind > val2->kind) ? 1 : 0);
5,843,905✔
4080
  }
4081

4082
  if (val1->kind == FLT_SCL_DATUM_KIND_NULL || val1->kind == FLT_SCL_DATUM_KIND_MIN ||
10,900,958✔
4083
      val1->kind == FLT_SCL_DATUM_KIND_MAX) {
10,204,488✔
4084
    return (val1->kind < val2->kind) ? -1 : ((val1->kind > val2->kind) ? 1 : 0);
1,997,461✔
4085
  }
4086

4087
  switch (val2->kind) {
8,902,820✔
4088
    case FLT_SCL_DATUM_KIND_UINT64: {
535✔
4089
      return fltSclCompareWithUInt64(val1, val2);
535✔
4090
    }
4091
    case FLT_SCL_DATUM_KIND_NCHAR:
6,692,132✔
4092
    case FLT_SCL_DATUM_KIND_VARCHAR:
4093
    case FLT_SCL_DATUM_KIND_INT64: {
4094
      return fltSclCompareWithInt64(val1, val2);
6,692,132✔
4095
    }
4096
    case FLT_SCL_DATUM_KIND_FLOAT64: {
2,210,297✔
4097
      return fltSclCompareWithFloat64(val1, val2);
2,210,297✔
4098
    }
4099
    case FLT_SCL_DATUM_KIND_DECIMAL64: {
×
4100
      void *pData1 = val1->kind == FLT_SCL_DATUM_KIND_DECIMAL64 ? (void *)&val1->i : (void *)&val1->dec;
×
4101
      return fltSclCompareWithDecimal(pData1, &val1->type, &val2->i, &val2->type);
×
4102
    }
4103
    case FLT_SCL_DATUM_KIND_DECIMAL: {
×
4104
      void *pData1 = val1->kind == FLT_SCL_DATUM_KIND_DECIMAL64 ? (void *)&val1->i : (void *)&val1->dec;
×
4105
      return fltSclCompareWithDecimal(pData1, &val1->type, &val2->dec, &val2->type);
×
4106
    }
4107
    default:
1,546✔
4108
      qError("not supported kind when compare datum. kind2 : %d", val2->kind);
1,546✔
4109
      return 0;
×
4110
      break;
4111
  }
4112
  return 0;
4113
}
4114

4115
bool fltSclLessPoint(SFltSclPoint *pt1, SFltSclPoint *pt2) {
16,742,878✔
4116
  // first value compare
4117
  int32_t cmp = fltSclCompareDatum(&pt1->val, &pt2->val);
16,742,878✔
4118
  if (cmp != 0) {
16,742,673✔
4119
    return cmp < 0;
12,622,718✔
4120
  }
4121

4122
  if (pt1->start && pt2->start) {
4,119,955✔
4123
    return !pt1->excl && pt2->excl;
1,369,330✔
4124
  } else if (pt1->start) {
2,750,625✔
4125
    return !pt1->excl && !pt2->excl;
1,352,763✔
4126
  } else if (pt2->start) {
1,397,862✔
4127
    return pt1->excl || pt2->excl;
1,337,961✔
4128
  }
4129
  return pt1->excl && !pt2->excl;
59,901✔
4130
}
4131

4132
int32_t fltSclMergeSort(SArray *pts1, SArray *pts2, SArray *result) {
3,856,124✔
4133
  size_t len1 = taosArrayGetSize(pts1);
3,856,124✔
4134
  size_t len2 = taosArrayGetSize(pts2);
3,856,657✔
4135
  size_t i = 0;
3,857,036✔
4136
  size_t j = 0;
3,857,036✔
4137
  while (i < len1 && j < len2) {
20,600,219✔
4138
    SFltSclPoint *pt1 = taosArrayGet(pts1, i);
16,743,183✔
4139
    SFltSclPoint *pt2 = taosArrayGet(pts2, j);
16,742,264✔
4140
    if (NULL == pt1 || NULL == pt2) {
16,741,885✔
4141
      FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
4142
    }
4143
    bool less = fltSclLessPoint(pt1, pt2);
16,741,885✔
4144
    if (less) {
16,742,673✔
4145
      if (NULL == taosArrayPush(result, pt1)) {
8,331,918✔
4146
        FLT_ERR_RET(terrno);
×
4147
      }
4148
      ++i;
8,330,617✔
4149
    } else {
4150
      if (NULL == taosArrayPush(result, pt2)) {
8,412,033✔
4151
        FLT_ERR_RET(terrno);
×
4152
      }
4153
      ++j;
8,412,566✔
4154
    }
4155
  }
4156
  if (i < len1) {
3,857,036✔
4157
    for (; i < len1; ++i) {
3,332,328✔
4158
      SFltSclPoint *pt1 = taosArrayGet(pts1, i);
1,672,372✔
4159
      if (NULL == pt1) {
1,671,839✔
4160
        FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
4161
      }
4162
      if (NULL == taosArrayPush(result, pt1)) {
1,672,372✔
4163
        FLT_ERR_RET(terrno);
×
4164
      }
4165
    }
4166
  }
4167
  if (j < len2) {
3,857,036✔
4168
    for (; j < len2; ++j) {
5,801,126✔
4169
      SFltSclPoint *pt2 = taosArrayGet(pts2, j);
3,603,513✔
4170
      if (NULL == pt2) {
3,603,513✔
4171
        FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
4172
      }
4173
      if (NULL == taosArrayPush(result, pt2)) {
3,603,513✔
4174
        FLT_ERR_RET(terrno);
×
4175
      }
4176
    }
4177
  }
4178
  return TSDB_CODE_SUCCESS;
3,857,036✔
4179
}
4180

4181
int32_t fltSclMerge(SArray *pts1, SArray *pts2, bool isUnion, SArray *merged) {
3,857,036✔
4182
  size_t len1 = taosArrayGetSize(pts1);
3,857,036✔
4183
  size_t len2 = taosArrayGetSize(pts2);
3,857,036✔
4184
  // first merge sort pts1 and pts2
4185
  SArray *all = taosArrayInit(len1 + len2, sizeof(SFltSclPoint));
3,857,569✔
4186
  if (all == NULL) {
3,854,813✔
4187
    FLT_ERR_RET(terrno);
×
4188
  }
4189
  FLT_ERR_RET(fltSclMergeSort(pts1, pts2, all));
3,854,813✔
4190
  int32_t countRequired = (isUnion) ? 1 : 2;
3,856,117✔
4191
  int32_t count = 0;
3,856,117✔
4192
  for (int32_t i = 0; i < taosArrayGetSize(all); ++i) {
25,863,921✔
4193
    SFltSclPoint *pt = taosArrayGet(all, i);
22,015,044✔
4194
    if (NULL == pt) {
22,015,577✔
4195
      FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
4196
    }
4197
    if (pt->start) {
22,015,577✔
4198
      ++count;
11,006,328✔
4199
      if (count == countRequired) {
11,006,328✔
4200
        if (NULL == taosArrayPush(merged, pt)) {
3,283,539✔
4201
          FLT_ERR_RET(terrno);
×
4202
        }
4203
      }
4204
    } else {
4205
      if (count == countRequired) {
11,009,249✔
4206
        if (NULL == taosArrayPush(merged, pt)) {
3,284,072✔
4207
          FLT_ERR_RET(terrno);
×
4208
        }
4209
      }
4210
      --count;
11,002,683✔
4211
    }
4212
  }
4213
  taosArrayDestroy(all);
3,849,266✔
4214
  return TSDB_CODE_SUCCESS;
3,854,146✔
4215
}
4216

4217
int32_t fltSclIntersect(SArray *pts1, SArray *pts2, SArray *merged) { return fltSclMerge(pts1, pts2, false, merged); }
3,857,036✔
4218

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

4221
typedef struct {
4222
  SColumnNode  *colNode;
4223
  SValueNode   *valNode;
4224
  EOperatorType type;
4225
} SFltSclOperator;
4226

4227
int32_t fltSclGetOrCreateColumnRange(SColumnNode *colNode, SArray *colRangeList, SFltSclColumnRange **colRange) {
9,213,714✔
4228
  for (int32_t i = 0; i < taosArrayGetSize(colRangeList); ++i) {
10,225,437✔
4229
    *colRange = taosArrayGet(colRangeList, i);
2,364,005✔
4230
    if (NULL == colRange) {
2,364,159✔
4231
      return TSDB_CODE_OUT_OF_RANGE;
×
4232
    }
4233
    if (nodesEqualNode((SNode *)(*colRange)->colNode, (SNode *)colNode)) {
2,364,159✔
4234
      return TSDB_CODE_SUCCESS;
1,350,307✔
4235
    }
4236
  }
4237
  // TODO(smj):wait for nodesCloneNode change it's return value, use terrno for now.
4238
  terrno = TSDB_CODE_SUCCESS;
7,860,924✔
4239
  SColumnNode *pColumnNode = NULL;
7,861,159✔
4240
  int32_t      code = nodesCloneNode((SNode *)colNode, (SNode **)&pColumnNode);
7,861,159✔
4241
  FLT_ERR_RET(code);
7,865,102✔
4242
  SFltSclColumnRange newColRange = {.colNode = pColumnNode, .points = taosArrayInit(4, sizeof(SFltSclPoint))};
7,865,102✔
4243
  if (NULL == newColRange.points) {
7,863,328✔
4244
    FLT_ERR_RET(terrno);
×
4245
  }
4246
  if (NULL == taosArrayPush(colRangeList, &newColRange)) {
7,864,467✔
4247
    FLT_ERR_RET(terrno);
×
4248
  }
4249
  *colRange = taosArrayGetLast(colRangeList);
7,864,467✔
4250
  return TSDB_CODE_SUCCESS;
7,865,695✔
4251
}
4252

4253
static int32_t fltSclBuildDecimalDatumFromValueNode(SFltSclDatum *datum, SColumnNode *pColNode, SValueNode *valNode) {
786,401✔
4254
  datum->type = pColNode->node.resType;
786,401✔
4255
  SDataType valDt = valNode->node.resType;
786,401✔
4256
  if (valNode->isNull) {
786,401✔
4257
    datum->kind = FLT_SCL_DATUM_KIND_NULL;
×
4258
  } else {
4259
    void *pInput = NULL;
786,401✔
4260
    switch (valNode->node.resType.type) {
786,401✔
4261
      case TSDB_DATA_TYPE_NULL:
×
4262
        datum->kind = FLT_SCL_DATUM_KIND_NULL;
×
4263
        FLT_RET(0);
×
4264
      case TSDB_DATA_TYPE_BOOL:
79,988✔
4265
        pInput = &valNode->datum.b;
79,988✔
4266
        break;
79,988✔
4267
      case TSDB_DATA_TYPE_TINYINT:
362,464✔
4268
      case TSDB_DATA_TYPE_SMALLINT:
4269
      case TSDB_DATA_TYPE_INT:
4270
      case TSDB_DATA_TYPE_BIGINT:
4271
      case TSDB_DATA_TYPE_TIMESTAMP:
4272
        pInput = &valNode->datum.i;
362,464✔
4273
        break;
362,464✔
4274
      case TSDB_DATA_TYPE_UTINYINT:
×
4275
      case TSDB_DATA_TYPE_USMALLINT:
4276
      case TSDB_DATA_TYPE_UINT:
4277
      case TSDB_DATA_TYPE_UBIGINT:
4278
        pInput = &valNode->datum.u;
×
4279
        break;
×
4280
      case TSDB_DATA_TYPE_FLOAT:
152,306✔
4281
      case TSDB_DATA_TYPE_DOUBLE:
4282
        datum->kind = FLT_SCL_DATUM_KIND_FLOAT64;
152,306✔
4283
        datum->type = valDt;
152,306✔
4284
        datum->d = valNode->datum.d;
152,306✔
4285
        FLT_RET(0);
152,306✔
4286
      case TSDB_DATA_TYPE_VARCHAR:
191,643✔
4287
        datum->kind = FLT_SCL_DATUM_KIND_FLOAT64;
191,643✔
4288
        datum->type.type = TSDB_DATA_TYPE_DOUBLE;
191,643✔
4289
        datum->type.bytes = DOUBLE_BYTES;
191,643✔
4290
        datum->d = taosStr2Double(valNode->literal, NULL);
191,643✔
4291
        FLT_RET(0);
191,643✔
4292
      case TSDB_DATA_TYPE_DECIMAL64:
×
4293
        datum->kind = FLT_SCL_DATUM_KIND_DECIMAL64;
×
4294
        datum->type = valDt;
×
4295
        datum->i = valNode->datum.i;
×
4296
        FLT_RET(0);
×
4297
      case TSDB_DATA_TYPE_DECIMAL:
×
4298
        datum->kind = FLT_SCL_DATUM_KIND_DECIMAL;
×
4299
        datum->type = valDt;
×
4300
        datum->dec = *(Decimal *)valNode->datum.p;
×
4301
        FLT_RET(0);
×
4302
      default:
×
4303
        qError("not supported type %d when build decimal datum from value node", valNode->node.resType.type);
×
4304
        return TSDB_CODE_INVALID_PARA;
×
4305
    }
4306

4307
    void *pData = NULL;
442,452✔
4308
    if (datum->type.type == TSDB_DATA_TYPE_DECIMAL64) {
442,452✔
4309
      pData = &datum->i;
123,652✔
4310
      datum->kind = FLT_SCL_DATUM_KIND_DECIMAL64;
123,652✔
4311
    } else if (datum->type.type == TSDB_DATA_TYPE_DECIMAL) {
318,800✔
4312
      pData = &datum->dec;
318,800✔
4313
      datum->kind = FLT_SCL_DATUM_KIND_DECIMAL;
318,800✔
4314
    }
4315
    if (datum->kind == FLT_SCL_DATUM_KIND_DECIMAL64 || datum->kind == FLT_SCL_DATUM_KIND_DECIMAL) {
442,452✔
4316
      int32_t code = convertToDecimal(pInput, &valDt, pData, &datum->type);
442,452✔
4317
      if (TSDB_CODE_SUCCESS != code) return code;
442,452✔
4318
    }
4319
  }
4320
  FLT_RET(0);
425,468✔
4321
}
4322

4323
int32_t fltSclBuildDatumFromValueNode(SFltSclDatum *datum, SColumnNode *pColNode, SValueNode *valNode) {
10,571,664✔
4324
  if (IS_DECIMAL_TYPE(pColNode->node.resType.type)) {
10,571,664✔
4325
    return fltSclBuildDecimalDatumFromValueNode(datum, pColNode, valNode);
789,140✔
4326
  }
4327
  datum->type = valNode->node.resType;
9,787,816✔
4328

4329
  if (valNode->isNull) {
9,780,970✔
4330
    datum->kind = FLT_SCL_DATUM_KIND_NULL;
×
4331
  } else {
4332
    switch (valNode->node.resType.type) {
9,786,655✔
4333
      case TSDB_DATA_TYPE_NULL: {
×
4334
        datum->kind = FLT_SCL_DATUM_KIND_NULL;
×
4335
        break;
×
4336
      }
4337
      case TSDB_DATA_TYPE_BOOL: {
3,716✔
4338
        datum->kind = FLT_SCL_DATUM_KIND_INT64;
3,716✔
4339
        datum->i = (valNode->datum.b) ? 1 : 0;
3,716✔
4340
        break;
3,870✔
4341
      }
4342
      case TSDB_DATA_TYPE_TINYINT:
5,999,664✔
4343
      case TSDB_DATA_TYPE_SMALLINT:
4344
      case TSDB_DATA_TYPE_INT:
4345
      case TSDB_DATA_TYPE_BIGINT:
4346
      case TSDB_DATA_TYPE_TIMESTAMP: {
4347
        datum->kind = FLT_SCL_DATUM_KIND_INT64;
5,999,664✔
4348
        datum->i = valNode->datum.i;
6,004,454✔
4349
        break;
6,004,046✔
4350
      }
4351
      case TSDB_DATA_TYPE_UTINYINT:
535✔
4352
      case TSDB_DATA_TYPE_USMALLINT:
4353
      case TSDB_DATA_TYPE_UINT:
4354
      case TSDB_DATA_TYPE_UBIGINT: {
4355
        datum->kind = FLT_SCL_DATUM_KIND_UINT64;
535✔
4356
        datum->u = valNode->datum.u;
535✔
4357
        break;
535✔
4358
      }
4359
      case TSDB_DATA_TYPE_FLOAT:
3,512,007✔
4360
      case TSDB_DATA_TYPE_DOUBLE: {
4361
        datum->kind = FLT_SCL_DATUM_KIND_FLOAT64;
3,512,007✔
4362
        datum->d = valNode->datum.d;
3,521,995✔
4363
        break;
3,521,995✔
4364
      }
4365
      case TSDB_DATA_TYPE_VARCHAR: {
256,642✔
4366
          datum->kind = FLT_SCL_DATUM_KIND_VARCHAR;
256,642✔
4367
          datum->i = taosStr2Int64(valNode->literal, NULL, 10);
256,642✔
4368
          break;
255,967✔
4369
      }
4370
      case TSDB_DATA_TYPE_NCHAR: {
×
4371
        datum->kind = FLT_SCL_DATUM_KIND_NCHAR;
×
4372
        datum->i = taosStr2Int64(valNode->literal, NULL, 10);
×
4373
        break;
×
4374
      }
4375
      default: {
×
4376
        qDebug("not supported type %d when build datum from value node", valNode->node.resType.type);
×
4377
        break;
×
4378
      }
4379
    }
4380
  }
4381
  return TSDB_CODE_SUCCESS;
9,786,278✔
4382
}
4383

4384
int32_t fltSclBuildDatumFromBlockSmaValue(SFltSclDatum *datum, uint8_t type, void *val) {
5,010,048✔
4385
  switch (type) {
5,010,048✔
4386
    case TSDB_DATA_TYPE_BOOL:
2,703,256✔
4387
    case TSDB_DATA_TYPE_TINYINT:
4388
    case TSDB_DATA_TYPE_SMALLINT:
4389
    case TSDB_DATA_TYPE_INT:
4390
    case TSDB_DATA_TYPE_BIGINT:
4391
    case TSDB_DATA_TYPE_TIMESTAMP: {
4392
      datum->kind = FLT_SCL_DATUM_KIND_INT64;
2,703,256✔
4393
      datum->i = *(int64_t *)val;
2,703,256✔
4394
      break;
2,703,256✔
4395
    }
4396
    case TSDB_DATA_TYPE_UTINYINT:
1,281,174✔
4397
    case TSDB_DATA_TYPE_USMALLINT:
4398
    case TSDB_DATA_TYPE_UINT:
4399
    case TSDB_DATA_TYPE_UBIGINT: {
4400
      datum->kind = FLT_SCL_DATUM_KIND_UINT64;
1,281,174✔
4401
      datum->u = *(uint64_t *)val;
1,281,174✔
4402
      break;
1,281,174✔
4403
    }
4404
    case TSDB_DATA_TYPE_FLOAT:
350,658✔
4405
    case TSDB_DATA_TYPE_DOUBLE: {
4406
      datum->kind = FLT_SCL_DATUM_KIND_FLOAT64;
350,658✔
4407
      datum->d = *(double *)val;
350,658✔
4408
      break;
350,658✔
4409
    }
4410
    case TSDB_DATA_TYPE_DECIMAL64:
168,740✔
4411
      datum->kind = FLT_SCL_DATUM_KIND_DECIMAL64;
168,740✔
4412
      datum->u = *(uint64_t *)val;
168,740✔
4413
      break;
168,740✔
4414
    case TSDB_DATA_TYPE_DECIMAL:
506,220✔
4415
      datum->kind = FLT_SCL_DATUM_KIND_DECIMAL;
506,220✔
4416
      datum->dec = *(Decimal *)val;
506,220✔
4417
      break;
506,220✔
4418
    case TSDB_DATA_TYPE_VARCHAR: {
×
4419
      datum->kind = FLT_SCL_DATUM_KIND_VARCHAR;
×
4420
      datum->i = *(int64_t*)val;
×
4421
      break;
×
4422
    }
4423
    case TSDB_DATA_TYPE_NCHAR: {
×
4424
      datum->kind = FLT_SCL_DATUM_KIND_NCHAR;
×
4425
      datum->i = *(int64_t*)val;
×
4426
      break;
×
4427
    }
4428
    default: {
×
4429
      datum->kind = FLT_SCL_DATUM_KIND_NULL;
×
4430
      qDebug("not supported type %d when build datum from block sma value", type);
×
4431
      break;
×
4432
    }
4433
  }
4434

4435
  return TSDB_CODE_SUCCESS;
5,010,048✔
4436
}
4437

4438
int32_t fltSclBuildRangeFromBlockSma(SFltSclColumnRange *colRange, SColumnDataAgg *pAgg, int32_t numOfRows,
2,505,024✔
4439
                                     SArray *points) {
4440
  if (pAgg->numOfNull == numOfRows) {
2,505,024✔
4441
    SFltSclDatum datum = {.kind = FLT_SCL_DATUM_KIND_NULL};
×
4442
    SFltSclPoint startPt = {.start = true, .excl = false, .val = datum};
×
4443
    SFltSclPoint endPt = {.start = false, .excl = false, .val = datum};
×
4444
    if (NULL == taosArrayPush(points, &startPt)) {
×
4445
      FLT_ERR_RET(terrno);
×
4446
    }
4447
    if (NULL == taosArrayPush(points, &endPt)) {
×
4448
      FLT_ERR_RET(terrno);
×
4449
    }
4450
    return TSDB_CODE_SUCCESS;
×
4451
  }
4452
  if (pAgg->numOfNull > 0) {
2,505,024✔
4453
    SFltSclDatum nullDatum = {.kind = FLT_SCL_DATUM_KIND_NULL};
1,103,128✔
4454
    SFltSclPoint startPt = {.start = true, .excl = false, .val = nullDatum};
1,103,128✔
4455
    SFltSclPoint endPt = {.start = false, .excl = false, .val = nullDatum};
1,103,128✔
4456
    if (NULL == taosArrayPush(points, &startPt)) {
1,103,128✔
4457
      FLT_ERR_RET(terrno);
×
4458
    }
4459
    if (NULL == taosArrayPush(points, &endPt)) {
1,103,128✔
4460
      FLT_ERR_RET(terrno);
×
4461
    }
4462
  }
4463
  int8_t       type = colRange->colNode->node.resType.type;
2,505,603✔
4464
  SFltSclDatum min = {0};
2,505,603✔
4465
  min.type = colRange->colNode->node.resType;
2,505,603✔
4466
  FLT_ERR_RET(fltSclBuildDatumFromBlockSmaValue(&min, type, COL_AGG_GET_MIN_PTR(pAgg, type)));
2,505,603✔
4467
  SFltSclPoint minPt = {.excl = false, .start = true, .val = min};
2,505,024✔
4468
  SFltSclDatum max = {0};
2,505,024✔
4469
  max.type = min.type;
2,505,024✔
4470
  FLT_ERR_RET(fltSclBuildDatumFromBlockSmaValue(&max, type, COL_AGG_GET_MAX_PTR(pAgg, type)));
2,505,024✔
4471
  SFltSclPoint maxPt = {.excl = false, .start = false, .val = max};
2,505,024✔
4472
  if (NULL == taosArrayPush(points, &minPt)) {
2,505,603✔
4473
    FLT_ERR_RET(terrno);
×
4474
  }
4475
  if (NULL == taosArrayPush(points, &maxPt)) {
2,505,024✔
4476
    FLT_ERR_RET(terrno);
×
4477
  }
4478
  return TSDB_CODE_SUCCESS;
2,505,024✔
4479
}
4480

4481
int32_t filterRangeExecute(SFilterInfo *info, SColumnDataAgg *pDataStatis, int32_t numOfCols, int32_t numOfRows,
9,031,187✔
4482
                           bool *keep) {
4483
  if (info->scalarMode) {
9,031,187✔
4484
    SArray *colRanges = info->sclCtx.fltSclRange;
3,710,463✔
4485
    for (int32_t i = 0; i < taosArrayGetSize(colRanges); ++i) {
4,818,255✔
4486
      SFltSclColumnRange *colRange = taosArrayGet(colRanges, i);
2,505,024✔
4487
      if (NULL == colRange) {
2,505,603✔
4488
        FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
4489
      }
4490
      bool    foundCol = false;
2,505,603✔
4491
      int32_t j = 0;
2,505,603✔
4492
      for (; j < numOfCols; ++j) {
2,507,935✔
4493
        if (pDataStatis[j].colId == colRange->colNode->colId) {
2,507,356✔
4494
          foundCol = true;
2,505,603✔
4495
          break;
2,505,603✔
4496
        }
4497
      }
4498
      if (foundCol) {
2,506,182✔
4499
        SColumnDataAgg *pAgg = &pDataStatis[j];
2,505,603✔
4500
        SArray         *points = taosArrayInit(2, sizeof(SFltSclPoint));
2,505,603✔
4501
        if (NULL == points) {
2,505,024✔
4502
          FLT_ERR_RET(terrno);
×
4503
        }
4504
        FLT_ERR_RET(fltSclBuildRangeFromBlockSma(colRange, pAgg, numOfRows, points));
2,505,024✔
4505
        qDebug("column data agg: nulls %d, rows %d, max %" PRId64 " min %" PRId64, pAgg->numOfNull, numOfRows,
2,505,024✔
4506
               pAgg->max, pAgg->min);
4507

4508
        SArray *merged = taosArrayInit(8, sizeof(SFltSclPoint));
2,505,603✔
4509
        if (NULL == merged) {
2,505,603✔
4510
          FLT_ERR_RET(terrno);
×
4511
        }
4512
        FLT_ERR_RET(fltSclIntersect(points, colRange->points, merged));
2,505,603✔
4513
        bool isIntersect = taosArrayGetSize(merged) != 0;
2,505,603✔
4514
        qDebug("filter range execute, scalar mode, column range found. colId: %d colName: %s has overlap: %d",
2,505,603✔
4515
               colRange->colNode->colId, colRange->colNode->colName, isIntersect);
4516

4517
        taosArrayDestroy(merged);
2,505,603✔
4518
        taosArrayDestroy(points);
2,505,603✔
4519
        if (!isIntersect) {
2,505,024✔
4520
          *keep = false;
1,397,811✔
4521
          FLT_RET(TSDB_CODE_SUCCESS);
1,397,811✔
4522
        }
4523
      }
4524
    }
4525
    *keep = true;
2,313,231✔
4526
    FLT_RET(TSDB_CODE_SUCCESS);
2,313,231✔
4527
  }
4528

4529
  if (FILTER_EMPTY_RES(info)) {
5,321,303✔
4530
    *keep = false;
×
4531
    FLT_RET(TSDB_CODE_SUCCESS);
×
4532
  }
4533

4534
  if (FILTER_ALL_RES(info)) {
5,320,724✔
4535
    *keep = true;
×
4536
    FLT_RET(TSDB_CODE_SUCCESS);
×
4537
  }
4538

4539
  bool  ret = true;
5,320,724✔
4540
  void *minVal, *maxVal;
4541

4542
  for (uint32_t k = 0; k < info->colRangeNum; ++k) {
8,433,261✔
4543
    int32_t          index = -1;
5,248,052✔
4544
    SFilterRangeCtx *ctx = info->colRange[k];
5,248,052✔
4545
    for (int32_t i = 0; i < numOfCols; ++i) {
5,250,384✔
4546
      if (pDataStatis[i].colId == ctx->colId) {
5,250,384✔
4547
        index = i;
5,248,052✔
4548
        break;
5,248,052✔
4549
      }
4550
    }
4551

4552
    // no statistics data, load the true data block
4553
    if (index == -1) {
5,248,052✔
4554
      break;
×
4555
    }
4556

4557
    // not support pre-filter operation on binary/nchar data type
4558
    if (FILTER_NO_MERGE_DATA_TYPE(ctx->type)) {
5,248,052✔
4559
      break;
4560
    }
4561

4562
    if (pDataStatis[index].numOfNull <= 0) {
5,248,052✔
4563
      if (ctx->isnull && !ctx->notnull && !ctx->isrange) {
2,404,739✔
4564
        ret = false;
290,658✔
4565
        break;
290,658✔
4566
      }
4567
    } else if (pDataStatis[index].numOfNull > 0) {
2,843,313✔
4568
      if (pDataStatis[index].numOfNull == numOfRows) {
2,843,313✔
4569
        if ((ctx->notnull || ctx->isrange) && (!ctx->isnull)) {
×
4570
          ret = false;
×
4571
          break;
×
4572
        }
4573

4574
        continue;
×
4575
      } else {
4576
        if (ctx->isnull) {
2,843,313✔
4577
          continue;
382,824✔
4578
        }
4579
      }
4580
    }
4581

4582
    SColumnDataAgg *pDataBlockst = &pDataStatis[index];
4,574,570✔
4583

4584
    SFilterRangeNode *r = ctx->rs;
4,574,570✔
4585
    float             minv = 0;
4,574,570✔
4586
    float             maxv = 0;
4,574,570✔
4587

4588
    if (ctx->type == TSDB_DATA_TYPE_FLOAT) {
4,574,570✔
4589
      minv = (float)(*(double *)(&pDataBlockst->min));
1,989,717✔
4590
      maxv = (float)(*(double *)(&pDataBlockst->max));
1,989,717✔
4591

4592
      minVal = &minv;
1,989,717✔
4593
      maxVal = &maxv;
1,989,717✔
4594
    } else {
4595
      minVal = &pDataBlockst->min;
2,584,853✔
4596
      maxVal = &pDataBlockst->max;
2,584,853✔
4597
    }
4598

4599
    while (r) {
6,419,427✔
4600
      ret = r->rc.func(minVal, maxVal, &r->rc.s, &r->rc.e, ctx->pCompareFunc);
4,454,870✔
4601
      if (ret) {
4,454,870✔
4602
        break;
2,610,013✔
4603
      }
4604
      r = r->next;
1,844,857✔
4605
    }
4606

4607
    if (!ret) {
4,574,570✔
4608
      *keep = ret;
1,844,857✔
4609
      FLT_RET(TSDB_CODE_SUCCESS);
1,844,857✔
4610
    }
4611
  }
4612

4613
  *keep = ret;
3,475,867✔
4614
  FLT_RET(TSDB_CODE_SUCCESS);
3,475,867✔
4615
}
4616

4617
int32_t filterGetTimeRangeImpl(SFilterInfo *info, STimeWindow *win, bool *isStrict) {
29,630,232✔
4618
  SFilterRange     ra = {0};
29,630,232✔
4619
  SFilterRangeCtx *prev = NULL;
29,630,232✔
4620
  SFilterRangeCtx *tmpc = NULL;
29,630,301✔
4621
  SFilterRangeCtx *cur = NULL;
29,630,301✔
4622
  int32_t          num = 0;
29,630,301✔
4623
  int32_t          optr = 0;
29,630,340✔
4624
  int32_t          code = 0;
29,630,340✔
4625
  bool             empty = false, all = false;
29,630,340✔
4626
  uint32_t         emptyGroups = 0;
29,630,340✔
4627

4628
  FLT_ERR_JRET(filterInitRangeCtx(TSDB_DATA_TYPE_TIMESTAMP, FLT_OPTION_TIMESTAMP, &prev));
29,630,340✔
4629
  FLT_ERR_JRET(filterInitRangeCtx(TSDB_DATA_TYPE_TIMESTAMP, FLT_OPTION_TIMESTAMP, &tmpc));
29,629,808✔
4630
  for (uint32_t i = 0; i < info->groupNum; ++i) {
56,884,827✔
4631
    SFilterGroup *group = &info->groups[i];
29,765,227✔
4632
    if (group->unitNum > 1) {
29,764,604✔
4633
      cur = tmpc;
15,800,504✔
4634
      optr = LOGIC_COND_TYPE_AND;
15,800,504✔
4635
    } else {
4636
      cur = prev;
13,964,130✔
4637
      optr = LOGIC_COND_TYPE_OR;
13,964,130✔
4638
    }
4639

4640
    empty = false;
29,764,634✔
4641
    for (uint32_t u = 0; u < group->unitNum; ++u) {
75,671,446✔
4642
      uint32_t     uidx = group->unitIdxs[u];
45,908,418✔
4643
      SFilterUnit *unit = &info->units[uidx];
45,907,912✔
4644

4645
      uint8_t raOptr = FILTER_UNIT_OPTR(unit);
45,907,912✔
4646

4647
      FLT_ERR_JRET(filterAddRangeOptr(cur, raOptr, LOGIC_COND_TYPE_AND, &empty, NULL));
45,907,873✔
4648
      if (empty) {
45,907,861✔
4649
        emptyGroups++;
3,952✔
4650
      }
4651

4652
      if (FILTER_NO_MERGE_OPTR(raOptr)) {
45,907,861✔
4653
        continue;
5,842,685✔
4654
      }
4655

4656
      FLT_ERR_JRET(filterAddUnitRange(info, unit, cur, optr));
40,065,176✔
4657
    }
4658

4659
    if (empty) {
29,764,642✔
4660
      continue;
3,952✔
4661
    }
4662

4663
    if (cur->notnull) {
29,760,690✔
4664
      prev->notnull = true;
2,508,923✔
4665
      break;
2,508,923✔
4666
    }
4667

4668
    if (group->unitNum > 1) {
27,251,767✔
4669
      FLT_ERR_JRET(filterSourceRangeFromCtx(prev, cur, LOGIC_COND_TYPE_OR, &empty, &all));
15,796,972✔
4670
      FLT_ERR_JRET(filterResetRangeCtx(cur));
15,795,989✔
4671
      if (all) {
15,795,796✔
4672
        break;
×
4673
      }
4674
    }
4675
  }
4676

4677
  FLT_CHK_JMP(emptyGroups == info->groupNum);
29,629,047✔
4678

4679
  if (prev->notnull) {
29,628,241✔
4680
    TAOS_SET_OBJ_ALIGNED(win, TSWINDOW_INITIALIZER);
2,508,923✔
4681
  } else {
4682
    FLT_ERR_JRET(filterGetRangeNum(prev, &num));
27,118,686✔
4683

4684
    FLT_CHK_JMP(num < 1);
27,117,874✔
4685

4686
    if (num > 1) {
23,750,409✔
4687
      *isStrict = false;
58,301✔
4688
      qDebug("more than one time range, num:%d", num);
58,301✔
4689
    }
4690

4691
    SFilterRange tra;
23,454,775✔
4692
    FLT_ERR_JRET(filterGetRangeRes(prev, &tra));
23,750,401✔
4693
    taosSetInt64Aligned(&win->skey, tra.s);
23,751,383✔
4694
    taosSetInt64Aligned(&win->ekey, tra.e);
23,751,262✔
4695
    if (FILTER_GET_FLAG(tra.sflag, RANGE_FLG_EXCLUDE)) {
23,750,316✔
4696
      win->skey++;
1,971,960✔
4697
    }
4698
    if (FILTER_GET_FLAG(tra.eflag, RANGE_FLG_EXCLUDE)) {
23,750,316✔
4699
      win->ekey--;
7,568,981✔
4700
    }
4701
  }
4702

4703
  (void)filterFreeRangeCtx(prev);  // No need to handle the return value.
26,260,661✔
4704
  (void)filterFreeRangeCtx(tmpc);  // No need to handle the return value.
26,260,349✔
4705

4706
  qDebug("qFilter time range:[%" PRId64 "]-[%" PRId64 "]", taosGetInt64Aligned(&win->skey),
75,897,628✔
4707
         taosGetInt64Aligned(&win->ekey));
4708
  return TSDB_CODE_SUCCESS;
26,261,295✔
4709

4710
_return:
3,368,993✔
4711

4712
  TAOS_SET_OBJ_ALIGNED(win, TSWINDOW_DESC_INITIALIZER);
3,368,993✔
4713

4714
  (void)filterFreeRangeCtx(prev);  // No need to handle the return value.
3,368,993✔
4715
  (void)filterFreeRangeCtx(tmpc);  // No need to handle the return value.
3,368,993✔
4716

4717
  qDebug("qFilter time range:[%" PRId64 "]-[%" PRId64 "]", taosGetInt64Aligned(&win->skey),
8,179,115✔
4718
         taosGetInt64Aligned(&win->ekey));
4719

4720
  return code;
3,368,993✔
4721
}
4722

4723
static int32_t fltSclGetTimeStampDatum(SFltSclPoint *point, SFltSclDatum *d) {
889,886✔
4724
  *d = point->val;
889,886✔
4725
  d->kind = FLT_SCL_DATUM_KIND_INT64;
889,886✔
4726

4727
  if (point->val.kind == FLT_SCL_DATUM_KIND_MAX) {
889,886✔
4728
    (void)getDataMax(point->val.type.type, &(d->i));  //  No need to handle the return value.
113,263✔
4729
  } else if (point->val.kind == FLT_SCL_DATUM_KIND_MIN) {
776,623✔
4730
    (void)getDataMin(point->val.type.type, &(d->i));  //  No need to handle the return value.
129,982✔
4731
  } else if (point->val.kind == FLT_SCL_DATUM_KIND_INT64) {
646,641✔
4732
    if (point->excl) {
146,636✔
4733
      if (point->start) {
3,052✔
4734
        ++d->i;
2,662✔
4735
      } else {
4736
        --d->i;
390✔
4737
      }
4738
    }
4739
  } else if (point->val.kind == FLT_SCL_DATUM_KIND_FLOAT64) {
500,005✔
4740
    double v = d->d;
500,005✔
4741
    if (point->excl) {
500,005✔
4742
      if (point->start) {
206,749✔
4743
        d->i = v + 1;
201,029✔
4744
      } else {
4745
        d->i = v - 1;
5,720✔
4746
      }
4747
    } else {
4748
      d->i = v;
293,256✔
4749
    }
4750
  } else if (point->val.kind == FLT_SCL_DATUM_KIND_UINT64) {
×
4751
    uint64_t v = d->u;
×
4752
    if (point->excl) {
×
4753
      if (point->start) {
×
4754
        d->i = v + 1;
×
4755
      } else {
4756
        d->i = v - 1;
×
4757
      }
4758
    } else {
4759
      d->i = v;
×
4760
    }
4761
  } else {
4762
    qError("not supported type %d when get datum from point", d->type.type);
×
4763
    return TSDB_CODE_FAILED;
×
4764
  }
4765
  return TSDB_CODE_SUCCESS;
889,886✔
4766
}
4767

4768
/**
4769
   * Extract a time-range window from a filter AST node.
4770
   *
4771
   * This tries to derive a timestamp range from the condition tree (typically a WHERE clause).
4772
   * If a single, strict range can be determined, it is written to `win` and `*isStrict` stays true.
4773
   * If multiple ranges or non-deterministic conditions are found, `*isStrict` is set to false and
4774
   * `win` may be set to a full/unknown window.
4775
   *
4776
   * @param pNode         Filter expression AST root (e.g., WHERE condition).
4777
   * @param win           Output time window (skey/ekey).
4778
   * @param isStrict      Output flag: true if `win` exactly matches the single time range
4779
   *                      in `pNode`, false if only a conservative/unknown range is available.
4780
   *
4781
   * @return TSDB_CODE_SUCCESS on success, otherwise an error code.
4782
 */
4783
int32_t filterGetTimeRange(SNode *pNode, STimeWindow *win, bool *isStrict, bool* hasRemoteNode) {
32,117,271✔
4784
  SFilterInfo *info = NULL;
32,117,271✔
4785
  int32_t      code = 0;
32,118,277✔
4786

4787
  *isStrict = true;
32,118,277✔
4788

4789
  FLT_ERR_JRET(filterInitFromNode(pNode, &info, FLT_OPTION_NO_REWRITE | FLT_OPTION_TIMESTAMP, NULL));
32,118,708✔
4790

4791
  if (info->scalarMode) {
32,118,639✔
4792
    SArray        *colRanges = info->sclCtx.fltSclRange;
2,488,342✔
4793
    SOperatorNode *optNode = (SOperatorNode *)pNode;
2,488,342✔
4794
    if (taosArrayGetSize(colRanges) == 1) {
2,488,342✔
4795
      SFltSclColumnRange *colRange = taosArrayGet(colRanges, 0);
491,648✔
4796
      if (NULL == colRange) {
491,648✔
4797
        FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE);
×
4798
      }
4799
      SArray *points = colRange->points;
491,648✔
4800
      if (taosArrayGetSize(points) == 2) {
491,648✔
4801
        TAOS_SET_OBJ_ALIGNED(win, TSWINDOW_DESC_INITIALIZER);
444,943✔
4802
        SFltSclPoint *startPt = taosArrayGet(points, 0);
444,943✔
4803
        SFltSclPoint *endPt = taosArrayGet(points, 1);
444,943✔
4804
        if (NULL == startPt || NULL == endPt) {
444,943✔
4805
          FLT_ERR_JRET(TSDB_CODE_OUT_OF_RANGE);
×
4806
        }
4807
        SFltSclDatum start;
432,449✔
4808
        SFltSclDatum end;
432,449✔
4809
        FLT_ERR_JRET(fltSclGetTimeStampDatum(startPt, &start));
444,943✔
4810
        FLT_ERR_JRET(fltSclGetTimeStampDatum(endPt, &end));
444,943✔
4811
        taosSetInt64Aligned(&win->skey, start.i);
444,943✔
4812
        taosSetInt64Aligned(&win->ekey, end.i);
444,943✔
4813
        *isStrict = info->isStrict;
444,943✔
4814
        goto _return;
444,943✔
4815
      } else if (taosArrayGetSize(points) == 0) {
46,705✔
4816
        TAOS_SET_OBJ_ALIGNED(win, TSWINDOW_DESC_INITIALIZER);
13,513✔
4817
        goto _return;
13,513✔
4818
      }
4819
    }
4820
    TAOS_SET_OBJ_ALIGNED(win, TSWINDOW_INITIALIZER);
2,029,886✔
4821
    *isStrict = false;
2,029,886✔
4822
    goto _return;
2,029,886✔
4823
  }
4824

4825
  FLT_ERR_JRET(filterGetTimeRangeImpl(info, win, isStrict));
29,630,288✔
4826

4827
_return:
32,094,360✔
4828

4829
  if (hasRemoteNode && info && !(*isStrict)) {
32,118,643✔
4830
    *hasRemoteNode = info->hasRemoteNode;
759,202✔
4831
  }
4832

4833
  filterFreeInfo(info);
32,118,643✔
4834

4835
  FLT_RET(code);
32,118,128✔
4836
}
4837

4838
int32_t filterConverNcharColumns(SFilterInfo *info, int32_t rows, bool *gotNchar) {
×
4839
  if (FILTER_EMPTY_RES(info) || FILTER_ALL_RES(info)) {
×
4840
    return TSDB_CODE_SUCCESS;
×
4841
  }
4842

4843
  for (uint32_t i = 0; i < info->fields[FLD_TYPE_COLUMN].num; ++i) {
×
4844
    SFilterField *fi = &info->fields[FLD_TYPE_COLUMN].fields[i];
×
4845
    int32_t       type = FILTER_GET_COL_FIELD_TYPE(fi);
×
4846
    if (type == TSDB_DATA_TYPE_NCHAR) {
×
4847
      SFilterField nfi = {0};
×
4848
      nfi.desc = fi->desc;
×
4849
      int32_t bytes = FILTER_GET_COL_FIELD_SIZE(fi);
×
4850
      nfi.data = taosMemoryMalloc(rows * bytes);
×
4851
      if (nfi.data == NULL) {
×
4852
        FLT_ERR_RET(terrno);
×
4853
      }
4854
      int32_t bufSize = bytes - VARSTR_HEADER_SIZE;
×
4855
      for (int32_t j = 0; j < rows; ++j) {
×
4856
        char   *src = FILTER_GET_COL_FIELD_DATA(fi, j);
×
4857
        char   *dst = FILTER_GET_COL_FIELD_DATA(&nfi, j);
×
4858
        int32_t len = 0;
×
4859
        char   *varSrc = varDataVal(src);
×
4860
        size_t  k = 0, varSrcLen = varDataLen(src);
×
4861
        while (k < varSrcLen && varSrc[k++] == -1) {
×
4862
        }
4863
        if (k == varSrcLen) {
×
4864
          /* NULL */
4865
          varDataLen(dst) = (VarDataLenT)varSrcLen;
×
4866
          varDataCopy(dst, src);
×
4867
          continue;
×
4868
        }
4869
        bool ret = taosMbsToUcs4(varDataVal(src), varDataLen(src), (TdUcs4 *)varDataVal(dst), bufSize, &len, NULL);
×
4870
        if (!ret) {
×
4871
          qError("filterConverNcharColumns taosMbsToUcs4 error");
×
4872
          return TSDB_CODE_SCALAR_CONVERT_ERROR;
×
4873
        }
4874
        varDataLen(dst) = len;
×
4875
      }
4876

4877
      fi->data = nfi.data;
×
4878

4879
      *gotNchar = true;
×
4880
    }
4881
  }
4882

4883
  if (*gotNchar) {
×
4884
    FLT_ERR_RET(filterUpdateComUnits(info));
×
4885
  }
4886

4887
  return TSDB_CODE_SUCCESS;
×
4888
}
4889

4890
int32_t filterFreeNcharColumns(SFilterInfo *info) {
×
4891
  for (uint32_t i = 0; i < info->fields[FLD_TYPE_COLUMN].num; ++i) {
×
4892
    SFilterField *fi = &info->fields[FLD_TYPE_COLUMN].fields[i];
×
4893
    int32_t       type = FILTER_GET_COL_FIELD_TYPE(fi);
×
4894
    if (type == TSDB_DATA_TYPE_NCHAR) {
×
4895
      taosMemoryFreeClear(fi->data);
×
4896
    }
4897
  }
4898

4899
  return TSDB_CODE_SUCCESS;
×
4900
}
4901

4902
int32_t fltAddValueNodeToConverList(SFltTreeStat *stat, SValueNode *pNode) {
×
4903
  if (NULL == stat->nodeList) {
×
4904
    stat->nodeList = taosArrayInit(10, POINTER_BYTES);
×
4905
    if (NULL == stat->nodeList) {
×
4906
      FLT_ERR_RET(terrno);
×
4907
    }
4908
  }
4909

4910
  if (NULL == taosArrayPush(stat->nodeList, &pNode)) {
×
4911
    FLT_ERR_RET(terrno);
×
4912
  }
4913

4914
  return TSDB_CODE_SUCCESS;
×
4915
}
4916

4917
EDealRes fltReviseRewriter(SNode **pNode, void *pContext) {
652,199,981✔
4918
  SFltTreeStat *stat = (SFltTreeStat *)pContext;
652,199,981✔
4919

4920
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pNode)) {
652,199,981✔
4921
    SLogicConditionNode *node = (SLogicConditionNode *)*pNode;
48,794,086✔
4922
    SListCell           *cell = node->pParameterList->pHead;
48,785,606✔
4923
    for (int32_t i = 0; i < node->pParameterList->length; ++i) {
151,910,522✔
4924
      if (NULL == cell || NULL == cell->pNode) {
103,180,024✔
4925
        fltError("invalid cell");
26,972✔
4926
        stat->code = TSDB_CODE_QRY_INVALID_INPUT;
26,972✔
4927
        return DEAL_RES_ERROR;
×
4928
      }
4929

4930
      if ((QUERY_NODE_OPERATOR != nodeType(cell->pNode)) && (QUERY_NODE_LOGIC_CONDITION != nodeType(cell->pNode))) {
103,155,585✔
4931
        stat->scalarMode = true;
×
4932
      }
4933

4934
      cell = cell->pNext;
103,164,142✔
4935
    }
4936
    if (node->condType == LOGIC_COND_TYPE_NOT) {
48,765,625✔
4937
      stat->scalarMode = true;
240,806✔
4938
    }
4939

4940
    return DEAL_RES_CONTINUE;
48,771,858✔
4941
  }
4942

4943
  if (QUERY_NODE_VALUE == nodeType(*pNode)) {
603,379,666✔
4944
    SValueNode *valueNode = (SValueNode *)*pNode;
156,998,522✔
4945
    if (valueNode->placeholderNo >= 1) {
156,998,929✔
4946
      stat->scalarMode = true;
20,518✔
4947
      return DEAL_RES_CONTINUE;
20,518✔
4948
    }
4949
    if (IS_DECIMAL_TYPE(valueNode->node.resType.type)) {
156,956,786✔
4950
      stat->scalarMode = true;
435✔
4951
      return DEAL_RES_CONTINUE;
×
4952
    }
4953
    return DEAL_RES_CONTINUE;
156,943,046✔
4954
  }
4955

4956
  if (QUERY_NODE_COLUMN == nodeType(*pNode)) {
446,510,404✔
4957
    SColumnNode *colNode = (SColumnNode *)*pNode;
203,952,550✔
4958
    stat->precision = colNode->node.resType.precision;
203,947,228✔
4959
    if (IS_DECIMAL_TYPE(colNode->node.resType.type)) {
203,953,158✔
4960
      stat->scalarMode = true;
2,718,585✔
4961
    }
4962
    return DEAL_RES_CONTINUE;
203,975,163✔
4963
  }
4964

4965
  if (QUERY_NODE_NODE_LIST == nodeType(*pNode)) {
242,637,663✔
4966
    SNodeListNode *listNode = (SNodeListNode *)*pNode;
3,514,575✔
4967
    if (QUERY_NODE_VALUE != nodeType(listNode->pNodeList->pHead->pNode)) {
3,512,549✔
4968
      stat->scalarMode = true;
×
4969
      return DEAL_RES_CONTINUE;
×
4970
    }
4971

4972
    SValueNode *valueNode = (SValueNode *)listNode->pNodeList->pHead->pNode;
3,510,431✔
4973
    uint8_t     type = valueNode->node.resType.type;
3,511,779✔
4974
    SNode      *node = NULL;
3,513,277✔
4975
    FOREACH(node, listNode->pNodeList) {
11,259,764✔
4976
      uint8_t nodeT = ((SExprNode *)node)->resType.type;
7,954,163✔
4977
      if (type != nodeT || IS_DECIMAL_TYPE(nodeT)) {
7,951,565✔
4978
        stat->scalarMode = true;
205,078✔
4979
        return DEAL_RES_CONTINUE;
204,460✔
4980
      }
4981
    }
4982

4983
    return DEAL_RES_CONTINUE;
3,306,019✔
4984
  }
4985

4986
  if (QUERY_NODE_REMOTE_VALUE == nodeType(*pNode) || QUERY_NODE_REMOTE_VALUE_LIST == nodeType(*pNode) ||
239,105,388✔
4987
      QUERY_NODE_REMOTE_ROW == nodeType(*pNode) || QUERY_NODE_REMOTE_ZERO_ROWS == nodeType(*pNode) ||
231,052,237✔
4988
      QUERY_NODE_REMOTE_TABLE == nodeType(*pNode)) {
219,067,940✔
4989
    stat->scalarMode = true;
20,308,883✔
4990
    stat->info->hasRemoteNode = true;
20,180,434✔
4991
    return DEAL_RES_CONTINUE;
20,174,857✔
4992
  }
4993

4994
  if (QUERY_NODE_FUNCTION == nodeType(*pNode)) {
218,955,090✔
4995
    stat->scalarMode = true;
24,986,137✔
4996
    return DEAL_RES_CONTINUE;
24,988,695✔
4997
  }
4998

4999
  if (QUERY_NODE_CASE_WHEN == nodeType(*pNode) || QUERY_NODE_WHEN_THEN == nodeType(*pNode)) {
193,989,683✔
5000
    stat->scalarMode = true;
142,717✔
5001
    return DEAL_RES_CONTINUE;
44,034✔
5002
  }
5003

5004
  if (QUERY_NODE_OPERATOR == nodeType(*pNode)) {
193,912,765✔
5005
    SOperatorNode *node = (SOperatorNode *)*pNode;
194,011,952✔
5006
    if (!FLT_IS_COMPARISON_OPERATOR(node->opType)) {
194,011,996✔
5007
      stat->scalarMode = true;
10,177,918✔
5008
      return DEAL_RES_CONTINUE;
10,160,116✔
5009
    }
5010

5011
    if (node->opType == OP_TYPE_NOT_LIKE || node->opType > OP_TYPE_IS_NOT_NULL || node->opType == OP_TYPE_NOT_EQUAL) {
183,844,356✔
5012
      stat->scalarMode = true;
6,025,568✔
5013
      return DEAL_RES_CONTINUE;
5,904,069✔
5014
    }
5015

5016
    if (FILTER_GET_FLAG(stat->info->options, FLT_OPTION_TIMESTAMP) && (node->opType >= OP_TYPE_NOT_EQUAL) &&
177,870,189✔
5017
        (node->opType != OP_TYPE_IS_NULL && node->opType != OP_TYPE_IS_NOT_NULL)) {
6,598,146✔
5018
      stat->scalarMode = true;
752,785✔
5019
      return DEAL_RES_CONTINUE;
752,785✔
5020
    }
5021

5022
    if (NULL == node->pRight) {
177,209,265✔
5023
      if (scalarGetOperatorParamNum(node->opType) > 1) {
39,794,105✔
5024
        fltError("invalid operator, pRight:%p, nodeType:%d, opType:%d", node->pRight, nodeType(node), node->opType);
×
5025
        stat->code = TSDB_CODE_APP_ERROR;
×
5026
        return DEAL_RES_ERROR;
×
5027
      }
5028

5029
      if (QUERY_NODE_COLUMN != nodeType(node->pLeft)) {
39,787,827✔
5030
        stat->scalarMode = true;
14,438,757✔
5031
        return DEAL_RES_CONTINUE;
14,439,293✔
5032
      }
5033

5034
      if (OP_TYPE_IS_TRUE == node->opType || OP_TYPE_IS_FALSE == node->opType || OP_TYPE_IS_UNKNOWN == node->opType ||
25,348,529✔
5035
          OP_TYPE_IS_NOT_TRUE == node->opType || OP_TYPE_IS_NOT_FALSE == node->opType ||
25,353,898✔
5036
          OP_TYPE_IS_NOT_UNKNOWN == node->opType) {
25,353,307✔
5037
        stat->scalarMode = true;
2,251✔
5038
        return DEAL_RES_CONTINUE;
×
5039
      }
5040
    } else {
5041
      if ((QUERY_NODE_COLUMN != nodeType(node->pLeft)) && (QUERY_NODE_VALUE != nodeType(node->pLeft))) {
137,367,803✔
5042
        stat->scalarMode = true;
3,278,803✔
5043
        return DEAL_RES_CONTINUE;
3,280,404✔
5044
      }
5045

5046
      if ((QUERY_NODE_COLUMN != nodeType(node->pRight)) && (QUERY_NODE_VALUE != nodeType(node->pRight)) &&
134,120,780✔
5047
          (QUERY_NODE_NODE_LIST != nodeType(node->pRight))) {
21,393,075✔
5048
        stat->scalarMode = true;
18,013,216✔
5049
        return DEAL_RES_CONTINUE;
18,015,445✔
5050
      }
5051

5052
      if (nodeType(node->pLeft) == nodeType(node->pRight)) {
116,129,127✔
5053
        stat->scalarMode = true;
1,358,477✔
5054
        return DEAL_RES_CONTINUE;
1,358,477✔
5055
      }
5056

5057
      if (OP_TYPE_JSON_CONTAINS == node->opType) {
114,658,742✔
5058
        stat->scalarMode = true;
×
5059
        return DEAL_RES_CONTINUE;
×
5060
      }
5061

5062
      if (QUERY_NODE_COLUMN != nodeType(node->pLeft)) {
114,703,460✔
5063
        SNode *t = node->pLeft;
126,275✔
5064
        node->pLeft = node->pRight;
126,275✔
5065
        node->pRight = t;
126,275✔
5066
        switch (node->opType) {
126,275✔
5067
          case OP_TYPE_GREATER_THAN:
24,704✔
5068
            node->opType = OP_TYPE_LOWER_THAN;
24,704✔
5069
            break;
24,704✔
5070
          case OP_TYPE_LOWER_THAN:
24,704✔
5071
            node->opType = OP_TYPE_GREATER_THAN;
24,704✔
5072
            break;
24,704✔
5073
          case OP_TYPE_GREATER_EQUAL:
25,790✔
5074
            node->opType = OP_TYPE_LOWER_EQUAL;
25,790✔
5075
            break;
25,790✔
5076
          case OP_TYPE_LOWER_EQUAL:
25,790✔
5077
            node->opType = OP_TYPE_GREATER_EQUAL;
25,790✔
5078
            break;
25,790✔
5079
          default:
25,287✔
5080
            break;
25,287✔
5081
        }
5082
      }
5083

5084
      if ((OP_TYPE_IN == node->opType || OP_TYPE_NOT_IN == node->opType) &&
114,736,455✔
5085
          QUERY_NODE_NODE_LIST != nodeType(node->pRight)) {
3,385,791✔
5086
        fltError("invalid IN operator node, rightType:%d", nodeType(node->pRight));
×
5087
        stat->code = TSDB_CODE_APP_ERROR;
×
5088
        return DEAL_RES_ERROR;
×
5089
      }
5090

5091
      SColumnNode *refNode = (SColumnNode *)node->pLeft;
114,725,400✔
5092
      SExprNode   *exprNode = NULL;
114,751,165✔
5093
      if (OP_TYPE_IN != node->opType && OP_TYPE_NOT_IN != node->opType) {
226,109,151✔
5094
        SValueNode *valueNode = (SValueNode *)node->pRight;
111,385,885✔
5095
        if (FILTER_GET_FLAG(stat->info->options, FLT_OPTION_TIMESTAMP) &&
111,359,593✔
5096
            TSDB_DATA_TYPE_UBIGINT == valueNode->node.resType.type && valueNode->datum.u <= INT64_MAX) {
40,682,084✔
5097
          valueNode->node.resType.type = TSDB_DATA_TYPE_BIGINT;
×
5098
        }
5099
        exprNode = &valueNode->node;
111,366,608✔
5100
        int32_t type = vectorGetConvertType(refNode->node.resType.type, exprNode->resType.type);
111,372,047✔
5101
        if (0 != type && type != refNode->node.resType.type) {
111,357,296✔
5102
          stat->scalarMode = true;
15,185,303✔
5103
        }
5104
      } else {
5105
        SNodeListNode *listNode = (SNodeListNode *)node->pRight;
3,397,378✔
5106
        if (LIST_LENGTH(listNode->pNodeList) > 10 || OP_TYPE_NOT_IN == node->opType || listNode->node.hasNull) {
3,375,412✔
5107
          stat->scalarMode = true;
386,180✔
5108
        }
5109
        int32_t type = refNode->node.resType.type;
3,375,711✔
5110
        exprNode = &listNode->node;
3,375,412✔
5111
        SNode *nodeItem = NULL;
3,375,711✔
5112
        FOREACH(nodeItem, listNode->pNodeList) {
11,179,385✔
5113
          SValueNode *valueNode = (SValueNode *)nodeItem;
7,809,074✔
5114
          int32_t     tmp = vectorGetConvertType(type, valueNode->node.resType.type);
7,809,074✔
5115
          if (tmp != 0) {
7,803,582✔
5116
            stat->scalarMode = true;
3,265,498✔
5117
            type = tmp;
3,265,590✔
5118
          }
5119
        }
5120
        if (IS_NUMERIC_TYPE(type)) {
3,374,935✔
5121
          exprNode->resType.type = type;
2,006,689✔
5122
        }
5123
      }
5124
    }
5125

5126
    return DEAL_RES_CONTINUE;
140,084,130✔
5127
  }
5128

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

5131
  stat->code = TSDB_CODE_QRY_INVALID_INPUT;
×
5132

5133
  return DEAL_RES_ERROR;
×
5134
}
5135

5136
int32_t fltReviseNodes(SFilterInfo *pInfo, SNode **pNode, SFltTreeStat *pStat) {
137,536,193✔
5137
  int32_t code = 0;
137,536,193✔
5138
  nodesRewriteExprPostOrder(pNode, fltReviseRewriter, (void *)pStat);
137,536,193✔
5139

5140
  FLT_ERR_JRET(pStat->code);
137,516,863✔
5141

5142
_return:
137,520,212✔
5143

5144
  taosArrayDestroy(pStat->nodeList);
137,520,212✔
5145
  FLT_RET(code);
137,496,072✔
5146
}
5147

5148
static int32_t fltSclBuildRangePointsForInOper(SFltSclOperator *oper, SArray *points) {
330,919✔
5149
  SNodeListNode *listNode = (SNodeListNode *)oper->valNode;
330,919✔
5150
  SFltSclDatum   minDatum = {.kind = FLT_SCL_DATUM_KIND_INT64, .i = INT64_MAX, .type = oper->colNode->node.resType};
330,919✔
5151
  SFltSclDatum   maxDatum = {.kind = FLT_SCL_DATUM_KIND_INT64, .i = INT64_MIN, .type = oper->colNode->node.resType};
330,919✔
5152
  SNode         *nodeItem = NULL;
330,336✔
5153
  FOREACH(nodeItem, listNode->pNodeList) {
2,018,109✔
5154
    SValueNode  *valueNode = (SValueNode *)nodeItem;
1,689,614✔
5155
    SFltSclDatum valDatum;
1,688,038✔
5156
    FLT_ERR_RET(fltSclBuildDatumFromValueNode(&valDatum, oper->colNode, valueNode));
1,689,031✔
5157
    if (valDatum.kind == FLT_SCL_DATUM_KIND_NULL) {
1,688,939✔
5158
      continue;
×
5159
    }
5160
    if (IS_DECIMAL_TYPE(oper->colNode->node.resType.type)) {
1,688,939✔
5161
      if (IS_DECIMAL_TYPE(valDatum.type.type)) {
855,205✔
5162
        double v = valDatum.type.type == TSDB_DATA_TYPE_DECIMAL64
681,096✔
5163
                       ? doubleFromDecimal64(&valDatum.i, valDatum.type.precision, valDatum.type.scale)
98,176✔
5164
                       : doubleFromDecimal128(&valDatum.dec, valDatum.type.precision, valDatum.type.scale);
340,548✔
5165
        if (minDatum.kind == FLT_SCL_DATUM_KIND_FLOAT64) {
340,548✔
5166
          minDatum.d = TMIN(v, minDatum.d);
283,023✔
5167
          maxDatum.d = TMAX(v, maxDatum.d);
283,023✔
5168
        } else if (minDatum.kind == FLT_SCL_DATUM_KIND_INT64) {
57,525✔
5169
          minDatum.d = v;
57,525✔
5170
          maxDatum.d = v;
57,525✔
5171
          minDatum.kind = FLT_SCL_DATUM_KIND_FLOAT64;
57,525✔
5172
          maxDatum.kind = FLT_SCL_DATUM_KIND_FLOAT64;
57,525✔
5173
        }
5174
      } else if (valDatum.kind == FLT_SCL_DATUM_KIND_FLOAT64) {
174,109✔
5175
        if (minDatum.kind == FLT_SCL_DATUM_KIND_INT64) {
174,109✔
5176
          minDatum.kind = FLT_SCL_DATUM_KIND_FLOAT64;
34,515✔
5177
          maxDatum.kind = FLT_SCL_DATUM_KIND_FLOAT64;
34,515✔
5178
          minDatum.d = TMIN(valDatum.d, minDatum.d);
34,515✔
5179
          maxDatum.d = TMAX(valDatum.d, maxDatum.d);
34,515✔
5180
        } else {
5181
          minDatum.d = TMIN(valDatum.d, minDatum.d);
139,594✔
5182
          maxDatum.d = TMAX(valDatum.d, maxDatum.d);
139,594✔
5183
        }
5184
      }
5185
      continue;
514,657✔
5186
    }
5187
    if (valueNode->node.resType.type == TSDB_DATA_TYPE_FLOAT || valueNode->node.resType.type == TSDB_DATA_TYPE_DOUBLE) {
1,173,116✔
5188
      minDatum.i = TMIN(minDatum.i, valDatum.d);
10,290✔
5189
      maxDatum.i = TMAX(maxDatum.i, valDatum.d);
10,290✔
5190
    } else {
5191
      minDatum.i = TMIN(minDatum.i, valDatum.i);
1,162,826✔
5192
      maxDatum.i = TMAX(maxDatum.i, valDatum.i);
1,162,826✔
5193
    }
5194
  }
5195
  SFltSclPoint startPt = {.start = true, .excl = false, .val = minDatum};
330,336✔
5196
  SFltSclPoint endPt = {.start = false, .excl = false, .val = maxDatum};
330,336✔
5197
  if (NULL == taosArrayPush(points, &startPt)) {
330,919✔
5198
    FLT_ERR_RET(terrno);
×
5199
  }
5200
  if (NULL == taosArrayPush(points, &endPt)) {
330,919✔
5201
    FLT_ERR_RET(terrno);
×
5202
  }
5203
  FLT_RET(0);
330,919✔
5204
}
5205

5206
int32_t fltSclBuildRangePoints(SFltSclOperator *oper, SArray *points) {
9,216,648✔
5207
  switch (oper->type) {
9,216,648✔
5208
    case OP_TYPE_GREATER_THAN: {
898,723✔
5209
      SFltSclDatum start;
898,333✔
5210
      FLT_ERR_RET(fltSclBuildDatumFromValueNode(&start, oper->colNode, oper->valNode));
898,723✔
5211
      SFltSclPoint startPt = {.start = true, .excl = true, .val = start};
895,635✔
5212
      SFltSclDatum end = {.kind = FLT_SCL_DATUM_KIND_MAX, .type = oper->colNode->node.resType};
895,635✔
5213
      SFltSclPoint endPt = {.start = false, .excl = false, .val = end};
895,635✔
5214
      if (NULL == taosArrayPush(points, &startPt)) {
895,635✔
5215
        FLT_ERR_RET(terrno);
×
5216
      }
5217
      if (NULL == taosArrayPush(points, &endPt)) {
895,635✔
5218
        FLT_ERR_RET(terrno);
×
5219
      }
5220
      break;
895,635✔
5221
    }
5222
    case OP_TYPE_GREATER_EQUAL: {
1,590,528✔
5223
      SFltSclDatum start;
1,586,516✔
5224
      FLT_ERR_RET(fltSclBuildDatumFromValueNode(&start, oper->colNode, oper->valNode));
1,590,528✔
5225
      SFltSclPoint startPt = {.start = true, .excl = false, .val = start};
1,586,672✔
5226
      SFltSclDatum end = {.kind = FLT_SCL_DATUM_KIND_MAX, .type = oper->colNode->node.resType};
1,587,051✔
5227
      SFltSclPoint endPt = {.start = false, .excl = false, .val = end};
1,586,672✔
5228
      if (NULL == taosArrayPush(points, &startPt)) {
1,586,554✔
5229
        FLT_ERR_RET(terrno);
×
5230
      }
5231
      if (NULL == taosArrayPush(points, &endPt)) {
1,587,051✔
5232
        FLT_ERR_RET(terrno);
×
5233
      }
5234
      break;
1,587,051✔
5235
    }
5236
    case OP_TYPE_LOWER_THAN: {
228,467✔
5237
      SFltSclDatum end;
228,077✔
5238
      FLT_ERR_RET(fltSclBuildDatumFromValueNode(&end, oper->colNode, oper->valNode));
228,467✔
5239
      SFltSclPoint endPt = {.start = false, .excl = true, .val = end};
225,379✔
5240
      SFltSclDatum start = {.kind = FLT_SCL_DATUM_KIND_MIN, .type = oper->colNode->node.resType};
225,379✔
5241
      SFltSclPoint startPt = {.start = true, .excl = false, .val = start};
225,379✔
5242
      if (NULL == taosArrayPush(points, &startPt)) {
225,379✔
5243
        FLT_ERR_RET(terrno);
×
5244
      }
5245
      if (NULL == taosArrayPush(points, &endPt)) {
225,379✔
5246
        FLT_ERR_RET(terrno);
×
5247
      }
5248
      break;
225,379✔
5249
    }
5250
    case OP_TYPE_LOWER_EQUAL: {
1,881,405✔
5251
      SFltSclDatum end;
1,877,393✔
5252
      FLT_ERR_RET(fltSclBuildDatumFromValueNode(&end, oper->colNode, oper->valNode));
1,880,872✔
5253
      SFltSclPoint endPt = {.start = false, .excl = false, .val = end};
1,878,787✔
5254
      SFltSclDatum start = {.kind = FLT_SCL_DATUM_KIND_MIN, .type = oper->colNode->node.resType};
1,879,320✔
5255
      SFltSclPoint startPt = {.start = true, .excl = false, .val = start};
1,878,317✔
5256
      if (NULL == taosArrayPush(points, &startPt)) {
1,877,875✔
5257
        FLT_ERR_RET(terrno);
×
5258
      }
5259
      if (NULL == taosArrayPush(points, &endPt)) {
1,877,398✔
5260
        FLT_ERR_RET(terrno);
×
5261
      }
5262
      break;
1,876,241✔
5263
    }
5264
    case OP_TYPE_EQUAL: {
439,504✔
5265
      SFltSclDatum valDatum;
432,088✔
5266
      FLT_ERR_RET(fltSclBuildDatumFromValueNode(&valDatum, oper->colNode, oper->valNode));
439,504✔
5267
      SFltSclPoint startPt = {.start = true, .excl = false, .val = valDatum};
436,416✔
5268
      SFltSclPoint endPt = {.start = false, .excl = false, .val = valDatum};
436,416✔
5269
      if (NULL == taosArrayPush(points, &startPt)) {
435,737✔
5270
        FLT_ERR_RET(terrno);
×
5271
      }
5272
      if (NULL == taosArrayPush(points, &endPt)) {
436,416✔
5273
        FLT_ERR_RET(terrno);
×
5274
      }
5275
      break;
436,416✔
5276
    }
5277
    case OP_TYPE_NOT_EQUAL: {
3,844,878✔
5278
      SFltSclDatum valDatum;
3,844,878✔
5279
      FLT_ERR_RET(fltSclBuildDatumFromValueNode(&valDatum, oper->colNode, oper->valNode));
3,845,421✔
5280
      {
5281
        SFltSclDatum start = {.kind = FLT_SCL_DATUM_KIND_MIN, .type = oper->colNode->node.resType};
3,843,334✔
5282
        SFltSclPoint startPt = {.start = true, .excl = false, .val = start};
3,845,025✔
5283
        SFltSclPoint endPt = {.start = false, .excl = true, .val = valDatum};
3,844,482✔
5284
        if (NULL == taosArrayPush(points, &startPt)) {
3,845,568✔
5285
          FLT_ERR_RET(terrno);
×
5286
        }
5287
        if (NULL == taosArrayPush(points, &endPt)) {
3,842,113✔
5288
          FLT_ERR_RET(terrno);
×
5289
        }
5290
      }
5291
      {
5292
        SFltSclPoint startPt = {.start = true, .excl = true, .val = valDatum};
3,843,877✔
5293
        SFltSclDatum end = {.kind = FLT_SCL_DATUM_KIND_MAX, .type = oper->colNode->node.resType};
3,841,978✔
5294
        SFltSclPoint endPt = {.start = false, .excl = false, .val = end};
3,845,098✔
5295
        if (NULL == taosArrayPush(points, &startPt)) {
3,844,890✔
5296
          FLT_ERR_RET(terrno);
×
5297
        }
5298
        if (NULL == taosArrayPush(points, &endPt)) {
3,842,656✔
5299
          FLT_ERR_RET(terrno);
×
5300
        }
5301
      }
5302
      break;
3,843,669✔
5303
    }
5304
    case OP_TYPE_IS_NULL: {
×
5305
      SFltSclDatum nullDatum = {.kind = FLT_SCL_DATUM_KIND_NULL};
×
5306
      SFltSclPoint startPt = {.start = true, .excl = false, .val = nullDatum};
×
5307
      SFltSclPoint endPt = {.start = false, .excl = false, .val = nullDatum};
×
5308
      if (NULL == taosArrayPush(points, &startPt)) {
×
5309
        FLT_ERR_RET(terrno);
×
5310
      }
5311
      if (NULL == taosArrayPush(points, &endPt)) {
×
5312
        FLT_ERR_RET(terrno);
×
5313
      }
5314
      break;
×
5315
    }
5316
    case OP_TYPE_IS_NOT_NULL: {
×
5317
      SFltSclDatum minDatum = {.kind = FLT_SCL_DATUM_KIND_MIN, .type = oper->colNode->node.resType};
×
5318
      SFltSclPoint startPt = {.start = true, .excl = false, .val = minDatum};
×
5319
      SFltSclDatum maxDatum = {.kind = FLT_SCL_DATUM_KIND_MAX, .type = oper->colNode->node.resType};
×
5320
      SFltSclPoint endPt = {.start = false, .excl = false, .val = maxDatum};
×
5321
      if (NULL == taosArrayPush(points, &startPt)) {
×
5322
        FLT_ERR_RET(terrno);
×
5323
      }
5324
      if (NULL == taosArrayPush(points, &endPt)) {
×
5325
        FLT_ERR_RET(terrno);
×
5326
      }
5327
      break;
×
5328
    }
5329
    case OP_TYPE_IN: {
330,919✔
5330
      FLT_ERR_RET(fltSclBuildRangePointsForInOper(oper, points));
330,919✔
5331
      break;
330,919✔
5332
    }
5333
    default: {
×
5334
      qError("not supported operator type : %d when build range points", oper->type);
×
5335
      break;
×
5336
    }
5337
  }
5338
  return TSDB_CODE_SUCCESS;
9,197,755✔
5339
}
5340

5341
// TODO: process DNF composed of CNF
5342
static int32_t fltSclProcessCNF(SFilterInfo *pInfo, SArray *sclOpListCNF, SArray *colRangeList) {
47,304,103✔
5343
  pInfo->isStrict = true;
47,304,103✔
5344
  size_t sz = taosArrayGetSize(sclOpListCNF);
47,304,293✔
5345
  for (int32_t i = 0; i < sz; ++i) {
56,472,977✔
5346
    SFltSclOperator *sclOper = taosArrayGet(sclOpListCNF, i);
9,213,181✔
5347
    if (NULL == sclOper) {
9,213,868✔
5348
      FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
5349
    }
5350

5351
    SFltSclColumnRange *colRange = NULL;
9,213,868✔
5352
    FLT_ERR_RET(fltSclGetOrCreateColumnRange(sclOper->colNode, colRangeList, &colRange));
9,212,956✔
5353
    SArray *points = taosArrayInit(4, sizeof(SFltSclPoint));
9,213,882✔
5354
    if (NULL == points) {
9,213,515✔
5355
      FLT_ERR_RET(terrno);
×
5356
    }
5357
    int32_t code = fltSclBuildRangePoints(sclOper, points);
9,213,515✔
5358
    if (code != 0) {
9,213,398✔
5359
      taosArrayDestroy(points);
16,984✔
5360
      FLT_ERR_RET(code);
16,984✔
5361
    }
5362
    if (taosArrayGetSize(colRange->points) != 0) {
9,196,414✔
5363
      SArray *merged = taosArrayInit(4, sizeof(SFltSclPoint));
1,351,577✔
5364
      if (NULL == merged) {
1,347,778✔
5365
        FLT_ERR_RET(terrno);
×
5366
      }
5367
      FLT_ERR_RET(fltSclIntersect(colRange->points, points, merged));
1,347,778✔
5368
      taosArrayDestroy(colRange->points);
1,348,543✔
5369
      taosArrayDestroy(points);
1,348,626✔
5370
      colRange->points = merged;
1,348,083✔
5371
      if (merged->size == 0) {
1,348,083✔
5372
        return TSDB_CODE_SUCCESS;
16,382✔
5373
      }
5374
    } else {
5375
      taosArrayDestroy(colRange->points);
7,838,340✔
5376
      colRange->points = points;
7,836,320✔
5377
    }
5378
    if (sclOper->type == OP_TYPE_IN) {
9,168,933✔
5379
      pInfo->isStrict = false;
329,320✔
5380
    }
5381
  }
5382
  return TSDB_CODE_SUCCESS;
47,259,796✔
5383
}
5384

5385
static bool fltSclIsCollectableNode(SNode *pNode) {
51,647,367✔
5386
  if (nodeType(pNode) != QUERY_NODE_OPERATOR) {
51,647,367✔
5387
    return false;
769,676✔
5388
  }
5389

5390
  SOperatorNode *pOper = (SOperatorNode *)pNode;
50,879,841✔
5391
  if (pOper->pLeft == NULL || pOper->pRight == NULL) {
50,879,841✔
5392
    return false;
10,847,160✔
5393
  }
5394

5395
  if (!(pOper->opType == OP_TYPE_GREATER_THAN || pOper->opType == OP_TYPE_GREATER_EQUAL ||
40,021,732✔
5396
        pOper->opType == OP_TYPE_LOWER_THAN || pOper->opType == OP_TYPE_LOWER_EQUAL ||
28,835,492✔
5397
        pOper->opType == OP_TYPE_NOT_EQUAL || pOper->opType == OP_TYPE_EQUAL || pOper->opType == OP_TYPE_IN)) {
18,349,821✔
5398
    return false;
3,782,693✔
5399
  }
5400

5401
  if (!((nodeType(pOper->pLeft) == QUERY_NODE_COLUMN && nodeType(pOper->pRight) == QUERY_NODE_VALUE) ||
36,243,661✔
5402
        (nodeType(pOper->pLeft) == QUERY_NODE_COLUMN && nodeType(pOper->pRight) == QUERY_NODE_NODE_LIST))) {
20,408,098✔
5403
    return false;
19,455,333✔
5404
  }
5405
  return true;
16,794,058✔
5406
}
5407

5408
static int32_t fltSclCollectOperatorFromNode(SNode *pNode, SArray *sclOpList) {
39,792,629✔
5409
  if (!fltSclIsCollectableNode(pNode)) {
39,792,629✔
5410
    return TSDB_CODE_SUCCESS;
28,378,309✔
5411
  }
5412

5413
  SOperatorNode *pOper = (SOperatorNode *)pNode;
11,407,460✔
5414

5415
  SExprNode *pLeft = (SExprNode *)pOper->pLeft;
11,407,460✔
5416
  if (IS_NUMERIC_TYPE(pLeft->resType.type) || pLeft->resType.type == TSDB_DATA_TYPE_TIMESTAMP) {
11,407,685✔
5417
    SNode  *pLeft = NULL, *pRight = NULL;
9,222,394✔
5418
    int32_t code = nodesCloneNode(pOper->pLeft, &pLeft);
9,218,880✔
5419
    if (TSDB_CODE_SUCCESS != code) {
9,215,104✔
5420
      FLT_ERR_RET(code);
×
5421
    }
5422
    code = nodesCloneNode(pOper->pRight, &pRight);
9,215,104✔
5423
    if (TSDB_CODE_SUCCESS != code) {
9,219,294✔
5424
      nodesDestroyNode(pLeft);
×
5425
      FLT_ERR_RET(code);
×
5426
    }
5427
    SFltSclOperator sclOp = {.colNode = (SColumnNode *)pLeft, .valNode = (SValueNode *)pRight, .type = pOper->opType};
9,219,294✔
5428
    if (NULL == taosArrayPush(sclOpList, &sclOp)) {
9,218,211✔
5429
      nodesDestroyNode(pLeft);
×
5430
      nodesDestroyNode(pRight);
×
5431
      FLT_ERR_RET(terrno);
×
5432
    }
5433
  }
5434

5435
  return TSDB_CODE_SUCCESS;
11,408,153✔
5436
}
5437

5438
static int32_t fltSclCollectOperatorsFromLogicCond(SNode *pNode, SArray *sclOpList) {
12,425,484✔
5439
  if (nodeType(pNode) != QUERY_NODE_LOGIC_CONDITION) {
12,425,484✔
5440
    return TSDB_CODE_SUCCESS;
×
5441
  }
5442
  SLogicConditionNode *pLogicCond = (SLogicConditionNode *)pNode;
12,426,017✔
5443
  // TODO: support LOGIC_COND_TYPE_OR
5444
  if (pLogicCond->condType != LOGIC_COND_TYPE_AND) {
12,426,017✔
5445
    return TSDB_CODE_SUCCESS;
3,847,777✔
5446
  }
5447
  SNode *pExpr = NULL;
8,578,465✔
5448
  FOREACH(pExpr, pLogicCond->pParameterList) {
13,964,070✔
5449
    if (!fltSclIsCollectableNode(pExpr)) {
11,854,776✔
5450
      return TSDB_CODE_SUCCESS;
6,470,271✔
5451
    }
5452
  }
5453
  FOREACH(pExpr, pLogicCond->pParameterList) { FLT_ERR_RET(fltSclCollectOperatorFromNode(pExpr, sclOpList)); }
7,021,335✔
5454
  return TSDB_CODE_SUCCESS;
2,108,167✔
5455
}
5456

5457
static int32_t fltSclCollectOperators(SNode *pNode, SArray *sclOpList) {
47,303,255✔
5458
  if (nodeType(pNode) == QUERY_NODE_OPERATOR) {
47,303,255✔
5459
    FLT_ERR_RET(fltSclCollectOperatorFromNode(pNode, sclOpList));
34,876,869✔
5460
  } else if (nodeType(pNode) == QUERY_NODE_LOGIC_CONDITION) {
12,427,841✔
5461
    FLT_ERR_RET(fltSclCollectOperatorsFromLogicCond(pNode, sclOpList));
12,425,863✔
5462
  }
5463
  return TSDB_CODE_SUCCESS;
47,300,726✔
5464
}
5465

5466
int32_t fltOptimizeNodes(SFilterInfo *pInfo, SNode **pNode) {
47,303,852✔
5467
  SArray *sclOpList = taosArrayInit(16, sizeof(SFltSclOperator));
47,303,852✔
5468
  int32_t code = TSDB_CODE_SUCCESS;
47,295,635✔
5469
  if (NULL == sclOpList) {
47,295,635✔
5470
    FLT_ERR_RET(terrno);
×
5471
  }
5472
  FLT_ERR_JRET(fltSclCollectOperators(*pNode, sclOpList));
47,295,635✔
5473
  SArray *colRangeList = taosArrayInit(16, sizeof(SFltSclColumnRange));
47,301,277✔
5474
  if (NULL == colRangeList) {
47,292,937✔
5475
    FLT_ERR_JRET(terrno);
×
5476
  }
5477
  FLT_ERR_JRET(fltSclProcessCNF(pInfo, sclOpList, colRangeList));
47,292,937✔
5478
  pInfo->sclCtx.fltSclRange = colRangeList;
47,282,373✔
5479
  colRangeList = NULL;
47,269,740✔
5480

5481
_return:
47,286,724✔
5482
  for (int32_t i = 0; i < taosArrayGetSize(sclOpList); ++i) {
56,500,614✔
5483
    SFltSclOperator *sclOp = taosArrayGet(sclOpList, i);
9,212,866✔
5484
    if (NULL == sclOp) {
9,215,123✔
5485
      code = TSDB_CODE_OUT_OF_RANGE;
×
5486
      break;
×
5487
    }
5488
    nodesDestroyNode((SNode *)sclOp->colNode);
9,215,123✔
5489
    nodesDestroyNode((SNode *)sclOp->valNode);
9,209,903✔
5490
  }
5491

5492
  for (int32_t i = 0; i < taosArrayGetSize(colRangeList); ++i) {
47,316,794✔
5493
    SFltSclColumnRange *colRange = taosArrayGet(colRangeList, i);
16,984✔
5494
    nodesDestroyNode((SNode *)colRange->colNode);
16,984✔
5495
    taosArrayDestroy(colRange->points);
16,984✔
5496
  }
5497
  taosArrayDestroy(colRangeList);
47,297,243✔
5498
  taosArrayDestroy(sclOpList);
47,301,854✔
5499
  return code;
47,280,571✔
5500
}
5501

5502
int32_t fltGetDataFromColId(void *param, int32_t id, void **data) {
×
5503
  int32_t numOfCols = ((SFilterColumnParam *)param)->numOfCols;
×
5504
  SArray *pDataBlock = ((SFilterColumnParam *)param)->pDataBlock;
×
5505

5506
  for (int32_t j = 0; j < numOfCols; ++j) {
×
5507
    SColumnInfoData *pColInfo = taosArrayGet(pDataBlock, j);
×
5508
    if (NULL == pColInfo) {
×
5509
      FLT_ERR_RET(TSDB_CODE_OUT_OF_RANGE);
×
5510
    }
5511
    if (id == pColInfo->info.colId) {
×
5512
      *data = pColInfo;
×
5513
      break;
×
5514
    }
5515
  }
5516

5517
  return TSDB_CODE_SUCCESS;
×
5518
}
5519

5520
int32_t fltGetDataFromSlotId(void *param, int32_t id, void **data) {
85,244,033✔
5521
  int32_t numOfCols = ((SFilterColumnParam *)param)->numOfCols;
85,244,033✔
5522
  SArray *pDataBlock = ((SFilterColumnParam *)param)->pDataBlock;
85,248,551✔
5523
  if (id < 0 || id >= numOfCols || id >= taosArrayGetSize(pDataBlock)) {
85,246,117✔
5524
    fltError("invalid slot id, id:%d, numOfCols:%d, arraySize:%d", id, numOfCols,
3,405✔
5525
             (int32_t)taosArrayGetSize(pDataBlock));
5526
    return TSDB_CODE_APP_ERROR;
×
5527
  }
5528

5529
  SColumnInfoData *pColInfo = taosArrayGet(pDataBlock, id);
85,243,245✔
5530
  if (NULL == pColInfo) {
85,239,939✔
5531
    return TSDB_CODE_OUT_OF_RANGE;
×
5532
  }
5533
  *data = pColInfo;
85,239,939✔
5534

5535
  return TSDB_CODE_SUCCESS;
85,242,611✔
5536
}
5537

5538
int32_t filterSetDataFromSlotId(SFilterInfo *info, void *param) {
181,822,118✔
5539
  if (NULL == info) {
181,822,118✔
5540
    return TSDB_CODE_QRY_INVALID_INPUT;
×
5541
  }
5542

5543
  return fltSetColFieldDataImpl(info, param, fltGetDataFromSlotId, false);
181,822,118✔
5544
}
5545

5546
int32_t filterSetDataFromColId(SFilterInfo *info, void *param) {
×
5547
  return fltSetColFieldDataImpl(info, param, fltGetDataFromColId, true);
×
5548
}
5549

5550
int32_t filterInitFromNode(SNode *pNode, SFilterInfo **pInfo, uint32_t options, void* pSclExtraParams) {
790,096,256✔
5551
  SFilterInfo *info = NULL;
790,096,256✔
5552
  if (pNode == NULL) {
790,096,256✔
5553
    return TSDB_CODE_SUCCESS;
652,655,850✔
5554
  }
5555

5556
  int32_t code = 0;
137,440,406✔
5557
  if (pNode == NULL || pInfo == NULL) {
137,440,406✔
5558
    fltError("invalid param");
×
5559
    FLT_ERR_RET(TSDB_CODE_APP_ERROR);
×
5560
  }
5561

5562
  if (*pInfo == NULL) {
137,440,406✔
5563
    *pInfo = taosMemoryCalloc(1, sizeof(SFilterInfo));
137,537,785✔
5564
    if (NULL == *pInfo) {
137,453,974✔
5565
      fltError("taosMemoryCalloc %d failed", (int32_t)sizeof(SFilterInfo));
×
5566
      FLT_ERR_RET(terrno);
×
5567
    }
5568
  }
5569

5570
  info = *pInfo;
137,453,154✔
5571
  info->options = options;
137,508,850✔
5572
  info->pStreamRtInfo = pSclExtraParams;
137,521,440✔
5573

5574
  if (options & FLT_OPTION_SCALAR_MODE) {
137,442,666✔
5575
    info->scalarMode = true;
×
5576
    fltDebug("force set scalar mode: %d", info->scalarMode);
×
5577
  } else {
5578
    SFltTreeStat stat = {0};
137,442,666✔
5579
    stat.precision = -1;
137,508,736✔
5580
    stat.info = info;
137,508,736✔
5581

5582
    FLT_ERR_JRET(fltReviseNodes(info, &pNode, &stat));
137,508,736✔
5583
    if (tsFilterScalarMode) {
137,507,796✔
5584
      info->scalarMode = true;
×
5585
    } else {
5586
      info->scalarMode = stat.scalarMode;
137,507,796✔
5587
    }
5588
    fltDebug("scalar mode: %d", info->scalarMode);
137,502,298✔
5589
  }
5590

5591
  if (!info->scalarMode) {
137,554,317✔
5592
    FLT_ERR_JRET(fltInitFromNode(pNode, info, options));
90,258,706✔
5593
  } else {
5594
    info->sclCtx.node = pNode;
47,301,963✔
5595
    FLT_ERR_JRET(fltOptimizeNodes(info, &info->sclCtx.node));
47,304,023✔
5596
  }
5597

5598
  return TSDB_CODE_SUCCESS;
137,515,179✔
5599

5600
_return:
8,942✔
5601

5602
  filterFreeInfo(*pInfo);
8,942✔
5603
  *pInfo = NULL;
23,980✔
5604
  FLT_RET(code);
23,980✔
5605
}
5606

5607
int32_t filterExecute(SFilterInfo *info, SSDataBlock *pSrc, SColumnInfoData **p, SColumnDataAgg *statis,
181,852,827✔
5608
                      int16_t numOfCols, int32_t *pResultStatus) {
5609
  if (NULL == info) {
181,852,827✔
5610
    *pResultStatus = FILTER_RESULT_ALL_QUALIFIED;
×
5611
    return TSDB_CODE_SUCCESS;
×
5612
  }
5613
  int32_t      code = TSDB_CODE_SUCCESS;
181,852,827✔
5614
  SScalarParam output = {0};
181,852,827✔
5615
  SDataType    type = {.type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)};
181,858,547✔
5616

5617
  FLT_ERR_JRET(sclCreateColumnInfoData(&type, pSrc->info.rows, &output));
181,856,551✔
5618

5619
  if (info->scalarMode) {
181,856,212✔
5620
    SArray *pList = taosArrayInit(1, POINTER_BYTES);
100,568,172✔
5621
    if (NULL == pList) {
100,577,276✔
5622
      FLT_ERR_JRET(terrno);
×
5623
    }
5624
    if (NULL == taosArrayPush(pList, &pSrc)) {
100,574,439✔
5625
      taosArrayDestroy(pList);
×
5626
      FLT_ERR_JRET(terrno);
×
5627
    }
5628

5629
    gTaskScalarExtra.pStreamInfo = (void*)info->pStreamRtInfo;
100,574,439✔
5630
    gTaskScalarExtra.pStreamRange = NULL;
100,580,459✔
5631
    code =
5632
        scalarCalculate(info->sclCtx.node, pList, &output, &gTaskScalarExtra);
100,561,995✔
5633
    taosArrayDestroy(pList);
100,558,899✔
5634

5635
    *p = output.columnData;
100,563,820✔
5636

5637
    FLT_ERR_JRET(code);
100,560,694✔
5638

5639
    if (output.numOfQualified == output.numOfRows) {
99,559,550✔
5640
      *pResultStatus = FILTER_RESULT_ALL_QUALIFIED;
39,726,739✔
5641
    } else if (output.numOfQualified == 0) {
59,832,811✔
5642
      *pResultStatus = FILTER_RESULT_NONE_QUALIFIED;
25,982,258✔
5643
    } else {
5644
      *pResultStatus = FILTER_RESULT_PARTIAL_QUALIFIED;
33,850,553✔
5645
    }
5646
    return TSDB_CODE_SUCCESS;
99,569,539✔
5647
  }
5648

5649
  *p = output.columnData;
81,295,739✔
5650
  output.numOfRows = pSrc->info.rows;
81,281,233✔
5651

5652
  if (*p == NULL) {
81,287,468✔
5653
    fltError("filterExecute failed, column data is NULL");
×
5654
    FLT_ERR_JRET(TSDB_CODE_APP_ERROR);
×
5655
  }
5656

5657
  bool keepAll = false;
81,282,422✔
5658
  FLT_ERR_JRET((info->func)(info, pSrc->info.rows, *p, statis, numOfCols, &output.numOfQualified, &keepAll));
81,281,744✔
5659

5660
  // todo this should be return during filter procedure
5661
  if (keepAll) {
81,284,533✔
5662
    *pResultStatus = FILTER_RESULT_ALL_QUALIFIED;
27,355,387✔
5663
  } else {
5664
    int32_t num = 0;
53,929,146✔
5665
    for (int32_t i = 0; i < output.numOfRows; ++i) {
2,147,483,647✔
5666
      if (((int8_t *)((*p)->pData))[i] == 1) {
2,147,483,647✔
5667
        ++num;
2,147,483,647✔
5668
      }
5669
    }
5670

5671
    if (num == output.numOfRows) {
53,922,142✔
5672
      *pResultStatus = FILTER_RESULT_ALL_QUALIFIED;
×
5673
    } else if (num == 0) {
53,922,142✔
5674
      *pResultStatus = FILTER_RESULT_NONE_QUALIFIED;
21,472,545✔
5675
    } else {
5676
      *pResultStatus = FILTER_RESULT_PARTIAL_QUALIFIED;
32,449,597✔
5677
    }
5678
  }
5679

5680
  return TSDB_CODE_SUCCESS;
81,285,850✔
5681
_return:
1,001,144✔
5682
  sclFreeParam(&output);
1,001,144✔
5683
  *p = NULL;
1,001,144✔
5684
  return code;
1,001,144✔
5685
}
5686

5687
typedef struct SClassifyConditionCxt {
5688
  bool hasPrimaryKey;
5689
  bool hasTagIndexCol;
5690
  bool hasTagCol;
5691
  bool hasOtherCol;
5692
} SClassifyConditionCxt;
5693

5694
static EDealRes classifyConditionImpl(SNode *pNode, void *pContext) {
1,604,156,886✔
5695
  SClassifyConditionCxt *pCxt = (SClassifyConditionCxt *)pContext;
1,604,156,886✔
5696
  if (QUERY_NODE_COLUMN == nodeType(pNode)) {
1,604,156,886✔
5697
    SColumnNode *pCol = (SColumnNode *)pNode;
476,969,559✔
5698
    if (PRIMARYKEY_TIMESTAMP_COL_ID == pCol->colId && TSDB_SYSTEM_TABLE != pCol->tableType) {
476,969,559✔
5699
      pCxt->hasPrimaryKey = true;
69,969,212✔
5700
    } else if (pCol->hasIndex) {
406,998,050✔
5701
      pCxt->hasTagIndexCol = true;
9,814,579✔
5702
      pCxt->hasTagCol = true;
9,814,579✔
5703
    } else if (COLUMN_TYPE_TAG == pCol->colType || COLUMN_TYPE_TBNAME == pCol->colType) {
397,183,141✔
5704
      pCxt->hasTagCol = true;
33,517,699✔
5705
    } else {
5706
      pCxt->hasOtherCol = true;
363,665,364✔
5707
    }
5708
  } else if (QUERY_NODE_FUNCTION == nodeType(pNode)) {
1,127,189,398✔
5709
    SFunctionNode *pFunc = (SFunctionNode *)pNode;
47,704,604✔
5710
    if (fmIsPseudoColumnFunc(pFunc->funcId)) {
47,704,604✔
5711
      if (FUNCTION_TYPE_TBNAME == pFunc->funcType) {
1,554,789✔
5712
        pCxt->hasTagCol = true;
1,335,673✔
5713
      } else if (fmIsPlaceHolderFunc(pFunc->funcId)) {
219,116✔
5714
      } else {
5715
        pCxt->hasOtherCol = true;
×
5716
      }
5717
    }
5718
  }
5719
  return DEAL_RES_CONTINUE;
1,604,152,825✔
5720
}
5721

5722
EConditionType filterClassifyCondition(SNode *pNode) {
486,232,743✔
5723
  SClassifyConditionCxt cxt = {.hasPrimaryKey = false, .hasTagIndexCol = false, .hasOtherCol = false};
486,232,743✔
5724
  nodesWalkExpr(pNode, classifyConditionImpl, &cxt);
486,235,797✔
5725
  if (cxt.hasOtherCol || (cxt.hasPrimaryKey && cxt.hasTagCol)) {
486,258,413✔
5726
    return COND_TYPE_NORMAL;
300,100,090✔
5727
  }
5728

5729
  if (cxt.hasPrimaryKey) {
186,158,323✔
5730
    return COND_TYPE_PRIMARY_KEY;
66,680,923✔
5731
  }
5732

5733
  if (cxt.hasTagIndexCol) {
119,477,400✔
5734
    return COND_TYPE_TAG_INDEX;
9,642,635✔
5735
  }
5736

5737
  if (cxt.hasTagCol) {
109,834,765✔
5738
    return COND_TYPE_TAG;
33,698,734✔
5739
  }
5740

5741
  return COND_TYPE_NORMAL;
76,136,031✔
5742
}
5743

5744
int32_t filterIsMultiTableColsCond(SNode *pCond, bool *res) {
499,174,284✔
5745
  SNodeList *pCondCols = NULL;
499,174,284✔
5746
  int32_t    code = nodesMakeList(&pCondCols);
499,175,314✔
5747
  if (TSDB_CODE_SUCCESS != code) {
499,198,040✔
5748
    return code;
×
5749
  }
5750
  code = nodesCollectColumnsFromNode(pCond, NULL, COLLECT_COL_TYPE_ALL, &pCondCols);
499,198,040✔
5751
  if (code == TSDB_CODE_SUCCESS) {
499,198,172✔
5752
    if (LIST_LENGTH(pCondCols) >= 2) {
499,190,799✔
5753
      SColumnNode *pFirstCol = (SColumnNode *)nodesListGetNode(pCondCols, 0);
26,720,894✔
5754
      SNode       *pColNode = NULL;
26,720,894✔
5755
      FOREACH(pColNode, pCondCols) {
73,039,413✔
5756
        if (strcmp(((SColumnNode *)pColNode)->dbName, pFirstCol->dbName) != 0 ||
59,260,457✔
5757
            strcmp(((SColumnNode *)pColNode)->tableAlias, pFirstCol->tableAlias) != 0) {
59,220,335✔
5758
          nodesDestroyList(pCondCols);
12,941,938✔
5759
          *res = true;
12,941,938✔
5760
          return TSDB_CODE_SUCCESS;
12,941,938✔
5761
        }
5762
      }
5763
    }
5764
    nodesDestroyList(pCondCols);
486,248,430✔
5765
  }
5766
  *res = false;
486,245,642✔
5767
  return code;
486,246,173✔
5768
}
5769

5770
static int32_t partitionLogicCond(SNode **pCondition, SNode **pPrimaryKeyCond, SNode **pTagIndexCond, SNode **pTagCond,
82,601,555✔
5771
                                  SNode **pOtherCond) {
5772
  SLogicConditionNode *pLogicCond = (SLogicConditionNode *)(*pCondition);
82,601,555✔
5773

5774
  int32_t code = TSDB_CODE_SUCCESS;
82,601,624✔
5775

5776
  SNodeList *pPrimaryKeyConds = NULL;
82,601,624✔
5777
  SNodeList *pTagIndexConds = NULL;
82,602,971✔
5778
  SNodeList *pTagConds = NULL;
82,603,001✔
5779
  SNodeList *pOtherConds = NULL;
82,602,494✔
5780
  SNode     *pCond = NULL;
82,600,995✔
5781
  FOREACH(pCond, pLogicCond->pParameterList) {
275,233,012✔
5782
    bool result = false;
192,630,365✔
5783
    code = filterIsMultiTableColsCond(pCond, &result);
192,630,327✔
5784
    if (TSDB_CODE_SUCCESS != code) {
192,628,476✔
5785
      break;
×
5786
    }
5787
    if (result) {
192,628,476✔
5788
      if (NULL != pOtherCond) {
12,585,496✔
5789
        SNode *pNew = NULL;
6,232,770✔
5790
        code = nodesCloneNode(pCond, &pNew);
6,232,770✔
5791
        if (TSDB_CODE_SUCCESS == code) {
6,232,770✔
5792
          code = nodesListMakeAppend(&pOtherConds, pNew);
6,232,770✔
5793
        }
5794
      }
5795
    } else {
5796
      switch (filterClassifyCondition(pCond)) {
180,042,980✔
5797
        case COND_TYPE_PRIMARY_KEY:
49,311,932✔
5798
          if (NULL != pPrimaryKeyCond) {
49,311,932✔
5799
            SNode *pNew = NULL;
34,703,080✔
5800
            code = nodesCloneNode(pCond, &pNew);
34,703,110✔
5801
            if (TSDB_CODE_SUCCESS == code) {
34,704,145✔
5802
              code = nodesListMakeAppend(&pPrimaryKeyConds, pNew);
34,704,145✔
5803
            }
5804
          }
5805
          break;
49,312,076✔
5806
        case COND_TYPE_TAG_INDEX:
2,537,150✔
5807
          if (NULL != pTagIndexCond) {
2,537,150✔
5808
            SNode *pNew = NULL;
727,653✔
5809
            code = nodesCloneNode(pCond, &pNew);
727,653✔
5810
            if (TSDB_CODE_SUCCESS == code) {
727,653✔
5811
              code = nodesListMakeAppend(&pTagIndexConds, pNew);
727,653✔
5812
            }
5813
          }
5814
          if (NULL != pTagCond) {
2,537,150✔
5815
            SNode *pNew = NULL;
727,653✔
5816
            code = nodesCloneNode(pCond, &pNew);
727,653✔
5817
            if (TSDB_CODE_SUCCESS == code) {
727,653✔
5818
              code = nodesListMakeAppend(&pTagConds, pNew);
727,653✔
5819
            }
5820
          }
5821
          break;
2,537,150✔
5822
        case COND_TYPE_TAG:
24,700,513✔
5823
          if (NULL != pTagCond) {
24,700,513✔
5824
            SNode *pNew = NULL;
7,648,619✔
5825
            code = nodesCloneNode(pCond, &pNew);
7,648,619✔
5826
            if (TSDB_CODE_SUCCESS == code) {
7,648,619✔
5827
              code = nodesListMakeAppend(&pTagConds, pNew);
7,648,619✔
5828
            }
5829
          }
5830
          break;
24,700,513✔
5831
        case COND_TYPE_NORMAL:
103,495,375✔
5832
        default:
5833
          if (NULL != pOtherCond) {
103,495,375✔
5834
            SNode *pNew = NULL;
68,252,012✔
5835
            code = nodesCloneNode(pCond, &pNew);
68,252,050✔
5836
            if (TSDB_CODE_SUCCESS == code) {
68,252,270✔
5837
              code = nodesListMakeAppend(&pOtherConds, pNew);
68,252,308✔
5838
            }
5839
          }
5840
          break;
103,495,806✔
5841
      }
5842
    }
5843
    if (TSDB_CODE_SUCCESS != code) {
192,631,002✔
5844
      break;
×
5845
    }
5846
  }
5847

5848
  SNode *pTempPrimaryKeyCond = NULL;
82,603,207✔
5849
  SNode *pTempTagIndexCond = NULL;
82,603,292✔
5850
  SNode *pTempTagCond = NULL;
82,603,292✔
5851
  SNode *pTempOtherCond = NULL;
82,603,322✔
5852
  if (TSDB_CODE_SUCCESS == code) {
82,603,241✔
5853
    code = nodesMergeConds(&pTempPrimaryKeyCond, &pPrimaryKeyConds);
82,604,172✔
5854
  }
5855
  if (TSDB_CODE_SUCCESS == code) {
82,601,068✔
5856
    code = nodesMergeConds(&pTempTagIndexCond, &pTagIndexConds);
82,603,036✔
5857
  }
5858
  if (TSDB_CODE_SUCCESS == code) {
82,601,524✔
5859
    code = nodesMergeConds(&pTempTagCond, &pTagConds);
82,602,044✔
5860
  }
5861
  if (TSDB_CODE_SUCCESS == code) {
82,603,047✔
5862
    code = nodesMergeConds(&pTempOtherCond, &pOtherConds);
82,603,895✔
5863
  }
5864

5865
  if (TSDB_CODE_SUCCESS == code) {
82,603,528✔
5866
    if (NULL != pPrimaryKeyCond) {
82,603,528✔
5867
      *pPrimaryKeyCond = pTempPrimaryKeyCond;
58,647,933✔
5868
    }
5869
    if (NULL != pTagIndexCond) {
82,603,567✔
5870
      *pTagIndexCond = pTempTagIndexCond;
28,477,227✔
5871
    }
5872
    if (NULL != pTagCond) {
82,603,567✔
5873
      *pTagCond = pTempTagCond;
29,166,359✔
5874
    }
5875
    if (NULL != pOtherCond) {
82,603,597✔
5876
      *pOtherCond = pTempOtherCond;
53,121,319✔
5877
    }
5878
    nodesDestroyNode(*pCondition);
82,603,597✔
5879
    *pCondition = NULL;
82,603,849✔
5880
  } else {
5881
    nodesDestroyList(pPrimaryKeyConds);
×
5882
    nodesDestroyList(pTagIndexConds);
×
5883
    nodesDestroyList(pTagConds);
×
5884
    nodesDestroyList(pOtherConds);
×
5885
    nodesDestroyNode(pTempPrimaryKeyCond);
×
5886
    nodesDestroyNode(pTempTagIndexCond);
×
5887
    nodesDestroyNode(pTempTagCond);
×
5888
    nodesDestroyNode(pTempOtherCond);
×
5889
  }
5890

5891
  return code;
82,603,755✔
5892
}
5893

5894
int32_t filterPartitionCond(SNode **pCondition, SNode **pPrimaryKeyCond, SNode **pTagIndexCond, SNode **pTagCond,
389,152,347✔
5895
                            SNode **pOtherCond) {
5896
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pCondition) &&
389,152,347✔
5897
      LOGIC_COND_TYPE_AND == ((SLogicConditionNode *)*pCondition)->condType) {
104,873,540✔
5898
    return partitionLogicCond(pCondition, pPrimaryKeyCond, pTagIndexCond, pTagCond, pOtherCond);
82,602,693✔
5899
  }
5900

5901
  bool needOutput = false;
306,551,288✔
5902
  bool result = false;
306,551,288✔
5903
  FLT_ERR_RET(filterIsMultiTableColsCond(*pCondition, &result));
306,550,216✔
5904
  if (result) {
306,563,505✔
5905
    if (NULL != pOtherCond) {
356,442✔
5906
      *pOtherCond = *pCondition;
191,767✔
5907
      needOutput = true;
191,867✔
5908
    }
5909
  } else {
5910
    switch (filterClassifyCondition(*pCondition)) {
306,207,063✔
5911
      case COND_TYPE_PRIMARY_KEY:
17,369,399✔
5912
        if (NULL != pPrimaryKeyCond) {
17,369,399✔
5913
          *pPrimaryKeyCond = *pCondition;
12,722,179✔
5914
          needOutput = true;
12,722,610✔
5915
        }
5916
        break;
17,369,830✔
5917
      case COND_TYPE_TAG_INDEX:
7,105,485✔
5918
        if (NULL != pTagIndexCond) {
7,105,485✔
5919
          *pTagIndexCond = *pCondition;
2,091,703✔
5920
          needOutput = true;
2,091,703✔
5921
        }
5922
        if (NULL != pTagCond) {
7,105,485✔
5923
          SNode *pTempCond = *pCondition;
2,182,027✔
5924
          if (NULL != pTagIndexCond) {
2,182,027✔
5925
            pTempCond = NULL;
2,091,703✔
5926
            int32_t code = nodesCloneNode(*pCondition, &pTempCond);
2,091,703✔
5927
            if (NULL == pTempCond) {
2,091,703✔
5928
              return code;
×
5929
            }
5930
          }
5931
          *pTagCond = pTempCond;
2,182,027✔
5932
          needOutput = true;
2,182,027✔
5933
        }
5934
        break;
7,105,485✔
5935
      case COND_TYPE_TAG:
8,998,221✔
5936
        if (NULL != pTagCond) {
8,998,221✔
5937
          *pTagCond = *pCondition;
3,393,332✔
5938
          needOutput = true;
3,392,066✔
5939
        }
5940
        break;
8,996,955✔
5941
      case COND_TYPE_NORMAL:
272,729,750✔
5942
      default:
5943
        if (NULL != pOtherCond) {
272,729,750✔
5944
          *pOtherCond = *pCondition;
176,683,924✔
5945
          needOutput = true;
176,684,455✔
5946
        }
5947
        break;
272,730,281✔
5948
    }
5949
  }
5950
  if (needOutput) {
306,559,093✔
5951
    *pCondition = NULL;
195,180,805✔
5952
  }
5953

5954
  return TSDB_CODE_SUCCESS;
306,560,790✔
5955
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc