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

taosdata / TDengine / #3531

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

push

travis-ci

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

fix:TD-32366/stmt add geometry datatype check

118529 of 252344 branches covered (46.97%)

Branch coverage included in aggregate %.

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

2282 existing lines in 115 files now uncovered.

199096 of 275161 relevant lines covered (72.36%)

6067577.83 hits per line

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

45.6
/source/libs/scalar/src/sclvector.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

16
#include "os.h"
17

18
#include "filter.h"
19
#include "filterInt.h"
20
#include "query.h"
21
#include "querynodes.h"
22
#include "sclInt.h"
23
#include "sclvector.h"
24
#include "tcompare.h"
25
#include "tdatablock.h"
26
#include "tdataformat.h"
27
#include "ttime.h"
28
#include "ttypes.h"
29
#include "geosWrapper.h"
30

31
#define LEFT_COL  ((pLeftCol->info.type == TSDB_DATA_TYPE_JSON ? (void *)pLeftCol : pLeftCol->pData))
32
#define RIGHT_COL ((pRightCol->info.type == TSDB_DATA_TYPE_JSON ? (void *)pRightCol : pRightCol->pData))
33

34
#define IS_NULL                                                                              \
35
  colDataIsNull_s(pLeft->columnData, i) || colDataIsNull_s(pRight->columnData, i) ||         \
36
      IS_JSON_NULL(pLeft->columnData->info.type, colDataGetVarData(pLeft->columnData, i)) || \
37
      IS_JSON_NULL(pRight->columnData->info.type, colDataGetVarData(pRight->columnData, i))
38

39
#define IS_HELPER_NULL(col, i) colDataIsNull_s(col, i) || IS_JSON_NULL(col->info.type, colDataGetVarData(col, i))
40

41
bool noConvertBeforeCompare(int32_t leftType, int32_t rightType, int32_t optr) {
533,798✔
42
  return IS_NUMERIC_TYPE(leftType) && IS_NUMERIC_TYPE(rightType) &&
898,115!
43
         (optr >= OP_TYPE_GREATER_THAN && optr <= OP_TYPE_NOT_EQUAL);
364,317✔
44
}
45

46
int32_t convertNumberToNumber(const void *inData, void *outData, int8_t inType, int8_t outType) {
948✔
47
  switch (outType) {
948!
48
    case TSDB_DATA_TYPE_BOOL: {
×
49
      GET_TYPED_DATA(*((bool *)outData), bool, inType, inData);
×
50
      break;
×
51
    }
52
    case TSDB_DATA_TYPE_TINYINT: {
×
53
      GET_TYPED_DATA(*((int8_t *)outData), int8_t, inType, inData);
×
54
      break;
×
55
    }
56
    case TSDB_DATA_TYPE_SMALLINT: {
×
57
      GET_TYPED_DATA(*((int16_t *)outData), int16_t, inType, inData);
×
58
      break;
×
59
    }
60
    case TSDB_DATA_TYPE_INT: {
×
61
      GET_TYPED_DATA(*((int32_t *)outData), int32_t, inType, inData);
×
62
      break;
×
63
    }
64
    case TSDB_DATA_TYPE_BIGINT:
×
65
    case TSDB_DATA_TYPE_TIMESTAMP: {
66
      GET_TYPED_DATA(*((int64_t *)outData), int64_t, inType, inData);
×
67
      break;
×
68
    }
69
    case TSDB_DATA_TYPE_UTINYINT: {
×
70
      GET_TYPED_DATA(*((uint8_t *)outData), uint8_t, inType, inData);
×
71
      break;
×
72
    }
73
    case TSDB_DATA_TYPE_USMALLINT: {
×
74
      GET_TYPED_DATA(*((uint16_t *)outData), uint16_t, inType, inData);
×
75
      break;
×
76
    }
77
    case TSDB_DATA_TYPE_UINT: {
×
78
      GET_TYPED_DATA(*((uint32_t *)outData), uint32_t, inType, inData);
×
79
      break;
×
80
    }
81
    case TSDB_DATA_TYPE_UBIGINT: {
×
82
      GET_TYPED_DATA(*((uint64_t *)outData), uint64_t, inType, inData);
×
83
      break;
×
84
    }
85
    case TSDB_DATA_TYPE_FLOAT: {
×
86
      GET_TYPED_DATA(*((float *)outData), float, inType, inData);
×
87
      break;
×
88
    }
89
    case TSDB_DATA_TYPE_DOUBLE: {
948✔
90
      GET_TYPED_DATA(*((double *)outData), double, inType, inData);
948!
91
      break;
948✔
92
    }
93
    default: {
×
94
      return TSDB_CODE_SCALAR_CONVERT_ERROR;
×
95
    }
96
  }
97
  return TSDB_CODE_SUCCESS;
948✔
98
}
99

100
int32_t convertNcharToDouble(const void *inData, void *outData) {
8✔
101
  int32_t code = TSDB_CODE_SUCCESS;
8✔
102
  char   *tmp = taosMemoryMalloc(varDataTLen(inData));
8✔
103
  if (NULL == tmp) {
8!
104
    SCL_ERR_RET(terrno);
×
105
  }
106
  int   len = taosUcs4ToMbs((TdUcs4 *)varDataVal(inData), varDataLen(inData), tmp);
8✔
107
  if (len < 0) {
8!
108
    sclError("castConvert taosUcs4ToMbs error 1");
×
109
    SCL_ERR_JRET(TSDB_CODE_SCALAR_CONVERT_ERROR);
×
110
  }
111

112
  tmp[len] = 0;
8✔
113

114
  double value = taosStr2Double(tmp, NULL);
8✔
115

116
  *((double *)outData) = value;
8✔
117

118
_return:
8✔
119
  taosMemoryFreeClear(tmp);
8!
120
  SCL_RET(code);
8!
121
}
122

123
int32_t convertBinaryToDouble(const void *inData, void *outData) {
×
124
  char *tmp = taosMemoryCalloc(1, varDataTLen(inData));
×
125
  if (tmp == NULL) {
×
126
    *((double *)outData) = 0.;
×
127
    SCL_ERR_RET(terrno);
×
128
  }
129
  (void)memcpy(tmp, varDataVal(inData), varDataLen(inData));
×
130
  double ret = taosStr2Double(tmp, NULL);
×
131
  taosMemoryFree(tmp);
×
132
  *((double *)outData) = ret;
×
133
  SCL_RET(TSDB_CODE_SUCCESS);
×
134
}
135

136
typedef int32_t (*_getBigintValue_fn_t)(void *src, int32_t index, int64_t *res);
137

138
int32_t getVectorBigintValue_TINYINT(void *src, int32_t index, int64_t *res) {
151,362✔
139
  *res = (int64_t) * ((int8_t *)src + index);
151,362✔
140
  SCL_RET(TSDB_CODE_SUCCESS);
151,362!
141
}
142
int32_t getVectorBigintValue_UTINYINT(void *src, int32_t index, int64_t *res) {
×
143
  *res = (int64_t) * ((uint8_t *)src + index);
×
144
  SCL_RET(TSDB_CODE_SUCCESS);
×
145
}
146
int32_t getVectorBigintValue_SMALLINT(void *src, int32_t index, int64_t *res) {
194,775✔
147
  *res = (int64_t) * ((int16_t *)src + index);
194,775✔
148
  SCL_RET(TSDB_CODE_SUCCESS);
194,775!
149
}
150
int32_t getVectorBigintValue_USMALLINT(void *src, int32_t index, int64_t *res) {
×
151
  *res = (int64_t) * ((uint16_t *)src + index);
×
152
  SCL_RET(TSDB_CODE_SUCCESS);
×
153
}
154
int32_t getVectorBigintValue_INT(void *src, int32_t index, int64_t *res) {
252,488✔
155
  *res = (int64_t) * ((int32_t *)src + index);
252,488✔
156
  SCL_RET(TSDB_CODE_SUCCESS);
252,488!
157
}
158
int32_t getVectorBigintValue_UINT(void *src, int32_t index, int64_t *res) {
×
159
  *res = (int64_t) * ((uint32_t *)src + index);
×
160
  SCL_RET(TSDB_CODE_SUCCESS);
×
161
}
162
int32_t getVectorBigintValue_BIGINT(void *src, int32_t index, int64_t *res) {
3,836,779✔
163
  *res = (int64_t) * ((int64_t *)src + index);
3,836,779✔
164
  SCL_RET(TSDB_CODE_SUCCESS);
3,836,779!
165
}
166
int32_t getVectorBigintValue_UBIGINT(void *src, int32_t index, int64_t *res) {
×
167
  *res = (int64_t) * ((uint64_t *)src + index);
×
168
  SCL_RET(TSDB_CODE_SUCCESS);
×
169
}
170
int32_t getVectorBigintValue_FLOAT(void *src, int32_t index, int64_t *res) {
36✔
171
  *res = (int64_t) * ((float *)src + index);
36✔
172
  SCL_RET(TSDB_CODE_SUCCESS);
36!
173
}
174
int32_t getVectorBigintValue_DOUBLE(void *src, int32_t index, int64_t *res) {
54✔
175
  *res = (int64_t) * ((double *)src + index);
54✔
176
  SCL_RET(TSDB_CODE_SUCCESS);
54!
177
}
178
int32_t getVectorBigintValue_BOOL(void *src, int32_t index, int64_t *res) {
68,535✔
179
  *res = (int64_t) * ((bool *)src + index);
68,535✔
180
  SCL_RET(TSDB_CODE_SUCCESS);
68,535!
181
}
182

183
int32_t getVectorBigintValue_JSON(void *src, int32_t index, int64_t *res) {
×
184
  if (colDataIsNull_var(((SColumnInfoData *)src), index)) {
×
185
    sclError("getVectorBigintValue_JSON get json data null with index %d", index);
×
186
    SCL_ERR_RET(TSDB_CODE_SCALAR_CONVERT_ERROR);
×
187
  }
188
  char  *data = colDataGetVarData((SColumnInfoData *)src, index);
×
189
  double out = 0;
×
190
  if (*data == TSDB_DATA_TYPE_NULL) {
×
191
    *res = 0;
×
192
    SCL_RET(TSDB_CODE_SUCCESS);
×
193
  } else if (*data == TSDB_DATA_TYPE_NCHAR) {  // json inner type can not be BINARY
×
194
    SCL_ERR_RET(convertNcharToDouble(data + CHAR_BYTES, &out));
×
195
  } else if (tTagIsJson(data)) {
×
196
    *res = 0;
×
197
    SCL_ERR_RET(TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR);
×
198
  } else {
199
    SCL_ERR_RET(convertNumberToNumber(data + CHAR_BYTES, &out, *data, TSDB_DATA_TYPE_DOUBLE));
×
200
  }
201
  *res = (int64_t)out;
×
202
  SCL_RET(TSDB_CODE_SUCCESS);
×
203
}
204

205
int32_t getVectorBigintValueFn(int32_t srcType, _getBigintValue_fn_t *p) {
1,047,505✔
206
   *p = NULL;
1,047,505✔
207
  if (srcType == TSDB_DATA_TYPE_TINYINT) {
1,047,505✔
208
    *p = getVectorBigintValue_TINYINT;
77,408✔
209
  } else if (srcType == TSDB_DATA_TYPE_UTINYINT) {
970,097!
210
    *p = getVectorBigintValue_UTINYINT;
×
211
  } else if (srcType == TSDB_DATA_TYPE_SMALLINT) {
970,097✔
212
    *p = getVectorBigintValue_SMALLINT;
99,428✔
213
  } else if (srcType == TSDB_DATA_TYPE_USMALLINT) {
870,669!
214
    *p = getVectorBigintValue_USMALLINT;
×
215
  } else if (srcType == TSDB_DATA_TYPE_INT) {
870,669✔
216
    *p = getVectorBigintValue_INT;
128,770✔
217
  } else if (srcType == TSDB_DATA_TYPE_UINT) {
741,899!
218
    *p = getVectorBigintValue_UINT;
×
219
  } else if (srcType == TSDB_DATA_TYPE_BIGINT) {
741,899✔
220
    *p = getVectorBigintValue_BIGINT;
184,267✔
221
  } else if (srcType == TSDB_DATA_TYPE_UBIGINT) {
557,632!
222
    *p = getVectorBigintValue_UBIGINT;
×
223
  } else if (srcType == TSDB_DATA_TYPE_FLOAT) {
557,632✔
224
    *p = getVectorBigintValue_FLOAT;
4✔
225
  } else if (srcType == TSDB_DATA_TYPE_DOUBLE) {
557,628✔
226
    *p = getVectorBigintValue_DOUBLE;
6✔
227
  } else if (srcType == TSDB_DATA_TYPE_TIMESTAMP) {
557,622✔
228
    *p = getVectorBigintValue_BIGINT;
523,598✔
229
  } else if (srcType == TSDB_DATA_TYPE_BOOL) {
34,024!
230
    *p = getVectorBigintValue_BOOL;
35,212✔
231
  } else if (srcType == TSDB_DATA_TYPE_JSON) {
×
232
    *p = getVectorBigintValue_JSON;
×
233
  } else if (srcType == TSDB_DATA_TYPE_NULL) {
×
234
    *p = NULL;
×
235
  } else {
236
    sclError("getVectorBigintValueFn invalid srcType : %d", srcType);
×
237
    return TSDB_CODE_SCALAR_CONVERT_ERROR;
×
238
  }
239
  return TSDB_CODE_SUCCESS;
1,048,693✔
240
}
241

242
static FORCE_INLINE int32_t varToTimestamp(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
128✔
243
  int64_t value = 0;
128✔
244
  int32_t code = TSDB_CODE_SUCCESS;
128✔
245
  if (taosParseTime(buf, &value, strlen(buf), pOut->columnData->info.precision, tsDaylight) != TSDB_CODE_SUCCESS) {
128!
246
    value = 0;
×
247
    code = TSDB_CODE_SCALAR_CONVERT_ERROR;
×
248
  }
249

250
  colDataSetInt64(pOut->columnData, rowIndex, &value);
128✔
251
  SCL_RET(code);
128!
252
}
253

254
static FORCE_INLINE int32_t varToSigned(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
18,073✔
255
  if (overflow) {
18,073✔
256
    int64_t minValue = tDataTypes[pOut->columnData->info.type].minValue;
3,608✔
257
    int64_t maxValue = tDataTypes[pOut->columnData->info.type].maxValue;
3,608✔
258
    int64_t value = (int64_t)taosStr2Int64(buf, NULL, 10);
3,608✔
259
    if (value > maxValue) {
3,611!
260
      *overflow = 1;
×
261
      SCL_RET(TSDB_CODE_SUCCESS);
×
262
    } else if (value < minValue) {
3,611!
263
      *overflow = -1;
×
264
      SCL_RET(TSDB_CODE_SUCCESS);
×
265
    } else {
266
      *overflow = 0;
3,611✔
267
    }
268
  }
269

270
  switch (pOut->columnData->info.type) {
18,076!
271
    case TSDB_DATA_TYPE_TINYINT: {
×
272
      int8_t value = (int8_t)taosStr2Int8(buf, NULL, 10);
×
273

274
      colDataSetInt8(pOut->columnData, rowIndex, (int8_t *)&value);
×
275
      break;
×
276
    }
277
    case TSDB_DATA_TYPE_SMALLINT: {
×
278
      int16_t value = (int16_t)taosStr2Int16(buf, NULL, 10);
×
279
      colDataSetInt16(pOut->columnData, rowIndex, (int16_t *)&value);
×
280
      break;
×
281
    }
282
    case TSDB_DATA_TYPE_INT: {
1,535✔
283
      int32_t value = (int32_t)taosStr2Int32(buf, NULL, 10);
1,535✔
284
      colDataSetInt32(pOut->columnData, rowIndex, (int32_t *)&value);
1,535✔
285
      break;
1,535✔
286
    }
287
    case TSDB_DATA_TYPE_BIGINT: {
16,540✔
288
      int64_t value = (int64_t)taosStr2Int64(buf, NULL, 10);
16,540✔
289
      colDataSetInt64(pOut->columnData, rowIndex, (int64_t *)&value);
16,540✔
290
      break;
16,540✔
291
    }
292
  }
293
  SCL_RET(TSDB_CODE_SUCCESS);
18,076!
294
}
295

