sclvector.c 71.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
Haojun Liao 已提交
40 41 42 43 44
bool noConvertBeforeCompare(int32_t leftType, int32_t rightType, int32_t optr) {
  return IS_NUMERIC_TYPE(leftType) && IS_NUMERIC_TYPE(rightType) &&
         (optr >= OP_TYPE_GREATER_THAN && optr <= OP_TYPE_NOT_EQUAL);
}

H
Hongze Cheng 已提交
45
void convertNumberToNumber(const void *inData, void *outData, int8_t inType, int8_t outType) {
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 87 88 89 90 91
  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 已提交
92
    default: {
93 94 95 96 97
      ASSERT(0);
    }
  }
}

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

  tmp[len] = 0;

wafwerar's avatar
wafwerar 已提交
107
  double value = taosStr2Double(tmp, NULL);
108 109 110 111 112

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

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

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

H
Hongze Cheng 已提交
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
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);
142
  double out = 0;
H
Hongze Cheng 已提交
143
  if (*data == TSDB_DATA_TYPE_NULL) {
144
    return 0;
H
Hongze Cheng 已提交
145 146 147
  } 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 已提交
148 149
    terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
    return 0;
150
  } else {
H
Hongze Cheng 已提交
151
    convertNumberToNumber(data + CHAR_BYTES, &out, *data, TSDB_DATA_TYPE_DOUBLE);
152 153 154 155
  }
  return (int64_t)out;
}

D
dapan1121 已提交
156
_getBigintValue_fn_t getVectorBigintValueFn(int32_t srcType) {
H
Hongze Cheng 已提交
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 185 186 187 188 189
  _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 已提交
190 191
}

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

H
Hongze Cheng 已提交
194 195 196 197 198 199 200 201 202 203 204 205
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); }
206 207

_getValueAddr_fn_t getVectorValueAddrFn(int32_t srcType) {
H
Hongze Cheng 已提交
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 235 236 237 238 239
  _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 已提交
240 241 242 243
  int64_t value = 0;
  if (taosParseTime(buf, &value, strlen(buf), pOut->columnData->info.precision, tsDaylight) != TSDB_CODE_SUCCESS) {
    value = 0;
  }
G
Ganlin Zhao 已提交
244

D
dapan1121 已提交
245 246 247
  colDataAppendInt64(pOut->columnData, rowIndex, &value);
}

H
Hongze Cheng 已提交
248
static FORCE_INLINE void varToSigned(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
D
dapan1121 已提交
249 250 251 252 253 254 255 256 257 258 259 260 261 262
  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 已提交
263

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

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

H
Hongze Cheng 已提交
289
static FORCE_INLINE void varToUnsigned(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
D
dapan1121 已提交
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
  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 已提交
305 306
  switch (pOut->columnData->info.type) {
    case TSDB_DATA_TYPE_UTINYINT: {
wafwerar's avatar
wafwerar 已提交
307
      uint8_t value = (uint8_t)taosStr2UInt8(buf, NULL, 10);
H
Hongze Cheng 已提交
308
      colDataAppendInt8(pOut->columnData, rowIndex, (int8_t *)&value);
D
fix bug  
dapan1121 已提交
309
      break;
G
Ganlin Zhao 已提交
310
    }
D
fix bug  
dapan1121 已提交
311
    case TSDB_DATA_TYPE_USMALLINT: {
wafwerar's avatar
wafwerar 已提交
312
      uint16_t value = (uint16_t)taosStr2UInt16(buf, NULL, 10);
H
Hongze Cheng 已提交
313
      colDataAppendInt16(pOut->columnData, rowIndex, (int16_t *)&value);
D
fix bug  
dapan1121 已提交
314
      break;
G
Ganlin Zhao 已提交
315
    }
D
fix bug  
dapan1121 已提交
316
    case TSDB_DATA_TYPE_UINT: {
wafwerar's avatar
wafwerar 已提交
317
      uint32_t value = (uint32_t)taosStr2UInt32(buf, NULL, 10);
H
Hongze Cheng 已提交
318
      colDataAppendInt32(pOut->columnData, rowIndex, (int32_t *)&value);
D
fix bug  
dapan1121 已提交
319
      break;
G
Ganlin Zhao 已提交
320
    }
D
fix bug  
dapan1121 已提交
321
    case TSDB_DATA_TYPE_UBIGINT: {
wafwerar's avatar
wafwerar 已提交
322
      uint64_t value = (uint64_t)taosStr2UInt64(buf, NULL, 10);
H
Hongze Cheng 已提交
323
      colDataAppendInt64(pOut->columnData, rowIndex, (int64_t *)&value);
D
fix bug  
dapan1121 已提交
324
      break;
G
Ganlin Zhao 已提交
325
    }
D
fix bug  
dapan1121 已提交
326
  }
D
dapan1121 已提交
327 328
}

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

wafwerar's avatar
wafwerar 已提交
336
  double value = taosStr2Double(buf, NULL);
337
  colDataAppendDouble(pOut->columnData, rowIndex, &value);
338 339
}

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

H
Haojun Liao 已提交
346
// todo remove this malloc
H
Hongze Cheng 已提交
347
static FORCE_INLINE void varToNchar(char *buf, SScalarParam *pOut, int32_t rowIndex, int32_t *overflow) {
wmmhello's avatar
wmmhello 已提交
348 349
  int32_t len = 0;
  int32_t inputLen = varDataLen(buf);
D
fix bug  
dapan1121 已提交
350
  int32_t outputMaxLen = (inputLen + 1) * TSDB_NCHAR_SIZE + VARSTR_HEADER_SIZE;
wmmhello's avatar
wmmhello 已提交
351

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

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

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

H
Hongze Cheng 已提交
367 368
  char   *t = taosMemoryCalloc(1, inputLen + VARSTR_HEADER_SIZE);
  int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(buf), varDataLen(buf), varDataVal(t));
D
dapan1121 已提交
369 370 371 372 373 374 375 376 377 378
  if (len < 0) {
    taosMemoryFree(t);
    return;
  }
  varDataSetLen(t, len);

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

