sclvector.c 70.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#include "os.h"

H
Haojun Liao 已提交
18
#include "filter.h"
D
dapan1121 已提交
19
#include "filterInt.h"
D
dapan1121 已提交
20
#include "query.h"
H
Haojun Liao 已提交
21
#include "querynodes.h"
D
dapan1121 已提交
22
#include "sclInt.h"
H
Haojun Liao 已提交
23 24 25
#include "sclvector.h"
#include "tcompare.h"
#include "tdatablock.h"
wmmhello's avatar
wmmhello 已提交
26
#include "tdataformat.h"
D
dapan1121 已提交
27
#include "ttime.h"
H
Hongze Cheng 已提交
28
#include "ttypes.h"
29

H
Hongze Cheng 已提交
30 31
#define LEFT_COL  ((pLeftCol->info.type == TSDB_DATA_TYPE_JSON ? (void *)pLeftCol : pLeftCol->pData))
#define RIGHT_COL ((pRightCol->info.type == TSDB_DATA_TYPE_JSON ? (void *)pRightCol : pRightCol->pData))
32

H
Hongze Cheng 已提交
33 34 35 36
#define IS_NULL                                                                              \
  colDataIsNull_s(pLeft->columnData, i) || colDataIsNull_s(pRight->columnData, i) ||         \
      IS_JSON_NULL(pLeft->columnData->info.type, colDataGetVarData(pLeft->columnData, i)) || \
      IS_JSON_NULL(pRight->columnData->info.type, colDataGetVarData(pRight->columnData, i))
wmmhello's avatar
wmmhello 已提交
37

H
Hongze Cheng 已提交
38
#define IS_HELPER_NULL(col, i) colDataIsNull_s(col, i) || IS_JSON_NULL(col->info.type, colDataGetVarData(col, i))
wmmhello's avatar
wmmhello 已提交
39

H
Hongze Cheng 已提交
40
void convertNumberToNumber(const void *inData, void *outData, int8_t inType, int8_t outType) {
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
  switch (outType) {
    case TSDB_DATA_TYPE_BOOL: {
      GET_TYPED_DATA(*((bool *)outData), bool, inType, inData);
      break;
    }
    case TSDB_DATA_TYPE_TINYINT: {
      GET_TYPED_DATA(*((int8_t *)outData), int8_t, inType, inData);
      break;
    }
    case TSDB_DATA_TYPE_SMALLINT: {
      GET_TYPED_DATA(*((int16_t *)outData), int16_t, inType, inData);
      break;
    }
    case TSDB_DATA_TYPE_INT: {
      GET_TYPED_DATA(*((int32_t *)outData), int32_t, inType, inData);
      break;
    }
    case TSDB_DATA_TYPE_BIGINT:
    case TSDB_DATA_TYPE_TIMESTAMP: {
      GET_TYPED_DATA(*((int64_t *)outData), int64_t, inType, inData);
      break;
    }
    case TSDB_DATA_TYPE_UTINYINT: {
      GET_TYPED_DATA(*((uint8_t *)outData), uint8_t, inType, inData);
      break;
    }
    case TSDB_DATA_TYPE_USMALLINT: {
      GET_TYPED_DATA(*((uint16_t *)outData), uint16_t, inType, inData);
      break;
    }
    case TSDB_DATA_TYPE_UINT: {
      GET_TYPED_DATA(*((uint32_t *)outData), uint32_t, inType, inData);
      break;
    }
    case TSDB_DATA_TYPE_UBIGINT: {
      GET_TYPED_DATA(*((uint64_t *)outData), uint64_t, inType, inData);
      break;
    }
    case TSDB_DATA_TYPE_FLOAT: {
      GET_TYPED_DATA(*((float *)outData), float, inType, inData);
      break;
    }
    case TSDB_DATA_TYPE_DOUBLE: {
      GET_TYPED_DATA(*((double *)outData), double, inType, inData);
      break;
    }
H
Hongze Cheng 已提交
87
    default: {
88 89 90 91 92
      ASSERT(0);
    }
  }
}

H
Hongze Cheng 已提交
93
void convertNcharToDouble(const void *inData, void *outData) {
94
  char *tmp = taosMemoryMalloc(varDataTLen(inData));
H
Hongze Cheng 已提交
95
  int   len = taosUcs4ToMbs((TdUcs4 *)varDataVal(inData), varDataLen(inData), tmp);
96 97 98 99 100 101
  if (len < 0) {
    sclError("castConvert taosUcs4ToMbs error 1");
  }

  tmp[len] = 0;

wafwerar's avatar
wafwerar 已提交
102
  double value = taosStr2Double(tmp, NULL);
103 104 105 106 107

  *((double *)outData) = value;
  taosMemoryFreeClear(tmp);
}

H
Hongze Cheng 已提交
108
void convertBinaryToDouble(const void *inData, void *outData) {
109
  char *tmp = taosMemoryCalloc(1, varDataTLen(inData));
H
Hongze Cheng 已提交
110
  if (tmp == NULL) {
111 112 113 114 115 116 117 118 119
    *((double *)outData) = 0.;
    return;
  }
  memcpy(tmp, varDataVal(inData), varDataLen(inData));
  double ret = taosStr2Double(tmp, NULL);
  taosMemoryFree(tmp);
  *((double *)outData) = ret;
}

D
dapan1121 已提交
120 121
typedef int64_t (*_getBigintValue_fn_t)(void *src, int32_t index);

H
Hongze Cheng 已提交
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
int64_t getVectorBigintValue_TINYINT(void *src, int32_t index) { return (int64_t) * ((int8_t *)src + index); }
int64_t getVectorBigintValue_UTINYINT(void *src, int32_t index) { return (int64_t) * ((uint8_t *)src + index); }
int64_t getVectorBigintValue_SMALLINT(void *src, int32_t index) { return (int64_t) * ((int16_t *)src + index); }
int64_t getVectorBigintValue_USMALLINT(void *src, int32_t index) { return (int64_t) * ((uint16_t *)src + index); }
int64_t getVectorBigintValue_INT(void *src, int32_t index) { return (int64_t) * ((int32_t *)src + index); }
int64_t getVectorBigintValue_UINT(void *src, int32_t index) { return (int64_t) * ((uint32_t *)src + index); }
int64_t getVectorBigintValue_BIGINT(void *src, int32_t index) { return (int64_t) * ((int64_t *)src + index); }
int64_t getVectorBigintValue_UBIGINT(void *src, int32_t index) { return (int64_t) * ((uint64_t *)src + index); }
int64_t getVectorBigintValue_FLOAT(void *src, int32_t index) { return (int64_t) * ((float *)src + index); }
int64_t getVectorBigintValue_DOUBLE(void *src, int32_t index) { return (int64_t) * ((double *)src + index); }
int64_t getVectorBigintValue_BOOL(void *src, int32_t index) { return (int64_t) * ((bool *)src + index); }

int64_t getVectorBigintValue_JSON(void *src, int32_t index) {
  ASSERT(!colDataIsNull_var(((SColumnInfoData *)src), index));
  char  *data = colDataGetVarData((SColumnInfoData *)src, index);
137
  double out = 0;
H
Hongze Cheng 已提交
138
  if (*data == TSDB_DATA_TYPE_NULL) {
139
    return 0;
H
Hongze Cheng 已提交
140 141 142
  } else if (*data == TSDB_DATA_TYPE_NCHAR) {  // json inner type can not be BINARY
    convertNcharToDouble(data + CHAR_BYTES, &out);
  } else if (tTagIsJson(data)) {
wmmhello's avatar
wmmhello 已提交
143 144
    terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
    return 0;
145
  } else {
H
Hongze Cheng 已提交
146
    convertNumberToNumber(data + CHAR_BYTES, &out, *data, TSDB_DATA_TYPE_DOUBLE);
147 148 149 150
  }
  return (int64_t)out;
}

D
dapan1121 已提交
151
_getBigintValue_fn_t getVectorBigintValueFn(int32_t srcType) {
H
Hongze Cheng 已提交
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
  _getBigintValue_fn_t p = NULL;
  if (srcType == TSDB_DATA_TYPE_TINYINT) {
    p = getVectorBigintValue_TINYINT;
  } else if (srcType == TSDB_DATA_TYPE_UTINYINT) {
    p = getVectorBigintValue_UTINYINT;
  } else if (srcType == TSDB_DATA_TYPE_SMALLINT) {
    p = getVectorBigintValue_SMALLINT;
  } else if (srcType == TSDB_DATA_TYPE_USMALLINT) {
    p = getVectorBigintValue_USMALLINT;
  } else if (srcType == TSDB_DATA_TYPE_INT) {
    p = getVectorBigintValue_INT;
  } else if (srcType == TSDB_DATA_TYPE_UINT) {
    p = getVectorBigintValue_UINT;
  } else if (srcType == TSDB_DATA_TYPE_BIGINT) {
    p = getVectorBigintValue_BIGINT;
  } else if (srcType == TSDB_DATA_TYPE_UBIGINT) {
    p = getVectorBigintValue_UBIGINT;
  } else if (srcType == TSDB_DATA_TYPE_FLOAT) {
    p = getVectorBigintValue_FLOAT;
  } else if (srcType == TSDB_DATA_TYPE_DOUBLE) {
    p = getVectorBigintValue_DOUBLE;
  } else if (srcType == TSDB_DATA_TYPE_TIMESTAMP) {
    p = getVectorBigintValue_BIGINT;
  } else if (srcType == TSDB_DATA_TYPE_BOOL) {
    p = getVectorBigintValue_BOOL;
  } else if (srcType == TSDB_DATA_TYPE_JSON) {
    p = getVectorBigintValue_JSON;
  } else if (srcType == TSDB_DATA_TYPE_NULL) {
    p = NULL;
  } else {
    ASSERT(0);
  }
  return p;
D
dapan1121 已提交
185 186
}

H
Hongze Cheng 已提交
187
typedef void *(*_getValueAddr_fn_t)(void *src, int32_t index);
188

H
Hongze Cheng 已提交
189 190 191 192 193 194 195 196 197 198 199 200
void *getVectorValueAddr_TINYINT(void *src, int32_t index) { return (void *)((int8_t *)src + index); }
void *getVectorValueAddr_UTINYINT(void *src, int32_t index) { return (void *)((uint8_t *)src + index); }
void *getVectorValueAddr_SMALLINT(void *src, int32_t index) { return (void *)((int16_t *)src + index); }
void *getVectorValueAddr_USMALLINT(void *src, int32_t index) { return (void *)((uint16_t *)src + index); }
void *getVectorValueAddr_INT(void *src, int32_t index) { return (void *)((int32_t *)src + index); }
void *getVectorValueAddr_UINT(void *src, int32_t index) { return (void *)((uint32_t *)src + index); }
void *getVectorValueAddr_BIGINT(void *src, int32_t index) { return (void *)((int64_t *)src + index); }
void *getVectorValueAddr_UBIGINT(void *src, int32_t index) { return (void *)((uint64_t *)src + index); }
void *getVectorValueAddr_FLOAT(void *src, int32_t index) { return (void *)((float *)src + index); }
void *getVectorValueAddr_DOUBLE(void *src, int32_t index) { return (void *)((double *)src + index); }
void *getVectorValueAddr_default(void *src, int32_t index) { return src; }
void *getVectorValueAddr_VAR(void *src, int32_t index) { return colDataGetData((SColumnInfoData *)src, index); }
201 202

_getValueAddr_fn_t getVectorValueAddrFn(int32_t srcType) {
H
Hongze Cheng 已提交
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
  _getValueAddr_fn_t p = NULL;
  if (srcType == TSDB_DATA_TYPE_TINYINT) {
    p = getVectorValueAddr_TINYINT;
  } else if (srcType == TSDB_DATA_TYPE_UTINYINT) {
    p = getVectorValueAddr_UTINYINT;
  } else if (srcType == TSDB_DATA_TYPE_SMALLINT) {
    p = getVectorValueAddr_SMALLINT;
  } else if (srcType == TSDB_DATA_TYPE_USMALLINT) {
    p = getVectorValueAddr_USMALLINT;
  } else if (srcType == TSDB_DATA_TYPE_INT) {
    p = getVectorValueAddr_INT;
  } else if (srcType == TSDB_DATA_TYPE_UINT) {
    p = getVectorValueAddr_UINT;
  } else if (srcType == TSDB_DATA_TYPE_BIGINT) {
    p = getVectorValueAddr_BIGINT;
  } else if (srcType == TSDB_DATA_TYPE_UBIGINT) {
    p = getVectorValueAddr_UBIGINT;
  } else if (srcType == TSDB_DATA_TYPE_FLOAT) {
    p = getVectorValueAddr_FLOAT;
  } else if (srcType == TSDB_DATA_TYPE_DOUBLE) {
    p = getVectorValueAddr_DOUBLE;
  } else if (srcType == TSDB_DATA_TYPE_BINARY) {
    p = getVectorValueAddr_VAR;
  } else if (srcType == TSDB_DATA_TYPE_NCHAR) {
    p = getVectorValueAddr_VAR;
  } else {
    p = getVectorValueAddr_default;
  }
  return p;
}