296
static FORCE_INLINE int32_t varToUnsigned(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
4,148✔
297
  if (overflow) {
4,148!
298
    uint64_t minValue = (uint64_t)tDataTypes[pOut->columnData->info.type].minValue;
4,148✔
299
    uint64_t maxValue = (uint64_t)tDataTypes[pOut->columnData->info.type].maxValue;
4,148✔
300
    uint64_t value = (uint64_t)taosStr2UInt64(buf, NULL, 10);
4,148✔
301
    if (value > maxValue) {
4,151!
302
      *overflow = 1;
×
303
      SCL_RET(TSDB_CODE_SUCCESS);
×
304
    } else if (value < minValue) {
4,151!
305
      *overflow = -1;
×
306
      SCL_RET(TSDB_CODE_SUCCESS);
×
307
    } else {
308
      *overflow = 0;
4,151✔
309
    }
310
  }
311

312
  switch (pOut->columnData->info.type) {
4,151!
313
    case TSDB_DATA_TYPE_UTINYINT: {
×
314
      uint8_t value = (uint8_t)taosStr2UInt8(buf, NULL, 10);
×
315
      colDataSetInt8(pOut->columnData, rowIndex, (int8_t *)&value);
×
316
      break;
×
317
    }
318
    case TSDB_DATA_TYPE_USMALLINT: {
×
319
      uint16_t value = (uint16_t)taosStr2UInt16(buf, NULL, 10);
×
320
      colDataSetInt16(pOut->columnData, rowIndex, (int16_t *)&value);
×
321
      break;
×
322
    }
323
    case TSDB_DATA_TYPE_UINT: {
1,805✔
324
      uint32_t value = (uint32_t)taosStr2UInt32(buf, NULL, 10);
1,805✔
325
      colDataSetInt32(pOut->columnData, rowIndex, (int32_t *)&value);
1,805✔
326
      break;
1,805✔
327
    }
328
    case TSDB_DATA_TYPE_UBIGINT: {
2,346✔
329
      uint64_t value = (uint64_t)taosStr2UInt64(buf, NULL, 10);
2,346✔
330
      colDataSetInt64(pOut->columnData, rowIndex, (int64_t *)&value);
2,345✔
331
      break;
2,345✔
332
    }
333
  }
334
  SCL_RET(TSDB_CODE_SUCCESS);
4,150!
335
}
336

337
static FORCE_INLINE int32_t varToFloat(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
6,104,183✔
338
  if (TSDB_DATA_TYPE_FLOAT == pOut->columnData->info.type) {
6,104,183!
339
    float value = taosStr2Float(buf, NULL);
×
340
    colDataSetFloat(pOut->columnData, rowIndex, &value);
×
341
    SCL_RET(TSDB_CODE_SUCCESS);
×
342
  }
343

344
  double value = taosStr2Double(buf, NULL);
6,104,183✔
345
  colDataSetDouble(pOut->columnData, rowIndex, &value);
6,103,600✔
346
  SCL_RET(TSDB_CODE_SUCCESS);
6,103,600!
347
}
348

349
static FORCE_INLINE int32_t varToBool(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
747✔
350
  int64_t value = taosStr2Int64(buf, NULL, 10);
747✔
351
  bool    v = (value != 0) ? true : false;
747✔
352
  colDataSetInt8(pOut->columnData, rowIndex, (int8_t *)&v);
747✔
353
  SCL_RET(TSDB_CODE_SUCCESS);
747!
354
}
355

356
// todo remove this malloc
357
static FORCE_INLINE int32_t varToVarbinary(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
37✔
358
  if(isHex(varDataVal(buf), varDataLen(buf))){
37✔
359
    if(!isValidateHex(varDataVal(buf), varDataLen(buf))){
25✔
360
      SCL_ERR_RET(TSDB_CODE_PAR_INVALID_VARBINARY);
2!
361
    }
362

363
    void* data = NULL;
23✔
364
    uint32_t size = 0;
23✔
365
    if(taosHex2Ascii(varDataVal(buf), varDataLen(buf), &data, &size) < 0){
23!
366
      SCL_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
×
367
    }
368
    int32_t inputLen = size + VARSTR_HEADER_SIZE;
23✔
369
    char   *t = taosMemoryCalloc(1, inputLen);
23✔
370
    if (t == NULL) {
23!
371
      sclError("Out of memory");
×
372
      taosMemoryFree(data);
×
373
      SCL_ERR_RET(terrno);
×
374
    }
375
    varDataSetLen(t, size);
23✔
376
    (void)memcpy(varDataVal(t), data, size);
23✔
377
    int32_t code = colDataSetVal(pOut->columnData, rowIndex, t, false);
23✔
378
    taosMemoryFree(t);
23✔
379
    taosMemoryFree(data);
23✔
380
    SCL_ERR_RET(code);
23!
381
  }else{
382
    int32_t inputLen = varDataTLen(buf);
12✔
383
    char   *t = taosMemoryCalloc(1, inputLen);
12✔
384
    if (t == NULL) {
12!
385
      sclError("Out of memory");
×
386
      SCL_ERR_RET(terrno);
×
387
    }
388
    (void)memcpy(t, buf, inputLen);
12✔
389
    int32_t code = colDataSetVal(pOut->columnData, rowIndex, t, false);
12✔
390
    taosMemoryFree(t);
12✔
391
    SCL_ERR_RET(code);
12!
392
  }
393
  SCL_RET(TSDB_CODE_SUCCESS);
35!
394
}
395

396
static FORCE_INLINE int32_t varToNchar(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
45,023✔
397
  int32_t len = 0;
45,023✔
398
  int32_t inputLen = varDataLen(buf);
45,023✔
399
  int32_t outputMaxLen = (inputLen + 1) * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE;
45,023✔
400
  int32_t code = TSDB_CODE_SUCCESS;
45,023✔
401

402
  char   *t = taosMemoryCalloc(1, outputMaxLen);
45,023✔
403
  if (NULL == t) {
45,027!
404
    SCL_ERR_RET(terrno);
×
405
  }
406
  int32_t ret =
45,027✔
407
      taosMbsToUcs4(varDataVal(buf), inputLen, (TdUcs4 *)varDataVal(t), outputMaxLen - VARSTR_HEADER_SIZE, &len);
45,027✔
408
  if (!ret) {
45,027!
409
    sclError("failed to convert to NCHAR");
×
410
    SCL_ERR_JRET(TSDB_CODE_SCALAR_CONVERT_ERROR);
×
411
  }
412
  varDataSetLen(t, len);
45,027✔
413

414
  SCL_ERR_JRET(colDataSetVal(pOut->columnData, rowIndex, t, false));
45,027!
415

416
_return:
45,026✔
417
  taosMemoryFree(t);
45,026✔
418
  SCL_RET(code);
45,026!
419
}
420

421
static FORCE_INLINE int32_t ncharToVar(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
4,011✔
422
  int32_t code =TSDB_CODE_SUCCESS;
4,011✔
423
  int32_t inputLen = varDataLen(buf);
4,011✔
424

425
  char   *t = taosMemoryCalloc(1, inputLen + VARSTR_HEADER_SIZE);
4,011✔
426
  if (NULL == t) {
4,011!
427
    SCL_ERR_RET(terrno);
×
428
  }
429
  int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(buf), varDataLen(buf), varDataVal(t));
4,011✔
430
  if (len < 0) {
4,011!
431
    SCL_ERR_JRET(TSDB_CODE_SCALAR_CONVERT_ERROR);
×
432
  }
433
  varDataSetLen(t, len);
4,011✔
434

435
  SCL_ERR_JRET(colDataSetVal(pOut->columnData, rowIndex, t, false));
4,011!
436

437
_return:
4,011✔
438
  taosMemoryFree(t);
4,011✔
439
  SCL_RET(code);
4,011!
440
}
441

442
static FORCE_INLINE int32_t varToGeometry(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
×
443
  //[ToDo] support to parse WKB as well as WKT
444
  int32_t        code = TSDB_CODE_SUCCESS;
×
445
  size_t         len = 0;
×
446
  unsigned char *t = NULL;
×
447
  char          *output = NULL;
×
448

449
  if ((code = initCtxGeomFromText()) != 0) {
×
450
    sclError("failed to init geometry ctx, %s", getGeosErrMsg(code));
×
451
    SCL_ERR_JRET(TSDB_CODE_APP_ERROR);
×
452
  }
453
  if ((code = doGeomFromText(buf, &t, &len)) != 0) {
×
454
    sclInfo("failed to convert text to geometry, %s", getGeosErrMsg(code));
×
455
    SCL_ERR_JRET(TSDB_CODE_SCALAR_CONVERT_ERROR);
×
456
  }
457

458
  output = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE);
×
459
  if (NULL == output) {
×
460
    SCL_ERR_JRET(terrno);
×
461
  }
462
  (void)memcpy(output + VARSTR_HEADER_SIZE, t, len);
×
463
  varDataSetLen(output, len);
×
464

465
  SCL_ERR_JRET(colDataSetVal(pOut->columnData, rowIndex, output, false));
×
466

467
  taosMemoryFree(output);
×
468
  geosFreeBuffer(t);
×
469

470
  SCL_RET(TSDB_CODE_SUCCESS);
×
471

472
_return:
×
473
  taosMemoryFree(output);
×
474
  geosFreeBuffer(t);
×
475
  t = NULL;
×
476
  VarDataLenT dummyHeader = 0;
×
477
  SCL_ERR_RET(colDataSetVal(pOut->columnData, rowIndex, (const char *)&dummyHeader, false));
×
478
  SCL_RET(code);
×
479
}
480

481
// TODO opt performance, tmp is not needed.
482
int32_t vectorConvertFromVarData(SSclVectorConvCtx *pCtx, int32_t *overflow) {
1,991,057✔
483
  int32_t code = TSDB_CODE_SUCCESS;
1,991,057✔
484
  bool vton = false;
1,991,057✔
485

486
  _bufConverteFunc func = NULL;
1,991,057✔
487
  if (TSDB_DATA_TYPE_BOOL == pCtx->outType) {
1,991,057✔
488
    func = varToBool;
747✔
489
  } else if (IS_SIGNED_NUMERIC_TYPE(pCtx->outType)) {
1,990,310!
490
    func = varToSigned;
7,227✔
491
  } else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->outType)) {
1,983,083✔
492
    func = varToUnsigned;
4,150✔
493
  } else if (IS_FLOAT_TYPE(pCtx->outType)) {
1,978,933!
494
    func = varToFloat;
1,929,735✔
495
  } else if ((pCtx->outType == TSDB_DATA_TYPE_VARCHAR || pCtx->outType == TSDB_DATA_TYPE_VARBINARY) &&
49,198✔
496
             pCtx->inType == TSDB_DATA_TYPE_NCHAR) {  // nchar -> binary
4,038✔
497
    func = ncharToVar;
4,011✔
498
    vton = true;
4,011✔
499
  } else if (pCtx->outType == TSDB_DATA_TYPE_NCHAR &&
45,187✔
500
      (pCtx->inType == TSDB_DATA_TYPE_VARCHAR || pCtx->inType == TSDB_DATA_TYPE_VARBINARY)) {  // binary -> nchar
45,025!
501
    func = varToNchar;
45,024✔
502
    vton = true;
45,024✔
503
  } else if (TSDB_DATA_TYPE_TIMESTAMP == pCtx->outType) {
163✔
504
    func = varToTimestamp;
128✔
505
  } else if (TSDB_DATA_TYPE_GEOMETRY == pCtx->outType) {
35!
506
    func = varToGeometry;
×
507
  } else if (TSDB_DATA_TYPE_VARBINARY == pCtx->outType) {
35!
508
    func = varToVarbinary;
37✔
509
    vton = true;
37✔
510
  } else {
511
    sclError("invalid convert outType:%d, inType:%d", pCtx->outType, pCtx->inType);
×
512
    SCL_ERR_RET(TSDB_CODE_APP_ERROR);
217✔
513
  }
514

515
  pCtx->pOut->numOfRows = pCtx->pIn->numOfRows;
1,991,268✔
516
  char* tmp = NULL;
1,991,268✔
517

518
  for (int32_t i = pCtx->startIndex; i <= pCtx->endIndex; ++i) {
9,057,994✔
519
    if (IS_HELPER_NULL(pCtx->pIn->columnData, i)) {
14,140,198!
520
      colDataSetNULL(pCtx->pOut->columnData, i);
892,153✔
521
      continue;
892,153✔
522
    }
523

524
    char   *data = colDataGetVarData(pCtx->pIn->columnData, i);
6,177,946✔
525
    int32_t convertType = pCtx->inType;
6,177,946✔
526
    if (pCtx->inType == TSDB_DATA_TYPE_JSON) {
6,177,946!
527
      if (*data == TSDB_DATA_TYPE_NCHAR) {
×
528
        data += CHAR_BYTES;
×
529
        convertType = TSDB_DATA_TYPE_NCHAR;
×
530
      } else if (tTagIsJson(data) || *data == TSDB_DATA_TYPE_NULL) {
×
531
        SCL_ERR_JRET(TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR);
×
532
      } else {
533
        SCL_ERR_JRET(convertNumberToNumber(data + CHAR_BYTES, colDataGetNumData(pCtx->pOut->columnData, i), *data, pCtx->outType));
×
534
        continue;
×
535
      }
536
    }
537

538
    int32_t bufSize = pCtx->pIn->columnData->info.bytes;
6,177,946✔
539
    if (tmp == NULL) {
6,177,946✔
540
      tmp = taosMemoryMalloc(bufSize);
1,870,933✔
541
      if (tmp == NULL) {
1,871,390!
542
        sclError("out of memory in vectorConvertFromVarData");
×
543
        SCL_ERR_JRET(terrno);
×
544
      }
545
    }
546

547
    if (vton) {
6,174,920✔
548
      (void)memcpy(tmp, data, varDataTLen(data));
49,067✔
549
    } else {
550
      if (TSDB_DATA_TYPE_VARCHAR == convertType || TSDB_DATA_TYPE_GEOMETRY == convertType) {
6,125,853!
551
        (void)memcpy(tmp, varDataVal(data), varDataLen(data));
3,058,517✔
552
        tmp[varDataLen(data)] = 0;
3,058,517✔
553
      } else if (TSDB_DATA_TYPE_NCHAR == convertType) {
3,067,336!
554
        // we need to convert it to native char string, and then perform the string to numeric data
555
        if (varDataLen(data) > bufSize) {
3,067,427!
556
          sclError("castConvert convert buffer size too small");
×
557
          SCL_ERR_JRET(TSDB_CODE_APP_ERROR);
×
558
        }
559

560
        int len = taosUcs4ToMbs((TdUcs4 *)varDataVal(data), varDataLen(data), tmp);
3,067,427✔
561
        if (len < 0) {
3,069,470!
562
          sclError("castConvert taosUcs4ToMbs error 1");
×
563
          SCL_ERR_JRET(TSDB_CODE_SCALAR_CONVERT_ERROR);
×
564
        }
565

566
        tmp[len] = 0;
3,069,347✔
567
      }
568
    }
569

570
    SCL_ERR_JRET((*func)(tmp, pCtx->pOut, i, overflow));
6,176,840✔
571
  }
572

573
_return:
1,987,895✔
574
  if (tmp != NULL) {
1,987,897✔
575
    taosMemoryFreeClear(tmp);
1,871,563!
576
  }
577
  SCL_RET(code);
1,987,668✔
578
}
579