dengyihao's avatar
dengyihao 已提交
379 380
// TODO opt performance, tmp is not needed.
int32_t vectorConvertFromVarData(SSclVectorConvCtx *pCtx, int32_t *overflow) {
wmmhello's avatar
wmmhello 已提交
381
  bool vton = false;
382 383

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

D
dapan1121 已提交
407
  pCtx->pOut->numOfRows = pCtx->pIn->numOfRows;
H
Haojun Liao 已提交
408 409
  char* tmp = NULL;

D
dapan1121 已提交
410 411 412
  for (int32_t i = pCtx->startIndex; i <= pCtx->endIndex; ++i) {
    if (IS_HELPER_NULL(pCtx->pIn->columnData, i)) {
      colDataAppendNULL(pCtx->pOut->columnData, i);
413 414 415
      continue;
    }

dengyihao's avatar
dengyihao 已提交
416
    char   *data = colDataGetVarData(pCtx->pIn->columnData, i);
D
dapan1121 已提交
417
    int32_t convertType = pCtx->inType;
dengyihao's avatar
dengyihao 已提交
418 419
    if (pCtx->inType == TSDB_DATA_TYPE_JSON) {
      if (*data == TSDB_DATA_TYPE_NULL) {
wmmhello's avatar
wmmhello 已提交
420
        ASSERT(0);
H
Hongze Cheng 已提交
421
      } else if (*data == TSDB_DATA_TYPE_NCHAR) {
422 423
        data += CHAR_BYTES;
        convertType = TSDB_DATA_TYPE_NCHAR;
H
Hongze Cheng 已提交
424
      } else if (tTagIsJson(data)) {
wmmhello's avatar
wmmhello 已提交
425 426
        terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
        return terrno;
427
      } else {
dengyihao's avatar
dengyihao 已提交
428
        convertNumberToNumber(data + CHAR_BYTES, colDataGetNumData(pCtx->pOut->columnData, i), *data, pCtx->outType);
429 430 431
        continue;
      }
    }
H
Haojun Liao 已提交
432

D
dapan1121 已提交
433
    int32_t bufSize = pCtx->pIn->columnData->info.bytes;
H
Haojun Liao 已提交
434 435 436 437 438 439
    if (tmp == NULL) {
      tmp = taosMemoryMalloc(bufSize);
      if (tmp == NULL) {
        sclError("out of memory in vectorConvertFromVarData");
        return TSDB_CODE_OUT_OF_MEMORY;
      }
440
    }
H
Haojun Liao 已提交
441

wmmhello's avatar
wmmhello 已提交
442 443 444
    if (vton) {
      memcpy(tmp, data, varDataTLen(data));
    } else {
445 446 447
      if (TSDB_DATA_TYPE_VARCHAR == convertType) {
        memcpy(tmp, varDataVal(data), varDataLen(data));
        tmp[varDataLen(data)] = 0;
H
Hongze Cheng 已提交
448
      } else if (TSDB_DATA_TYPE_NCHAR == convertType) {
H
Haojun Liao 已提交
449
        // we need to convert it to native char string, and then perform the string to numeric data
450 451 452 453 454 455
        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 已提交
456
          return TSDB_CODE_APP_ERROR;
457 458 459 460
        }

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

D
dapan1121 已提交
463
    (*func)(tmp, pCtx->pOut, i, overflow);
464
  }
G
Ganlin Zhao 已提交
465

H
Haojun Liao 已提交
466 467 468
  if (tmp != NULL) {
    taosMemoryFreeClear(tmp);
  }
469 470 471
  return TSDB_CODE_SUCCESS;
}

H
Hongze Cheng 已提交
472 473
double getVectorDoubleValue_JSON(void *src, int32_t index) {
  char  *data = colDataGetVarData((SColumnInfoData *)src, index);
474
  double out = 0;
H
Hongze Cheng 已提交
475
  if (*data == TSDB_DATA_TYPE_NULL) {
476
    return out;
H
Hongze Cheng 已提交
477 478 479
  } 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 已提交
480 481
    terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
    return 0;
H
Hongze Cheng 已提交
482 483
  } else {
    convertNumberToNumber(data + CHAR_BYTES, &out, *data, TSDB_DATA_TYPE_DOUBLE);
484 485 486 487
  }
  return out;
}

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

H
Hongze Cheng 已提交
491 492
  void   *t = taosMemoryCalloc(1, inputLen);
  int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(buf), varDataLen(buf), varDataVal(t));
493 494
  if (len < 0) {
    sclError("charset:%s to %s. val:%s convert ncharTobinary failed.", DEFAULT_UNICODE_ENCODEC, tsCharset,
H
Hongze Cheng 已提交
495
             (char *)varDataVal(buf));
496 497 498 499 500 501 502
    taosMemoryFree(t);
    return NULL;
  }
  varDataSetLen(t, len);
  return t;
}

H
Hongze Cheng 已提交
503 504 505
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 已提交
506
  if (optr == OP_TYPE_JSON_CONTAINS) {
wmmhello's avatar
wmmhello 已提交
507
    return true;
508 509
  }

G
Ganlin Zhao 已提交
510
  if (typeLeft != TSDB_DATA_TYPE_JSON && typeRight != TSDB_DATA_TYPE_JSON) {
wmmhello's avatar
wmmhello 已提交
511
    return true;
512 513
  }

G
Ganlin Zhao 已提交
514 515
  if (typeLeft == TSDB_DATA_TYPE_JSON) {
    if (tTagIsJson(*pLeftData)) {
wmmhello's avatar
wmmhello 已提交
516 517 518
      terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
      return false;
    }
519
    typeLeft = **pLeftData;
H
Hongze Cheng 已提交
520
    (*pLeftData)++;
521
  }
G
Ganlin Zhao 已提交
522
  if (typeRight == TSDB_DATA_TYPE_JSON) {
wmmhello's avatar
wmmhello 已提交
523
    if (tTagIsJson(*pRightData)) {
wmmhello's avatar
wmmhello 已提交
524 525 526
      terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
      return false;
    }
527
    typeRight = **pRightData;
H
Hongze Cheng 已提交
528
    (*pRightData)++;
529
  }
wmmhello's avatar
wmmhello 已提交
530

G
Ganlin Zhao 已提交
531 532
  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 已提交
533 534 535 536
      return false;
    }
  }

wmmhello's avatar
wmmhello 已提交
537
  // if types can not comparable
G
Ganlin Zhao 已提交
538 539 540 541 542 543
  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 已提交
544 545
    return false;

G
Ganlin Zhao 已提交
546
  if (typeLeft == TSDB_DATA_TYPE_NULL || typeRight == TSDB_DATA_TYPE_NULL) {
547
    *isNull = true;
wmmhello's avatar
wmmhello 已提交
548
    return true;
549
  }
550 551
  int8_t type = vectorGetConvertType(typeLeft, typeRight);

G
Ganlin Zhao 已提交
552
  if (type == 0) {
553
    *fp = filterGetCompFunc(typeLeft, optr);
wmmhello's avatar
wmmhello 已提交
554
    return true;
555 556 557 558
  }

  *fp = filterGetCompFunc(type, optr);

G
Ganlin Zhao 已提交
559 560
  if (IS_NUMERIC_TYPE(type)) {
    if (typeLeft == TSDB_DATA_TYPE_NCHAR) {
wmmhello's avatar
wmmhello 已提交
561
      ASSERT(0);
H
Hongze Cheng 已提交
562 563
      //      convertNcharToDouble(*pLeftData, pLeftOut);
      //      *pLeftData = pLeftOut;
G
Ganlin Zhao 已提交
564
    } else if (typeLeft == TSDB_DATA_TYPE_BINARY) {
wmmhello's avatar
wmmhello 已提交
565
      ASSERT(0);
H
Hongze Cheng 已提交
566 567
      //      convertBinaryToDouble(*pLeftData, pLeftOut);
      //      *pLeftData = pLeftOut;
G
Ganlin Zhao 已提交
568
    } else if (typeLeft != type) {
569 570 571 572
      convertNumberToNumber(*pLeftData, pLeftOut, typeLeft, type);
      *pLeftData = pLeftOut;
    }

G
Ganlin Zhao 已提交
573
    if (typeRight == TSDB_DATA_TYPE_NCHAR) {
wmmhello's avatar
wmmhello 已提交
574
      ASSERT(0);
H
Hongze Cheng 已提交
575 576
      //      convertNcharToDouble(*pRightData, pRightOut);
      //      *pRightData = pRightOut;
G
Ganlin Zhao 已提交
577
    } else if (typeRight == TSDB_DATA_TYPE_BINARY) {
wmmhello's avatar
wmmhello 已提交
578
      ASSERT(0);
H
Hongze Cheng 已提交
579 580
      //      convertBinaryToDouble(*pRightData, pRightOut);
      //      *pRightData = pRightOut;
G
Ganlin Zhao 已提交
581
    } else if (typeRight != type) {
582 583 584
      convertNumberToNumber(*pRightData, pRightOut, typeRight, type);
      *pRightData = pRightOut;
    }
G
Ganlin Zhao 已提交
585 586
  } else if (type == TSDB_DATA_TYPE_BINARY) {
    if (typeLeft == TSDB_DATA_TYPE_NCHAR) {
587 588 589
      *pLeftData = ncharTobinary(*pLeftData);
      *freeLeft = true;
    }
G
Ganlin Zhao 已提交
590
    if (typeRight == TSDB_DATA_TYPE_NCHAR) {
591 592 593
      *pRightData = ncharTobinary(*pRightData);
      *freeRight = true;
    }
G
Ganlin Zhao 已提交
594
  } else {
595
    ASSERT(0);
596 597
  }

wmmhello's avatar
wmmhello 已提交
598
  return true;
599 600
}