static FORCE_INLINE void varToTimestamp(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
D
dapan1121 已提交
235 236 237 238
  int64_t value = 0;
  if (taosParseTime(buf, &value, strlen(buf), pOut->columnData->info.precision, tsDaylight) != TSDB_CODE_SUCCESS) {
    value = 0;
  }
G
Ganlin Zhao 已提交
239

D
dapan1121 已提交
240 241 242
  colDataAppendInt64(pOut->columnData, rowIndex, &value);
}

H
Hongze Cheng 已提交
243
static FORCE_INLINE void varToSigned(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
D
dapan1121 已提交
244 245 246 247 248 249 250 251 252 253 254 255 256 257
  if (overflow) {
    int64_t minValue = tDataTypes[pOut->columnData->info.type].minValue;
    int64_t maxValue = tDataTypes[pOut->columnData->info.type].maxValue;
    int64_t value = (int64_t)taosStr2Int64(buf, NULL, 10);
    if (value > maxValue) {
      *overflow = 1;
      return;
    } else if (value < minValue) {
      *overflow = -1;
      return;
    } else {
      *overflow = 0;
    }
  }
G
Ganlin Zhao 已提交
258

D
fix bug  
dapan1121 已提交
259 260
  switch (pOut->columnData->info.type) {
    case TSDB_DATA_TYPE_TINYINT: {
wafwerar's avatar
wafwerar 已提交
261
      int8_t value = (int8_t)taosStr2Int8(buf, NULL, 10);
G
Ganlin Zhao 已提交
262

H
Hongze Cheng 已提交
263
      colDataAppendInt8(pOut->columnData, rowIndex, (int8_t *)&value);
D
fix bug  
dapan1121 已提交
264
      break;
G
Ganlin Zhao 已提交
265
    }
D
fix bug  
dapan1121 已提交
266
    case TSDB_DATA_TYPE_SMALLINT: {
wafwerar's avatar
wafwerar 已提交
267
      int16_t value = (int16_t)taosStr2Int16(buf, NULL, 10);
H
Hongze Cheng 已提交
268
      colDataAppendInt16(pOut->columnData, rowIndex, (int16_t *)&value);
D
fix bug  
dapan1121 已提交
269
      break;
G
Ganlin Zhao 已提交
270
    }
D
fix bug  
dapan1121 已提交
271
    case TSDB_DATA_TYPE_INT: {
wafwerar's avatar
wafwerar 已提交
272
      int32_t value = (int32_t)taosStr2Int32(buf, NULL, 10);
H
Hongze Cheng 已提交
273
      colDataAppendInt32(pOut->columnData, rowIndex, (int32_t *)&value);
D
fix bug  
dapan1121 已提交
274
      break;
G
Ganlin Zhao 已提交
275
    }
D
fix bug  
dapan1121 已提交
276
    case TSDB_DATA_TYPE_BIGINT: {
wafwerar's avatar
wafwerar 已提交
277
      int64_t value = (int64_t)taosStr2Int64(buf, NULL, 10);
H
Hongze Cheng 已提交
278
      colDataAppendInt64(pOut->columnData, rowIndex, (int64_t *)&value);
D
fix bug  
dapan1121 已提交
279
      break;
G
Ganlin Zhao 已提交
280
    }
D
fix bug  
dapan1121 已提交
281
  }
D
dapan1121 已提交
282 283
}

H
Hongze Cheng 已提交
284
static FORCE_INLINE void varToUnsigned(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
D
dapan1121 已提交
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
  if (overflow) {
    uint64_t minValue = (uint64_t)tDataTypes[pOut->columnData->info.type].minValue;
    uint64_t maxValue = (uint64_t)tDataTypes[pOut->columnData->info.type].maxValue;
    uint64_t value = (uint64_t)taosStr2UInt64(buf, NULL, 10);
    if (value > maxValue) {
      *overflow = 1;
      return;
    } else if (value < minValue) {
      *overflow = -1;
      return;
    } else {
      *overflow = 0;
    }
  }

D
fix bug  
dapan1121 已提交
300 301
  switch (pOut->columnData->info.type) {
    case TSDB_DATA_TYPE_UTINYINT: {
wafwerar's avatar
wafwerar 已提交
302
      uint8_t value = (uint8_t)taosStr2UInt8(buf, NULL, 10);
H
Hongze Cheng 已提交
303
      colDataAppendInt8(pOut->columnData, rowIndex, (int8_t *)&value);
D
fix bug  
dapan1121 已提交
304
      break;
G
Ganlin Zhao 已提交
305
    }
D
fix bug  
dapan1121 已提交
306
    case TSDB_DATA_TYPE_USMALLINT: {
wafwerar's avatar
wafwerar 已提交
307
      uint16_t value = (uint16_t)taosStr2UInt16(buf, NULL, 10);
H
Hongze Cheng 已提交
308
      colDataAppendInt16(pOut->columnData, rowIndex, (int16_t *)&value);
D
fix bug  
dapan1121 已提交
309
      break;
G
Ganlin Zhao 已提交
310
    }
D
fix bug  
dapan1121 已提交
311
    case TSDB_DATA_TYPE_UINT: {
wafwerar's avatar
wafwerar 已提交
312
      uint32_t value = (uint32_t)taosStr2UInt32(buf, NULL, 10);
H
Hongze Cheng 已提交
313
      colDataAppendInt32(pOut->columnData, rowIndex, (int32_t *)&value);
D
fix bug  
dapan1121 已提交
314
      break;
G
Ganlin Zhao 已提交
315
    }
D
fix bug  
dapan1121 已提交
316
    case TSDB_DATA_TYPE_UBIGINT: {
wafwerar's avatar
wafwerar 已提交
317
      uint64_t value = (uint64_t)taosStr2UInt64(buf, NULL, 10);
H
Hongze Cheng 已提交
318
      colDataAppendInt64(pOut->columnData, rowIndex, (int64_t *)&value);
D
fix bug  
dapan1121 已提交
319
      break;
G
Ganlin Zhao 已提交
320
    }
D
fix bug  
dapan1121 已提交
321
  }
D
dapan1121 已提交
322 323
}

H
Hongze Cheng 已提交
324
static FORCE_INLINE void varToFloat(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
D
dapan1121 已提交
325 326 327 328 329
  if (TSDB_DATA_TYPE_FLOAT == pOut->columnData->info.type) {
    float value = taosStr2Float(buf, NULL);
    colDataAppendFloat(pOut->columnData, rowIndex, &value);
    return;
  }
G
Ganlin Zhao 已提交
330

wafwerar's avatar
wafwerar 已提交
331
  double value = taosStr2Double(buf, NULL);
332
  colDataAppendDouble(pOut->columnData, rowIndex, &value);
333 334
}

H
Hongze Cheng 已提交
335
static FORCE_INLINE void varToBool(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
wafwerar's avatar
wafwerar 已提交
336
  int64_t value = taosStr2Int64(buf, NULL, 10);
H
Hongze Cheng 已提交
337 338
  bool    v = (value != 0) ? true : false;
  colDataAppendInt8(pOut->columnData, rowIndex, (int8_t *)&v);
D
dapan1121 已提交
339 340
}

H
Hongze Cheng 已提交
341
static FORCE_INLINE void varToNchar(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
wmmhello's avatar
wmmhello 已提交
342 343
  int32_t len = 0;
  int32_t inputLen = varDataLen(buf);
D
fix bug  
dapan1121 已提交
344
  int32_t outputMaxLen = (inputLen + 1) * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE;
wmmhello's avatar
wmmhello 已提交
345

dengyihao's avatar
dengyihao 已提交
346 347 348
  char   *t = taosMemoryCalloc(1, outputMaxLen);
  int32_t ret =
      taosMbsToUcs4(varDataVal(buf), inputLen, (TdUcs4 *)varDataVal(t), outputMaxLen - VARSTR_HEADER_SIZE, &len);
G
Ganlin Zhao 已提交
349
  if (!ret) {
dengyihao's avatar
dengyihao 已提交
350
    sclError("failed to convert to NCHAR");
G
Ganlin Zhao 已提交
351
  }
wmmhello's avatar
wmmhello 已提交
352 353 354 355 356
  varDataSetLen(t, len);

  colDataAppend(pOut->columnData, rowIndex, t, false);
  taosMemoryFree(t);
}
357

H
Hongze Cheng 已提交
358
static FORCE_INLINE void ncharToVar(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
D
dapan1121 已提交
359 360
  int32_t inputLen = varDataLen(buf);

H
Hongze Cheng 已提交
361 362
  char   *t = taosMemoryCalloc(1, inputLen + VARSTR_HEADER_SIZE);
  int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(buf), varDataLen(buf), varDataVal(t));
D
dapan1121 已提交
363 364 365 366 367 368 369 370 371 372
  if (len < 0) {
    taosMemoryFree(t);
    return;
  }
  varDataSetLen(t, len);

  colDataAppend(pOut->columnData, rowIndex, t, false);
  taosMemoryFree(t);
}

dengyihao's avatar
dengyihao 已提交
373 374
// TODO opt performance, tmp is not needed.
int32_t vectorConvertFromVarData(SSclVectorConvCtx *pCtx, int32_t *overflow) {
wmmhello's avatar
wmmhello 已提交
375
  bool vton = false;
376 377

  _bufConverteFunc func = NULL;
D
dapan1121 已提交
378
  if (TSDB_DATA_TYPE_BOOL == pCtx->outType) {
379
    func = varToBool;
D
dapan1121 已提交
380
  } else if (IS_SIGNED_NUMERIC_TYPE(pCtx->outType)) {
381
    func = varToSigned;
D
dapan1121 已提交
382
  } else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->outType)) {
383
    func = varToUnsigned;
D
dapan1121 已提交
384
  } else if (IS_FLOAT_TYPE(pCtx->outType)) {
385
    func = varToFloat;
dengyihao's avatar
dengyihao 已提交
386
  } else if (pCtx->outType == TSDB_DATA_TYPE_BINARY) {  // nchar -> binary
D
dapan1121 已提交
387
    ASSERT(pCtx->inType == TSDB_DATA_TYPE_NCHAR);
D
dapan1121 已提交
388 389
    func = ncharToVar;
    vton = true;
dengyihao's avatar
dengyihao 已提交
390
  } else if (pCtx->outType == TSDB_DATA_TYPE_NCHAR) {  // binary -> nchar
D
dapan1121 已提交
391
    ASSERT(pCtx->inType == TSDB_DATA_TYPE_VARCHAR);
wmmhello's avatar
wmmhello 已提交
392 393
    func = varToNchar;
    vton = true;
D
dapan1121 已提交
394
  } else if (TSDB_DATA_TYPE_TIMESTAMP == pCtx->outType) {
D
dapan1121 已提交
395
    func = varToTimestamp;
396
  } else {
D
dapan1121 已提交
397
    sclError("invalid convert outType:%d", pCtx->outType);
S
Shengliang Guan 已提交
398
    return TSDB_CODE_APP_ERROR;
399 400
  }