580
int32_t getVectorDoubleValue_JSON(void *src, int32_t index, double *out) {
28✔
581
  char  *data = colDataGetVarData((SColumnInfoData *)src, index);
28✔
582
  *out = 0;
28✔
583
  if (*data == TSDB_DATA_TYPE_NULL) {
28!
584
    SCL_RET(TSDB_CODE_SUCCESS);
×
585
  } else if (*data == TSDB_DATA_TYPE_NCHAR) {  // json inner type can not be BINARY
28✔
586
    SCL_ERR_RET(convertNcharToDouble(data + CHAR_BYTES, out));
8!
587
  } else if (tTagIsJson(data)) {
20✔
588
    SCL_ERR_RET(TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR);
4!
589
  } else {
590
    SCL_ERR_RET(convertNumberToNumber(data + CHAR_BYTES, out, *data, TSDB_DATA_TYPE_DOUBLE));
16!
591
  }
592
  SCL_RET(TSDB_CODE_SUCCESS);
24!
593
}
594

595
int32_t ncharTobinary(void *buf, void **out) {  // todo need to remove , if tobinary is nchar
428✔
596
  int32_t inputLen = varDataTLen(buf);
428✔
597

598
  *out = taosMemoryCalloc(1, inputLen);
428✔
599
  if (NULL == *out) {
428!
600
    sclError("charset:%s to %s. val:%s convert ncharTobinary failed, since memory alloc failed.",
×
601
             DEFAULT_UNICODE_ENCODEC, tsCharset, (char *)varDataVal(buf));
602
    SCL_ERR_RET(terrno);
×
603
  }
604
  int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(buf), varDataLen(buf), varDataVal(*out));
428✔
605
  if (len < 0) {
428!
606
    sclError("charset:%s to %s. val:%s convert ncharTobinary failed.", DEFAULT_UNICODE_ENCODEC, tsCharset,
×
607
             (char *)varDataVal(buf));
608
    taosMemoryFree(*out);
×
609
    SCL_ERR_RET(TSDB_CODE_SCALAR_CONVERT_ERROR);
×
610
  }
611
  varDataSetLen(*out, len);
428✔
612
  SCL_RET(TSDB_CODE_SUCCESS);
428!
613
}
614

615
int32_t convertJsonValue(__compar_fn_t *fp, int32_t optr, int8_t typeLeft, int8_t typeRight, char **pLeftData,
7,264,416✔
616
                      char **pRightData, void *pLeftOut, void *pRightOut, bool *isNull, bool *freeLeft,
617
                      bool *freeRight, bool *result) {
618
  *result = false;
7,264,416✔
619
  if (optr == OP_TYPE_JSON_CONTAINS) {
7,264,416!
620
    *result = true;
×
621
    return TSDB_CODE_SUCCESS;
×
622
  }
623

624
  if (typeLeft != TSDB_DATA_TYPE_JSON && typeRight != TSDB_DATA_TYPE_JSON) {
7,264,416!
625
    *result = true;
7,262,972✔
626
    return TSDB_CODE_SUCCESS;
7,262,972✔
627
  }
628

629
  if (typeLeft == TSDB_DATA_TYPE_JSON) {
1,444!
630
    if (tTagIsJson(*pLeftData)) {
3,192✔
631
      *result = false;
12✔
632
      return TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
12✔
633
    }
634
    typeLeft = **pLeftData;
3,180✔
635
    (*pLeftData)++;
3,180✔
636
  }
637
  if (typeRight == TSDB_DATA_TYPE_JSON) {
1,432✔
638
    if (tTagIsJson(*pRightData)) {
136!
639
      *result = false;
×
640
      return TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
×
641
    }
642
    typeRight = **pRightData;
136✔
643
    (*pRightData)++;
136✔
644
  }
645

646
  if (optr == OP_TYPE_LIKE || optr == OP_TYPE_NOT_LIKE || optr == OP_TYPE_MATCH || optr == OP_TYPE_NMATCH) {
1,432!
647
    if (typeLeft != TSDB_DATA_TYPE_NCHAR && typeLeft != TSDB_DATA_TYPE_BINARY &&
×
648
        typeLeft != TSDB_DATA_TYPE_GEOMETRY && typeLeft != TSDB_DATA_TYPE_VARBINARY) {
152!
649
      *result = false;
152✔
650
      return TSDB_CODE_SUCCESS;
152✔
651
    }
652
  }
653

654
  // if types can not comparable
655
  if ((IS_NUMERIC_TYPE(typeLeft) && !IS_NUMERIC_TYPE(typeRight)) ||
1,280!
656
      (IS_NUMERIC_TYPE(typeRight) && !IS_NUMERIC_TYPE(typeLeft)) ||
1,064!
657
      (IS_VAR_DATA_TYPE(typeLeft) && !IS_VAR_DATA_TYPE(typeRight)) ||
×
658
      (IS_VAR_DATA_TYPE(typeRight) && !IS_VAR_DATA_TYPE(typeLeft)) ||
×
659
      ((typeLeft == TSDB_DATA_TYPE_BOOL) && (typeRight != TSDB_DATA_TYPE_BOOL)) ||
×
660
      ((typeRight == TSDB_DATA_TYPE_BOOL) && (typeLeft != TSDB_DATA_TYPE_BOOL))) {
32!
661
    *result = false;
1,500✔
662
    return TSDB_CODE_SUCCESS;
1,500✔
663
  }
664

665
  if (typeLeft == TSDB_DATA_TYPE_NULL || typeRight == TSDB_DATA_TYPE_NULL) {
×
666
    *isNull = true;
×
667
    *result = true;
×
668
    return TSDB_CODE_SUCCESS;
×
669
  }
670
  int8_t type = (int8_t)vectorGetConvertType(typeLeft, typeRight);
1,528✔
671

672
  if (type == 0) {
1,528✔
673
    *result = true;
168✔
674
    SCL_RET(filterGetCompFunc(fp, typeLeft, optr));
168!
675
  }
676

677
  SCL_ERR_RET(filterGetCompFunc(fp, type, optr));
1,360!
678

679
  if (IS_NUMERIC_TYPE(type)) {
1,360!
680
    if (typeLeft == TSDB_DATA_TYPE_NCHAR ||
932!
681
        typeLeft == TSDB_DATA_TYPE_VARCHAR ||
932!
682
        typeLeft == TSDB_DATA_TYPE_GEOMETRY) {
683
      *result = false;
×
684
      return TSDB_CODE_SUCCESS;
×
685
    } else if (typeLeft != type) {
932!
686
      SCL_ERR_RET(convertNumberToNumber(*pLeftData, pLeftOut, typeLeft, type));
×
687
      *pLeftData = pLeftOut;
×
688
    }
689

690
    if (typeRight == TSDB_DATA_TYPE_NCHAR ||
932!
691
        typeRight == TSDB_DATA_TYPE_VARCHAR ||
932!
692
        typeRight == TSDB_DATA_TYPE_GEOMETRY) {
693
      *result = false;
×
694
      return TSDB_CODE_SUCCESS;
×
695
    } else if (typeRight != type) {
932!
696
      SCL_ERR_RET(convertNumberToNumber(*pRightData, pRightOut, typeRight, type));
932!
697
      *pRightData = pRightOut;
932✔
698
    }
699
  } else if (type == TSDB_DATA_TYPE_BINARY ||
428!
700
             type == TSDB_DATA_TYPE_GEOMETRY) {
701
    if (typeLeft == TSDB_DATA_TYPE_NCHAR) {
428!
702
      char *tmpLeft = NULL;
428✔
703
      SCL_ERR_RET(ncharTobinary(*pLeftData, (void *)&tmpLeft));
428!
704
      *pLeftData = tmpLeft;
428✔
705
      *freeLeft = true;
428✔
706
    }
707
    if (typeRight == TSDB_DATA_TYPE_NCHAR) {
428!
708
      char *tmpRight = NULL;
×
709
      SCL_ERR_RET(ncharTobinary(*pRightData, (void *)&tmpRight));
×
710
      *pRightData = tmpRight;
×
711
      *freeRight = true;
×
712
    }
713
  } else {
714
    *result = false;
×
715
    return TSDB_CODE_SUCCESS;
×
716
  }
717

718
  *result = true;
1,360✔
719
  return TSDB_CODE_SUCCESS;
1,360✔
720
}
721

722
int32_t vectorConvertToVarData(SSclVectorConvCtx *pCtx) {
256✔
723
  SColumnInfoData *pInputCol = pCtx->pIn->columnData;
256✔
724
  SColumnInfoData *pOutputCol = pCtx->pOut->columnData;
256✔
725
  char             tmp[128] = {0};
256✔
726

727
  if (IS_SIGNED_NUMERIC_TYPE(pCtx->inType) || pCtx->inType == TSDB_DATA_TYPE_BOOL ||
256✔
728
      pCtx->inType == TSDB_DATA_TYPE_TIMESTAMP) {
8!
729
    for (int32_t i = pCtx->startIndex; i <= pCtx->endIndex; ++i) {
496✔
730
      if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
248!
731
        colDataSetNULL(pOutputCol, i);
×
732
        continue;
×
733
      }
734

735
      int64_t value = 0;
248✔
736
      GET_TYPED_DATA(value, int64_t, pCtx->inType, colDataGetData(pInputCol, i));
248!
737
      int32_t len = tsnprintf(varDataVal(tmp), sizeof(tmp) - VARSTR_HEADER_SIZE, "%" PRId64, value);
248✔
738
      varDataLen(tmp) = len;
248✔
739
      if (pCtx->outType == TSDB_DATA_TYPE_NCHAR) {
248!
740
        SCL_ERR_RET(varToNchar(tmp, pCtx->pOut, i, NULL));
×
741
      } else {
742
        SCL_ERR_RET(colDataSetVal(pOutputCol, i, (char *)tmp, false));
248!
743
      }
744
    }
745
  } else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->inType)) {
8!
746
    for (int32_t i = pCtx->startIndex; i <= pCtx->endIndex; ++i) {
×
747
      if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
×
748
        colDataSetNULL(pOutputCol, i);
×
749
        continue;
×
750
      }
751

752
      uint64_t value = 0;
×
753
      GET_TYPED_DATA(value, uint64_t, pCtx->inType, colDataGetData(pInputCol, i));
×
754
      int32_t len = tsnprintf(varDataVal(tmp), sizeof(tmp) - VARSTR_HEADER_SIZE, "%" PRIu64, value);
×
755
      varDataLen(tmp) = len;
×
756
      if (pCtx->outType == TSDB_DATA_TYPE_NCHAR) {
×
757
        SCL_ERR_RET(varToNchar(tmp, pCtx->pOut, i, NULL));
×
758
      } else {
759
        SCL_ERR_RET(colDataSetVal(pOutputCol, i, (char *)tmp, false));
×
760
      }
761
    }
762
  } else if (IS_FLOAT_TYPE(pCtx->inType)) {
8!
763
    for (int32_t i = pCtx->startIndex; i <= pCtx->endIndex; ++i) {
16✔
764
      if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
8!
765
        colDataSetNULL(pOutputCol, i);
×
766
        continue;
×
767
      }
768

769
      double value = 0;
8✔
770
      GET_TYPED_DATA(value, double, pCtx->inType, colDataGetData(pInputCol, i));
8!
771
      int32_t len = tsnprintf(varDataVal(tmp), sizeof(tmp) - VARSTR_HEADER_SIZE, "%lf", value);
8✔
772
      varDataLen(tmp) = len;
8✔
773
      if (pCtx->outType == TSDB_DATA_TYPE_NCHAR) {
8!
774
        SCL_ERR_RET(varToNchar(tmp, pCtx->pOut, i, NULL));
×
775
      } else {
776
        SCL_ERR_RET(colDataSetVal(pOutputCol, i, (char *)tmp, false));
8!
777
      }
778
    }
779
  } else {
780
    sclError("not supported input type:%d", pCtx->inType);
×
781
    return TSDB_CODE_APP_ERROR;
×
782
  }
783

784
  return TSDB_CODE_SUCCESS;
256✔
785
}
786

787
// TODO opt performance
788
int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, int32_t *overflow, int32_t startIndex,
77,550,949✔
789
                                   int32_t numOfRows) {
790
  SColumnInfoData *pInputCol = pIn->columnData;
77,550,949✔
791
  SColumnInfoData *pOutputCol = pOut->columnData;
77,550,949✔
792

793
  if (NULL == pInputCol) {
77,550,949!
794
    sclError("input column is NULL, hashFilter %p", pIn->pHashFilter);
×
795
    return TSDB_CODE_APP_ERROR;
×
796
  }
797

798
  int32_t           rstart = (startIndex >= 0 && startIndex < pIn->numOfRows) ? startIndex : 0;
77,550,949✔
799
  int32_t           rend = numOfRows > 0 ? rstart + numOfRows - 1 : rstart + pIn->numOfRows - 1;
77,550,949✔
800
  SSclVectorConvCtx cCtx = {pIn, pOut, rstart, rend, pInputCol->info.type, pOutputCol->info.type};
77,550,949✔
801

802
  if (IS_VAR_DATA_TYPE(cCtx.inType)) {
77,550,949!
803
    return vectorConvertFromVarData(&cCtx, overflow);
1,878,107✔
804
  }
805

806
  if (overflow && TSDB_DATA_TYPE_NULL != cCtx.inType) {
75,672,842!
807
    if (1 != pIn->numOfRows) {
75,471,937!
808
      sclError("invalid numOfRows %d", pIn->numOfRows);
×
809
      return TSDB_CODE_APP_ERROR;
×
810
    }
811

812
    pOut->numOfRows = 0;
75,471,937✔
813

814
    if (IS_SIGNED_NUMERIC_TYPE(cCtx.outType)) {
75,471,937✔
815
      int64_t minValue = tDataTypes[cCtx.outType].minValue;
5,684✔
816
      int64_t maxValue = tDataTypes[cCtx.outType].maxValue;
5,684✔
817

818
      double value = 0;
5,684✔
819
      GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, 0));
5,684!
820

821
      if (value > maxValue) {
5,684✔
822
        *overflow = 1;
40✔
823
        return TSDB_CODE_SUCCESS;
40✔
824
      } else if (value < minValue) {
5,644✔
825
        *overflow = -1;
32✔
826
        return TSDB_CODE_SUCCESS;
32✔
827
      } else {
828
        *overflow = 0;
5,612✔
829
      }
830
    } else if (IS_UNSIGNED_NUMERIC_TYPE(cCtx.outType)) {
75,466,253!
831
      uint64_t minValue = (uint64_t)tDataTypes[cCtx.outType].minValue;
2,204✔
832
      uint64_t maxValue = (uint64_t)tDataTypes[cCtx.outType].maxValue;
2,204✔
833

834
      double value = 0;
2,204✔
835
      GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, 0));
2,204!
836

837
      if (value > maxValue) {
2,204✔
838
        *overflow = 1;
4✔
839
        return TSDB_CODE_SUCCESS;
4✔
840
      } else if (value < minValue) {
2,200!
841
        *overflow = -1;
×
842
        return TSDB_CODE_SUCCESS;
×
843
      } else {
844
        *overflow = 0;
2,200✔
845
      }
846
    }
847
  }
848

849
  pOut->numOfRows = pIn->numOfRows;
75,672,766✔
850
  switch (cCtx.outType) {
75,672,766✔
851
    case TSDB_DATA_TYPE_BOOL: {
32,334✔
852
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
71,656✔
853
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
39,322✔
854
          colDataSetNULL(pOutputCol, i);
706!
855
          continue;
706✔
856
        }
857

858
        bool value = 0;
38,616✔
859
        GET_TYPED_DATA(value, bool, cCtx.inType, colDataGetData(pInputCol, i));
38,616!
860
        colDataSetInt8(pOutputCol, i, (int8_t *)&value);
38,616✔
861
      }
862
      break;
32,334✔
863
    }