D
dapan1121 已提交
601
int32_t vectorConvertToVarData(SSclVectorConvCtx *pCtx) {
dengyihao's avatar
dengyihao 已提交
602 603 604
  SColumnInfoData *pInputCol = pCtx->pIn->columnData;
  SColumnInfoData *pOutputCol = pCtx->pOut->columnData;
  char             tmp[128] = {0};
D
fix bug  
dapan1121 已提交
605

dengyihao's avatar
dengyihao 已提交
606 607
  if (IS_SIGNED_NUMERIC_TYPE(pCtx->inType) || pCtx->inType == TSDB_DATA_TYPE_BOOL ||
      pCtx->inType == TSDB_DATA_TYPE_TIMESTAMP) {
D
dapan1121 已提交
608
    for (int32_t i = pCtx->startIndex; i <= pCtx->endIndex; ++i) {
D
fix bug  
dapan1121 已提交
609 610 611 612
      if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
        colDataAppendNULL(pOutputCol, i);
        continue;
      }
G
Ganlin Zhao 已提交
613

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

D
fix bug  
dapan1121 已提交
631
      uint64_t value = 0;
D
dapan1121 已提交
632
      GET_TYPED_DATA(value, uint64_t, pCtx->inType, colDataGetData(pInputCol, i));
D
fix bug  
dapan1121 已提交
633 634
      int32_t len = sprintf(varDataVal(tmp), "%" PRIu64, value);
      varDataLen(tmp) = len;
D
dapan1121 已提交
635 636
      if (pCtx->outType == TSDB_DATA_TYPE_NCHAR) {
        varToNchar(tmp, pCtx->pOut, i, NULL);
D
fix bug  
dapan1121 已提交
637
      } else {
D
dapan1121 已提交
638
        colDataAppend(pOutputCol, i, (char *)tmp, false);
D
fix bug  
dapan1121 已提交
639 640
      }
    }
D
dapan1121 已提交
641 642
  } else if (IS_FLOAT_TYPE(pCtx->inType)) {
    for (int32_t i = pCtx->startIndex; i <= pCtx->endIndex; ++i) {
D
fix bug  
dapan1121 已提交
643 644 645 646
      if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
        colDataAppendNULL(pOutputCol, i);
        continue;
      }
G
Ganlin Zhao 已提交
647

D
fix bug  
dapan1121 已提交
648
      double value = 0;
D
dapan1121 已提交
649
      GET_TYPED_DATA(value, double, pCtx->inType, colDataGetData(pInputCol, i));
D
fix bug  
dapan1121 已提交
650 651
      int32_t len = sprintf(varDataVal(tmp), "%lf", value);
      varDataLen(tmp) = len;
D
dapan1121 已提交
652 653
      if (pCtx->outType == TSDB_DATA_TYPE_NCHAR) {
        varToNchar(tmp, pCtx->pOut, i, NULL);
D
fix bug  
dapan1121 已提交
654
      } else {
D
dapan1121 已提交
655
        colDataAppend(pOutputCol, i, (char *)tmp, false);
D
fix bug  
dapan1121 已提交
656 657 658
      }
    }
  } else {
D
dapan1121 已提交
659
    sclError("not supported input type:%d", pCtx->inType);
S
Shengliang Guan 已提交
660
    return TSDB_CODE_APP_ERROR;
D
fix bug  
dapan1121 已提交
661 662 663 664 665
  }

  return TSDB_CODE_SUCCESS;
}

666
// TODO opt performance
dengyihao's avatar
dengyihao 已提交
667 668 669 670
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 已提交
671

D
dapan1121 已提交
672 673 674 675
  if (NULL == pInputCol) {
    sclError("input column is NULL, hashFilter %p", pIn->pHashFilter);
    return TSDB_CODE_APP_ERROR;
  }
D
dapan1121 已提交
676

dengyihao's avatar
dengyihao 已提交
677 678
  int32_t           rstart = (startIndex >= 0 && startIndex < pIn->numOfRows) ? startIndex : 0;
  int32_t           rend = numOfRows > 0 ? rstart + numOfRows - 1 : rstart + pIn->numOfRows - 1;
D
dapan1121 已提交
679 680 681 682
  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 已提交
683 684 685 686 687 688
  }

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

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

D
dapan1121 已提交
690 691 692
    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 已提交
693

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

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

D
dapan1121 已提交
710
      double value = 0;
D
dapan1121 已提交
711
      GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, 0));
dengyihao's avatar
dengyihao 已提交
712

D
dapan1121 已提交
713 714 715 716 717 718 719 720 721 722
      if (value > maxValue) {
        *overflow = 1;
        return TSDB_CODE_SUCCESS;
      } else if (value < minValue) {
        *overflow = -1;
        return TSDB_CODE_SUCCESS;
      } else {
        *overflow = 0;
      }
    }
D
dapan 已提交
723
  }
724 725

  pOut->numOfRows = pIn->numOfRows;
D
dapan1121 已提交
726
  switch (cCtx.outType) {
727
    case TSDB_DATA_TYPE_BOOL: {
D
dapan1121 已提交
728
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
729
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
730
          colDataAppendNULL(pOutputCol, i);
731 732 733 734
          continue;
        }

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

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

        int16_t value = 0;
D
dapan1121 已提交
761
        GET_TYPED_DATA(value, int16_t, cCtx.inType, colDataGetData(pInputCol, i));
D
dapan1121 已提交
762 763 764 765
        colDataAppendInt16(pOutputCol, i, (int16_t *)&value);
      }
      break;
    }
dengyihao's avatar
dengyihao 已提交
766
    case TSDB_DATA_TYPE_INT: {
D
dapan1121 已提交
767
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
D
dapan1121 已提交
768 769 770 771 772 773
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
          colDataAppendNULL(pOutputCol, i);
          continue;
        }

        int32_t value = 0;
D
dapan1121 已提交
774
        GET_TYPED_DATA(value, int32_t, cCtx.inType, colDataGetData(pInputCol, i));
D
dapan1121 已提交
775
        colDataAppendInt32(pOutputCol, i, (int32_t *)&value);
776 777 778
      }
      break;
    }
D
dapan1121 已提交
779
    case TSDB_DATA_TYPE_BIGINT:
780
    case TSDB_DATA_TYPE_TIMESTAMP: {
D
dapan1121 已提交
781
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
782
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
783
          colDataAppendNULL(pOutputCol, i);
D
dapan 已提交
784
          continue;
D
dapan1121 已提交
785
        }
D
dapan 已提交
786 787

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

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

D
dapan1121 已提交
813
        uint16_t value = 0;
D
dapan1121 已提交
814
        GET_TYPED_DATA(value, uint16_t, cCtx.inType, colDataGetData(pInputCol, i));
D
dapan1121 已提交
815 816 817 818
        colDataAppendInt16(pOutputCol, i, (int16_t *)&value);
      }
      break;
    }
dengyihao's avatar
dengyihao 已提交
819
    case TSDB_DATA_TYPE_UINT: {
D
dapan1121 已提交
820
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
D
dapan1121 已提交
821 822 823 824
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
          colDataAppendNULL(pOutputCol, i);
          continue;
        }
G
Ganlin Zhao 已提交
825

D
dapan1121 已提交
826
        uint32_t value = 0;
D
dapan1121 已提交
827
        GET_TYPED_DATA(value, uint32_t, cCtx.inType, colDataGetData(pInputCol, i));
D
dapan1121 已提交
828 829 830 831 832
        colDataAppendInt32(pOutputCol, i, (int32_t *)&value);
      }
      break;
    }
    case TSDB_DATA_TYPE_UBIGINT: {
D
dapan1121 已提交
833
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
834
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
835
          colDataAppendNULL(pOutputCol, i);
D
dapan 已提交
836
          continue;
D
dapan1121 已提交
837
        }
G
Ganlin Zhao 已提交
838

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

D
dapan1121 已提交
852
        float value = 0;
D
dapan1121 已提交
853
        GET_TYPED_DATA(value, float, cCtx.inType, colDataGetData(pInputCol, i));
dengyihao's avatar
dengyihao 已提交
854
        colDataAppendFloat(pOutputCol, i, (float *)&value);
D
dapan1121 已提交
855
      }
G
Ganlin Zhao 已提交
856
      break;