D
dapan1121 已提交
401 402 403 404
  pCtx->pOut->numOfRows = pCtx->pIn->numOfRows;
  for (int32_t i = pCtx->startIndex; i <= pCtx->endIndex; ++i) {
    if (IS_HELPER_NULL(pCtx->pIn->columnData, i)) {
      colDataAppendNULL(pCtx->pOut->columnData, i);
405 406 407
      continue;
    }

dengyihao's avatar
dengyihao 已提交
408
    char   *data = colDataGetVarData(pCtx->pIn->columnData, i);
D
dapan1121 已提交
409
    int32_t convertType = pCtx->inType;
dengyihao's avatar
dengyihao 已提交
410 411
    if (pCtx->inType == TSDB_DATA_TYPE_JSON) {
      if (*data == TSDB_DATA_TYPE_NULL) {
wmmhello's avatar
wmmhello 已提交
412
        ASSERT(0);
H
Hongze Cheng 已提交
413
      } else if (*data == TSDB_DATA_TYPE_NCHAR) {
414 415
        data += CHAR_BYTES;
        convertType = TSDB_DATA_TYPE_NCHAR;
H
Hongze Cheng 已提交
416
      } else if (tTagIsJson(data)) {
wmmhello's avatar
wmmhello 已提交
417 418
        terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
        return terrno;
419
      } else {
dengyihao's avatar
dengyihao 已提交
420
        convertNumberToNumber(data + CHAR_BYTES, colDataGetNumData(pCtx->pOut->columnData, i), *data, pCtx->outType);
421 422 423
        continue;
      }
    }
D
dapan1121 已提交
424
    int32_t bufSize = pCtx->pIn->columnData->info.bytes;
dengyihao's avatar
dengyihao 已提交
425 426
    char   *tmp = taosMemoryMalloc(varDataTLen(data));
    if (!tmp) {
427 428 429
      sclError("out of memory in vectorConvertFromVarData");
      return TSDB_CODE_OUT_OF_MEMORY;
    }
wmmhello's avatar
wmmhello 已提交
430 431 432
    if (vton) {
      memcpy(tmp, data, varDataTLen(data));
    } else {
433 434 435
      if (TSDB_DATA_TYPE_VARCHAR == convertType) {
        memcpy(tmp, varDataVal(data), varDataLen(data));
        tmp[varDataLen(data)] = 0;
H
Hongze Cheng 已提交
436
      } else if (TSDB_DATA_TYPE_NCHAR == convertType) {
437 438 439 440 441 442
        ASSERT(varDataLen(data) <= bufSize);

        int len = taosUcs4ToMbs((TdUcs4 *)varDataVal(data), varDataLen(data), tmp);
        if (len < 0) {
          sclError("castConvert taosUcs4ToMbs error 1");
          taosMemoryFreeClear(tmp);
S
Shengliang Guan 已提交
443
          return TSDB_CODE_APP_ERROR;
444 445 446 447
        }

        tmp[len] = 0;
      }
wmmhello's avatar
wmmhello 已提交
448
    }
dengyihao's avatar
dengyihao 已提交
449

D
dapan1121 已提交
450
    (*func)(tmp, pCtx->pOut, i, overflow);
451
    taosMemoryFreeClear(tmp);
452
  }
G
Ganlin Zhao 已提交
453

454 455 456
  return TSDB_CODE_SUCCESS;
}

H
Hongze Cheng 已提交
457 458
double getVectorDoubleValue_JSON(void *src, int32_t index) {
  char  *data = colDataGetVarData((SColumnInfoData *)src, index);
459
  double out = 0;
H
Hongze Cheng 已提交
460
  if (*data == TSDB_DATA_TYPE_NULL) {
461
    return out;
H
Hongze Cheng 已提交
462 463 464
  } else if (*data == TSDB_DATA_TYPE_NCHAR) {  // json inner type can not be BINARY
    convertNcharToDouble(data + CHAR_BYTES, &out);
  } else if (tTagIsJson(data)) {
wmmhello's avatar
wmmhello 已提交
465 466
    terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
    return 0;
H
Hongze Cheng 已提交
467 468
  } else {
    convertNumberToNumber(data + CHAR_BYTES, &out, *data, TSDB_DATA_TYPE_DOUBLE);
469 470 471 472
  }
  return out;
}

H
Hongze Cheng 已提交
473
void *ncharTobinary(void *buf) {  // todo need to remove , if tobinary is nchar
wmmhello's avatar
wmmhello 已提交
474
  int32_t inputLen = varDataTLen(buf);
475

H
Hongze Cheng 已提交
476 477
  void   *t = taosMemoryCalloc(1, inputLen);
  int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(buf), varDataLen(buf), varDataVal(t));
478 479
  if (len < 0) {
    sclError("charset:%s to %s. val:%s convert ncharTobinary failed.", DEFAULT_UNICODE_ENCODEC, tsCharset,
H
Hongze Cheng 已提交
480
             (char *)varDataVal(buf));
481 482 483 484 485 486 487
    taosMemoryFree(t);
    return NULL;
  }
  varDataSetLen(t, len);
  return t;
}

H
Hongze Cheng 已提交
488 489 490
bool convertJsonValue(__compar_fn_t *fp, int32_t optr, int8_t typeLeft, int8_t typeRight, char **pLeftData,
                      char **pRightData, void *pLeftOut, void *pRightOut, bool *isNull, bool *freeLeft,
                      bool *freeRight) {
G
Ganlin Zhao 已提交
491
  if (optr == OP_TYPE_JSON_CONTAINS) {
wmmhello's avatar
wmmhello 已提交
492
    return true;
493 494
  }

G
Ganlin Zhao 已提交
495
  if (typeLeft != TSDB_DATA_TYPE_JSON && typeRight != TSDB_DATA_TYPE_JSON) {
wmmhello's avatar
wmmhello 已提交
496
    return true;
497 498
  }

G
Ganlin Zhao 已提交
499 500
  if (typeLeft == TSDB_DATA_TYPE_JSON) {
    if (tTagIsJson(*pLeftData)) {
wmmhello's avatar
wmmhello 已提交
501 502 503
      terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
      return false;
    }
504
    typeLeft = **pLeftData;
H
Hongze Cheng 已提交
505
    (*pLeftData)++;
506
  }
G
Ganlin Zhao 已提交
507
  if (typeRight == TSDB_DATA_TYPE_JSON) {
wmmhello's avatar
wmmhello 已提交
508
    if (tTagIsJson(*pRightData)) {
wmmhello's avatar
wmmhello 已提交
509 510 511
      terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
      return false;
    }
512
    typeRight = **pRightData;
H
Hongze Cheng 已提交
513
    (*pRightData)++;
514
  }
wmmhello's avatar
wmmhello 已提交
515

G
Ganlin Zhao 已提交
516 517
  if (optr == OP_TYPE_LIKE || optr == OP_TYPE_NOT_LIKE || optr == OP_TYPE_MATCH || optr == OP_TYPE_NMATCH) {
    if (typeLeft != TSDB_DATA_TYPE_NCHAR && typeLeft != TSDB_DATA_TYPE_BINARY) {
wmmhello's avatar
wmmhello 已提交
518 519 520 521
      return false;
    }
  }

wmmhello's avatar
wmmhello 已提交
522
  // if types can not comparable
G
Ganlin Zhao 已提交
523 524 525 526 527 528
  if ((IS_NUMERIC_TYPE(typeLeft) && !IS_NUMERIC_TYPE(typeRight)) ||
      (IS_NUMERIC_TYPE(typeRight) && !IS_NUMERIC_TYPE(typeLeft)) ||
      (IS_VAR_DATA_TYPE(typeLeft) && !IS_VAR_DATA_TYPE(typeRight)) ||
      (IS_VAR_DATA_TYPE(typeRight) && !IS_VAR_DATA_TYPE(typeLeft)) ||
      ((typeLeft == TSDB_DATA_TYPE_BOOL) && (typeRight != TSDB_DATA_TYPE_BOOL)) ||
      ((typeRight == TSDB_DATA_TYPE_BOOL) && (typeLeft != TSDB_DATA_TYPE_BOOL)))
wmmhello's avatar
wmmhello 已提交
529 530
    return false;

G
Ganlin Zhao 已提交
531
  if (typeLeft == TSDB_DATA_TYPE_NULL || typeRight == TSDB_DATA_TYPE_NULL) {
532
    *isNull = true;
wmmhello's avatar
wmmhello 已提交
533
    return true;
534
  }
535 536
  int8_t type = vectorGetConvertType(typeLeft, typeRight);

G
Ganlin Zhao 已提交
537
  if (type == 0) {
538
    *fp = filterGetCompFunc(typeLeft, optr);
wmmhello's avatar
wmmhello 已提交
539
    return true;
540 541 542 543
  }

  *fp = filterGetCompFunc(type, optr);

G
Ganlin Zhao 已提交
544 545
  if (IS_NUMERIC_TYPE(type)) {
    if (typeLeft == TSDB_DATA_TYPE_NCHAR) {
wmmhello's avatar
wmmhello 已提交
546
      ASSERT(0);
H
Hongze Cheng 已提交
547 548
      //      convertNcharToDouble(*pLeftData, pLeftOut);
      //      *pLeftData = pLeftOut;
G
Ganlin Zhao 已提交
549
    } else if (typeLeft == TSDB_DATA_TYPE_BINARY) {
wmmhello's avatar
wmmhello 已提交
550
      ASSERT(0);
H
Hongze Cheng 已提交
551 552
      //      convertBinaryToDouble(*pLeftData, pLeftOut);
      //      *pLeftData = pLeftOut;
G
Ganlin Zhao 已提交
553
    } else if (typeLeft != type) {
554 555 556 557
      convertNumberToNumber(*pLeftData, pLeftOut, typeLeft, type);
      *pLeftData = pLeftOut;
    }

G
Ganlin Zhao 已提交
558
    if (typeRight == TSDB_DATA_TYPE_NCHAR) {
wmmhello's avatar
wmmhello 已提交
559
      ASSERT(0);
H
Hongze Cheng 已提交
560 561
      //      convertNcharToDouble(*pRightData, pRightOut);
      //      *pRightData = pRightOut;
G
Ganlin Zhao 已提交
562
    } else if (typeRight == TSDB_DATA_TYPE_BINARY) {
wmmhello's avatar
wmmhello 已提交
563
      ASSERT(0);
H
Hongze Cheng 已提交
564 565
      //      convertBinaryToDouble(*pRightData, pRightOut);
      //      *pRightData = pRightOut;
G
Ganlin Zhao 已提交
566
    } else if (typeRight != type) {
567 568 569
      convertNumberToNumber(*pRightData, pRightOut, typeRight, type);
      *pRightData = pRightOut;
    }
G
Ganlin Zhao 已提交
570 571
  } else if (type == TSDB_DATA_TYPE_BINARY) {
    if (typeLeft == TSDB_DATA_TYPE_NCHAR) {
572 573 574
      *pLeftData = ncharTobinary(*pLeftData);
      *freeLeft = true;
    }
G
Ganlin Zhao 已提交
575
    if (typeRight == TSDB_DATA_TYPE_NCHAR) {
576 577 578
      *pRightData = ncharTobinary(*pRightData);
      *freeRight = true;
    }
G
Ganlin Zhao 已提交
579
  } else {
580
    ASSERT(0);
581 582
  }

wmmhello's avatar
wmmhello 已提交
583
  return true;
584 585
}

D
dapan1121 已提交
586
int32_t vectorConvertToVarData(SSclVectorConvCtx *pCtx) {
dengyihao's avatar
dengyihao 已提交
587 588 589
  SColumnInfoData *pInputCol = pCtx->pIn->columnData;
  SColumnInfoData *pOutputCol = pCtx->pOut->columnData;
  char             tmp[128] = {0};
D
fix bug  
dapan1121 已提交
590

dengyihao's avatar
dengyihao 已提交
591 592
  if (IS_SIGNED_NUMERIC_TYPE(pCtx->inType) || pCtx->inType == TSDB_DATA_TYPE_BOOL ||
      pCtx->inType == TSDB_DATA_TYPE_TIMESTAMP) {
D
dapan1121 已提交
593
    for (int32_t i = pCtx->startIndex; i <= pCtx->endIndex; ++i) {
D
fix bug  
dapan1121 已提交
594 595 596 597
      if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
        colDataAppendNULL(pOutputCol, i);
        continue;
      }
G
Ganlin Zhao 已提交
598

D
fix bug  
dapan1121 已提交
599
      int64_t value = 0;
D
dapan1121 已提交
600
      GET_TYPED_DATA(value, int64_t, pCtx->inType, colDataGetData(pInputCol, i));
D
fix bug  
dapan1121 已提交
601 602
      int32_t len = sprintf(varDataVal(tmp), "%" PRId64, value);
      varDataLen(tmp) = len;
D
dapan1121 已提交
603 604
      if (pCtx->outType == TSDB_DATA_TYPE_NCHAR) {
        varToNchar(tmp, pCtx->pOut, i, NULL);
D
fix bug  
dapan1121 已提交
605
      } else {
D
dapan1121 已提交
606
        colDataAppend(pOutputCol, i, (char *)tmp, false);
D
fix bug  
dapan1121 已提交
607 608
      }
    }
D
dapan1121 已提交
609 610
  } else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->inType)) {
    for (int32_t i = pCtx->startIndex; i <= pCtx->endIndex; ++i) {
D
fix bug  
dapan1121 已提交
611 612 613 614
      if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
        colDataAppendNULL(pOutputCol, i);
        continue;
      }
G
Ganlin Zhao 已提交
615

D
fix bug  
dapan1121 已提交
616
      uint64_t value = 0;
D
dapan1121 已提交
617
      GET_TYPED_DATA(value, uint64_t, pCtx->inType, colDataGetData(pInputCol, i));
D
fix bug  
dapan1121 已提交
618 619
      int32_t len = sprintf(varDataVal(tmp), "%" PRIu64, value);
      varDataLen(tmp) = len;
D
dapan1121 已提交
620 621
      if (pCtx->outType == TSDB_DATA_TYPE_NCHAR) {
        varToNchar(tmp, pCtx->pOut, i, NULL);
D
fix bug  
dapan1121 已提交
622
      } else {
D
dapan1121 已提交
623
        colDataAppend(pOutputCol, i, (char *)tmp, false);
D
fix bug  
dapan1121 已提交
624 625
      }
    }