864
    case TSDB_DATA_TYPE_TINYINT: {
19,004✔
865
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
1,889,606✔
866
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
1,870,602✔
867
          colDataSetNULL(pOutputCol, i);
1,128!
868
          continue;
1,128✔
869
        }
870

871
        int8_t value = 0;
1,869,474✔
872
        GET_TYPED_DATA(value, int8_t, cCtx.inType, colDataGetData(pInputCol, i));
1,869,474!
873
        colDataSetInt8(pOutputCol, i, (int8_t *)&value);
1,869,474✔
874
      }
875
      break;
19,004✔
876
    }
877
    case TSDB_DATA_TYPE_SMALLINT: {
1,743✔
878
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
3,489✔
879
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
1,746!
880
          colDataSetNULL(pOutputCol, i);
×
881
          continue;
×
882
        }
883

884
        int16_t value = 0;
1,746✔
885
        GET_TYPED_DATA(value, int16_t, cCtx.inType, colDataGetData(pInputCol, i));
1,746!
886
        colDataSetInt16(pOutputCol, i, (int16_t *)&value);
1,746✔
887
      }
888
      break;
1,743✔
889
    }
890
    case TSDB_DATA_TYPE_INT: {
12,702✔
891
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
25,435✔
892
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
12,733✔
893
          colDataSetNULL(pOutputCol, i);
4!
894
          continue;
4✔
895
        }
896

897
        int32_t value = 0;
12,729✔
898
        GET_TYPED_DATA(value, int32_t, cCtx.inType, colDataGetData(pInputCol, i));
12,729!
899
        colDataSetInt32(pOutputCol, i, (int32_t *)&value);
12,729✔
900
      }
901
      break;
12,702✔
902
    }
903
    case TSDB_DATA_TYPE_BIGINT:
75,401,672✔
904
    case TSDB_DATA_TYPE_TIMESTAMP: {
905
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
150,746,837✔
906
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
75,345,165✔
907
          colDataSetNULL(pOutputCol, i);
22!
908
          continue;
22✔
909
        }
910

911
        int64_t value = 0;
75,345,143✔
912
        GET_TYPED_DATA(value, int64_t, cCtx.inType, colDataGetData(pInputCol, i));
75,345,143!
913
        colDataSetInt64(pOutputCol, i, (int64_t *)&value);
75,345,143✔
914
      }
915
      break;
75,401,672✔
916
    }
917
    case TSDB_DATA_TYPE_UTINYINT: {
622✔
918
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
1,244✔
919
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
622!
920
          colDataSetNULL(pOutputCol, i);
×
921
          continue;
×
922
        }
923

924
        uint8_t value = 0;
622✔
925
        GET_TYPED_DATA(value, uint8_t, cCtx.inType, colDataGetData(pInputCol, i));
622!
926
        colDataSetInt8(pOutputCol, i, (int8_t *)&value);
622✔
927
      }
928
      break;
622✔
929
    }
930
    case TSDB_DATA_TYPE_USMALLINT: {
530✔
931
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
1,060✔
932
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
530!
933
          colDataSetNULL(pOutputCol, i);
×
934
          continue;
×
935
        }
936

937
        uint16_t value = 0;
530✔
938
        GET_TYPED_DATA(value, uint16_t, cCtx.inType, colDataGetData(pInputCol, i));
530!
939
        colDataSetInt16(pOutputCol, i, (int16_t *)&value);
530✔
940
      }
941
      break;
530✔
942
    }
943
    case TSDB_DATA_TYPE_UINT: {
524✔
944
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
1,048✔
945
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
524!
946
          colDataSetNULL(pOutputCol, i);
×
947
          continue;
×
948
        }
949

950
        uint32_t value = 0;
524✔
951
        GET_TYPED_DATA(value, uint32_t, cCtx.inType, colDataGetData(pInputCol, i));
524!
952
        colDataSetInt32(pOutputCol, i, (int32_t *)&value);
524✔
953
      }
954
      break;
524✔
955
    }
956
    case TSDB_DATA_TYPE_UBIGINT: {
524✔
957
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
1,048✔
958
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
524!
959
          colDataSetNULL(pOutputCol, i);
×
960
          continue;
×
961
        }
962

963
        uint64_t value = 0;
524✔
964
        GET_TYPED_DATA(value, uint64_t, cCtx.inType, colDataGetData(pInputCol, i));
524!
965
        colDataSetInt64(pOutputCol, i, (int64_t *)&value);
524✔
966
      }
967
      break;
524✔
968
    }
969
    case TSDB_DATA_TYPE_FLOAT: {
1,210✔
970
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
2,428✔
971
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
1,218!
972
          colDataSetNULL(pOutputCol, i);
×
973
          continue;
×
974
        }
975

976
        float value = 0;
1,218✔
977
        GET_TYPED_DATA(value, float, cCtx.inType, colDataGetData(pInputCol, i));
1,218!
978
        colDataSetFloat(pOutputCol, i, (float *)&value);
1,218✔
979
      }
980
      break;
1,210✔
981
    }
982
    case TSDB_DATA_TYPE_DOUBLE: {
5,368✔
983
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
44,478✔
984
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
39,110✔
985
          colDataSetNULL(pOutputCol, i);
9!
986
          continue;
9✔
987
        }
988

989
        double value = 0;
39,101✔
990
        GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, i));
39,101!
991
        colDataSetDouble(pOutputCol, i, (double *)&value);
39,101✔
992
      }
993
      break;
5,368✔
994
    }
995
    case TSDB_DATA_TYPE_BINARY:
256✔
996
    case TSDB_DATA_TYPE_VARBINARY:
997
    case TSDB_DATA_TYPE_NCHAR:
998
    case TSDB_DATA_TYPE_GEOMETRY: {
999
      return vectorConvertToVarData(&cCtx);
256✔
1000
    }
1001
    default:
196,277✔
1002
      sclError("invalid convert output type:%d", cCtx.outType);
196,277!
1003
      return TSDB_CODE_APP_ERROR;
×
1004
  }
1005

1006
  return TSDB_CODE_SUCCESS;
75,476,233✔
1007
}
1008

1009
int8_t gConvertTypes[TSDB_DATA_TYPE_MAX][TSDB_DATA_TYPE_MAX] = {
1010
    /*         NULL BOOL TINY SMAL INT  BIG  FLOA DOUB VARC TIME NCHA UTIN USMA UINT UBIG JSON VARB DECI BLOB MEDB GEOM*/
1011
    /*NULL*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0, 0, 0,
1012
    /*BOOL*/ 0, 0, 2, 3, 4, 5, 6, 7, 5, 9, 7, 11, 12, 13, 14, 0, -1, 0, 0, 0, -1,
1013
    /*TINY*/ 0, 0, 0, 3, 4, 5, 6, 7, 5, 9, 7, 3,  4,  5,  7,  0, -1, 0, 0, 0, -1,
1014
    /*SMAL*/ 0, 0, 0, 0, 4, 5, 6, 7, 5, 9, 7, 3,  4,  5,  7,  0, -1, 0, 0, 0, -1,
1015
    /*INT */ 0, 0, 0, 0, 0, 5, 6, 7, 5, 9, 7, 4,  4,  5,  7,  0, -1, 0, 0, 0, -1,
1016
    /*BIGI*/ 0, 0, 0, 0, 0, 0, 6, 7, 5, 9, 7, 5,  5,  5,  7,  0, -1, 0, 0, 0, -1,
1017
    /*FLOA*/ 0, 0, 0, 0, 0, 0, 0, 7, 7, 6, 7, 6,  6,  6,  6,  0, -1, 0, 0, 0, -1,
1018
    /*DOUB*/ 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7,  7,  7,  7,  0, -1, 0, 0, 0, -1,
1019
    /*VARC*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 7,  7,  7,  7,  0, 16, 0, 0, 0, 20,
1020
    /*TIME*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,  9,  9,  7,  0, -1, 0, 0, 0, -1,
1021
    /*NCHA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,  7,  7,  7,  0, 16, 0, 0, 0, -1,
1022
    /*UTIN*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  12, 13, 14, 0, -1, 0, 0, 0, -1,
1023
    /*USMA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  13, 14, 0, -1, 0, 0, 0, -1,
1024
    /*UINT*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  14, 0, -1, 0, 0, 0, -1,
1025
    /*UBIG*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, -1, 0, 0, 0, -1,
1026
    /*JSON*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, -1, 0, 0, 0, -1,
1027
    /*VARB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, -1, -1,-1, -1,
1028
    /*DECI*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, -1, 0, 0, 0, -1,
1029
    /*BLOB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, -1, 0, 0, 0, -1,
1030
    /*MEDB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, -1, 0, 0, 0, -1,
1031
    /*GEOM*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, -1, 0, 0, 0, 0};
1032

1033
int8_t gDisplyTypes[TSDB_DATA_TYPE_MAX][TSDB_DATA_TYPE_MAX] = {
1034
              /*NULL BOOL TINY SMAL INT  BIGI FLOA DOUB VARC TIM NCHA UTIN USMA UINT UBIG JSON VARB DECI BLOB MEDB GEOM*/
1035
    /*NULL*/    0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  -1,  -1,  -1,  20,
1036
    /*BOOL*/    0,   1,   2,   3,   4,   5,   6,   7,   8,   5,  10,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,
1037
    /*TINY*/    0,   0,   2,   3,   4,   5,   8,   8,   8,   5,  10,   3,   4,   5,   8,  -1,  -1,  -1,  -1,  -1,  -1,
1038
    /*SMAL*/    0,   0,   0,   3,   4,   5,   8,   8,   8,   5,  10,   3,   4,   5,   8,  -1,  -1,  -1,  -1,  -1,  -1,
1039
    /*INT */    0,   0,   0,   0,   4,   5,   8,   8,   8,   5,  10,   4,   4,   5,   8,  -1,  -1,  -1,  -1,  -1,  -1,
1040
    /*BIGI*/    0,   0,   0,   0,   0,   5,   8,   8,   8,   5,  10,   5,   5,   5,   8,  -1,  -1,  -1,  -1,  -1,  -1,
1041
    /*FLOA*/    0,   0,   0,   0,   0,   0,   6,   7,   8,   8,  10,   8,   8,   8,   8,  -1,  -1,  -1,  -1,  -1,  -1,
1042
    /*DOUB*/    0,   0,   0,   0,   0,   0,   0,   7,   8,   8,  10,   8,   8,   8,   8,  -1,  -1,  -1,  -1,  -1,  -1,
1043
    /*VARC*/    0,   0,   0,   0,   0,   0,   0,   0,   8,   8,  10,   8,   8,   8,   8,  -1,  16,  -1,  -1,  -1,  -1,
1044
    /*TIME*/    0,   0,   0,   0,   0,   0,   0,   0,   0,   9,  10,   5,   5,   5,   8,  -1,  -1,  -1,  -1,  -1,  -1,
1045
    /*NCHA*/    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  10,  10,  10,  10,  10,  -1,  -1,  -1,  -1,  -1,  -1,
1046
    /*UTINY*/   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  11,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,
1047
    /*USMA*/    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  12,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,
1048
    /*UINT*/    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  13,  14,  -1,  -1,  -1,  -1,  -1,  -1,
1049
    /*UBIG*/    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  14,  -1,  -1,  -1,  -1,  -1,  -1,
1050
    /*JSON*/    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  15,  -1,  -1,  -1,  -1,  -1,
1051
    /*VARB*/    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  16,  -1,  -1,  -1,  -1,
1052
    /*DECI*/    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  -1,  -1,  -1,  -1,
1053
    /*BLOB*/    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  -1,  -1,  -1,
1054
    /*MEDB*/    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  -1,  -1,
1055
    /*GEOM*/    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  20
1056
};
1057

1058
int32_t vectorGetConvertType(int32_t type1, int32_t type2) {
782,728✔
1059
  if (type1 == type2) {
782,728✔
1060
    return 0;
438,873✔
1061
  }
1062

1063
  if (type1 < type2) {
343,855✔
1064
    return gConvertTypes[type1][type2];
115,031✔
1065
  }
1066

1067
  return gConvertTypes[type2][type1];
228,824✔
1068
}
1069

1070
int32_t vectorConvertSingleCol(SScalarParam *input, SScalarParam *output, int32_t type, int32_t startIndex,
2,017,921✔
1071
                               int32_t numOfRows) {
1072
  output->numOfRows = input->numOfRows;
2,017,921✔
1073

1074
  SDataType t = {.type = type};
2,017,921✔
1075
  t.bytes = (IS_VAR_DATA_TYPE(t.type) && input->columnData) ? input->columnData->info.bytes:tDataTypes[type].bytes;
2,017,921!
1076
  t.precision = (IS_TIMESTAMP_TYPE(t.type) && input->columnData) ? input->columnData->info.precision : TSDB_TIME_PRECISION_MILLI;
2,017,921✔
1077

1078
  int32_t code = sclCreateColumnInfoData(&t, input->numOfRows, output);
2,017,921✔
1079
  if (code != TSDB_CODE_SUCCESS) {
2,018,912!
1080
    return TSDB_CODE_OUT_OF_MEMORY;
×
1081
  }
1082

1083
  code = vectorConvertSingleColImpl(input, output, NULL, startIndex, numOfRows);
2,018,912✔
1084
  if (code) {
2,017,944!
1085
    return code;
×
1086
  }
1087

1088
  return TSDB_CODE_SUCCESS;
2,017,944✔
1089
}
1090

1091
int32_t vectorConvertCols(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pLeftOut, SScalarParam *pRightOut,
175,609✔
1092
                          int32_t startIndex, int32_t numOfRows) {
1093
  int32_t leftType = GET_PARAM_TYPE(pLeft);
175,609!
1094
  int32_t rightType = GET_PARAM_TYPE(pRight);
175,609✔
1095
  if (leftType == rightType) {
175,609✔
1096
    return TSDB_CODE_SUCCESS;
83,890✔
1097
  }
1098

1099
  int8_t  type = 0;
91,719✔
1100
  int32_t code = 0;
91,719✔
1101

1102
  SScalarParam *param1 = NULL, *paramOut1 = NULL;
91,719✔
1103
  SScalarParam *param2 = NULL, *paramOut2 = NULL;
91,719✔
1104

1105
  // always convert least data
1106
  if (IS_VAR_DATA_TYPE(leftType) && IS_VAR_DATA_TYPE(rightType) && (pLeft->numOfRows != pRight->numOfRows) &&
91,719!
1107
      leftType != TSDB_DATA_TYPE_JSON && rightType != TSDB_DATA_TYPE_JSON) {
44,686!
1108
    param1 = pLeft;
44,687✔
1109
    param2 = pRight;
44,687✔
1110
    paramOut1 = pLeftOut;
44,687✔
1111
    paramOut2 = pRightOut;
44,687✔
1112

1113
    if (pLeft->numOfRows > pRight->numOfRows) {
44,687!
1114
      type = leftType;
44,687✔
1115
    } else {
UNCOV
1116
      type = rightType;
×
1117
    }
1118
  } else {
1119
    // we only define half value in the convert-matrix, so make sure param1 always less equal than param2
1120
    if (leftType < rightType) {
47,032✔
1121
      param1 = pLeft;
24,917✔
1122
      param2 = pRight;
24,917✔
1123
      paramOut1 = pLeftOut;
24,917✔
1124
      paramOut2 = pRightOut;
24,917✔
1125
    } else {
1126
      param1 = pRight;
22,115✔
1127
      param2 = pLeft;
22,115✔
1128
      paramOut1 = pRightOut;
22,115✔
1129
      paramOut2 = pLeftOut;
22,115✔
1130
    }
1131

1132
    type = vectorGetConvertType(GET_PARAM_TYPE(param1), GET_PARAM_TYPE(param2));
47,032!
1133
    if (0 == type) {
47,096✔
1134
      return TSDB_CODE_SUCCESS;
1,458✔
1135
    }
1136
    if (-1 == type) {
45,638✔
1137
      sclError("invalid convert type1:%d, type2:%d", GET_PARAM_TYPE(param1), GET_PARAM_TYPE(param2));
1!
1138
      terrno = TSDB_CODE_SCALAR_CONVERT_ERROR;
1✔
1139
      return TSDB_CODE_SCALAR_CONVERT_ERROR;
1✔
1140
    }
1141
  }
1142

1143
  if (type != GET_PARAM_TYPE(param1)) {
90,324✔
1144
    code = vectorConvertSingleCol(param1, paramOut1, type, startIndex, numOfRows);
36,211✔
1145
    if (code) {
36,198!
1146
      return code;
×
1147
    }
1148
  }
1149

1150
  if (type != GET_PARAM_TYPE(param2)) {
90,311!
1151
    code = vectorConvertSingleCol(param2, paramOut2, type, startIndex, numOfRows);
60,557✔
1152
    if (code) {
60,558!
1153
      return code;
×
1154
    }
1155
  }
1156

1157
  return TSDB_CODE_SUCCESS;
90,312✔
1158
}
1159