D
dapan1121 已提交
857 858
    }
    case TSDB_DATA_TYPE_DOUBLE: {
D
dapan1121 已提交
859
      for (int32_t i = cCtx.startIndex; i <= cCtx.endIndex; ++i) {
860
        if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
861
          colDataAppendNULL(pOutputCol, i);
D
dapan 已提交
862
          continue;
D
dapan1121 已提交
863
        }
G
Ganlin Zhao 已提交
864

D
dapan 已提交
865
        double value = 0;
D
dapan1121 已提交
866
        GET_TYPED_DATA(value, double, cCtx.inType, colDataGetData(pInputCol, i));
dengyihao's avatar
dengyihao 已提交
867
        colDataAppendDouble(pOutputCol, i, (double *)&value);
D
dapan1121 已提交
868
      }
G
Ganlin Zhao 已提交
869
      break;
D
dapan1121 已提交
870
    }
G
Ganlin Zhao 已提交
871
    case TSDB_DATA_TYPE_BINARY:
D
fix bug  
dapan1121 已提交
872
    case TSDB_DATA_TYPE_NCHAR: {
D
dapan1121 已提交
873
      return vectorConvertToVarData(&cCtx);
D
fix bug  
dapan1121 已提交
874
    }
D
dapan1121 已提交
875
    default:
D
dapan1121 已提交
876
      sclError("invalid convert output type:%d", cCtx.outType);
S
Shengliang Guan 已提交
877
      return TSDB_CODE_APP_ERROR;
D
dapan1121 已提交
878 879 880 881 882
  }

  return TSDB_CODE_SUCCESS;
}