D
dapan1121 已提交
626 627
  } else if (IS_FLOAT_TYPE(pCtx->inType)) {
    for (int32_t i = pCtx->startIndex; i <= pCtx->endIndex; ++i) {
D
fix bug  
dapan1121 已提交
628 629 630 631
      if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
        colDataAppendNULL(pOutputCol, i);
        continue;
      }
G
Ganlin Zhao 已提交
632

D
fix bug  
dapan1121 已提交
633
      double value = 0;
D
dapan1121 已提交
634
      GET_TYPED_DATA(value, double, pCtx->inType, colDataGetData(pInputCol, i));
D
fix bug  
dapan1121 已提交
635 636
      int32_t len = sprintf(varDataVal(tmp), "%lf", value);
      varDataLen(tmp) = len;
D
dapan1121 已提交
637 638
      if (pCtx->outType == TSDB_DATA_TYPE_NCHAR) {
        varToNchar(tmp, pCtx->pOut, i, NULL);
D
fix bug  
dapan1121 已提交
639
      } else {
D
dapan1121 已提交
640
        colDataAppend(pOutputCol, i, (char *)tmp, false);
D
fix bug  
dapan1121 已提交
641 642 643
      }
    }
  } else {
D
dapan1121 已提交
644
    sclError("not supported input type:%d", pCtx->inType);
S
Shengliang Guan 已提交
645
    return TSDB_CODE_APP_ERROR;
D
fix bug  
dapan1121 已提交
646 647 648 649 650
  }

  return TSDB_CODE_SUCCESS;
}

651
// TODO opt performance
dengyihao's avatar
dengyihao 已提交
652 653 654 655
int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, int32_t *overflow, int32_t startIndex,
                                   int32_t numOfRows) {
  SColumnInfoData *pInputCol = pIn->columnData;
  SColumnInfoData *pOutputCol = pOut->columnData;
H
Haojun Liao 已提交
656

D
dapan1121 已提交
657 658 659 660
  if (NULL == pInputCol) {
    sclError("input column is NULL, hashFilter %p", pIn->pHashFilter);
    return TSDB_CODE_APP_ERROR;
  }
D
dapan1121 已提交
661

dengyihao's avatar
dengyihao 已提交
662 663
  int32_t           rstart = (startIndex >= 0 && startIndex < pIn->numOfRows) ? startIndex : 0;
  int32_t           rend = numOfRows > 0 ? rstart + numOfRows - 1 : rstart + pIn->numOfRows - 1;
D
dapan1121 已提交
664 665 666 667
  SSclVectorConvCtx cCtx = {pIn, pOut, rstart, rend, pInputCol->info.type, pOutputCol->info.type};

  if (IS_VAR_DATA_TYPE(cCtx.inType)) {
    return vectorConvertFromVarData(&cCtx, overflow);
D
dapan1121 已提交
668 669 670 671 672 673
  }

  if (overflow) {
    ASSERT(1 == pIn->numOfRows);

    pOut->numOfRows = 0;
dengyihao's avatar
dengyihao 已提交
674

D
dapan1121 已提交
675 676 677
    if (IS_SIGNED_NUMERIC_TYPE(cCtx.outType)) {
      int64_t minValue = tDataTypes[cCtx.outType].minValue;
      int64_t maxValue = tDataTypes[cCtx.outType].maxValue;
dengyihao's avatar
dengyihao 已提交
678

D
dapan1121 已提交
679
      double value = 0;
D
dapan1121 已提交
680
      GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, 0));
dengyihao's avatar
dengyihao 已提交
681

D
dapan1121 已提交
682 683 684 685 686 687 688 689 690
      if (value > maxValue) {
        *overflow = 1;
        return TSDB_CODE_SUCCESS;
      } else if (value < minValue) {
        *overflow = -1;
        return TSDB_CODE_SUCCESS;
      } else {
        *overflow = 0;
      }
D
dapan1121 已提交
691 692 693
    } else if (IS_UNSIGNED_NUMERIC_TYPE(cCtx.outType)) {
      uint64_t minValue = (uint64_t)tDataTypes[cCtx.outType].minValue;
      uint64_t maxValue = (uint64_t)tDataTypes[cCtx.outType].maxValue;
dengyihao's avatar
dengyihao 已提交
694

D
dapan1121 已提交
695
      double value = 0;
D
dapan1121 已提交
696
      GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, 0));
dengyihao's avatar
dengyihao 已提交
697

D
dapan1121 已提交
698 699 700 701 702 703 704 705 706 707
      if (value > maxValue) {
        *overflow = 1;
        return TSDB_CODE_SUCCESS;
      } else if (value < minValue) {
        *overflow = -1;
        return TSDB_CODE_SUCCESS;
      } else {
        *overflow = 0;
      }
    }
D
dapan 已提交
708
  }
709 710

  pOut->numOfRows = pIn->numOfRows;
D
dapan1121 已提交
711
  switch (cCtx.outType) {
712
    case TSDB_DATA_TYPE_BOOL: {
D
dapan1121 已提交
713
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
714
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
715
          colDataAppendNULL(pOutputCol, i);
716 717 718 719
          continue;
        }

        bool value = 0;
D
dapan1121 已提交
720
        GET_TYPED_DATA(value, bool, cCtx.inType, colDataGetData(pInputCol, i));
D
dapan1121 已提交
721 722 723 724 725
        colDataAppendInt8(pOutputCol, i, (int8_t *)&value);
      }
      break;
    }
    case TSDB_DATA_TYPE_TINYINT: {
D
dapan1121 已提交
726
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
D
dapan1121 已提交
727 728 729 730 731 732
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
          colDataAppendNULL(pOutputCol, i);
          continue;
        }

        int8_t value = 0;
D
dapan1121 已提交
733
        GET_TYPED_DATA(value, int8_t, cCtx.inType, colDataGetData(pInputCol, i));
D
dapan1121 已提交
734 735 736 737
        colDataAppendInt8(pOutputCol, i, (int8_t *)&value);
      }
      break;
    }
dengyihao's avatar
dengyihao 已提交
738
    case TSDB_DATA_TYPE_SMALLINT: {
D
dapan1121 已提交
739
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
D
dapan1121 已提交
740 741 742 743 744 745
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
          colDataAppendNULL(pOutputCol, i);
          continue;
        }

        int16_t value = 0;
D
dapan1121 已提交
746
        GET_TYPED_DATA(value, int16_t, cCtx.inType, colDataGetData(pInputCol, i));
D
dapan1121 已提交
747 748 749 750
        colDataAppendInt16(pOutputCol, i, (int16_t *)&value);
      }
      break;
    }
dengyihao's avatar
dengyihao 已提交
751
    case TSDB_DATA_TYPE_INT: {
D
dapan1121 已提交
752
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
D
dapan1121 已提交
753 754 755 756 757 758
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
          colDataAppendNULL(pOutputCol, i);
          continue;
        }

        int32_t value = 0;
D
dapan1121 已提交
759
        GET_TYPED_DATA(value, int32_t, cCtx.inType, colDataGetData(pInputCol, i));
D
dapan1121 已提交
760
        colDataAppendInt32(pOutputCol, i, (int32_t *)&value);
761 762 763
      }
      break;
    }
D
dapan1121 已提交
764
    case TSDB_DATA_TYPE_BIGINT:
765
    case TSDB_DATA_TYPE_TIMESTAMP: {
D
dapan1121 已提交
766
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
767
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
768
          colDataAppendNULL(pOutputCol, i);
D
dapan 已提交
769
          continue;
D
dapan1121 已提交
770
        }
D
dapan 已提交
771 772

        int64_t value = 0;
D
dapan1121 已提交
773
        GET_TYPED_DATA(value, int64_t, cCtx.inType, colDataGetData(pInputCol, i));
D
dapan1121 已提交
774
        colDataAppendInt64(pOutputCol, i, (int64_t *)&value);
D
dapan1121 已提交
775 776
      }
      break;
777
    }
dengyihao's avatar
dengyihao 已提交
778
    case TSDB_DATA_TYPE_UTINYINT: {
D
dapan1121 已提交
779
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
D
dapan1121 已提交
780 781 782 783
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
          colDataAppendNULL(pOutputCol, i);
          continue;
        }
G
Ganlin Zhao 已提交
784

D
dapan1121 已提交
785
        uint8_t value = 0;
D
dapan1121 已提交
786
        GET_TYPED_DATA(value, uint8_t, cCtx.inType, colDataGetData(pInputCol, i));
D
dapan1121 已提交
787 788 789 790
        colDataAppendInt8(pOutputCol, i, (int8_t *)&value);
      }
      break;
    }
dengyihao's avatar
dengyihao 已提交
791
    case TSDB_DATA_TYPE_USMALLINT: {
D
dapan1121 已提交
792
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
D
dapan1121 已提交
793 794 795 796
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
          colDataAppendNULL(pOutputCol, i);
          continue;
        }
G
Ganlin Zhao 已提交
797

D
dapan1121 已提交
798
        uint16_t value = 0;
D
dapan1121 已提交
799
        GET_TYPED_DATA(value, uint16_t, cCtx.inType, colDataGetData(pInputCol, i));
D
dapan1121 已提交
800 801 802 803
        colDataAppendInt16(pOutputCol, i, (int16_t *)&value);
      }
      break;
    }
dengyihao's avatar
dengyihao 已提交
804
    case TSDB_DATA_TYPE_UINT: {
D
dapan1121 已提交
805
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
D
dapan1121 已提交
806 807 808 809
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
          colDataAppendNULL(pOutputCol, i);
          continue;
        }
G
Ganlin Zhao 已提交
810

D
dapan1121 已提交
811
        uint32_t value = 0;
D
dapan1121 已提交
812
        GET_TYPED_DATA(value, uint32_t, cCtx.inType, colDataGetData(pInputCol, i));
D
dapan1121 已提交
813 814 815 816 817
        colDataAppendInt32(pOutputCol, i, (int32_t *)&value);
      }
      break;
    }
    case TSDB_DATA_TYPE_UBIGINT: {
D
dapan1121 已提交
818
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
819
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
820
          colDataAppendNULL(pOutputCol, i);
D
dapan 已提交
821
          continue;
D
dapan1121 已提交
822
        }
G
Ganlin Zhao 已提交
823

D
dapan 已提交
824
        uint64_t value = 0;
D
dapan1121 已提交
825
        GET_TYPED_DATA(value, uint64_t, cCtx.inType, colDataGetData(pInputCol, i));
dengyihao's avatar
dengyihao 已提交
826
        colDataAppendInt64(pOutputCol, i, (int64_t *)&value);
D
dapan1121 已提交
827 828
      }
      break;
D
dapan1121 已提交
829
    }
dengyihao's avatar
dengyihao 已提交
830
    case TSDB_DATA_TYPE_FLOAT: {
D
dapan1121 已提交
831
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
D
dapan1121 已提交
832 833 834 835
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
          colDataAppendNULL(pOutputCol, i);
          continue;
        }
G
Ganlin Zhao 已提交
836

D
dapan1121 已提交
837
        float value = 0;
D
dapan1121 已提交
838
        GET_TYPED_DATA(value, float, cCtx.inType, colDataGetData(pInputCol, i));
dengyihao's avatar
dengyihao 已提交
839
        colDataAppendFloat(pOutputCol, i, (float *)&value);
D
dapan1121 已提交
840
      }
G
Ganlin Zhao 已提交
841
      break;
D
dapan1121 已提交
842 843
    }
    case TSDB_DATA_TYPE_DOUBLE: {
D
dapan1121 已提交
844
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
845
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
846
          colDataAppendNULL(pOutputCol, i);
D
dapan 已提交
847
          continue;
D
dapan1121 已提交
848
        }
G
Ganlin Zhao 已提交
849

D
dapan 已提交
850
        double value = 0;
D
dapan1121 已提交
851
        GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, i));
dengyihao's avatar
dengyihao 已提交
852
        colDataAppendDouble(pOutputCol, i, (double *)&value);
D
dapan1121 已提交
853
      }
G
Ganlin Zhao 已提交
854
      break;
D
dapan1121 已提交
855
    }
G
Ganlin Zhao 已提交
856
    case TSDB_DATA_TYPE_BINARY:
D
fix bug  
dapan1121 已提交
857
    case TSDB_DATA_TYPE_NCHAR: {
D
dapan1121 已提交
858
      return vectorConvertToVarData(&cCtx);
D
fix bug  
dapan1121 已提交
859
    }
D
dapan1121 已提交
860
    default:
D
dapan1121 已提交
861
      sclError("invalid convert output type:%d", cCtx.outType);
S
Shengliang Guan 已提交
862
      return TSDB_CODE_APP_ERROR;
D
dapan1121 已提交
863 864 865 866 867
  }

  return TSDB_CODE_SUCCESS;
}