1160
enum {
1161
  VECTOR_DO_CONVERT = 0x1,
1162
  VECTOR_UN_CONVERT = 0x2,
1163
};
1164

1165
// TODO not correct for descending order scan
1166
static int32_t vectorMathAddHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
31,939✔
1167
                                int32_t numOfRows, int32_t step, int32_t i) {
1168
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft;
1169
  _getDoubleValue_fn_t getVectorDoubleValueFnRight;
1170
  SCL_ERR_RET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
63,878!
1171
  SCL_ERR_RET(getVectorDoubleValueFn(pRightCol->info.type, &getVectorDoubleValueFnRight));
63,878!
1172

1173
  double *output = (double *)pOutputCol->pData;
31,939!
1174

1175
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
31,939!
1176
    colDataSetNNULL(pOutputCol, 0, numOfRows);
1!
1177
  } else {
1178
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
4,255,420✔
1179
      if (IS_HELPER_NULL(pLeftCol, i)) {
8,446,940!
1180
        colDataSetNULL(pOutputCol, i);
682,512!
1181
        continue;  // TODO set null or ignore
682,512✔
1182
      }
1183
      double leftRes = 0;
3,540,958✔
1184
      double rightRes = 0;
3,540,958✔
1185
      SCL_ERR_RET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
3,540,958✔
1186
      SCL_ERR_RET(getVectorDoubleValueFnRight(RIGHT_COL, 0, &rightRes));
3,540,818!
1187
      *output =  leftRes + rightRes;
3,540,970✔
1188
    }
1189
  }
1190
  SCL_RET(TSDB_CODE_SUCCESS);
31,951!
1191
}
1192

1193
static int32_t vectorMathTsAddHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
200,711✔
1194
                                  int32_t numOfRows, int32_t step, int32_t i) {
1195
  _getBigintValue_fn_t getVectorBigintValueFnLeft;
1196
  _getBigintValue_fn_t getVectorBigintValueFnRight;
1197
  SCL_ERR_RET(getVectorBigintValueFn(pLeftCol->info.type, &getVectorBigintValueFnLeft));
200,711!
1198
  SCL_ERR_RET(getVectorBigintValueFn(pRightCol->info.type, &getVectorBigintValueFnRight));
200,791!
1199
  int64_t *output = (int64_t *)pOutputCol->pData;
200,814✔
1200

1201
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
200,814!
1202
    colDataSetNNULL(pOutputCol, 0, numOfRows);
17,879!
1203
  } else {
1204
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
954,943✔
1205
      if (IS_HELPER_NULL(pLeftCol, i)) {
1,544,462!
1206
        colDataSetNULL(pOutputCol, i);
×
1207
        continue;  // TODO set null or ignore
×
1208
      }
1209
      int64_t leftRes = 0;
772,231✔
1210
      int64_t rightRes = 0;
772,231✔
1211
      SCL_ERR_RET(getVectorBigintValueFnLeft(pLeftCol->pData, i, &leftRes));
772,231!
1212
      SCL_ERR_RET(getVectorBigintValueFnRight(pRightCol->pData, 0, &rightRes));
771,404!
1213
      *output =
772,008✔
1214
          taosTimeAdd(leftRes, rightRes, pRightCol->info.scale, pRightCol->info.precision);
771,957✔
1215
    }
1216
  }
1217
  SCL_RET(TSDB_CODE_SUCCESS);
200,591!
1218
}
1219

1220
static int32_t vectorConvertVarToDouble(SScalarParam *pInput, int32_t *converted, SColumnInfoData **pOutputCol) {
4,912,646✔
1221
  SScalarParam     output = {0};
4,912,646✔
1222
  SColumnInfoData *pCol = pInput->columnData;
4,912,646✔
1223

1224
  if (IS_VAR_DATA_TYPE(pCol->info.type) && pCol->info.type != TSDB_DATA_TYPE_JSON && pCol->info.type != TSDB_DATA_TYPE_VARBINARY) {
4,912,646!
1225
    int32_t code = vectorConvertSingleCol(pInput, &output, TSDB_DATA_TYPE_DOUBLE, -1, -1);
1,921,717✔
1226
    if (code != TSDB_CODE_SUCCESS) {
1,921,184!
1227
      *pOutputCol = NULL;
×
1228
      SCL_ERR_RET(code);
×
1229
    }
1230

1231
    *converted = VECTOR_DO_CONVERT;
1,921,184✔
1232

1233
    *pOutputCol = output.columnData;
1,921,184✔
1234
    SCL_RET(code);
1,921,184!
1235
  }
1236

1237
  *converted = VECTOR_UN_CONVERT;
2,990,929✔
1238

1239
  *pOutputCol = pInput->columnData;
2,990,929✔
1240
  SCL_RET(TSDB_CODE_SUCCESS);
2,990,929!
1241
}
1242

1243
static void doReleaseVec(SColumnInfoData *pCol, int32_t type) {
4,913,258✔
1244
  if (type == VECTOR_DO_CONVERT) {
4,913,258✔
1245
    colDataDestroy(pCol);
1,920,639✔
1246
    taosMemoryFree(pCol);
1,921,706✔
1247
  }
1248
}
4,915,089✔
1249

1250
int32_t vectorMathAdd(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
2,048,349✔
1251
  SColumnInfoData *pOutputCol = pOut->columnData;
2,048,349✔
1252

1253
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
2,048,349!
1254
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
2,048,349!
1255

1256
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
2,048,349✔
1257

1258
  int32_t          code = TSDB_CODE_SUCCESS;
2,048,349✔
1259
  int32_t          leftConvert = 0, rightConvert = 0;
2,048,349✔
1260
  SColumnInfoData *pLeftCol = NULL;
2,048,349✔
1261
  SColumnInfoData *pRightCol = NULL;
2,048,349✔
1262
  SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
2,048,349!
1263
  SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
2,048,853!
1264

1265
  if ((GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && IS_INTEGER_TYPE(GET_PARAM_TYPE(pRight))) ||
2,049,189!
1266
      (GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_TIMESTAMP && IS_INTEGER_TYPE(GET_PARAM_TYPE(pLeft))) ||
2,019,153!
1267
      (GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_BOOL) ||
1,755,458!
1268
      (GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_TIMESTAMP &&
1,755,426!
1269
       GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_BOOL)) {  // timestamp plus duration
336,479!
1270
    int64_t             *output = (int64_t *)pOutputCol->pData;
315,874✔
1271
    _getBigintValue_fn_t getVectorBigintValueFnLeft;
1272
    _getBigintValue_fn_t getVectorBigintValueFnRight;
1273
    SCL_ERR_JRET(getVectorBigintValueFn(pLeftCol->info.type, &getVectorBigintValueFnLeft));
315,874!
1274
    SCL_ERR_JRET(getVectorBigintValueFn(pRightCol->info.type, &getVectorBigintValueFnRight));
314,620!
1275

1276
    if (pLeft->numOfRows == 1 && pRight->numOfRows == 1) {
314,734!
1277
      if (GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP) {
196,892✔
1278
        SCL_ERR_JRET(vectorMathTsAddHelper(pLeftCol, pRightCol, pOutputCol, pRight->numOfRows, step, i));
25,275!
1279
      } else {
1280
        SCL_ERR_JRET(vectorMathTsAddHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i));
171,617!
1281
      }
1282
    } else if (pLeft->numOfRows == 1) {
117,842!
1283
      SCL_ERR_JRET(vectorMathTsAddHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i));
×
1284
    } else if (pRight->numOfRows == 1) {
117,842✔
1285
      SCL_ERR_JRET(vectorMathTsAddHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i));
3,973!
1286
    } else if (pLeft->numOfRows == pRight->numOfRows) {
113,869✔
1287
      for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
968,174!
1288
        if (IS_NULL) {
2,449,838!
1289
          colDataSetNULL(pOutputCol, i);
114,800!
1290
          continue;  // TODO set null or ignore
114,800✔
1291
        }
1292
        int64_t leftRes = 0;
740,327✔
1293
        int64_t rightRes = 0;
740,327✔
1294
        SCL_ERR_JRET(getVectorBigintValueFnLeft(pLeftCol->pData, i, &leftRes));
740,327!
1295
        SCL_ERR_JRET(getVectorBigintValueFnRight(pRightCol->pData, i, &rightRes));
739,506✔
1296
        *output = leftRes + rightRes;
739,507✔
1297
      }
1298
    }
1299
  } else {
1300
    double              *output = (double *)pOutputCol->pData;
1,733,315✔
1301
    _getDoubleValue_fn_t getVectorDoubleValueFnLeft;
1302
    _getDoubleValue_fn_t getVectorDoubleValueFnRight;
1303
    SCL_ERR_JRET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
3,466,634!
1304
    SCL_ERR_JRET(getVectorDoubleValueFn(pRightCol->info.type, &getVectorDoubleValueFnRight));
3,466,630!
1305
    if (pLeft->numOfRows == pRight->numOfRows) {
1,733,315✔
1306
      for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
7,978,606!
1307
        if (IS_NULL) {
18,047,037!
1308
          colDataSetNULL(pOutputCol, i);
799,180✔
1309
          continue;  // TODO set null or ignore
799,180✔
1310
        }
1311
        double leftRes = 0;
5,480,056✔
1312
        double rightRes = 0;
5,480,056✔
1313
        SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
5,480,056!
1314
        SCL_ERR_JRET(getVectorDoubleValueFnRight(RIGHT_COL, i, &rightRes));
5,478,094!
1315
        *output = leftRes + rightRes;
5,478,134✔
1316
      }
1317
    } else if (pLeft->numOfRows == 1) {
32,023✔
1318
      SCL_ERR_JRET(vectorMathAddHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i));
10,195!
1319
    } else if (pRight->numOfRows == 1) {
21,828✔
1320
      SCL_ERR_JRET(vectorMathAddHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i));
21,743!
1321
    }
1322
  }
1323

1324
_return:
2,047,522✔
1325
  doReleaseVec(pLeftCol, leftConvert);
2,047,522✔
1326
  doReleaseVec(pRightCol, rightConvert);
2,049,456✔
1327
  SCL_RET(code);
2,049,592✔
1328
}
1329

1330
// TODO not correct for descending order scan
1331
static int32_t vectorMathSubHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
9,098✔
1332
                                int32_t numOfRows, int32_t step, int32_t factor, int32_t i) {
1333
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft;
1334
  _getDoubleValue_fn_t getVectorDoubleValueFnRight;
1335
  SCL_ERR_RET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
18,196!
1336
  SCL_ERR_RET(getVectorDoubleValueFn(pRightCol->info.type, &getVectorDoubleValueFnRight));
18,196!
1337

1338
  double *output = (double *)pOutputCol->pData;
9,098!
1339

1340
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
9,098!
1341
    colDataSetNNULL(pOutputCol, 0, numOfRows);
×
1342
  } else {
1343
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
941,469✔
1344
      if (IS_HELPER_NULL(pLeftCol, i)) {
1,864,712!
1345
        colDataSetNULL(pOutputCol, i);
684,420✔
1346
        continue;  // TODO set null or ignore
684,420✔
1347
      }
1348
      double leftRes = 0;
247,936✔
1349
      double rightRes = 0;
247,936✔
1350
      SCL_ERR_RET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
247,936!
1351
      SCL_ERR_RET(getVectorDoubleValueFnRight(RIGHT_COL, 0, &rightRes));
247,942!
1352
      *output = (leftRes - rightRes) * factor;
247,951✔
1353
    }
1354
  }
1355
  SCL_RET(TSDB_CODE_SUCCESS);
9,113!
1356
}
1357

1358
static int32_t vectorMathTsSubHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
4,215✔
1359
                                  int32_t numOfRows, int32_t step, int32_t factor, int32_t i) {
1360
  _getBigintValue_fn_t getVectorBigintValueFnLeft;
1361
  _getBigintValue_fn_t getVectorBigintValueFnRight;
1362
  SCL_ERR_RET(getVectorBigintValueFn(pLeftCol->info.type, &getVectorBigintValueFnLeft));
4,215!
1363
  SCL_ERR_RET(getVectorBigintValueFn(pRightCol->info.type, &getVectorBigintValueFnRight));
4,216!
1364

1365
  int64_t *output = (int64_t *)pOutputCol->pData;
4,216!
1366

1367
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
4,216!
1368
    colDataSetNNULL(pOutputCol, 0, numOfRows);
×
1369
  } else {
1370
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
742,023!
1371
      if (IS_HELPER_NULL(pLeftCol, i)) {
1,476,350!
1372
        colDataSetNULL(pOutputCol, i);
×
1373
        continue;  // TODO set null or ignore
×
1374
      }
1375
      int64_t leftRes = 0;
738,175✔
1376
      int64_t rightRes = 0;
738,175✔
1377
      SCL_ERR_RET(getVectorBigintValueFnLeft(pLeftCol->pData, i, &leftRes));
738,175!
1378
      SCL_ERR_RET(getVectorBigintValueFnRight(pRightCol->pData, 0, &rightRes));
737,274!
1379
      *output =
737,807✔
1380
          taosTimeAdd(leftRes, -rightRes, pRightCol->info.scale, pRightCol->info.precision);
738,015✔
1381
    }
1382
  }
1383
  SCL_RET(TSDB_CODE_SUCCESS);
3,848!
1384
}
1385

1386
int32_t vectorMathSub(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
29,825✔
1387
  SColumnInfoData *pOutputCol = pOut->columnData;
29,825✔
1388

1389
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
29,825✔
1390

1391
  int32_t code = TSDB_CODE_SUCCESS;
29,825✔
1392
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
29,825!
1393
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
29,825!
1394

1395
  int32_t          leftConvert = 0, rightConvert = 0;
29,825✔
1396
  SColumnInfoData *pLeftCol = NULL;
29,825✔
1397
  SColumnInfoData *pRightCol = NULL;
29,825✔
1398
  SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
29,825!
1399
  SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
29,832!
1400

1401
  if ((GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_BIGINT) ||
29,831!
1402
      (GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_TIMESTAMP &&
25,602!
1403
       GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_BIGINT)) {  // timestamp minus duration
4,231!
1404
    int64_t             *output = (int64_t *)pOutputCol->pData;
4,232✔
1405
    _getBigintValue_fn_t getVectorBigintValueFnLeft;
1406
    _getBigintValue_fn_t getVectorBigintValueFnRight;
1407
    SCL_ERR_JRET(getVectorBigintValueFn(pLeftCol->info.type, &getVectorBigintValueFnLeft));
4,232!
1408
    SCL_ERR_JRET(getVectorBigintValueFn(pRightCol->info.type, &getVectorBigintValueFnRight));
4,228✔
1409

1410
    if (pLeft->numOfRows == 1 && pRight->numOfRows == 1) {
4,228!
1411
      SCL_ERR_JRET(vectorMathTsSubHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, 1, i));
2,091!
1412
    } else if (pLeft->numOfRows == 1) {
2,137!
1413
      SCL_ERR_JRET(vectorMathTsSubHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, -1, i));
×
1414
    } else if (pRight->numOfRows == 1) {
2,137✔
1415
      SCL_ERR_JRET(vectorMathTsSubHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, 1, i));