H
Hongze Cheng 已提交
883 884
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 已提交
885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903
    /*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 已提交
904

D
dapan1121 已提交
905 906 907 908 909 910 911 912 913 914 915 916
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 已提交
917 918
int32_t vectorConvertSingleCol(SScalarParam *input, SScalarParam *output, int32_t type, int32_t startIndex,
                               int32_t numOfRows) {
D
dapan1121 已提交
919 920
  output->numOfRows = input->numOfRows;

H
Haojun Liao 已提交
921 922 923
  SDataType t = {.type = type};
  t.bytes = IS_VAR_DATA_TYPE(t.type)? input->columnData->info.bytes:tDataTypes[type].bytes;

H
Haojun Liao 已提交
924 925
  int32_t code = sclCreateColumnInfoData(&t, input->numOfRows, output);
  if (code != TSDB_CODE_SUCCESS) {
D
dapan1121 已提交
926
    return TSDB_CODE_OUT_OF_MEMORY;
D
dapan1121 已提交
927 928
  }

D
dapan1121 已提交
929
  code = vectorConvertSingleColImpl(input, output, NULL, startIndex, numOfRows);
D
dapan1121 已提交
930 931 932 933 934 935 936
  if (code) {
    return code;
  }

  return TSDB_CODE_SUCCESS;
}

dengyihao's avatar
dengyihao 已提交
937 938 939
int32_t vectorConvertCols(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pLeftOut, SScalarParam *pRightOut,
                          int32_t startIndex, int32_t numOfRows) {
  int32_t leftType = GET_PARAM_TYPE(pLeft);
940 941
  int32_t rightType = GET_PARAM_TYPE(pRight);
  if (leftType == rightType) {
D
dapan1121 已提交
942 943 944
    return TSDB_CODE_SUCCESS;
  }

H
Haojun Liao 已提交
945 946 947
  int8_t  type = 0;
  int32_t code = 0;

G
Ganlin Zhao 已提交
948
  SScalarParam *param1 = NULL, *paramOut1 = NULL;
D
dapan1121 已提交
949
  SScalarParam *param2 = NULL, *paramOut2 = NULL;
G
Ganlin Zhao 已提交
950

H
Haojun Liao 已提交
951 952 953
  // always convert least data
  if (IS_VAR_DATA_TYPE(leftType) && IS_VAR_DATA_TYPE(rightType) && (pLeft->numOfRows != pRight->numOfRows) &&
      leftType != TSDB_DATA_TYPE_JSON && rightType != TSDB_DATA_TYPE_JSON) {
D
dapan1121 已提交
954 955 956 957
    param1 = pLeft;
    param2 = pRight;
    paramOut1 = pLeftOut;
    paramOut2 = pRightOut;
H
Haojun Liao 已提交
958 959 960 961 962 963

    if (pLeft->numOfRows > pRight->numOfRows) {
      type = leftType;
    } else {
      type = rightType;
    }
D
dapan1121 已提交
964
  } else {
H
Haojun Liao 已提交
965 966 967 968 969 970 971 972 973 974 975 976
    // we only define half value in the convert-matrix, so make sure param1 always less equal than param2
    if (leftType < rightType) {
      param1 = pLeft;
      param2 = pRight;
      paramOut1 = pLeftOut;
      paramOut2 = pRightOut;
    } else {
      param1 = pRight;
      param2 = pLeft;
      paramOut1 = pRightOut;
      paramOut2 = pLeftOut;
    }
D
dapan1121 已提交
977

H
Haojun Liao 已提交
978 979 980 981
    type = vectorGetConvertType(GET_PARAM_TYPE(param1), GET_PARAM_TYPE(param2));
    if (0 == type) {
      return TSDB_CODE_SUCCESS;
    }
D
dapan1121 已提交
982 983
  }

984
  if (type != GET_PARAM_TYPE(param1)) {
D
dapan1121 已提交
985
    code = vectorConvertSingleCol(param1, paramOut1, type, startIndex, numOfRows);
D
dapan1121 已提交
986 987 988
    if (code) {
      return code;
    }
D
dapan1121 已提交
989
  }
G
Ganlin Zhao 已提交
990

991
  if (type != GET_PARAM_TYPE(param2)) {
D
dapan1121 已提交
992
    code = vectorConvertSingleCol(param2, paramOut2, type, startIndex, numOfRows);
D
dapan1121 已提交
993 994 995
    if (code) {
      return code;
    }
D
dapan1121 已提交
996 997 998 999 1000
  }

  return TSDB_CODE_SUCCESS;
}

H
Haojun Liao 已提交
1001 1002 1003 1004 1005
enum {
  VECTOR_DO_CONVERT = 0x1,
  VECTOR_UN_CONVERT = 0x2,
};

1006
// TODO not correct for descending order scan
H
Hongze Cheng 已提交
1007 1008 1009
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);
1010 1011 1012 1013
  _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);

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

wmmhello's avatar
wmmhello 已提交
1014
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1015
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
1016 1017
  } else {
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1018
      if (IS_HELPER_NULL(pLeftCol, i)) {
1019 1020 1021
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
H
Hongze Cheng 已提交
1022
      *output = getVectorDoubleValueFnLeft(LEFT_COL, i) + getVectorDoubleValueFnRight(RIGHT_COL, 0);
D
dapan1121 已提交
1023 1024
    }
  }
1025
}
D
dapan1121 已提交
1026

H
Hongze Cheng 已提交
1027 1028 1029
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);
1030 1031 1032 1033
  _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);

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

wmmhello's avatar
wmmhello 已提交
1034
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1035 1036 1037
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
  } else {
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1038
      if (IS_HELPER_NULL(pLeftCol, i)) {
1039 1040 1041
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
H
Hongze Cheng 已提交
1042 1043 1044
      *output =
          taosTimeAdd(getVectorBigintValueFnLeft(pLeftCol->pData, i), getVectorBigintValueFnRight(pRightCol->pData, 0),
                      pRightCol->info.scale, pRightCol->info.precision);
1045 1046 1047 1048
    }
  }
}

dengyihao's avatar
dengyihao 已提交
1049 1050 1051
static SColumnInfoData *vectorConvertVarToDouble(SScalarParam *pInput, int32_t *converted) {
  SScalarParam     output = {0};
  SColumnInfoData *pCol = pInput->columnData;
H
Haojun Liao 已提交
1052

D
dapan1121 已提交
1053 1054 1055 1056 1057 1058
  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 已提交
1059

D
dapan1121 已提交
1060 1061 1062
    *converted = VECTOR_DO_CONVERT;

    return output.columnData;
H
Haojun Liao 已提交
1063
  }
D
dapan1121 已提交
1064 1065

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

D
dapan1121 已提交
1067
  return pInput->columnData;
H
Haojun Liao 已提交
1068 1069
}

H
Hongze Cheng 已提交
1070
static void doReleaseVec(SColumnInfoData *pCol, int32_t type) {
H
Haojun Liao 已提交
1071 1072
  if (type == VECTOR_DO_CONVERT) {
    colDataDestroy(pCol);
H
Haojun Liao 已提交
1073
    taosMemoryFree(pCol);
H
Haojun Liao 已提交
1074 1075 1076
  }
}

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

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

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

dengyihao's avatar
dengyihao 已提交
1085 1086 1087
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
1088

1089 1090 1091
  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 已提交
1092 1093 1094 1095
      (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);
1096
    _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);
1097

D
dapan1121 已提交
1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108
    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) {
1109
      for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1110
        if (IS_NULL) {
wmmhello's avatar
wmmhello 已提交
1111 1112 1113
          colDataAppendNULL(pOutputCol, i);
          continue;  // TODO set null or ignore
        }
1114
        *output = getVectorBigintValueFnLeft(pLeftCol->pData, i) + getVectorBigintValueFnRight(pRightCol->pData, i);
1115
      }
G
Ganlin Zhao 已提交
1116
    }
1117
  } else {
H
Hongze Cheng 已提交
1118 1119
    double              *output = (double *)pOutputCol->pData;
    _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
1120
    _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);
1121

1122 1123
    if (pLeft->numOfRows == pRight->numOfRows) {
      for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
H
Hongze Cheng 已提交
1124
        if (IS_NULL) {
1125 1126 1127 1128
          colDataAppendNULL(pOutputCol, i);
          continue;  // TODO set null or ignore
        }
        *output = getVectorDoubleValueFnLeft(LEFT_COL, i) + getVectorDoubleValueFnRight(RIGHT_COL, i);
1129 1130 1131 1132 1133 1134
      }
    } 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);
    }
1135
  }
H
Haojun Liao 已提交
1136 1137 1138

  doReleaseVec(pLeftCol, leftConvert);
  doReleaseVec(pRightCol, rightConvert);
1139
}
D
dapan1121 已提交
1140

1141
// TODO not correct for descending order scan
H
Hongze Cheng 已提交
1142 1143 1144
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);
1145 1146 1147 1148
  _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);

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

wmmhello's avatar
wmmhello 已提交
1149
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1150
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
1151 1152
  } else {
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1153
      if (IS_HELPER_NULL(pLeftCol, i)) {
1154 1155 1156
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
H
Hongze Cheng 已提交
1157
      *output = (getVectorDoubleValueFnLeft(LEFT_COL, i) - getVectorDoubleValueFnRight(RIGHT_COL, 0)) * factor;
D
dapan1121 已提交
1158
    }
1159 1160
  }
}
D
dapan1121 已提交
1161

H
Hongze Cheng 已提交
1162 1163 1164
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);
1165 1166 1167 1168
  _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);

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

wmmhello's avatar
wmmhello 已提交
1169
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1170 1171 1172
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
  } else {
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1173
      if (IS_HELPER_NULL(pLeftCol, i)) {
1174 1175 1176
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
H
Hongze Cheng 已提交
1177 1178 1179
      *output =
          taosTimeAdd(getVectorBigintValueFnLeft(pLeftCol->pData, i), -getVectorBigintValueFnRight(pRightCol->pData, 0),
                      pRightCol->info.scale, pRightCol->info.precision);
1180 1181 1182 1183
    }
  }
}

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

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

H
Hongze Cheng 已提交
1189 1190
  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 已提交
1191

dengyihao's avatar
dengyihao 已提交
1192 1193 1194
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
1195

1196
  if ((GET_PARAM_TYPE(pLeft) == TSDB_DATA_TYPE_TIMESTAMP && GET_PARAM_TYPE(pRight) == TSDB_DATA_TYPE_BIGINT) ||
H
Hongze Cheng 已提交
1197 1198 1199 1200
      (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);
1201
    _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);
1202

D
dapan1121 已提交
1203 1204 1205 1206 1207 1208 1209
    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) {
1210
      for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1211
        if (IS_NULL) {
wmmhello's avatar
wmmhello 已提交
1212 1213 1214
          colDataAppendNULL(pOutputCol, i);
          continue;  // TODO set null or ignore
        }
1215
        *output = getVectorBigintValueFnLeft(pLeftCol->pData, i) - getVectorBigintValueFnRight(pRightCol->pData, i);
1216
      }
D
dapan1121 已提交
1217
    }
1218
  } else {
H
Hongze Cheng 已提交
1219 1220
    double              *output = (double *)pOutputCol->pData;
    _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
1221 1222 1223 1224
    _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 已提交
1225
        if (IS_NULL) {
1226 1227 1228 1229
          colDataAppendNULL(pOutputCol, i);
          continue;  // TODO set null or ignore
        }
        *output = getVectorDoubleValueFnLeft(LEFT_COL, i) - getVectorDoubleValueFnRight(RIGHT_COL, i);
1230 1231 1232 1233 1234 1235
      }
    } 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);
    }
1236
  }
H
Haojun Liao 已提交
1237

H
Hongze Cheng 已提交
1238
  doReleaseVec(pLeftCol, leftConvert);
H
Haojun Liao 已提交
1239
  doReleaseVec(pRightCol, rightConvert);
D
dapan1121 已提交
1240 1241
}

1242
// TODO not correct for descending order scan
H
Hongze Cheng 已提交
1243 1244 1245
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);
1246
  _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);
D
dapan1121 已提交
1247

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

wmmhello's avatar
wmmhello 已提交
1250
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1251
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
1252 1253
  } else {
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1254
      if (IS_HELPER_NULL(pLeftCol, i)) {
1255 1256 1257
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
1258
      *output = getVectorDoubleValueFnLeft(LEFT_COL, i) * getVectorDoubleValueFnRight(RIGHT_COL, 0);
1259 1260
    }
  }
D
dapan1121 已提交
1261 1262
}

H
Hongze Cheng 已提交
1263
void vectorMathMultiply(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1264
  SColumnInfoData *pOutputCol = pOut->columnData;
1265
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
1266

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

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

H
Hongze Cheng 已提交
1274
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
1275 1276 1277 1278 1279
  _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 已提交
1280
      if (IS_NULL) {
1281 1282 1283
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
1284
      *output = getVectorDoubleValueFnLeft(LEFT_COL, i) * getVectorDoubleValueFnRight(RIGHT_COL, i);
1285 1286 1287 1288 1289
    }
  } 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 已提交
1290
  }
H
Haojun Liao 已提交
1291 1292 1293

  doReleaseVec(pLeftCol, leftConvert);
  doReleaseVec(pRightCol, rightConvert);
D
dapan1121 已提交
1294 1295
}

H
Hongze Cheng 已提交
1296
void vectorMathDivide(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1297
  SColumnInfoData *pOutputCol = pOut->columnData;
1298
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
D
dapan1121 已提交
1299

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

dengyihao's avatar
dengyihao 已提交
1303 1304
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
D
dapan1121 已提交
1305
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
1306

H
Hongze Cheng 已提交
1307
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
1308 1309 1310
  _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);

  double *output = (double *)pOutputCol->pData;
1311
  if (pLeft->numOfRows == pRight->numOfRows) {
1312
    for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
H
Hongze Cheng 已提交
1313
      if (IS_NULL || (getVectorDoubleValueFnRight(RIGHT_COL, i) == 0)) {  // divide by 0 check
1314
        colDataAppendNULL(pOutputCol, i);
1315
        continue;
1316
      }
H
Hongze Cheng 已提交
1317
      *output = getVectorDoubleValueFnLeft(LEFT_COL, i) / getVectorDoubleValueFnRight(RIGHT_COL, i);
1318 1319
    }
  } else if (pLeft->numOfRows == 1) {
wmmhello's avatar
wmmhello 已提交
1320
    if (IS_HELPER_NULL(pLeftCol, 0)) {  // Set pLeft->numOfRows NULL value
1321
      colDataAppendNNULL(pOutputCol, 0, pRight->numOfRows);
1322 1323
    } else {
      for (; i >= 0 && i < pRight->numOfRows; i += step, output += 1) {
H
Hongze Cheng 已提交
1324
        if (IS_HELPER_NULL(pRightCol, i) || (getVectorDoubleValueFnRight(RIGHT_COL, i) == 0)) {  // divide by 0 check
1325
          colDataAppendNULL(pOutputCol, i);
1326
          continue;
1327
        }
H
Hongze Cheng 已提交
1328
        *output = getVectorDoubleValueFnLeft(LEFT_COL, 0) / getVectorDoubleValueFnRight(RIGHT_COL, i);
1329 1330 1331
      }
    }
  } else if (pRight->numOfRows == 1) {
H
Hongze Cheng 已提交
1332 1333
    if (IS_HELPER_NULL(pRightCol, 0) ||
        (getVectorDoubleValueFnRight(RIGHT_COL, 0) == 0)) {  // Set pLeft->numOfRows NULL value (divde by 0 check)
1334
      colDataAppendNNULL(pOutputCol, 0, pLeft->numOfRows);
1335 1336
    } else {
      for (; i >= 0 && i < pLeft->numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1337
        if (IS_HELPER_NULL(pLeftCol, i)) {
1338
          colDataAppendNULL(pOutputCol, i);
1339
          continue;
1340
        }
H
Hongze Cheng 已提交
1341
        *output = getVectorDoubleValueFnLeft(LEFT_COL, i) / getVectorDoubleValueFnRight(RIGHT_COL, 0);
1342 1343 1344
      }
    }
  }
H
Haojun Liao 已提交
1345

H
Hongze Cheng 已提交
1346
  doReleaseVec(pLeftCol, leftConvert);
H
Haojun Liao 已提交
1347
  doReleaseVec(pRightCol, rightConvert);
D
dapan1121 已提交
1348 1349
}

H
Hongze Cheng 已提交
1350
void vectorMathRemainder(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1351
  SColumnInfoData *pOutputCol = pOut->columnData;
1352
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
1353

H
Hongze Cheng 已提交
1354 1355
  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 已提交
1356

dengyihao's avatar
dengyihao 已提交
1357 1358
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
D
dapan1121 已提交
1359
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
1360

H
Hongze Cheng 已提交
1361
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
1362
  _getDoubleValue_fn_t getVectorDoubleValueFnRight = getVectorDoubleValueFn(pRightCol->info.type);
1363 1364 1365 1366 1367

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

  if (pLeft->numOfRows == pRight->numOfRows) {
    for (; i < pRight->numOfRows && i >= 0; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1368
      if (IS_NULL) {
1369
        colDataAppendNULL(pOutputCol, i);
1370 1371 1372
        continue;
      }

1373 1374 1375
      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)) {
1376
        colDataAppendNULL(pOutputCol, i);
1377 1378 1379
        continue;
      }

1380
      *output = lx - ((int64_t)(lx / rx)) * rx;
1381 1382
    }
  } else if (pLeft->numOfRows == 1) {
1383
    double lx = getVectorDoubleValueFnLeft(LEFT_COL, 0);
wmmhello's avatar
wmmhello 已提交
1384
    if (IS_HELPER_NULL(pLeftCol, 0)) {  // Set pLeft->numOfRows NULL value
1385
      colDataAppendNNULL(pOutputCol, 0, pRight->numOfRows);
1386 1387
    } else {
      for (; i >= 0 && i < pRight->numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1388
        if (IS_HELPER_NULL(pRightCol, i)) {
1389
          colDataAppendNULL(pOutputCol, i);
1390 1391 1392
          continue;
        }

1393 1394
        double rx = getVectorDoubleValueFnRight(RIGHT_COL, i);
        if (isnan(rx) || isinf(rx) || FLT_EQUAL(rx, 0)) {
1395
          colDataAppendNULL(pOutputCol, i);
1396 1397 1398
          continue;
        }

1399
        *output = lx - ((int64_t)(lx / rx)) * rx;
1400 1401 1402
      }
    }
  } else if (pRight->numOfRows == 1) {
1403 1404
    double rx = getVectorDoubleValueFnRight(RIGHT_COL, 0);
    if (IS_HELPER_NULL(pRightCol, 0) || FLT_EQUAL(rx, 0)) {  // Set pLeft->numOfRows NULL value
1405
      colDataAppendNNULL(pOutputCol, 0, pLeft->numOfRows);
1406 1407
    } else {
      for (; i >= 0 && i < pLeft->numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1408
        if (IS_HELPER_NULL(pLeftCol, i)) {
1409
          colDataAppendNULL(pOutputCol, i);
1410 1411 1412
          continue;
        }

1413 1414 1415 1416 1417 1418 1419
        double lx = getVectorDoubleValueFnLeft(LEFT_COL, i);
        if (isnan(lx) || isinf(lx)) {
          colDataAppendNULL(pOutputCol, i);
          continue;
        }

        *output = lx - ((int64_t)(lx / rx)) * rx;
1420 1421 1422
      }
    }
  }
H
Haojun Liao 已提交
1423 1424 1425

  doReleaseVec(pLeftCol, leftConvert);
  doReleaseVec(pRightCol, rightConvert);
1426 1427
}

H
Hongze Cheng 已提交
1428
void vectorMathMinus(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan1121 已提交
1429 1430 1431 1432
  SColumnInfoData *pOutputCol = pOut->columnData;

  pOut->numOfRows = pLeft->numOfRows;

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

dengyihao's avatar
dengyihao 已提交
1436 1437
  int32_t          leftConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
D
dapan1121 已提交
1438

H
Hongze Cheng 已提交
1439
  _getDoubleValue_fn_t getVectorDoubleValueFnLeft = getVectorDoubleValueFn(pLeftCol->info.type);
D
dapan1121 已提交
1440 1441 1442

  double *output = (double *)pOutputCol->pData;
  for (; i < pLeft->numOfRows && i >= 0; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1443
    if (IS_HELPER_NULL(pLeftCol, i)) {
1444
      colDataAppendNULL(pOutputCol, i);
1445
      continue;
1446
    }
1447 1448
    double result = getVectorDoubleValueFnLeft(LEFT_COL, i);
    *output = (result == 0) ? 0 : -result;
D
dapan1121 已提交
1449 1450
  }

H
Hongze Cheng 已提交
1451
  doReleaseVec(pLeftCol, leftConvert);
D
dapan1121 已提交
1452 1453
}

H
Hongze Cheng 已提交
1454
void vectorAssign(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan1121 已提交
1455 1456 1457
  SColumnInfoData *pOutputCol = pOut->columnData;
  pOut->numOfRows = pLeft->numOfRows;

H
Hongze Cheng 已提交
1458
  if (colDataIsNull_s(pRight->columnData, 0)) {
1459
    colDataAppendNNULL(pOutputCol, 0, pOut->numOfRows);
D
dapan1121 已提交
1460
  } else {
H
Hongze Cheng 已提交
1461
    char *d = colDataGetData(pRight->columnData, 0);
D
dapan1121 已提交
1462
    for (int32_t i = 0; i < pOut->numOfRows; ++i) {
1463
      colDataAppend(pOutputCol, i, d, false);
D
dapan1121 已提交
1464 1465
    }
  }
1466 1467 1468

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

H
Hongze Cheng 已提交
1471 1472 1473
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);
1474
  _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);
D
dapan1121 已提交
1475

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

wmmhello's avatar
wmmhello 已提交
1478
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1479
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
1480 1481
  } else {
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1482
      if (IS_HELPER_NULL(pLeftCol, i)) {
1483 1484 1485 1486
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
      *output = getVectorBigintValueFnLeft(LEFT_COL, i) & getVectorBigintValueFnRight(RIGHT_COL, 0);
D
dapan1121 已提交
1487 1488
    }
  }
1489
}
D
dapan1121 已提交
1490

H
Hongze Cheng 已提交
1491
void vectorBitAnd(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1492
  SColumnInfoData *pOutputCol = pOut->columnData;
1493
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
D
dapan 已提交
1494

1495 1496
  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 已提交
1497

dengyihao's avatar
dengyihao 已提交
1498 1499 1500
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
D
dapan1121 已提交
1501

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

1505 1506 1507
  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 已提交
1508
      if (IS_NULL) {
1509 1510 1511 1512
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
      *output = getVectorBigintValueFnLeft(LEFT_COL, i) & getVectorBigintValueFnRight(RIGHT_COL, i);
D
dapan1121 已提交
1513
    }
1514 1515 1516 1517 1518
  } 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 已提交
1519

H
Hongze Cheng 已提交
1520
  doReleaseVec(pLeftCol, leftConvert);
H
Haojun Liao 已提交
1521
  doReleaseVec(pRightCol, rightConvert);
D
dapan1121 已提交
1522 1523
}

H
Hongze Cheng 已提交
1524 1525 1526
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);
1527
  _getBigintValue_fn_t getVectorBigintValueFnRight = getVectorBigintValueFn(pRightCol->info.type);
D
dapan1121 已提交
1528

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

wmmhello's avatar
wmmhello 已提交
1531
  if (IS_HELPER_NULL(pRightCol, 0)) {  // Set pLeft->numOfRows NULL value
1532
    colDataAppendNNULL(pOutputCol, 0, numOfRows);
1533
  } else {
1534
    int64_t rx = getVectorBigintValueFnRight(RIGHT_COL, 0);
1535
    for (; i >= 0 && i < numOfRows; i += step, output += 1) {
wmmhello's avatar
wmmhello 已提交
1536
      if (IS_HELPER_NULL(pLeftCol, i)) {
1537 1538 1539 1540
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
      *output = getVectorBigintValueFnLeft(LEFT_COL, i) | rx;
D
dapan1121 已提交
1541 1542
    }
  }
1543
}
D
dapan1121 已提交
1544

H
Hongze Cheng 已提交
1545
void vectorBitOr(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
1546
  SColumnInfoData *pOutputCol = pOut->columnData;
1547
  pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
D
dapan1121 已提交
1548

1549 1550
  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 已提交
1551

dengyihao's avatar
dengyihao 已提交
1552 1553 1554
  int32_t          leftConvert = 0, rightConvert = 0;
  SColumnInfoData *pLeftCol = vectorConvertVarToDouble(pLeft, &leftConvert);
  SColumnInfoData *pRightCol = vectorConvertVarToDouble(pRight, &rightConvert);
D
dapan1121 已提交
1555

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

1559 1560 1561
  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 已提交
1562
      if (IS_NULL) {
1563 1564 1565 1566
        colDataAppendNULL(pOutputCol, i);
        continue;  // TODO set null or ignore
      }
      *output = getVectorBigintValueFnLeft(LEFT_COL, i) | getVectorBigintValueFnRight(RIGHT_COL, i);
1567 1568 1569 1570 1571
    }
  } 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 已提交
1572
  }
H
Haojun Liao 已提交
1573

H
Hongze Cheng 已提交
1574
  doReleaseVec(pLeftCol, leftConvert);
H
Haojun Liao 已提交
1575
  doReleaseVec(pRightCol, rightConvert);
D
dapan1121 已提交
1576 1577
}

dengyihao's avatar
dengyihao 已提交
1578 1579
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) {
1580
  int32_t num = 0;
1581
  bool   *pRes = (bool *)pOut->columnData->pData;
1582

1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618
  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 已提交
1619 1620 1621
    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;
1622

H
Haojun Liao 已提交
1623 1624 1625 1626 1627
      if (IS_HELPER_NULL(pLeft->columnData, leftIndex) || IS_HELPER_NULL(pRight->columnData, rightIndex)) {
        bool res = false;
        colDataAppendInt8(pOut->columnData, i, (int8_t *)&res);
        continue;
      }
1628

1629 1630
      char   *pLeftData = colDataGetData(pLeft->columnData, leftIndex);
      char   *pRightData = colDataGetData(pRight->columnData, rightIndex);
H
Haojun Liao 已提交
1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641
      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);
      }
1642

H
Haojun Liao 已提交
1643 1644 1645
      if (!pLeftData || !pRightData) {
        result = false;
      }
1646

H
Haojun Liao 已提交
1647 1648 1649 1650 1651 1652 1653 1654 1655
      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;
        }
      }
1656

H
Haojun Liao 已提交
1657 1658
      if (freeLeft) {
        taosMemoryFreeClear(pLeftData);
1659 1660
      }

H
Haojun Liao 已提交
1661 1662 1663
      if (freeRight) {
        taosMemoryFreeClear(pRightData);
      }
1664
    }
1665 1666
  }

1667 1668 1669
  return num;
}

dengyihao's avatar
dengyihao 已提交
1670 1671
void doVectorCompare(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t startIndex,
                     int32_t numOfRows, int32_t _ord, int32_t optr) {
D
dapan1121 已提交
1672
  int32_t       i = 0;
1673
  int32_t       step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
D
dapan1121 已提交
1674 1675 1676
  int32_t       lType = GET_PARAM_TYPE(pLeft);
  int32_t       rType = GET_PARAM_TYPE(pRight);
  __compar_fn_t fp = NULL;
D
dapan1121 已提交
1677
  int32_t       compRows = 0;
dengyihao's avatar
dengyihao 已提交
1678

D
dapan1121 已提交
1679 1680 1681 1682
  if (lType == rType) {
    fp = filterGetCompFunc(lType, optr);
  } else {
    fp = filterGetCompFuncEx(lType, rType, optr);
wmmhello's avatar
wmmhello 已提交
1683
  }
1684

D
dapan1121 已提交
1685 1686
  if (startIndex < 0) {
    i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
D
dapan1121 已提交
1687
    pOut->numOfRows = TMAX(pLeft->numOfRows, pRight->numOfRows);
D
dapan1121 已提交
1688 1689 1690 1691 1692 1693
    compRows = pOut->numOfRows;
  } else {
    compRows = startIndex + numOfRows;
    i = startIndex;
  }

1694 1695
  if (pRight->pHashFilter != NULL) {
    for (; i >= 0 && i < pLeft->numOfRows; i += step) {
wmmhello's avatar
wmmhello 已提交
1696
      if (IS_HELPER_NULL(pLeft->columnData, i)) {
H
Hongze Cheng 已提交
1697 1698
        bool res = false;
        colDataAppendInt8(pOut->columnData, i, (int8_t *)&res);
D
dapan1121 已提交
1699 1700 1701
        continue;
      }

1702 1703
      char *pLeftData = colDataGetData(pLeft->columnData, i);
      bool  res = filterDoCompare(fp, optr, pLeftData, pRight->pHashFilter);
H
Hongze Cheng 已提交
1704
      colDataAppendInt8(pOut->columnData, i, (int8_t *)&res);
1705 1706 1707
      if (res) {
        pOut->numOfQualified++;
      }
1708
    }
1709
  } else {  // normal compare
D
dapan1121 已提交
1710
    pOut->numOfQualified = doVectorCompareImpl(pLeft, pRight, pOut, i, compRows, step, fp, optr);
D
dapan1121 已提交
1711 1712 1713
  }
}

dengyihao's avatar
dengyihao 已提交
1714 1715 1716 1717
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 已提交
1718
  SScalarParam *param1 = NULL;
D
dapan1121 已提交
1719
  SScalarParam *param2 = NULL;
D
dapan1121 已提交
1720

H
Haojun Liao 已提交
1721
  if (noConvertBeforeCompare(GET_PARAM_TYPE(pLeft), GET_PARAM_TYPE(pRight), optr)) {
D
dapan1121 已提交
1722 1723
    param1 = pLeft;
    param2 = pRight;
D
dapan1121 已提交
1724
  } else {
D
dapan1121 已提交
1725
    vectorConvertCols(pLeft, pRight, &pLeftOut, &pRightOut, startIndex, numOfRows);
D
dapan1121 已提交
1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737

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

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

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

D
dapan1121 已提交
1742
  sclFreeParam(&pLeftOut);
G
Ganlin Zhao 已提交
1743
  sclFreeParam(&pRightOut);
D
dapan1121 已提交
1744 1745
}

dengyihao's avatar
dengyihao 已提交
1746
void vectorCompare(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord, int32_t optr) {
D
dapan1121 已提交
1747 1748 1749
  vectorCompareImpl(pLeft, pRight, pOut, -1, -1, _ord, optr);
}

dengyihao's avatar
dengyihao 已提交
1750
void vectorGreater(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1751
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_GREATER_THAN);
D
dapan1121 已提交
1752 1753
}

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

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

H
Hongze Cheng 已提交
1762
void vectorLowerEqual(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1763
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_LOWER_EQUAL);
D
dapan1121 已提交
1764 1765
}

H
Hongze Cheng 已提交
1766
void vectorEqual(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1767
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_EQUAL);
D
dapan1121 已提交
1768 1769
}

H
Hongze Cheng 已提交
1770
void vectorNotEqual(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1771
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_NOT_EQUAL);
D
dapan1121 已提交
1772 1773
}

H
Hongze Cheng 已提交
1774
void vectorIn(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1775
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_IN);
D
dapan1121 已提交
1776 1777
}

H
Hongze Cheng 已提交
1778
void vectorNotIn(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1779
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_NOT_IN);
D
dapan1121 已提交
1780 1781
}

H
Hongze Cheng 已提交
1782
void vectorLike(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1783
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_LIKE);
D
dapan1121 已提交
1784 1785
}

H
Hongze Cheng 已提交
1786
void vectorNotLike(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1787
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_NOT_LIKE);
D
dapan1121 已提交
1788 1789
}

H
Hongze Cheng 已提交
1790
void vectorMatch(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1791
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_MATCH);
D
dapan1121 已提交
1792 1793
}

H
Hongze Cheng 已提交
1794
void vectorNotMatch(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan 已提交
1795
  vectorCompare(pLeft, pRight, pOut, _ord, OP_TYPE_NMATCH);
D
dapan1121 已提交
1796 1797
}

H
Hongze Cheng 已提交
1798 1799
void vectorIsNull(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
  for (int32_t i = 0; i < pLeft->numOfRows; ++i) {
wmmhello's avatar
wmmhello 已提交
1800
    int8_t v = IS_HELPER_NULL(pLeft->columnData, i) ? 1 : 0;
1801
    colDataAppendInt8(pOut->columnData, i, &v);
D
dapan1121 已提交
1802
  }
1803
  pOut->numOfRows = pLeft->numOfRows;
D
dapan1121 已提交
1804 1805
}

H
Hongze Cheng 已提交
1806 1807
void vectorNotNull(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
  for (int32_t i = 0; i < pLeft->numOfRows; ++i) {
wmmhello's avatar
wmmhello 已提交
1808
    int8_t v = IS_HELPER_NULL(pLeft->columnData, i) ? 0 : 1;
1809
    colDataAppendInt8(pOut->columnData, i, &v);
D
dapan1121 已提交
1810
  }
1811
  pOut->numOfRows = pLeft->numOfRows;
D
dapan 已提交
1812
}
D
dapan1121 已提交
1813

dengyihao's avatar
dengyihao 已提交
1814
void vectorIsTrue(SScalarParam *pLeft, SScalarParam *pRight, SScalarParam *pOut, int32_t _ord) {
D
dapan1121 已提交
1815
  vectorConvertSingleColImpl(pLeft, pOut, NULL, -1, -1);
dengyihao's avatar
dengyihao 已提交
1816 1817
  for (int32_t i = 0; i < pOut->numOfRows; ++i) {
    if (colDataIsNull_s(pOut->columnData, i)) {
1818 1819
      int8_t v = 0;
      colDataAppendInt8(pOut->columnData, i, &v);
H
Haojun Liao 已提交
1820
      colDataClearNull_f(pOut->columnData->nullbitmap, i);
1821 1822 1823
    }
  }
  pOut->columnData->hasNull = false;
D
dapan1121 已提交
1824 1825
}

1826 1827
STagVal getJsonValue(char *json, char *key, bool *isExist) {
  STagVal val = {.pKey = key};
dengyihao's avatar
dengyihao 已提交
1828
  if (json == NULL || tTagIsJson((const STag *)json) == false) {
wmmhello's avatar
wmmhello 已提交
1829
    terrno = TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR;
H
Hongze Cheng 已提交
1830
    if (isExist) {
wmmhello's avatar
wmmhello 已提交
1831 1832 1833 1834 1835
      *isExist = false;
    }
    return val;
  }

1836
  bool find = tTagGet(((const STag *)json), &val);  // json value is null and not exist is different
H
Hongze Cheng 已提交
1837
  if (isExist) {
1838 1839 1840 1841 1842
    *isExist = find;
  }
  return val;
}

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

H
Hongze Cheng 已提交
1846 1847
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861

  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 已提交
1862
    colDataAppend(pOutputCol, i, (const char *)(&isExist), false);
1863 1864 1865 1866
  }
  taosMemoryFree(jsonKey);
}

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

H
Hongze Cheng 已提交
1870 1871
  int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : TMAX(pLeft->numOfRows, pRight->numOfRows) - 1;
  int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1;
1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883

  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 已提交
1884 1885
    char   *pLeftData = colDataGetVarData(pLeft->columnData, i);
    bool    isExist = false;
1886
    STagVal value = getJsonValue(pLeftData, jsonKey, &isExist);
H
Hongze Cheng 已提交
1887
    char   *data = isExist ? tTagValToData(&value, true) : NULL;
1888
    colDataAppend(pOutputCol, i, data, data == NULL);
H
Hongze Cheng 已提交
1889
    if (isExist && IS_VAR_DATA_TYPE(value.type) && data) {
1890 1891 1892 1893 1894 1895
      taosMemoryFree(data);
    }
  }
  taosMemoryFree(jsonKey);
}

1896 1897
_bin_scalar_fn_t getBinScalarOperatorFn(int32_t binFunctionId) {
  switch (binFunctionId) {
D
dapan1121 已提交
1898
    case OP_TYPE_ADD:
1899
      return vectorMathAdd;
D
dapan1121 已提交
1900
    case OP_TYPE_SUB:
1901
      return vectorMathSub;
D
dapan1121 已提交
1902
    case OP_TYPE_MULTI:
1903
      return vectorMathMultiply;
D
dapan1121 已提交
1904
    case OP_TYPE_DIV:
1905
      return vectorMathDivide;
1906
    case OP_TYPE_REM:
1907
      return vectorMathRemainder;
D
dapan1121 已提交
1908 1909
    case OP_TYPE_MINUS:
      return vectorMathMinus;
D
dapan1121 已提交
1910 1911
    case OP_TYPE_ASSIGN:
      return vectorAssign;
D
dapan1121 已提交
1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935
    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 已提交
1936
    case OP_TYPE_IS_NULL:
D
dapan1121 已提交
1937
      return vectorIsNull;
D
dapan1121 已提交
1938
    case OP_TYPE_IS_NOT_NULL:
D
dapan1121 已提交
1939 1940 1941 1942 1943
      return vectorNotNull;
    case OP_TYPE_BIT_AND:
      return vectorBitAnd;
    case OP_TYPE_BIT_OR:
      return vectorBitOr;
D
dapan1121 已提交
1944 1945
    case OP_TYPE_IS_TRUE:
      return vectorIsTrue;
1946 1947 1948 1949
    case OP_TYPE_JSON_GET_VALUE:
      return vectorJsonArrow;
    case OP_TYPE_JSON_CONTAINS:
      return vectorJsonContains;
1950
    default:
1951
      ASSERT(0);
1952 1953
      return NULL;
  }
D
dapan1121 已提交
1954
}