H
Hongze Cheng 已提交
868 869
int8_t gConvertTypes[TSDB_DATA_TYPE_BLOB + 1][TSDB_DATA_TYPE_BLOB + 1] = {
    /*         NULL BOOL TINY SMAL INT  BIG  FLOA DOUB VARC TIME NCHA UTIN USMA UINT UBIG JSON VARB DECI BLOB */
dengyihao's avatar
dengyihao 已提交
870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888
    /*NULL*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0,
    /*BOOL*/ 0, 0, 2, 3, 4, 5, 6, 7, 5, 9, 7, 11, 12, 13, 14, 0, 7, 0, 0,
    /*TINY*/ 0, 0, 0, 3, 4, 5, 6, 7, 5, 9, 7, 3,  4,  5,  7,  0, 7, 0, 0,
    /*SMAL*/ 0, 0, 0, 0, 4, 5, 6, 7, 5, 9, 7, 3,  4,  5,  7,  0, 7, 0, 0,
    /*INT */ 0, 0, 0, 0, 0, 5, 6, 7, 5, 9, 7, 4,  4,  5,  7,  0, 7, 0, 0,
    /*BIGI*/ 0, 0, 0, 0, 0, 0, 6, 7, 5, 9, 7, 5,  5,  5,  7,  0, 7, 0, 0,
    /*FLOA*/ 0, 0, 0, 0, 0, 0, 0, 7, 7, 6, 7, 6,  6,  6,  6,  0, 7, 0, 0,
    /*DOUB*/ 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7,  7,  7,  7,  0, 7, 0, 0,
    /*VARC*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 7,  7,  7,  7,  0, 0, 0, 0,
    /*TIME*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,  9,  9,  7,  0, 7, 0, 0,
    /*NCHA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,  7,  7,  7,  0, 0, 0, 0,
    /*UTIN*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  12, 13, 14, 0, 7, 0, 0,
    /*USMA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  13, 14, 0, 7, 0, 0,
    /*UINT*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  14, 0, 7, 0, 0,
    /*UBIG*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 7, 0, 0,
    /*JSON*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0,
    /*VARB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0,
    /*DECI*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0,
    /*BLOB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0, 0, 0, 0};
D
dapan1121 已提交
889

D
dapan1121 已提交
890 891 892 893 894 895 896 897 898 899 900 901
int32_t vectorGetConvertType(int32_t type1, int32_t type2) {
  if (type1 == type2) {
    return 0;
  }

  if (type1 < type2) {
    return gConvertTypes[type1][type2];
  }

  return gConvertTypes[type2][type1];
}

dengyihao's avatar
dengyihao 已提交
902 903
int32_t vectorConvertSingleCol(SScalarParam *input, SScalarParam *output, int32_t type, int32_t startIndex,
                               int32_t numOfRows) {
D
dapan1121 已提交
904 905 906
  SDataType t = {.type = type, .bytes = tDataTypes[type].bytes};
  output->numOfRows = input->numOfRows;

H
Haojun Liao 已提交
907 908
  int32_t code = sclCreateColumnInfoData(&t, input->numOfRows, output);
  if (code != TSDB_CODE_SUCCESS) {
D
dapan1121 已提交
909
    return TSDB_CODE_OUT_OF_MEMORY;
D
dapan1121 已提交
910 911
  }

D
dapan1121 已提交
912
  code = vectorConvertSingleColImpl(input, output, NULL, startIndex, numOfRows);
D
dapan1121 已提交
913 914 915 916 917 918 919
  if (code) {
    return code;
  }

  return TSDB_CODE_SUCCESS;
}

dengyihao's avatar
dengyihao 已提交
920 921 922
int32_t vectorConvertCols(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pLeftOut, SScalarParam *pRightOut,
                          int32_t startIndex, int32_t numOfRows) {
  int32_t leftType = GET_PARAM_TYPE(pLeft);
923 924
  int32_t rightType = GET_PARAM_TYPE(pRight);
  if (leftType == rightType) {
D
dapan1121 已提交
925 926 927
    return TSDB_CODE_SUCCESS;
  }

G
Ganlin Zhao 已提交
928
  SScalarParam *param1 = NULL, *paramOut1 = NULL;
D
dapan1121 已提交
929
  SScalarParam *param2 = NULL, *paramOut2 = NULL;
H
Hongze Cheng 已提交
930
  int32_t       code = 0;
G
Ganlin Zhao 已提交
931

932
  if (leftType < rightType) {
D
dapan1121 已提交
933 934 935 936 937 938 939 940 941 942 943
    param1 = pLeft;
    param2 = pRight;
    paramOut1 = pLeftOut;
    paramOut2 = pRightOut;
  } else {
    param1 = pRight;
    param2 = pLeft;
    paramOut1 = pRightOut;
    paramOut2 = pLeftOut;
  }

944
  int8_t type = vectorGetConvertType(GET_PARAM_TYPE(param1), GET_PARAM_TYPE(param2));
D
dapan1121 已提交
945 946 947 948
  if (0 == type) {
    return TSDB_CODE_SUCCESS;
  }

949
  if (type != GET_PARAM_TYPE(param1)) {
D
dapan1121 已提交
950
    code = vectorConvertSingleCol(param1, paramOut1, type, startIndex, numOfRows);
D
dapan1121 已提交
951 952 953
    if (code) {
      return code;
    }
D
dapan1121 已提交
954
  }
G
Ganlin Zhao 已提交
955

956
  if (type != GET_PARAM_TYPE(param2)) {
D
dapan1121 已提交
957
    code = vectorConvertSingleCol(param2, paramOut2, type, startIndex, numOfRows);
D
dapan1121 已提交
958 959 960
    if (code) {
      return code;
    }
D
dapan1121 已提交
961 962 963 964 965
  }

  return TSDB_CODE_SUCCESS;
}

H
Haojun Liao 已提交
966 967 968 969 970
enum {
  VECTOR_DO_CONVERT = 0x1,
  VECTOR_UN_CONVERT = 0x2,
};

971
// TODO not correct for descending order scan
H
Hongze Cheng 已提交
972 973 974
static void vectorMathAddHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
                                int32_t numOfRows, int32_t step, int32_t i) {
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
975 976 977 978
  _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);

  double *output = (double *)pOutputCol->pData;

wmmhello's avatar
wmmhello 已提交
979
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
980
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
981 982
  } else {
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
983
      if (IS_HELPER_NULL(pLeftCol, i)) {
984 985 986
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
H
Hongze Cheng 已提交
987
      *output = getVectorDoubleValueFnLeft(LEFT_COL, i) + getVectorDoubleValueFnRight(RIGHT_COL, 0);
D
dapan1121 已提交
988 989
    }
  }
990
}
D
dapan1121 已提交
991

H
Hongze Cheng 已提交
992 993 994
static void vectorMathTsAddHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
                                  int32_t numOfRows, int32_t step, int32_t i) {
  _getBigintValue_fn_t getVectorBigintValueFnLeft = getVectorBigintValueFn(pLeftCol->info.type);
995 996 997 998
  _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);

  int64_t *output = (int64_t *)pOutputCol->pData;

wmmhello's avatar
wmmhello 已提交
999
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1000 1001 1002
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
  } else {
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1003
      if (IS_HELPER_NULL(pLeftCol, i)) {
1004 1005 1006
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
H
Hongze Cheng 已提交
1007 1008 1009
      *output =
          taosTimeAdd(getVectorBigintValueFnLeft(pLeftCol->pData, i), getVectorBigintValueFnRight(pRightCol->pData, 0),
                      pRightCol->info.scale, pRightCol->info.precision);
1010 1011 1012 1013
    }
  }
}

dengyihao's avatar
dengyihao 已提交
1014 1015 1016
static SColumnInfoData *vectorConvertVarToDouble(SScalarParam *pInput, int32_t *converted) {
  SScalarParam     output = {0};
  SColumnInfoData *pCol = pInput->columnData;
H
Haojun Liao 已提交
1017

D
dapan1121 已提交
1018 1019 1020 1021 1022 1023
  if (IS_VAR_DATA_TYPE(pCol->info.type) && pCol->info.type != TSDB_DATA_TYPE_JSON) {
    int32_t code = vectorConvertSingleCol(pInput, &output, TSDB_DATA_TYPE_DOUBLE, -1, -1);
    if (code != TSDB_CODE_SUCCESS) {
      terrno = code;
      return NULL;
    }
H
Haojun Liao 已提交
1024

D
dapan1121 已提交
1025 1026 1027
    *converted = VECTOR_DO_CONVERT;

    return output.columnData;
H
Haojun Liao 已提交
1028
  }
D
dapan1121 已提交
1029 1030

  *converted = VECTOR_UN_CONVERT;
dengyihao's avatar
dengyihao 已提交
1031

D
dapan1121 已提交
1032
  return pInput->columnData;
H
Haojun Liao 已提交
1033 1034
}

H
Hongze Cheng 已提交
1035
static void doReleaseVec(SColumnInfoData *pCol, int32_t type) {
H
Haojun Liao 已提交
1036 1037
  if (type == VECTOR_DO_CONVERT) {
    colDataDestroy(pCol);
H
Haojun Liao 已提交
1038
    taosMemoryFree(pCol);
H
Haojun Liao 已提交
1039 1040 1041
  }
}

H
Hongze Cheng 已提交
1042
void vectorMathAdd(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1043 1044
  SColumnInfoData *pOutputCol = pOut->columnData;

H
Hongze Cheng 已提交
1045 1046
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
1047

1048 1049
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);

dengyihao's avatar
dengyihao 已提交
1050 1051 1052
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
1053

1054 1055 1056
  if ((GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && IS_INTEGER_TYPE(GET_PARAM_TYPE(pRight))) ||
      (GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_TIMESTAMP && IS_INTEGER_TYPE(GET_PARAM_TYPE(pLeft))) ||
      (GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_BOOL) ||
H
Hongze Cheng 已提交
1057 1058 1059 1060
      (GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_TIMESTAMP &&
       GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_BOOL)) {  // timestamp plus duration
    int64_t             *output = (int64_t *)pOutputCol->pData;
    _getBigintValue_fn_t getVectorBigintValueFnLeft = getVectorBigintValueFn(pLeftCol->info.type);
1061
    _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);
1062

D
dapan1121 已提交
1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073
    if (pLeft->numOfRows == 1 && pRight->numOfRows == 1) {
      if (GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP) {
        vectorMathTsAddHelper(pLeftCol, pRightCol, pOutputCol, pRight->numOfRows, step, i);
      } else {
        vectorMathTsAddHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i);
      }
    } else if (pLeft->numOfRows == 1) {
      vectorMathTsAddHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i);
    } else if (pRight->numOfRows == 1) {
      vectorMathTsAddHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i);
    } else if (pLeft->numOfRows == pRight->numOfRows) {
1074
      for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1075
        if (IS_NULL) {
wmmhello's avatar
wmmhello 已提交
1076 1077 1078
          colDataAppendNULL(pOutputCol, i);
          continue;  // TODO set null or ignore
        }
1079
        *output = getVectorBigintValueFnLeft(pLeftCol->pData, i) + getVectorBigintValueFnRight(pRightCol->pData, i);
1080
      }
G
Ganlin Zhao 已提交
1081
    }
1082
  } else {
H
Hongze Cheng 已提交
1083 1084
    double              *output = (double *)pOutputCol->pData;
    _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
1085
    _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);
1086

1087 1088
    if (pLeft->numOfRows == pRight->numOfRows) {
      for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
H
Hongze Cheng 已提交
1089
        if (IS_NULL) {
1090 1091 1092 1093
          colDataAppendNULL(pOutputCol, i);
          continue;  // TODO set null or ignore
        }
        *output = getVectorDoubleValueFnLeft(LEFT_COL, i) + getVectorDoubleValueFnRight(RIGHT_COL, i);
1094 1095 1096 1097 1098 1099
      }
    } else if (pLeft->numOfRows == 1) {
      vectorMathAddHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i);
    } else if (pRight->numOfRows == 1) {
      vectorMathAddHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i);
    }
1100
  }
H
Haojun Liao 已提交
1101 1102 1103

  doReleaseVec(pLeftCol, leftConvert);
  doReleaseVec(pRightCol, rightConvert);
1104
}
D
dapan1121 已提交
1105

1106
// TODO not correct for descending order scan
H
Hongze Cheng 已提交
1107 1108 1109
static void vectorMathSubHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
                                int32_t numOfRows, int32_t step, int32_t factor, int32_t i) {
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
1110 1111 1112 1113
  _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);

  double *output = (double *)pOutputCol->pData;

wmmhello's avatar
wmmhello 已提交
1114
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1115
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
1116 1117
  } else {
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1118
      if (IS_HELPER_NULL(pLeftCol, i)) {
1119 1120 1121
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
H
Hongze Cheng 已提交
1122
      *output = (getVectorDoubleValueFnLeft(LEFT_COL, i) - getVectorDoubleValueFnRight(RIGHT_COL, 0)) * factor;
D
dapan1121 已提交
1123
    }
1124 1125
  }
}
D
dapan1121 已提交
1126

H
Hongze Cheng 已提交
1127 1128 1129
static void vectorMathTsSubHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
                                  int32_t numOfRows, int32_t step, int32_t factor, int32_t i) {
  _getBigintValue_fn_t getVectorBigintValueFnLeft = getVectorBigintValueFn(pLeftCol->info.type);
1130 1131 1132 1133
  _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);

  int64_t *output = (int64_t *)pOutputCol->pData;

wmmhello's avatar
wmmhello 已提交
1134
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1135 1136 1137
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
  } else {
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1138
      if (IS_HELPER_NULL(pLeftCol, i)) {
1139 1140 1141
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
H
Hongze Cheng 已提交
1142 1143 1144
      *output =
          taosTimeAdd(getVectorBigintValueFnLeft(pLeftCol->pData, i), -getVectorBigintValueFnRight(pRightCol->pData, 0),
                      pRightCol->info.scale, pRightCol->info.precision);
1145 1146 1147 1148
    }
  }
}

H
Hongze Cheng 已提交
1149
void vectorMathSub(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1150
  SColumnInfoData *pOutputCol = pOut->columnData;
D
dapan1121 已提交
1151

1152 1153
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);

H
Hongze Cheng 已提交
1154 1155
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
D
dapan1121 已提交
1156

dengyihao's avatar
dengyihao 已提交
1157 1158 1159
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
1160

1161
  if ((GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_BIGINT) ||
H
Hongze Cheng 已提交
1162 1163 1164 1165
      (GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_TIMESTAMP &&
       GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_BIGINT)) {  // timestamp minus duration
    int64_t             *output = (int64_t *)pOutputCol->pData;
    _getBigintValue_fn_t getVectorBigintValueFnLeft = getVectorBigintValueFn(pLeftCol->info.type);
1166
    _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);
1167

D
dapan1121 已提交
1168 1169 1170 1171 1172 1173 1174
    if (pLeft->numOfRows == 1 && pRight->numOfRows == 1) {
      vectorMathTsSubHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, 1, i);
    } else if (pLeft->numOfRows == 1) {
      vectorMathTsSubHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, -1, i);
    } else if (pRight->numOfRows == 1) {
      vectorMathTsSubHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, 1, i);
    } else if (pLeft->numOfRows == pRight->numOfRows) {
1175
      for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1176
        if (IS_NULL) {
wmmhello's avatar
wmmhello 已提交
1177 1178 1179
          colDataAppendNULL(pOutputCol, i);
          continue;  // TODO set null or ignore
        }
1180
        *output = getVectorBigintValueFnLeft(pLeftCol->pData, i) - getVectorBigintValueFnRight(pRightCol->pData, i);
1181
      }
D
dapan1121 已提交
1182
    }
1183
  } else {
H
Hongze Cheng 已提交
1184 1185
    double              *output = (double *)pOutputCol->pData;
    _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
1186 1187 1188 1189
    _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);

    if (pLeft->numOfRows == pRight->numOfRows) {
      for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1190
        if (IS_NULL) {
1191 1192 1193 1194
          colDataAppendNULL(pOutputCol, i);
          continue;  // TODO set null or ignore
        }
        *output = getVectorDoubleValueFnLeft(LEFT_COL, i) - getVectorDoubleValueFnRight(RIGHT_COL, i);
1195 1196 1197 1198 1199 1200
      }
    } else if (pLeft->numOfRows == 1) {
      vectorMathSubHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, -1, i);
    } else if (pRight->numOfRows == 1) {
      vectorMathSubHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, 1, i);
    }
1201
  }
H
Haojun Liao 已提交
1202

H
Hongze Cheng 已提交
1203
  doReleaseVec(pLeftCol, leftConvert);
H
Haojun Liao 已提交
1204
  doReleaseVec(pRightCol, rightConvert);
D
dapan1121 已提交
1205 1206
}

1207
// TODO not correct for descending order scan
H
Hongze Cheng 已提交
1208 1209 1210
static void vectorMathMultiplyHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
                                     int32_t numOfRows, int32_t step, int32_t i) {
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
1211
  _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);
D
dapan1121 已提交
1212

1213
  double *output = (double *)pOutputCol->pData;
D
dapan1121 已提交
1214

wmmhello's avatar
wmmhello 已提交
1215
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1216
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
1217 1218
  } else {
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1219
      if (IS_HELPER_NULL(pLeftCol, i)) {
1220 1221 1222
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
1223
      *output = getVectorDoubleValueFnLeft(LEFT_COL, i) * getVectorDoubleValueFnRight(RIGHT_COL, 0);
1224 1225
    }
  }
D
dapan1121 已提交
1226 1227
}

H
Hongze Cheng 已提交
1228
void vectorMathMultiply(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1229
  SColumnInfoData *pOutputCol = pOut->columnData;
1230
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
1231

H
Hongze Cheng 已提交
1232 1233
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
1234

dengyihao's avatar
dengyihao 已提交
1235 1236 1237
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
1238

H
Hongze Cheng 已提交
1239
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
1240 1241 1242 1243 1244
  _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);

  double *output = (double *)pOutputCol->pData;
  if (pLeft->numOfRows == pRight->numOfRows) {
    for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1245
      if (IS_NULL) {
1246 1247 1248
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
1249
      *output = getVectorDoubleValueFnLeft(LEFT_COL, i) * getVectorDoubleValueFnRight(RIGHT_COL, i);
1250 1251 1252 1253 1254
    }
  } else if (pLeft->numOfRows == 1) {
    vectorMathMultiplyHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i);
  } else if (pRight->numOfRows == 1) {
    vectorMathMultiplyHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i);
D
dapan1121 已提交
1255
  }
H
Haojun Liao 已提交
1256 1257 1258

  doReleaseVec(pLeftCol, leftConvert);
  doReleaseVec(pRightCol, rightConvert);
D
dapan1121 已提交
1259 1260
}

H
Hongze Cheng 已提交
1261
void vectorMathDivide(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1262
  SColumnInfoData *pOutputCol = pOut->columnData;
1263
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
D
dapan1121 已提交
1264

H
Hongze Cheng 已提交
1265 1266
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
1267

dengyihao's avatar
dengyihao 已提交
1268 1269
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
D
dapan1121 已提交
1270
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
1271

H
Hongze Cheng 已提交
1272
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
1273 1274 1275
  _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);

  double *output = (double *)pOutputCol->pData;
1276
  if (pLeft->numOfRows == pRight->numOfRows) {
1277
    for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
H
Hongze Cheng 已提交
1278
      if (IS_NULL || (getVectorDoubleValueFnRight(RIGHT_COL, i) == 0)) {  // divide by 0 check
1279
        colDataAppendNULL(pOutputCol, i);
1280
        continue;
1281
      }
H
Hongze Cheng 已提交
1282
      *output = getVectorDoubleValueFnLeft(LEFT_COL, i) / getVectorDoubleValueFnRight(RIGHT_COL, i);
1283 1284
    }
  } else if (pLeft->numOfRows == 1) {
wmmhello's avatar
wmmhello 已提交
1285
    if (IS_HELPER_NULL(pLeftCol, 0)) {  // Set pLeft->numOfRows NULL value
1286
      colDataAppendNNULL(pOutputCol, 0, pRight->numOfRows);
1287 1288
    } else {
      for (; i >= 0 && i < pRight->numOfRows; i += step, output += 1) {
H
Hongze Cheng 已提交
1289
        if (IS_HELPER_NULL(pRightCol, i) || (getVectorDoubleValueFnRight(RIGHT_COL, i) == 0)) {  // divide by 0 check
1290
          colDataAppendNULL(pOutputCol, i);
1291
          continue;
1292
        }
H
Hongze Cheng 已提交
1293
        *output = getVectorDoubleValueFnLeft(LEFT_COL, 0) / getVectorDoubleValueFnRight(RIGHT_COL, i);
1294 1295 1296
      }
    }
  } else if (pRight->numOfRows == 1) {
H
Hongze Cheng 已提交
1297 1298
    if (IS_HELPER_NULL(pRightCol, 0) ||
        (getVectorDoubleValueFnRight(RIGHT_COL, 0) == 0)) {  // Set pLeft->numOfRows NULL value (divde by 0 check)
1299
      colDataAppendNNULL(pOutputCol, 0, pLeft->numOfRows);
1300 1301
    } else {
      for (; i >= 0 && i < pLeft->numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1302
        if (IS_HELPER_NULL(pLeftCol, i)) {
1303
          colDataAppendNULL(pOutputCol, i);
1304
          continue;
1305
        }
H
Hongze Cheng 已提交
1306
        *output = getVectorDoubleValueFnLeft(LEFT_COL, i) / getVectorDoubleValueFnRight(RIGHT_COL, 0);
1307 1308 1309
      }
    }
  }
H
Haojun Liao 已提交
1310

H
Hongze Cheng 已提交
1311
  doReleaseVec(pLeftCol, leftConvert);
H
Haojun Liao 已提交
1312
  doReleaseVec(pRightCol, rightConvert);
D
dapan1121 已提交
1313 1314
}

H
Hongze Cheng 已提交
1315
void vectorMathRemainder(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1316
  SColumnInfoData *pOutputCol = pOut->columnData;
1317
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
1318

H
Hongze Cheng 已提交
1319 1320
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
D
dapan1121 已提交
1321

dengyihao's avatar
dengyihao 已提交
1322 1323
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
D
dapan1121 已提交
1324
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
1325

H
Hongze Cheng 已提交
1326
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
1327
  _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);
1328 1329 1330 1331 1332

  double *output = (double *)pOutputCol->pData;

  if (pLeft->numOfRows == pRight->numOfRows) {
    for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1333
      if (IS_NULL) {
1334
        colDataAppendNULL(pOutputCol, i);
1335 1336 1337
        continue;
      }

1338 1339 1340
      double lx = getVectorDoubleValueFnLeft(LEFT_COL, i);
      double rx = getVectorDoubleValueFnRight(RIGHT_COL, i);
      if (isnan(lx) || isinf(lx) || isnan(rx) || isinf(rx) || FLT_EQUAL(rx, 0)) {
1341
        colDataAppendNULL(pOutputCol, i);
1342 1343 1344
        continue;
      }

1345
      *output = lx - ((int64_t)(lx / rx)) * rx;
1346 1347
    }
  } else if (pLeft->numOfRows == 1) {
1348
    double lx = getVectorDoubleValueFnLeft(LEFT_COL, 0);
wmmhello's avatar
wmmhello 已提交
1349
    if (IS_HELPER_NULL(pLeftCol, 0)) {  // Set pLeft->numOfRows NULL value
1350
      colDataAppendNNULL(pOutputCol, 0, pRight->numOfRows);
1351 1352
    } else {
      for (; i >= 0 && i < pRight->numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1353
        if (IS_HELPER_NULL(pRightCol, i)) {
1354
          colDataAppendNULL(pOutputCol, i);
1355 1356 1357
          continue;
        }

1358 1359
        double rx = getVectorDoubleValueFnRight(RIGHT_COL, i);
        if (isnan(rx) || isinf(rx) || FLT_EQUAL(rx, 0)) {
1360
          colDataAppendNULL(pOutputCol, i);
1361 1362 1363
          continue;
        }

1364
        *output = lx - ((int64_t)(lx / rx)) * rx;
1365 1366 1367
      }
    }
  } else if (pRight->numOfRows == 1) {
1368 1369
    double rx = getVectorDoubleValueFnRight(RIGHT_COL, 0);
    if (IS_HELPER_NULL(pRightCol, 0) || FLT_EQUAL(rx, 0)) {  // Set pLeft->numOfRows NULL value
1370
      colDataAppendNNULL(pOutputCol, 0, pLeft->numOfRows);
1371 1372
    } else {
      for (; i >= 0 && i < pLeft->numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1373
        if (IS_HELPER_NULL(pLeftCol, i)) {
1374
          colDataAppendNULL(pOutputCol, i);
1375 1376 1377
          continue;
        }

1378 1379 1380 1381 1382 1383 1384
        double lx = getVectorDoubleValueFnLeft(LEFT_COL, i);
        if (isnan(lx) || isinf(lx)) {
          colDataAppendNULL(pOutputCol, i);
          continue;
        }

        *output = lx - ((int64_t)(lx / rx)) * rx;
1385 1386 1387
      }
    }
  }
H
Haojun Liao 已提交
1388 1389 1390

  doReleaseVec(pLeftCol, leftConvert);
  doReleaseVec(pRightCol, rightConvert);
1391 1392
}

H
Hongze Cheng 已提交
1393
void vectorMathMinus(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan1121 已提交
1394 1395 1396 1397
  SColumnInfoData *pOutputCol = pOut->columnData;

  pOut->numOfRows = pLeft->numOfRows;

H
Hongze Cheng 已提交
1398 1399
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : (pLeft->numOfRows - 1);
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
D
dapan1121 已提交
1400

dengyihao's avatar
dengyihao 已提交
1401 1402
  int32_t          leftConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
D
dapan1121 已提交
1403

H
Hongze Cheng 已提交
1404
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
D
dapan1121 已提交
1405 1406 1407

  double *output = (double *)pOutputCol->pData;
  for (; i < pLeft->numOfRows && i >= 0; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1408
    if (IS_HELPER_NULL(pLeftCol, i)) {
1409
      colDataAppendNULL(pOutputCol, i);
1410
      continue;
1411
    }
1412 1413
    double result = getVectorDoubleValueFnLeft(LEFT_COL, i);
    *output = (result == 0) ? 0 : -result;
D
dapan1121 已提交
1414 1415
  }

H
Hongze Cheng 已提交
1416
  doReleaseVec(pLeftCol, leftConvert);
D
dapan1121 已提交
1417 1418
}

H
Hongze Cheng 已提交
1419
void vectorAssign(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan1121 已提交
1420 1421 1422
  SColumnInfoData *pOutputCol = pOut->columnData;
  pOut->numOfRows = pLeft->numOfRows;

H
Hongze Cheng 已提交
1423
  if (colDataIsNull_s(pRight->columnData, 0)) {
1424
    colDataAppendNNULL(pOutputCol, 0, pOut->numOfRows);
D
dapan1121 已提交
1425
  } else {
H
Hongze Cheng 已提交
1426
    char *d = colDataGetData(pRight->columnData, 0);
D
dapan1121 已提交
1427
    for (int32_t i = 0; i < pOut->numOfRows; ++i) {
1428
      colDataAppend(pOutputCol, i, d, false);
D
dapan1121 已提交
1429 1430
    }
  }
1431 1432 1433

  ASSERT(pRight->numOfQualified == 1 || pRight->numOfQualified == 0);
  pOut->numOfQualified = pRight->numOfQualified * pOut->numOfRows;
D
dapan1121 已提交
1434 1435
}

H
Hongze Cheng 已提交
1436 1437 1438
static void vectorBitAndHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
                               int32_t numOfRows, int32_t step, int32_t i) {
  _getBigintValue_fn_t getVectorBigintValueFnLeft = getVectorBigintValueFn(pLeftCol->info.type);
1439
  _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);
D
dapan1121 已提交
1440

wmmhello's avatar
wmmhello 已提交
1441
  int64_t *output = (int64_t *)pOutputCol->pData;
D
dapan1121 已提交
1442

wmmhello's avatar
wmmhello 已提交
1443
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1444
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
1445 1446
  } else {
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1447
      if (IS_HELPER_NULL(pLeftCol, i)) {
1448 1449 1450 1451
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
      *output = getVectorBigintValueFnLeft(LEFT_COL, i) & getVectorBigintValueFnRight(RIGHT_COL, 0);
D
dapan1121 已提交
1452 1453
    }
  }
1454
}
D
dapan1121 已提交
1455

H
Hongze Cheng 已提交
1456
void vectorBitAnd(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1457
  SColumnInfoData *pOutputCol = pOut->columnData;
1458
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
D
dapan 已提交
1459

1460 1461
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
D
dapan1121 已提交
1462

dengyihao's avatar
dengyihao 已提交
1463 1464 1465
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
D
dapan1121 已提交
1466

H
Hongze Cheng 已提交
1467
  _getBigintValue_fn_t getVectorBigintValueFnLeft = getVectorBigintValueFn(pLeftCol->info.type);
H
Haojun Liao 已提交
1468
  _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);
D
dapan1121 已提交
1469

1470 1471 1472
  int64_t *output = (int64_t *)pOutputCol->pData;
  if (pLeft->numOfRows == pRight->numOfRows) {
    for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1473
      if (IS_NULL) {
1474 1475 1476 1477
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
      *output = getVectorBigintValueFnLeft(LEFT_COL, i) & getVectorBigintValueFnRight(RIGHT_COL, i);
D
dapan1121 已提交
1478
    }
1479 1480 1481 1482 1483
  } else if (pLeft->numOfRows == 1) {
    vectorBitAndHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i);
  } else if (pRight->numOfRows == 1) {
    vectorBitAndHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i);
  }
H
Haojun Liao 已提交
1484

H
Hongze Cheng 已提交
1485
  doReleaseVec(pLeftCol, leftConvert);
H
Haojun Liao 已提交
1486
  doReleaseVec(pRightCol, rightConvert);
D
dapan1121 已提交
1487 1488
}

H
Hongze Cheng 已提交
1489 1490 1491
static void vectorBitOrHelper(SColumnInfoData *pLeftCol, SColumnInfoData *pRightCol, SColumnInfoData *pOutputCol,
                              int32_t numOfRows, int32_t step, int32_t i) {
  _getBigintValue_fn_t getVectorBigintValueFnLeft = getVectorBigintValueFn(pLeftCol->info.type);
1492
  _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);
D
dapan1121 已提交
1493

1494
  int64_t *output = (int64_t *)pOutputCol->pData;
D
dapan1121 已提交
1495

wmmhello's avatar
wmmhello 已提交
1496
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1497
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
1498
  } else {
1499
    int64_t rx = getVectorBigintValueFnRight(RIGHT_COL, 0);
1500
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1501
      if (IS_HELPER_NULL(pLeftCol, i)) {
1502 1503 1504 1505
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
      *output = getVectorBigintValueFnLeft(LEFT_COL, i) | rx;
D
dapan1121 已提交
1506 1507
    }
  }
1508
}
D
dapan1121 已提交
1509

H
Hongze Cheng 已提交
1510
void vectorBitOr(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1511
  SColumnInfoData *pOutputCol = pOut->columnData;
1512
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
D
dapan1121 已提交
1513

1514 1515
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
D
dapan1121 已提交
1516

dengyihao's avatar
dengyihao 已提交
1517 1518 1519
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
D
dapan1121 已提交
1520

H
Hongze Cheng 已提交
1521
  _getBigintValue_fn_t getVectorBigintValueFnLeft = getVectorBigintValueFn(pLeftCol->info.type);
H
Haojun Liao 已提交
1522
  _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);
D
dapan 已提交
1523

1524 1525 1526
  int64_t *output = (int64_t *)pOutputCol->pData;
  if (pLeft->numOfRows == pRight->numOfRows) {
    for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1527
      if (IS_NULL) {
1528 1529 1530 1531
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
      *output = getVectorBigintValueFnLeft(LEFT_COL, i) | getVectorBigintValueFnRight(RIGHT_COL, i);
1532 1533 1534 1535 1536
    }
  } else if (pLeft->numOfRows == 1) {
    vectorBitOrHelper(pRightCol, pLeftCol, pOutputCol, pRight->numOfRows, step, i);
  } else if (pRight->numOfRows == 1) {
    vectorBitOrHelper(pLeftCol, pRightCol, pOutputCol, pLeft->numOfRows, step, i);
D
dapan1121 已提交
1537
  }
H
Haojun Liao 已提交
1538

H
Hongze Cheng 已提交
1539
  doReleaseVec(pLeftCol, leftConvert);
H
Haojun Liao 已提交
1540
  doReleaseVec(pRightCol, rightConvert);
D
dapan1121 已提交
1541 1542
}

dengyihao's avatar
dengyihao 已提交
1543 1544
int32_t doVectorCompareImpl(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t startIndex,
                            int32_t numOfRows, int32_t step, __compar_fn_t fp, int32_t optr) {
1545
  int32_t num = 0;
1546
  bool   *pRes = (bool *)pOut->columnData->pData;
1547

1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583
  if (IS_MATHABLE_TYPE(GET_PARAM_TYPE(pLeft)) && IS_MATHABLE_TYPE(GET_PARAM_TYPE(pRight))) {
    if (!(pLeft->columnData->hasNull || pRight->columnData->hasNull)) {
      for (int32_t i = startIndex; i < numOfRows && i >= 0; i += step) {
        int32_t leftIndex = (i >= pLeft->numOfRows) ? 0 : i;
        int32_t rightIndex = (i >= pRight->numOfRows) ? 0 : i;

        char *pLeftData = colDataGetData(pLeft->columnData, leftIndex);
        char *pRightData = colDataGetData(pRight->columnData, rightIndex);

        pRes[i] = filterDoCompare(fp, optr, pLeftData, pRightData);
        if (pRes[i]) {
          ++num;
        }
      }
    } else {
      for (int32_t i = startIndex; i < numOfRows && i >= 0; i += step) {
        int32_t leftIndex = (i >= pLeft->numOfRows) ? 0 : i;
        int32_t rightIndex = (i >= pRight->numOfRows) ? 0 : i;

        if (colDataIsNull_f(pLeft->columnData->nullbitmap, leftIndex) ||
            colDataIsNull_f(pRight->columnData->nullbitmap, rightIndex)) {
          pRes[i] = false;
          continue;
        }

        char *pLeftData = colDataGetData(pLeft->columnData, leftIndex);
        char *pRightData = colDataGetData(pRight->columnData, rightIndex);

        pRes[i] = filterDoCompare(fp, optr, pLeftData, pRightData);
        if (pRes[i]) {
          ++num;
        }
      }
    }
  } else {
    //  if (GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_JSON || GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_JSON) {
H
Haojun Liao 已提交
1584 1585 1586
    for (int32_t i = startIndex; i < numOfRows && i >= startIndex; i += step) {
      int32_t leftIndex = (i >= pLeft->numOfRows) ? 0 : i;
      int32_t rightIndex = (i >= pRight->numOfRows) ? 0 : i;
1587

H
Haojun Liao 已提交
1588 1589 1590 1591 1592
      if (IS_HELPER_NULL(pLeft->columnData, leftIndex) || IS_HELPER_NULL(pRight->columnData, rightIndex)) {
        bool res = false;
        colDataAppendInt8(pOut->columnData, i, (int8_t *)&res);
        continue;
      }
1593

1594 1595
      char   *pLeftData = colDataGetData(pLeft->columnData, leftIndex);
      char   *pRightData = colDataGetData(pRight->columnData, rightIndex);
H
Haojun Liao 已提交
1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606
      int64_t leftOut = 0;
      int64_t rightOut = 0;
      bool    freeLeft = false;
      bool    freeRight = false;
      bool    isJsonnull = false;

      bool result = convertJsonValue(&fp, optr, GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight), &pLeftData, &pRightData,
                                     &leftOut, &rightOut, &isJsonnull, &freeLeft, &freeRight);
      if (isJsonnull) {
        ASSERT(0);
      }
1607

H
Haojun Liao 已提交
1608 1609 1610
      if (!pLeftData || !pRightData) {
        result = false;
      }
1611

H
Haojun Liao 已提交
1612 1613 1614 1615 1616 1617 1618 1619 1620
      if (!result) {
        colDataAppendInt8(pOut->columnData, i, (int8_t *)&result);
      } else {
        bool res = filterDoCompare(fp, optr, pLeftData, pRightData);
        colDataAppendInt8(pOut->columnData, i, (int8_t *)&res);
        if (res) {
          ++num;
        }
      }
1621

H
Haojun Liao 已提交
1622 1623
      if (freeLeft) {
        taosMemoryFreeClear(pLeftData);
1624 1625
      }

H
Haojun Liao 已提交
1626 1627 1628
      if (freeRight) {
        taosMemoryFreeClear(pRightData);
      }
1629
    }
1630 1631
  }

1632 1633 1634
  return num;
}

dengyihao's avatar
dengyihao 已提交
1635 1636
void doVectorCompare(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t startIndex,
                     int32_t numOfRows, int32_t _ord, int32_t optr) {
D
dapan1121 已提交
1637
  int32_t       i = 0;
1638
  int32_t       step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
D
dapan1121 已提交
1639 1640 1641
  int32_t       lType = GET_PARAM_TYPE(pLeft);
  int32_t       rType = GET_PARAM_TYPE(pRight);
  __compar_fn_t fp = NULL;
D
dapan1121 已提交
1642
  int32_t       compRows = 0;
dengyihao's avatar
dengyihao 已提交
1643

D
dapan1121 已提交
1644 1645 1646 1647
  if (lType == rType) {
    fp = filterGetCompFunc(lType, optr);
  } else {
    fp = filterGetCompFuncEx(lType, rType, optr);
wmmhello's avatar
wmmhello 已提交
1648
  }
1649

D
dapan1121 已提交
1650 1651
  if (startIndex < 0) {
    i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
D
dapan1121 已提交
1652
    pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
D
dapan1121 已提交
1653 1654 1655 1656 1657 1658
    compRows = pOut->numOfRows;
  } else {
    compRows = startIndex + numOfRows;
    i = startIndex;
  }

1659 1660
  if (pRight->pHashFilter != NULL) {
    for (; i >= 0 && i < pLeft->numOfRows; i += step) {
wmmhello's avatar
wmmhello 已提交
1661
      if (IS_HELPER_NULL(pLeft->columnData, i)) {
H
Hongze Cheng 已提交
1662 1663
        bool res = false;
        colDataAppendInt8(pOut->columnData, i, (int8_t *)&res);
D
dapan1121 已提交
1664 1665 1666
        continue;
      }

1667 1668
      char *pLeftData = colDataGetData(pLeft->columnData, i);
      bool  res = filterDoCompare(fp, optr, pLeftData, pRight->pHashFilter);
H
Hongze Cheng 已提交
1669
      colDataAppendInt8(pOut->columnData, i, (int8_t *)&res);
1670 1671 1672
      if (res) {
        pOut->numOfQualified++;
      }
1673
    }
1674
  } else {  // normal compare
D
dapan1121 已提交
1675
    pOut->numOfQualified = doVectorCompareImpl(pLeft, pRight, pOut, i, compRows, step, fp, optr);
D
dapan1121 已提交
1676 1677 1678
  }
}

dengyihao's avatar
dengyihao 已提交
1679 1680 1681 1682
void vectorCompareImpl(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t startIndex,
                       int32_t numOfRows, int32_t _ord, int32_t optr) {
  SScalarParam  pLeftOut = {0};
  SScalarParam  pRightOut = {0};
G
Ganlin Zhao 已提交
1683
  SScalarParam *param1 = NULL;
D
dapan1121 已提交
1684
  SScalarParam *param2 = NULL;
D
dapan1121 已提交
1685

D
dapan1121 已提交
1686
  if (SCL_NO_NEED_CONVERT_COMPARISION(GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight), optr)) {
D
dapan1121 已提交
1687 1688
    param1 = pLeft;
    param2 = pRight;
D
dapan1121 已提交
1689
  } else {
D
dapan1121 已提交
1690
    vectorConvertCols(pLeft, pRight, &pLeftOut, &pRightOut, startIndex, numOfRows);
D
dapan1121 已提交
1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702

    if (pLeftOut.columnData != NULL) {
      param1 = &pLeftOut;
    } else {
      param1 = pLeft;
    }

    if (pRightOut.columnData != NULL) {
      param2 = &pRightOut;
    } else {
      param2 = pRight;
    }
D
dapan1121 已提交
1703 1704
  }

D
dapan1121 已提交
1705
  doVectorCompare(param1, param2, pOut, startIndex, numOfRows, _ord, optr);
dengyihao's avatar
dengyihao 已提交
1706

D
dapan1121 已提交
1707
  sclFreeParam(&pLeftOut);
G
Ganlin Zhao 已提交
1708
  sclFreeParam(&pRightOut);
D
dapan1121 已提交
1709 1710
}

dengyihao's avatar
dengyihao 已提交
1711
void vectorCompare(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord, int32_t optr) {
D
dapan1121 已提交
1712 1713 1714
  vectorCompareImpl(pLeft, pRight, pOut, -1, -1, _ord, optr);
}

dengyihao's avatar
dengyihao 已提交
1715
void vectorGreater(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1716
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_GREATER_THAN);
D
dapan1121 已提交
1717 1718
}

H
Hongze Cheng 已提交
1719
void vectorGreaterEqual(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1720
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_GREATER_EQUAL);
D
dapan1121 已提交
1721 1722
}

H
Hongze Cheng 已提交
1723
void vectorLower(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1724
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_LOWER_THAN);
D
dapan1121 已提交
1725 1726
}

H
Hongze Cheng 已提交
1727
void vectorLowerEqual(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1728
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_LOWER_EQUAL);
D
dapan1121 已提交
1729 1730
}

H
Hongze Cheng 已提交
1731
void vectorEqual(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1732
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_EQUAL);
D
dapan1121 已提交
1733 1734
}

H
Hongze Cheng 已提交
1735
void vectorNotEqual(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1736
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_NOT_EQUAL);
D
dapan1121 已提交
1737 1738
}

H
Hongze Cheng 已提交
1739
void vectorIn(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1740
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_IN);
D
dapan1121 已提交
1741 1742
}

H
Hongze Cheng 已提交
1743
void vectorNotIn(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1744
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_NOT_IN);
D
dapan1121 已提交
1745 1746
}

H
Hongze Cheng 已提交
1747
void vectorLike(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1748
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_LIKE);
D
dapan1121 已提交
1749 1750
}

H
Hongze Cheng 已提交
1751
void vectorNotLike(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1752
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_NOT_LIKE);
D
dapan1121 已提交
1753 1754
}

H
Hongze Cheng 已提交
1755
void vectorMatch(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1756
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_MATCH);
D
dapan1121 已提交
1757 1758
}

H
Hongze Cheng 已提交
1759
void vectorNotMatch(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1760
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_NMATCH);
D
dapan1121 已提交
1761 1762
}

H
Hongze Cheng 已提交
1763 1764
void vectorIsNull(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
  for (int32_t i = 0; i < pLeft->numOfRows; ++i) {
wmmhello's avatar
wmmhello 已提交
1765
    int8_t v = IS_HELPER_NULL(pLeft->columnData, i) ? 1 : 0;
1766
    colDataAppendInt8(pOut->columnData, i, &v);
D
dapan1121 已提交
1767
  }
1768
  pOut->numOfRows = pLeft->numOfRows;
D
dapan1121 已提交
1769 1770
}

H
Hongze Cheng 已提交
1771 1772
void vectorNotNull(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
  for (int32_t i = 0; i < pLeft->numOfRows; ++i) {
wmmhello's avatar
wmmhello 已提交
1773
    int8_t v = IS_HELPER_NULL(pLeft->columnData, i) ? 0 : 1;
1774
    colDataAppendInt8(pOut->columnData, i, &v);
D
dapan1121 已提交
1775
  }
1776
  pOut->numOfRows = pLeft->numOfRows;
D
dapan 已提交
1777
}
D
dapan1121 已提交
1778

dengyihao's avatar
dengyihao 已提交
1779
void vectorIsTrue(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan1121 已提交
1780
  vectorConvertSingleColImpl(pLeft, pOut, NULL, -1, -1);
dengyihao's avatar
dengyihao 已提交
1781 1782
  for (int32_t i = 0; i < pOut->numOfRows; ++i) {
    if (colDataIsNull_s(pOut->columnData, i)) {
1783 1784
      int8_t v = 0;
      colDataAppendInt8(pOut->columnData, i, &v);
H
Haojun Liao 已提交
1785
      colDataClearNull_f(pOut->columnData->nullbitmap, i);
1786 1787 1788
    }
  }
  pOut->columnData->hasNull = false;
D
dapan1121 已提交
1789 1790
}

1791 1792
STagVal getJsonValue(char *json, char *key, bool *isExist) {
  STagVal val = {.pKey = key};
dengyihao's avatar
dengyihao 已提交
1793
  if (json == NULL || tTagIsJson((const STag *)json) == false) {
wmmhello's avatar
wmmhello 已提交
1794
    terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
H
Hongze Cheng 已提交
1795
    if (isExist) {
wmmhello's avatar
wmmhello 已提交
1796 1797 1798 1799 1800
      *isExist = false;
    }
    return val;
  }

1801
  bool find = tTagGet(((const STag *)json), &val);  // json value is null and not exist is different
H
Hongze Cheng 已提交
1802
  if (isExist) {
1803 1804 1805 1806 1807
    *isExist = find;
  }
  return val;
}

H
Hongze Cheng 已提交
1808
void vectorJsonContains(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1809 1810
  SColumnInfoData *pOutputCol = pOut->columnData;

H
Hongze Cheng 已提交
1811 1812
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826

  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);

  char *pRightData = colDataGetVarData(pRight->columnData, 0);
  char *jsonKey = taosMemoryCalloc(1, varDataLen(pRightData) + 1);
  memcpy(jsonKey, varDataVal(pRightData), varDataLen(pRightData));
  for (; i >= 0 && i < pLeft->numOfRows; i += step) {
    bool isExist = false;

    if (!colDataIsNull_var(pLeft->columnData, i)) {
      char *pLeftData = colDataGetVarData(pLeft->columnData, i);
      getJsonValue(pLeftData, jsonKey, &isExist);
    }

H
Hongze Cheng 已提交
1827
    colDataAppend(pOutputCol, i, (const char *)(&isExist), false);
1828 1829 1830 1831
  }
  taosMemoryFree(jsonKey);
}

H
Hongze Cheng 已提交
1832
void vectorJsonArrow(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1833 1834
  SColumnInfoData *pOutputCol = pOut->columnData;

H
Hongze Cheng 已提交
1835 1836
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848

  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);

  char *pRightData = colDataGetVarData(pRight->columnData, 0);
  char *jsonKey = taosMemoryCalloc(1, varDataLen(pRightData) + 1);
  memcpy(jsonKey, varDataVal(pRightData), varDataLen(pRightData));
  for (; i >= 0 && i < pLeft->numOfRows; i += step) {
    if (colDataIsNull_var(pLeft->columnData, i)) {
      colDataSetNull_var(pOutputCol, i);
      pOutputCol->hasNull = true;
      continue;
    }
H
Hongze Cheng 已提交
1849 1850
    char   *pLeftData = colDataGetVarData(pLeft->columnData, i);
    bool    isExist = false;
1851
    STagVal value = getJsonValue(pLeftData, jsonKey, &isExist);
H
Hongze Cheng 已提交
1852
    char   *data = isExist ? tTagValToData(&value, true) : NULL;
1853
    colDataAppend(pOutputCol, i, data, data == NULL);
H
Hongze Cheng 已提交
1854
    if (isExist && IS_VAR_DATA_TYPE(value.type) && data) {
1855 1856 1857 1858 1859 1860
      taosMemoryFree(data);
    }
  }
  taosMemoryFree(jsonKey);
}

1861 1862
_bin_scalar_fn_t getBinScalarOperatorFn(int32_t binFunctionId) {
  switch (binFunctionId) {
D
dapan1121 已提交
1863
    case OP_TYPE_ADD:
1864
      return vectorMathAdd;
D
dapan1121 已提交
1865
    case OP_TYPE_SUB:
1866
      return vectorMathSub;
D
dapan1121 已提交
1867
    case OP_TYPE_MULTI:
1868
      return vectorMathMultiply;
D
dapan1121 已提交
1869
    case OP_TYPE_DIV:
1870
      return vectorMathDivide;
1871
    case OP_TYPE_REM:
1872
      return vectorMathRemainder;
D
dapan1121 已提交
1873 1874
    case OP_TYPE_MINUS:
      return vectorMathMinus;
D
dapan1121 已提交
1875 1876
    case OP_TYPE_ASSIGN:
      return vectorAssign;
D
dapan1121 已提交
1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900
    case OP_TYPE_GREATER_THAN:
      return vectorGreater;
    case OP_TYPE_GREATER_EQUAL:
      return vectorGreaterEqual;
    case OP_TYPE_LOWER_THAN:
      return vectorLower;
    case OP_TYPE_LOWER_EQUAL:
      return vectorLowerEqual;
    case OP_TYPE_EQUAL:
      return vectorEqual;
    case OP_TYPE_NOT_EQUAL:
      return vectorNotEqual;
    case OP_TYPE_IN:
      return vectorIn;
    case OP_TYPE_NOT_IN:
      return vectorNotIn;
    case OP_TYPE_LIKE:
      return vectorLike;
    case OP_TYPE_NOT_LIKE:
      return vectorNotLike;
    case OP_TYPE_MATCH:
      return vectorMatch;
    case OP_TYPE_NMATCH:
      return vectorNotMatch;
D
dapan1121 已提交
1901
    case OP_TYPE_IS_NULL:
D
dapan1121 已提交
1902
      return vectorIsNull;
D
dapan1121 已提交
1903
    case OP_TYPE_IS_NOT_NULL:
D
dapan1121 已提交
1904 1905 1906 1907 1908
      return vectorNotNull;
    case OP_TYPE_BIT_AND:
      return vectorBitAnd;
    case OP_TYPE_BIT_OR:
      return vectorBitOr;
D
dapan1121 已提交
1909 1910
    case OP_TYPE_IS_TRUE:
      return vectorIsTrue;
1911 1912 1913 1914
    case OP_TYPE_JSON_GET_VALUE:
      return vectorJsonArrow;
    case OP_TYPE_JSON_CONTAINS:
      return vectorJsonContains;
1915
    default:
1916
      ASSERT(0);
1917 1918
      return NULL;
  }
D
dapan1121 已提交
1919
}