2,124!
1416
    } else if (pLeft->numOfRows == pRight->numOfRows) {
13!
1417
      for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
258!
1418
        if (IS_NULL) {
732!
1419
          colDataSetNULL(pOutputCol, i);
×
1420
          continue;  // TODO set null or ignore
×
1421
        }
1422
        int64_t leftRes = 0;
244✔
1423
        int64_t rightRes = 0;
244✔
1424
        SCL_ERR_JRET(getVectorBigintValueFnLeft(pLeftCol->pData, i, &leftRes));
244!
1425
        SCL_ERR_JRET(getVectorBigintValueFnRight(pRightCol->pData, i, &rightRes));
244!
1426
        *output = leftRes - rightRes;
244✔
1427
      }
1428
    }
1429
  } else {
1430
    double              *output = (double *)pOutputCol->pData;
25,599✔
1431
    _getDoubleValue_fn_t getVectorDoubleValueFnLeft;
1432
    _getDoubleValue_fn_t getVectorDoubleValueFnRight;
1433
    SCL_ERR_JRET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
51,198!
1434
    SCL_ERR_JRET(getVectorDoubleValueFn(pRightCol->info.type, &getVectorDoubleValueFnRight));
51,198!
1435

1436
    if (pLeft->numOfRows == pRight->numOfRows) {
25,599✔
1437
      for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
76,751✔
1438
        if (IS_NULL) {
179,017!
1439
          colDataSetNULL(pOutputCol, i);
14,572!
1440
          continue;  // TODO set null or ignore
14,572✔
1441
        }
1442
        double leftRes = 0;
45,678✔
1443
        double rightRes = 0;
45,678✔
1444
        SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
45,678!
1445
        SCL_ERR_JRET(getVectorDoubleValueFnRight(RIGHT_COL, i, &rightRes));
45,680!
1446
        *output = leftRes - rightRes;
45,680✔
1447
      }
1448
    } else if (pLeft->numOfRows == 1) {
9,100✔
1449
      SCL_ERR_JRET(vectorMathSubHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, -1, i));
6,553!
1450
    } else if (pRight->numOfRows == 1) {
2,547✔
1451
      SCL_ERR_JRET(vectorMathSubHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, 1, i));
2,545✔
1452
    }
1453
  }
1454

1455
_return:
29,829✔
1456
  doReleaseVec(pLeftCol, leftConvert);
29,829✔
1457
  doReleaseVec(pRightCol, rightConvert);
29,829✔
1458
  SCL_RET(code);
29,830!
1459
}
1460

1461
// TODO not correct for descending order scan
1462
static int32_t vectorMathMultiplyHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
90,975✔
1463
                                     int32_t numOfRows, int32_t step, int32_t i) {
1464
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft;
1465
  _getDoubleValue_fn_t getVectorDoubleValueFnRight;
1466
  SCL_ERR_RET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
181,950!
1467
  SCL_ERR_RET(getVectorDoubleValueFn(pRightCol->info.type, &getVectorDoubleValueFnRight));
181,950!
1468

1469
  double *output = (double *)pOutputCol->pData;
90,975!
1470

1471
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
90,975!
1472
    colDataSetNNULL(pOutputCol, 0, numOfRows);
×
1473
  } else {
1474
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
29,477,257✔
1475
      if (IS_HELPER_NULL(pLeftCol, i)) {
58,777,294!
1476
        colDataSetNULL(pOutputCol, i);
1,435,097!
1477
        continue;  // TODO set null or ignore
1,435,097✔
1478
      }
1479
      double leftRes = 0;
27,953,550✔
1480
      double rightRes = 0;
27,953,550✔
1481
      SCL_ERR_RET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
27,953,550✔
1482
      SCL_ERR_RET(getVectorDoubleValueFnRight(RIGHT_COL, 0, &rightRes));
27,951,157!
1483
      *output = leftRes * rightRes;
27,951,185✔
1484
    }
1485
  }
1486
  SCL_RET(TSDB_CODE_SUCCESS);
88,610!
1487
}
1488

1489
int32_t vectorMathMultiply(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
174,844✔
1490
  SColumnInfoData *pOutputCol = pOut->columnData;
174,844✔
1491
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
174,844✔
1492

1493
  int32_t code = TSDB_CODE_SUCCESS;
174,844✔
1494
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
174,844!
1495
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
174,844!
1496

1497
  int32_t          leftConvert = 0, rightConvert = 0;
174,844✔
1498
  SColumnInfoData *pLeftCol = NULL;
174,844✔
1499
  SColumnInfoData *pRightCol = NULL;
174,844✔
1500
  SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
174,844!
1501
  SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
174,861!
1502

1503
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft;
1504
  _getDoubleValue_fn_t getVectorDoubleValueFnRight;
1505
  SCL_ERR_JRET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
349,658!
1506
  SCL_ERR_JRET(getVectorDoubleValueFn(pRightCol->info.type, &getVectorDoubleValueFnRight));
349,658!
1507

1508
  double *output = (double *)pOutputCol->pData;
174,829✔
1509
  if (pLeft->numOfRows == pRight->numOfRows) {
174,829✔
1510
    for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
206,025!
1511
      if (IS_NULL) {
363,588!
1512
        colDataSetNULL(pOutputCol, i);
55,817✔
1513
        continue;  // TODO set null or ignore
55,817✔
1514
      }
1515
      double leftRes = 0;
66,348✔
1516
      double rightRes = 0;
66,348✔
1517
      SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
66,348!
1518
      SCL_ERR_JRET(getVectorDoubleValueFnRight(RIGHT_COL, i, &rightRes));
66,358!
1519
      *output = leftRes * rightRes;
66,355✔
1520
    }
1521
  } else if (pLeft->numOfRows == 1) {
90,976✔
1522
    SCL_ERR_JRET(vectorMathMultiplyHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i));
90,183!
1523
  } else if (pRight->numOfRows == 1) {
793!
1524
    SCL_ERR_JRET(vectorMathMultiplyHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i));
793!
1525
  }
1526

1527
_return:
793✔
1528
  doReleaseVec(pLeftCol, leftConvert);
174,846✔
1529
  doReleaseVec(pRightCol, rightConvert);
174,825✔
1530
  SCL_RET(code);
174,841!
1531
}
1532

1533
int32_t vectorMathDivide(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
90,157✔
1534
  SColumnInfoData *pOutputCol = pOut->columnData;
90,157✔
1535
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
90,157✔
1536

1537
  int32_t code = TSDB_CODE_SUCCESS;
90,157✔
1538
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
90,157!
1539
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
90,157!
1540

1541
  int32_t          leftConvert = 0, rightConvert = 0;
90,157✔
1542
  SColumnInfoData *pLeftCol = NULL;
90,157✔
1543
  SColumnInfoData *pRightCol = NULL;
90,157✔
1544
  SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
90,157!
1545
  SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
90,160!
1546

1547
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft;
1548
  _getDoubleValue_fn_t getVectorDoubleValueFnRight;
1549
  SCL_ERR_JRET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
180,318!
1550
  SCL_ERR_JRET(getVectorDoubleValueFn(pRightCol->info.type, &getVectorDoubleValueFnRight));
180,318!
1551

1552
  double *output = (double *)pOutputCol->pData;
90,159✔
1553
  if (pLeft->numOfRows == pRight->numOfRows) {
90,159✔
1554
    for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
29,333,892!
1555
      if (IS_NULL) {  // divide by 0 check
87,743,340!
1556
        colDataSetNULL(pOutputCol, i);
18,892✔
1557
        continue;
20,963✔
1558
      }
1559
      double rightRes = 0;
29,234,244✔
1560
      SCL_ERR_JRET((getVectorDoubleValueFnRight(RIGHT_COL, i, &rightRes)));
29,234,244✔
1561
      if (rightRes == 0) {
29,234,007✔
1562
        colDataSetNULL(pOutputCol, i);
2,071!
1563
        continue;
2,071✔
1564
      }
1565
      double leftRes = 0;
29,231,936✔
1566
      SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
29,231,936!
1567
      *output = leftRes / rightRes;
29,232,207✔
1568
    }
1569
  } else if (pLeft->numOfRows == 1) {
9,437✔
1570
    if (IS_HELPER_NULL(pLeftCol, 0)) {  // Set pLeft->numOfRows NULL value
12,030!
1571
      colDataSetNNULL(pOutputCol, 0, pRight->numOfRows);
×
1572
    } else {
1573
      for (; i >= 0 && i < pRight->numOfRows; i += step, output += 1) {
904,509✔
1574
        if (IS_HELPER_NULL(pRightCol, i)) {  // divide by 0 check
1,796,956!
1575
          colDataSetNULL(pOutputCol, i);
680,669✔
1576
          continue;
680,669✔
1577
        }
1578
        double rightRes = 0;
217,809✔
1579
        SCL_ERR_JRET((getVectorDoubleValueFnRight(RIGHT_COL, i, &rightRes)));
217,809!
1580
        if (rightRes == 0) {
217,826!
1581
          colDataSetNULL(pOutputCol, i);
×
1582
          continue;
×
1583
        }
1584
        double leftRes = 0;
217,826✔
1585
        SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, 0, &leftRes));
217,826!
1586
        *output = leftRes / rightRes;
217,825✔
1587
      }
1588
    }
1589
  } else if (pRight->numOfRows == 1) {
3,422✔
1590
    if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value (divde by 0 check)
6,842!
1591
      colDataSetNNULL(pOutputCol, 0, pLeft->numOfRows);
×
1592
    } else {
1593
      double rightRes = 0;
3,421✔
1594
      SCL_ERR_JRET((getVectorDoubleValueFnRight(RIGHT_COL, 0, &rightRes)));
3,421!
1595
      if (rightRes == 0) {
3,421✔
1596
        colDataSetNNULL(pOutputCol, 0, pLeft->numOfRows);
90!
1597
      } else {
1598
        for (; i >= 0 && i < pLeft->numOfRows; i += step, output += 1) {
1,498,821!
1599
          if (IS_HELPER_NULL(pLeftCol, i)) {
2,990,980!
1600
            colDataSetNULL(pOutputCol, i);
129!
1601
            continue;
129✔
1602
          }
1603
          double leftRes = 0;
1,495,361✔
1604
          SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &leftRes));
1,495,361!
1605
          *output = leftRes / rightRes;
1,495,361✔
1606
        }
1607
      }
1608
    }
1609
  }
1610

1611
_return:
1✔
1612
  doReleaseVec(pLeftCol, leftConvert);
90,209✔
1613
  doReleaseVec(pRightCol, rightConvert);
90,158✔
1614
  SCL_RET(code);
90,157!
1615
}
1616

1617
int32_t vectorMathRemainder(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
93,381✔
1618
  SColumnInfoData *pOutputCol = pOut->columnData;
93,381✔
1619
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
93,381✔
1620

1621
  int32_t code = TSDB_CODE_SUCCESS;
93,381✔
1622
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
93,381!
1623
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
93,381!
1624

1625
  int32_t          leftConvert = 0, rightConvert = 0;
93,381✔
1626
  SColumnInfoData *pLeftCol = NULL;
93,381✔
1627
  SColumnInfoData *pRightCol = NULL;
93,381✔
1628
  SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
93,381!
1629
  SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
93,420✔
1630

1631
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft;
1632
  _getDoubleValue_fn_t getVectorDoubleValueFnRight;
1633
  SCL_ERR_JRET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
186,808!
1634
  SCL_ERR_JRET(getVectorDoubleValueFn(pRightCol->info.type, &getVectorDoubleValueFnRight));
186,808!
1635

1636
  double *output = (double *)pOutputCol->pData;
93,404✔
1637

1638
  if (pLeft->numOfRows == pRight->numOfRows) {
93,404✔
1639
    for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
23,446!
1640
      if (IS_NULL) {
58,316!
1641
        colDataSetNULL(pOutputCol, i);
10,000!
1642
        continue;
11,200✔
1643
      }
1644

1645
      double lx = 0;
12,772✔
1646
      double rx = 0;
12,772✔
1647
      SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &lx));
12,772!
1648
      SCL_ERR_JRET(getVectorDoubleValueFnRight(RIGHT_COL, i, &rx));
12,772!
1649
      if (isnan(lx) || isinf(lx) || isnan(rx) || isinf(rx) || FLT_EQUAL(rx, 0)) {
12,772!
1650
        colDataSetNULL(pOutputCol, i);
1,200!
1651
        continue;
1,200✔
1652
      }
1653

1654
      *output = lx - ((int64_t)(lx / rx)) * rx;
11,572✔
1655
    }
1656
  } else if (pLeft->numOfRows == 1) {
92,730!
1657
    double lx = 0;
×
1658
    SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, 0, &lx));
×
1659
    if (IS_HELPER_NULL(pLeftCol, 0)) {  // Set pLeft->numOfRows NULL value
×
1660
      colDataSetNNULL(pOutputCol, 0, pRight->numOfRows);
×
1661
    } else {
1662
      for (; i >= 0 && i < pRight->numOfRows; i += step, output += 1) {
×
1663
        if (IS_HELPER_NULL(pRightCol, i)) {
×
1664
          colDataSetNULL(pOutputCol, i);
×
1665
          continue;
×
1666
        }
1667

1668
        double rx = 0;
×
1669
        SCL_ERR_JRET(getVectorDoubleValueFnRight(RIGHT_COL, i, &rx));
×
1670
        if (isnan(rx) || isinf(rx) || FLT_EQUAL(rx, 0)) {
×
1671
          colDataSetNULL(pOutputCol, i);
×
1672
          continue;
×
1673
        }
1674

1675
        *output = lx - ((int64_t)(lx / rx)) * rx;
×
1676
      }
1677
    }
1678
  } else if (pRight->numOfRows == 1) {
92,730✔
1679
    double rx = 0;
92,647✔
1680
    SCL_ERR_JRET(getVectorDoubleValueFnRight(RIGHT_COL, 0, &rx));
92,647!
1681
    if (IS_HELPER_NULL(pRightCol, 0) || FLT_EQUAL(rx, 0)) {  // Set pLeft->numOfRows NULL value
185,418!
1682
      colDataSetNNULL(pOutputCol, 0, pLeft->numOfRows);
59!
1683
    } else {
1684
      for (; i >= 0 && i < pLeft->numOfRows; i += step, output += 1) {
9,388,313✔
1685
        if (IS_HELPER_NULL(pLeftCol, i)) {
18,588,108!
1686
          colDataSetNULL(pOutputCol, i);
×
1687
          continue;
×
1688
        }
1689

1690
        double lx = 0;
9,294,054✔
1691
        SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &lx));
9,294,054✔
1692
        if (isnan(lx) || isinf(lx)) {
9,295,663!
1693
          colDataSetNULL(pOutputCol, i);
×
1694
          continue;
×
1695
        }
1696

1697
        *output = lx - ((int64_t)(lx / rx)) * rx;
9,295,663✔
1698
      }
1699
    }
1700
  }
1701

1702
_return:
83✔
1703
  doReleaseVec(pLeftCol, leftConvert);
95,075✔
1704
  doReleaseVec(pRightCol, rightConvert);
93,413✔
1705
  SCL_RET(code);
93,420!
1706
}
1707

1708
int32_t vectorMathMinus(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
40,186✔
1709
  SColumnInfoData *pOutputCol = pOut->columnData;
40,186✔
1710

1711
  pOut->numOfRows = pLeft->numOfRows;
40,186✔
1712

1713
  int32_t code = TSDB_CODE_SUCCESS;
40,186✔
1714
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : (pLeft->numOfRows - 1);
40,186!
1715
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
40,186!
1716

1717
  int32_t          leftConvert = 0;
40,186✔
1718
  SColumnInfoData *pLeftCol = NULL;
40,186✔
1719
  SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
40,186✔
1720

1721
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft;
1722
  SCL_ERR_JRET(getVectorDoubleValueFn(pLeftCol->info.type, &getVectorDoubleValueFnLeft));
80,390!
1723

1724
  double *output = (double *)pOutputCol->pData;
40,195✔
1725
  for (; i < pLeft->numOfRows && i >= 0; i += step, output += 1) {
1,390,098!
1726
    if (IS_HELPER_NULL(pLeftCol, i)) {
2,700,034!
1727
      colDataSetNULL(pOutputCol, i);
372,618✔
1728
      continue;
372,618✔
1729
    }
1730
    double result = 0;
977,399✔
1731
    SCL_ERR_JRET(getVectorDoubleValueFnLeft(LEFT_COL, i, &result));
977,399✔
1732
    *output = (result == 0) ? 0 : -result;
977,285✔
1733
  }
1734

1735
_return:
40,081✔
1736
  doReleaseVec(pLeftCol, leftConvert);
40,081✔
1737
  SCL_RET(code);
40,172✔
1738
}
1739

1740
int32_t vectorAssign(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1,452,547✔
1741
  SColumnInfoData *pOutputCol = pOut->columnData;
1,452,547✔
1742
  pOut->numOfRows = pLeft->numOfRows;
1,452,547✔
1743

1744
  if (colDataIsNull_s(pRight->columnData, 0)) {
2,905,094✔
1745
    colDataSetNNULL(pOutputCol, 0, pOut->numOfRows);
152,000✔
1746
  } else {
1747
    char *d = colDataGetData(pRight->columnData, 0);
1,300,547!
1748
    for (int32_t i = 0; i < pOut->numOfRows; ++i) {
15,817,604✔
1749
      SCL_ERR_RET(colDataSetVal(pOutputCol, i, d, false));
14,517,502!
1750
    }
1751
  }
1752

1753
  if (pRight->numOfQualified != 1 && pRight->numOfQualified != 0) {
1,452,102!
1754
    sclError("vectorAssign: invalid qualified number %d", pRight->numOfQualified);
×
1755
    SCL_ERR_RET(TSDB_CODE_APP_ERROR);
1,003!
1756
  }
1757
  pOut->numOfQualified = pRight->numOfQualified * pOut->numOfRows;
1,453,105✔
1758
  return TSDB_CODE_SUCCESS;
1,453,105✔
1759
}
1760

1761
static int32_t vectorBitAndHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
16✔
1762
                                  int32_t numOfRows, int32_t step, int32_t i) {
1763
  _getBigintValue_fn_t getVectorBigintValueFnLeft;
1764
  _getBigintValue_fn_t getVectorBigintValueFnRight;
1765
  SCL_ERR_RET(getVectorBigintValueFn(pLeftCol->info.type, &getVectorBigintValueFnLeft));
16!
1766
  SCL_ERR_RET(getVectorBigintValueFn(pRightCol->info.type, &getVectorBigintValueFnRight));
16!
1767

1768
  int64_t *output = (int64_t *)pOutputCol->pData;
16!
1769

1770
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
16!
1771
    colDataSetNNULL(pOutputCol, 0, numOfRows);
×
1772
  } else {
1773
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
176!
1774
      if (IS_HELPER_NULL(pLeftCol, i)) {
320!
1775
        colDataSetNULL(pOutputCol, i);
24!
1776
        continue;  // TODO set null or ignore
24✔
1777
      }
1778
      int64_t leftRes = 0;
136✔
1779
      int64_t rightRes = 0;
136✔
1780
      SCL_ERR_RET(getVectorBigintValueFnLeft(LEFT_COL, i, &leftRes));
136!
1781
      SCL_ERR_RET(getVectorBigintValueFnRight(RIGHT_COL, 0, &rightRes));
136!
1782
      *output =  leftRes & rightRes;
136✔
1783
    }
1784
  }
1785
  SCL_RET(TSDB_CODE_SUCCESS);
16!
1786
}
1787

1788
int32_t vectorBitAnd(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
372✔
1789
  SColumnInfoData *pOutputCol = pOut->columnData;
372✔
1790
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
372✔
1791

1792
  int32_t code = TSDB_CODE_SUCCESS;
372✔
1793
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
372!
1794
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
372!
1795

1796
  int32_t          leftConvert = 0, rightConvert = 0;
372✔
1797
  SColumnInfoData *pLeftCol = NULL;
372✔
1798
  SColumnInfoData *pRightCol = NULL;
372✔
1799
  SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
372!
1800
  SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
372!
1801

1802
  _getBigintValue_fn_t getVectorBigintValueFnLeft;
1803
  _getBigintValue_fn_t getVectorBigintValueFnRight;
1804
  SCL_ERR_JRET(getVectorBigintValueFn(pLeftCol->info.type, &getVectorBigintValueFnLeft));
372!
1805
  SCL_ERR_JRET(getVectorBigintValueFn(pRightCol->info.type, &getVectorBigintValueFnRight));
372!
1806

1807
  int64_t *output = (int64_t *)pOutputCol->pData;
372✔
1808
  if (pLeft->numOfRows == pRight->numOfRows) {
372✔
1809
    for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
6,142!
1810
      if (IS_NULL) {
16,730!
1811
        colDataSetNULL(pOutputCol, i);
652!
1812
        continue;  // TODO set null or ignore
652✔
1813
      }
1814
      int64_t leftRes = 0;
5,134✔
1815
      int64_t rightRes = 0;
5,134✔
1816
      SCL_ERR_JRET(getVectorBigintValueFnLeft(LEFT_COL, i, &leftRes));
5,134!
1817
      SCL_ERR_JRET(getVectorBigintValueFnRight(RIGHT_COL, i, &rightRes));
5,134!
1818
      *output = leftRes & rightRes;
5,134✔
1819
    }
1820
  } else if (pLeft->numOfRows == 1) {
16!
1821
    SCL_ERR_JRET(vectorBitAndHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i));
16!
1822
  } else if (pRight->numOfRows == 1) {
×
1823
    SCL_ERR_JRET(vectorBitAndHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i));
×
1824
  }
1825

1826
_return:
×
1827
  doReleaseVec(pLeftCol, leftConvert);
372✔
1828
  doReleaseVec(pRightCol, rightConvert);
372✔
1829
  SCL_RET(code);
372!
1830
}
1831

1832
static int32_t vectorBitOrHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
×
1833
                                 int32_t numOfRows, int32_t step, int32_t i) {
1834
  _getBigintValue_fn_t getVectorBigintValueFnLeft;
1835
  _getBigintValue_fn_t getVectorBigintValueFnRight;
1836
  SCL_ERR_RET(getVectorBigintValueFn(pLeftCol->info.type, &getVectorBigintValueFnLeft));
×
1837
  SCL_ERR_RET(getVectorBigintValueFn(pRightCol->info.type, &getVectorBigintValueFnRight));
×
1838

1839
  int64_t *output = (int64_t *)pOutputCol->pData;
×
1840

1841
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
×
1842
    colDataSetNNULL(pOutputCol, 0, numOfRows);
×
1843
  } else {
1844
    int64_t rx = 0;
×
1845
    SCL_ERR_RET(getVectorBigintValueFnRight(RIGHT_COL, 0, &rx));
×
1846
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
×
1847
      if (IS_HELPER_NULL(pLeftCol, i)) {
×
1848
        colDataSetNULL(pOutputCol, i);
×
1849
        continue;  // TODO set null or ignore
×
1850
      }
1851
      int64_t lx = 0;
×
1852
      SCL_ERR_RET(getVectorBigintValueFnLeft(LEFT_COL, i, &lx));
×
1853
      *output = lx | rx;
×
1854
    }
1855
  }
1856
  SCL_RET(TSDB_CODE_SUCCESS);
×
1857
}
1858

1859
int32_t vectorBitOr(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
76✔
1860
  SColumnInfoData *pOutputCol = pOut->columnData;
76✔
1861
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
76✔
1862

1863
  int32_t code = TSDB_CODE_SUCCESS;
76✔
1864
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
76!
1865
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
76!
1866

1867
  int32_t          leftConvert = 0, rightConvert = 0;
76✔
1868
  SColumnInfoData *pLeftCol = NULL;
76✔
1869
  SColumnInfoData *pRightCol = NULL;
76✔
1870
  SCL_ERR_JRET(vectorConvertVarToDouble(pLeft, &leftConvert, &pLeftCol));
76!
1871
  SCL_ERR_JRET(vectorConvertVarToDouble(pRight, &rightConvert, &pRightCol));
76!
1872

1873
  _getBigintValue_fn_t getVectorBigintValueFnLeft;
1874
  _getBigintValue_fn_t getVectorBigintValueFnRight;
1875
  SCL_ERR_JRET(getVectorBigintValueFn(pLeftCol->info.type, &getVectorBigintValueFnLeft));
76!
1876
  SCL_ERR_JRET(getVectorBigintValueFn(pRightCol->info.type, &getVectorBigintValueFnRight));
76!
1877

1878
  int64_t *output = (int64_t *)pOutputCol->pData;
76✔
1879
  if (pLeft->numOfRows == pRight->numOfRows) {
76!
1880
    for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
3,058!
1881
      if (IS_NULL) {
8,780!
1882
        colDataSetNULL(pOutputCol, i);
178!
1883
        continue;  // TODO set null or ignore
178✔
1884
      }
1885
      int64_t leftRes = 0;
2,804✔
1886
      int64_t rightRes = 0;
2,804✔
1887
      SCL_ERR_JRET(getVectorBigintValueFnLeft(LEFT_COL, i, &leftRes));
2,804!
1888
      SCL_ERR_JRET(getVectorBigintValueFnRight(RIGHT_COL, i, &rightRes));
2,804!
1889
      *output = leftRes | rightRes;
2,804✔
1890
    }
1891
  } else if (pLeft->numOfRows == 1) {
×
1892
    SCL_ERR_JRET(vectorBitOrHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i));
×
1893
  } else if (pRight->numOfRows == 1) {
×
1894
    SCL_ERR_JRET(vectorBitOrHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i));
×
1895
  }
1896

1897
_return:
×
1898
  doReleaseVec(pLeftCol, leftConvert);
76✔
1899
  doReleaseVec(pRightCol, rightConvert);
76✔
1900
  SCL_RET(code);
76!
1901
}
1902

1903
int32_t doVectorCompareImpl(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t startIndex,
489,476✔
1904
                            int32_t numOfRows, int32_t step, __compar_fn_t fp, int32_t optr, int32_t *num) {
1905
  bool   *pRes = (bool *)pOut->columnData->pData;
489,476✔
1906
  int32_t code = TSDB_CODE_SUCCESS;
489,476✔
1907
  if (IS_MATHABLE_TYPE(GET_PARAM_TYPE(pLeft)) && IS_MATHABLE_TYPE(GET_PARAM_TYPE(pRight))) {
489,476!
1908
    if (!(pLeft->columnData->hasNull || pRight->columnData->hasNull)) {
404,699✔
1909
      for (int32_t i = startIndex; i < numOfRows && i >= 0; i += step) {
46,417,244✔
1910
        int32_t leftIndex = (i >= pLeft->numOfRows) ? 0 : i;
46,041,836✔
1911
        int32_t rightIndex = (i >= pRight->numOfRows) ? 0 : i;
46,041,836✔
1912

1913
        char *pLeftData = colDataGetData(pLeft->columnData, leftIndex);
46,041,836!
1914
        char *pRightData = colDataGetData(pRight->columnData, rightIndex);
46,041,836!
1915

1916
        pRes[i] = filterDoCompare(fp, optr, pLeftData, pRightData);
46,041,836✔
1917
        if (pRes[i]) {
46,032,146✔
1918
          ++(*num);
23,967,852✔
1919
        }
1920
      }
1921
    } else {
1922
      for (int32_t i = startIndex; i < numOfRows && i >= 0; i += step) {
25,286,259✔
1923
        int32_t leftIndex = (i >= pLeft->numOfRows) ? 0 : i;
25,266,768!
1924
        int32_t rightIndex = (i >= pRight->numOfRows) ? 0 : i;
25,266,768✔
1925

1926
        if (colDataIsNull_f(pLeft->columnData->nullbitmap, leftIndex) ||
25,266,768✔
1927
            colDataIsNull_f(pRight->columnData->nullbitmap, rightIndex)) {
22,870,257!
1928
          pRes[i] = false;
2,393,334✔
1929
          continue;
2,393,334✔
1930
        }
1931
        char *pLeftData = colDataGetData(pLeft->columnData, leftIndex);
22,873,434!
1932
        char *pRightData = colDataGetData(pRight->columnData, rightIndex);
22,873,434!
1933
        pRes[i] = filterDoCompare(fp, optr, pLeftData, pRightData);
22,873,434✔
1934
        if (pRes[i]) {
22,873,324✔
1935
          ++(*num);
21,660,046✔
1936
        }
1937
      }
1938
    }
1939
  } else {
1940
    //  if (GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_JSON || GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_JSON) {
1941
    for (int32_t i = startIndex; i < numOfRows && i >= startIndex; i += step) {
7,350,430✔
1942
      int32_t leftIndex = (i >= pLeft->numOfRows) ? 0 : i;
7,265,646!
1943
      int32_t rightIndex = (i >= pRight->numOfRows) ? 0 : i;
7,265,646✔
1944

1945
      if (IS_HELPER_NULL(pLeft->columnData, leftIndex) || IS_HELPER_NULL(pRight->columnData, rightIndex)) {
21,791,286!
1946
        bool res = false;
6,719✔
1947
        colDataSetInt8(pOut->columnData, i, (int8_t *)&res);
6,719✔
1948
        continue;
6,719✔
1949
      }
1950

1951
      char   *pLeftData = colDataGetData(pLeft->columnData, leftIndex);
7,258,927!
1952
      char   *pRightData = colDataGetData(pRight->columnData, rightIndex);
7,258,927!
1953
      int64_t leftOut = 0;
7,258,927✔
1954
      int64_t rightOut = 0;
7,258,927✔
1955
      bool    freeLeft = false;
7,258,927✔
1956
      bool    freeRight = false;
7,258,927✔
1957
      bool    isJsonnull = false;
7,258,927✔
1958
      bool    result = false;
7,258,927✔
1959

1960
      SCL_ERR_RET(convertJsonValue(&fp, optr, GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight), &pLeftData, &pRightData,
7,258,927!
1961
                                   &leftOut, &rightOut, &isJsonnull, &freeLeft, &freeRight, &result));
1962

1963
      if (isJsonnull) {
7,265,424!
1964
        sclError("doVectorCompareImpl: invalid json null value");
×
1965
        SCL_ERR_RET(TSDB_CODE_APP_ERROR);
898!
1966
      }
1967

1968
      if (!pLeftData || !pRightData) {
7,266,322!
1969
        result = false;
×
1970
      }
1971
      if (!result) {
7,266,322✔
1972
        colDataSetInt8(pOut->columnData, i, (int8_t *)&result);
1,652✔
1973
      } else {
1974
        bool res = filterDoCompare(fp, optr, pLeftData, pRightData);
7,264,670✔
1975
        colDataSetInt8(pOut->columnData, i, (int8_t *)&res);
7,257,282✔
1976
        if (res) {
7,257,282✔
1977
          ++(*num);
4,032,080✔
1978
        }
1979
      }
1980

1981
      if (freeLeft) {
7,258,934✔
1982
        taosMemoryFreeClear(pLeftData);
428!
1983
      }
1984

1985
      if (freeRight) {
7,258,934!
1986
        taosMemoryFreeClear(pRightData);
×
1987
      }
1988
    }
1989
  }
1990

1991
  return code;
479,683✔
1992
}
1993

1994
int32_t doVectorCompare(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t startIndex,
533,955✔
1995
                     int32_t numOfRows, int32_t _ord, int32_t optr) {
1996
  int32_t       i = 0;
533,955✔
1997
  int32_t       step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
533,955!
1998
  int32_t       lType = GET_PARAM_TYPE(pLeft);
533,955!
1999
  int32_t       rType = GET_PARAM_TYPE(pRight);
533,955✔
2000
  __compar_fn_t fp = NULL;
533,955✔
2001
  int32_t       compRows = 0;
533,955✔
2002
  if (lType == rType) {
533,955✔
2003
    SCL_ERR_RET(filterGetCompFunc(&fp, lType, optr));
245,146!
2004
  } else {
2005
    fp = filterGetCompFuncEx(lType, rType, optr);
288,809✔
2006
  }
2007

2008
  if (startIndex < 0) {
534,010✔
2009
    i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
522,464!
2010
    pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
522,464✔
2011
    compRows = pOut->numOfRows;
522,464✔
2012
  } else {
2013
    compRows = startIndex + numOfRows;
11,546✔
2014
    i = startIndex;
11,546✔
2015
  }
2016

2017
  if (pRight->pHashFilter != NULL) {
534,010✔
2018
    for (; i >= 0 && i < pLeft->numOfRows; i += step) {
94,284,159!
2019
      if (IS_HELPER_NULL(pLeft->columnData, i)) {
188,504,362!
2020
        bool res = false;
314✔
2021
        colDataSetInt8(pOut->columnData, i, (int8_t *)&res);
314✔
2022
        continue;
314✔
2023
      }
2024

2025
      char *pLeftData = colDataGetData(pLeft->columnData, i);
94,251,867!
2026
      bool  res = filterDoCompare(fp, optr, pLeftData, pRight->pHashFilter);
94,251,867✔
2027
      colDataSetInt8(pOut->columnData, i, (int8_t *)&res);
94,239,609✔
2028
      if (res) {
94,239,609✔
2029
        pOut->numOfQualified++;
3,351,605✔
2030
      }
2031
    }
2032
  } else {  // normal compare
2033
    SCL_ERR_RET(doVectorCompareImpl(pLeft, pRight, pOut, i, compRows, step, fp, optr, &(pOut->numOfQualified)));
489,774!
2034
  }
2035
  return TSDB_CODE_SUCCESS;
534,191✔
2036
}
2037

2038
int32_t vectorCompareImpl(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t startIndex,
533,810✔
2039
                          int32_t numOfRows, int32_t _ord, int32_t optr) {
2040
  SScalarParam  pLeftOut = {0};
533,810✔
2041
  SScalarParam  pRightOut = {0};
533,810✔
2042
  SScalarParam *param1 = NULL;
533,810✔
2043
  SScalarParam *param2 = NULL;
533,810✔
2044
  int32_t code = TSDB_CODE_SUCCESS;
533,810✔
2045
  if (noConvertBeforeCompare(GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight), optr)) {
533,810!
2046
    param1 = pLeft;
358,542✔
2047
    param2 = pRight;
358,542✔
2048
  } else {
2049
    SCL_ERR_JRET(vectorConvertCols(pLeft, pRight, &pLeftOut, &pRightOut, startIndex, numOfRows));
175,681✔
2050
    param1 = (pLeftOut.columnData != NULL) ? &pLeftOut : pLeft;
175,678✔
2051
    param2 = (pRightOut.columnData != NULL) ? &pRightOut : pRight;
175,678✔
2052
  }
2053

2054
  SCL_ERR_JRET(doVectorCompare(param1, param2, pOut, startIndex, numOfRows, _ord, optr));
534,220✔
2055

2056
_return:
534,191✔
2057
  sclFreeParam(&pLeftOut);
534,204✔
2058
  sclFreeParam(&pRightOut);
534,182✔
2059
  SCL_RET(code);
534,236✔
2060
}
2061

2062
int32_t vectorCompare(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord, int32_t optr) {
522,330✔
2063
  SCL_RET(vectorCompareImpl(pLeft, pRight, pOut, -1, -1, _ord, optr));
522,330✔
2064
}
2065

2066
int32_t vectorGreater(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
30,413✔
2067
  SCL_RET(vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_GREATER_THAN));
30,413✔
2068
}
2069

2070
int32_t vectorGreaterEqual(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
90,729✔
2071
  SCL_RET(vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_GREATER_EQUAL));
90,729!
2072
}
2073

2074
int32_t vectorLower(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
37,428✔
2075
  SCL_RET(vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_LOWER_THAN));
37,428!
2076
}
2077

2078
int32_t vectorLowerEqual(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
65,541✔
2079
  SCL_RET(vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_LOWER_EQUAL));
65,541!
2080
}
2081

2082
int32_t vectorEqual(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
162,223✔
2083
  SCL_RET(vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_EQUAL));
162,223✔
2084
}
2085

2086
int32_t vectorNotEqual(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
46,833✔
2087
  SCL_RET(vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_NOT_EQUAL));
46,833!
2088
}
2089

2090
int32_t vectorIn(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
38,332✔
2091
  SCL_RET(vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_IN));
38,332!
2092
}
2093

2094
int32_t vectorNotIn(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
5,881✔
2095
  SCL_RET(vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_NOT_IN));
5,881!
2096
}
2097

2098
int32_t vectorLike(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
27,330✔
2099
  SCL_RET(vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_LIKE));
27,330✔
2100
}
2101

2102
int32_t vectorNotLike(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
8✔
2103
  SCL_RET(vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_NOT_LIKE));
8!
2104
}
2105

2106
int32_t vectorMatch(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
7,592✔
2107
  SCL_RET(vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_MATCH));
7,592!
2108
}
2109

2110
int32_t vectorNotMatch(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
7,375✔
2111
  SCL_RET(vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_NMATCH));
7,375!
2112
}
2113

2114
int32_t vectorIsNull(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
2,397✔
2115
  for (int32_t i = 0; i < pLeft->numOfRows; ++i) {
4,904,576✔
2116
    int8_t v = IS_HELPER_NULL(pLeft->columnData, i) ? 1 : 0;
9,804,358!
2117
    if (v) {
4,902,179✔
2118
      ++pOut->numOfQualified;
497,422✔
2119
    }
2120
    colDataSetInt8(pOut->columnData, i, &v);
4,902,179✔
2121
    colDataClearNull_f(pOut->columnData->nullbitmap, i);
4,902,179✔
2122
  }
2123
  pOut->numOfRows = pLeft->numOfRows;
2,397✔
2124
  return TSDB_CODE_SUCCESS;
2,397✔
2125
}
2126

2127
int32_t vectorNotNull(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
424,627✔
2128
  for (int32_t i = 0; i < pLeft->numOfRows; ++i) {
2,211,230✔
2129
    int8_t v = IS_HELPER_NULL(pLeft->columnData, i) ? 0 : 1;
3,573,206!
2130
    if (v) {
1,786,603✔
2131
      ++pOut->numOfQualified;
1,404,573✔
2132
    }
2133
    colDataSetInt8(pOut->columnData, i, &v);
1,786,603✔
2134
    colDataClearNull_f(pOut->columnData->nullbitmap, i);
1,786,603✔
2135
  }
2136
  pOut->numOfRows = pLeft->numOfRows;
424,627✔
2137
  return TSDB_CODE_SUCCESS;
424,627✔
2138
}
2139

2140
int32_t vectorIsTrue(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
5,771✔
2141
  SCL_ERR_RET(vectorConvertSingleColImpl(pLeft, pOut, NULL, -1, -1));
5,771!
2142
  for (int32_t i = 0; i < pOut->numOfRows; ++i) {
18,529✔
2143
    if (colDataIsNull_s(pOut->columnData, i)) {
25,516✔
2144
      int8_t v = 0;
706✔
2145
      colDataSetInt8(pOut->columnData, i, &v);
706✔
2146
      colDataClearNull_f(pOut->columnData->nullbitmap, i);
706✔
2147
    }
2148
    {
2149
      bool v = false;
12,758✔
2150
      GET_TYPED_DATA(v, bool, pOut->columnData->info.type, colDataGetData(pOut->columnData, i));
12,758!
2151
      if (v) {
12,758✔
2152
        ++pOut->numOfQualified;
11,212✔
2153
      }
2154
    }
2155
  }
2156
  pOut->columnData->hasNull = false;
5,771✔
2157
  return TSDB_CODE_SUCCESS;
5,771✔
2158
}
2159

2160
int32_t getJsonValue(char *json, char *key, bool *isExist, STagVal *val) {
6,683✔
2161
  val->pKey = key;
6,683✔
2162
  if (json == NULL || tTagIsJson((const STag *)json) == false) {
6,683!
2163
    if (isExist) {
4!
2164
      *isExist = false;
4✔
2165
    }
2166
    SCL_ERR_RET(TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR);
4!
2167
  }
2168

2169
  bool find = tTagGet(((const STag *)json), val);  // json value is null and not exist is different
6,679✔
2170
  if (isExist) {
6,680!
2171
    *isExist = find;
6,680✔
2172
  }
2173
  SCL_RET(TSDB_CODE_SUCCESS);
6,680!
2174
}
2175

2176
int32_t vectorJsonContains(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
40✔
2177
  SColumnInfoData *pOutputCol = pOut->columnData;
40✔
2178

2179
  int32_t code = TSDB_CODE_SUCCESS;
40✔
2180
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
40!
2181
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
40!
2182

2183
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
40✔
2184

2185
  char *pRightData = colDataGetVarData(pRight->columnData, 0);
40✔
2186
  char *jsonKey = taosMemoryCalloc(1, varDataLen(pRightData) + 1);
40✔
2187
  if (NULL == jsonKey) {
40!
2188
    SCL_ERR_RET(terrno);
×
2189
  }
2190
  (void)memcpy(jsonKey, varDataVal(pRightData), varDataLen(pRightData));
40✔
2191
  for (; i >= 0 && i < pLeft->numOfRows; i += step) {
400!
2192
    bool isExist = false;
360✔
2193

2194
    if (!colDataIsNull_var(pLeft->columnData, i)) {
360✔
2195
      char *pLeftData = colDataGetVarData(pLeft->columnData, i);
236✔
2196
      STagVal value;
2197
      SCL_ERR_JRET(getJsonValue(pLeftData, jsonKey, &isExist, &value));
236!
2198
    }
2199
    if (isExist) {
360✔
2200
      ++pOut->numOfQualified;
112✔
2201
    }
2202
    SCL_ERR_JRET(colDataSetVal(pOutputCol, i, (const char *)(&isExist), false));
360!
2203
  }
2204

2205
_return:
40✔
2206
  taosMemoryFree(jsonKey);
40✔
2207
  SCL_RET(code);
40!
2208
}
2209

2210
int32_t vectorJsonArrow(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1,538✔
2211
  SColumnInfoData *pOutputCol = pOut->columnData;
1,538✔
2212

2213
  int32_t code = TSDB_CODE_SUCCESS;
1,538✔
2214
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
1,538!
2215
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
1,538!
2216

2217
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
1,538✔
2218

2219
  char *pRightData = colDataGetVarData(pRight->columnData, 0);
1,538✔
2220
  char *jsonKey = taosMemoryCalloc(1, varDataLen(pRightData) + 1);
1,538✔
2221
  if (NULL == jsonKey) {
1,539!
2222
    SCL_ERR_RET(terrno);
×
2223
  }
2224
  (void)memcpy(jsonKey, varDataVal(pRightData), varDataLen(pRightData));
1,539✔
2225
  for (; i >= 0 && i < pLeft->numOfRows; i += step) {
10,715!
2226
    if (colDataIsNull_var(pLeft->columnData, i)) {
9,180✔
2227
      colDataSetNull_var(pOutputCol, i);
2,732✔
2228
      pOutputCol->hasNull = true;
2,732✔
2229
      continue;
2,732✔
2230
    }
2231
    char   *pLeftData = colDataGetVarData(pLeft->columnData, i);
6,448✔
2232
    bool    isExist = false;
6,448✔
2233
    STagVal value;
2234
    SCL_ERR_JRET(getJsonValue(pLeftData, jsonKey, &isExist, &value));
6,448✔
2235
    char   *data = isExist ? tTagValToData(&value, true) : NULL;
6,444✔
2236
    code = colDataSetVal(pOutputCol, i, data, data == NULL);
6,444✔
2237
    if (isExist && IS_VAR_DATA_TYPE(value.type) && data) {
6,444!
2238
      taosMemoryFree(data);
2,378✔
2239
    }
2240
    SCL_ERR_JRET(code);
6,444!
2241
  }
2242

2243
_return:
1,535✔
2244
  taosMemoryFree(jsonKey);
1,539✔
2245
  SCL_RET(code);
1,539✔
2246
}
2247

2248
_bin_scalar_fn_t getBinScalarOperatorFn(int32_t binFunctionId) {
4,884,789✔
2249
  switch (binFunctionId) {
4,884,789!
2250
    case OP_TYPE_ADD:
2,049,064✔
2251
      return vectorMathAdd;
2,049,064✔
2252
    case OP_TYPE_SUB:
29,831✔
2253
      return vectorMathSub;
29,831✔
2254
    case OP_TYPE_MULTI:
174,885✔
2255
      return vectorMathMultiply;
174,885✔
2256
    case OP_TYPE_DIV:
90,159✔
2257
      return vectorMathDivide;
90,159✔
2258
    case OP_TYPE_REM:
93,429✔
2259
      return vectorMathRemainder;
93,429✔
2260
    case OP_TYPE_MINUS:
40,203✔
2261
      return vectorMathMinus;
40,203✔
2262
    case OP_TYPE_ASSIGN:
1,453,026✔
2263
      return vectorAssign;
1,453,026✔
2264
    case OP_TYPE_GREATER_THAN:
30,416✔
2265
      return vectorGreater;
30,416✔
2266
    case OP_TYPE_GREATER_EQUAL:
90,712✔
2267
      return vectorGreaterEqual;
90,712✔
2268
    case OP_TYPE_LOWER_THAN:
37,433✔
2269
      return vectorLower;
37,433✔
2270
    case OP_TYPE_LOWER_EQUAL:
65,544✔
2271
      return vectorLowerEqual;
65,544✔
2272
    case OP_TYPE_EQUAL:
162,273✔
2273
      return vectorEqual;
162,273✔
2274
    case OP_TYPE_NOT_EQUAL:
46,849✔
2275
      return vectorNotEqual;
46,849✔
2276
    case OP_TYPE_IN:
38,338✔
2277
      return vectorIn;
38,338✔
2278
    case OP_TYPE_NOT_IN:
5,881✔
2279
      return vectorNotIn;
5,881✔
2280
    case OP_TYPE_LIKE:
27,331✔
2281
      return vectorLike;
27,331✔
2282
    case OP_TYPE_NOT_LIKE:
8✔
2283
      return vectorNotLike;
8✔
2284
    case OP_TYPE_MATCH:
7,597✔
2285
      return vectorMatch;
7,597✔
2286
    case OP_TYPE_NMATCH:
7,375✔
2287
      return vectorNotMatch;
7,375✔
2288
    case OP_TYPE_IS_NULL:
2,397✔
2289
      return vectorIsNull;
2,397✔
2290
    case OP_TYPE_IS_NOT_NULL:
424,668✔
2291
      return vectorNotNull;
424,668✔
2292
    case OP_TYPE_BIT_AND:
372✔
2293
      return vectorBitAnd;
372✔
2294
    case OP_TYPE_BIT_OR:
76✔
2295
      return vectorBitOr;
76✔
2296
    case OP_TYPE_IS_TRUE:
5,771✔
2297
      return vectorIsTrue;
5,771✔
2298
    case OP_TYPE_JSON_GET_VALUE:
1,538✔
2299
      return vectorJsonArrow;
1,538✔
2300
    case OP_TYPE_JSON_CONTAINS:
40✔
2301
      return vectorJsonContains;
40✔
2302
    default:
×
2303
      return NULL;
×
2304
  }
2305
}
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