builtins.c 19.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * 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 "builtins.h"
H
Haojun Liao 已提交
17
#include "builtinsimpl.h"
18
#include "scalar.h"
19
#include "taoserror.h"
H
Haojun Liao 已提交
20
#include "tdatablock.h"
21

X
Xiaoyu Wang 已提交
22
int32_t checkAndGetResultType(SFunctionNode* pFunc);
23 24 25 26 27

const SBuiltinFuncDefinition funcMgtBuiltins[] = {
  {
    .name = "count",
    .type = FUNCTION_TYPE_COUNT,
28
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SPECIAL_DATA_REQUIRED,
X
Xiaoyu Wang 已提交
29
    .checkFunc    = checkAndGetResultType,
30
    .dataRequiredFunc = countDataRequired,
H
Haojun Liao 已提交
31 32 33
    .getEnvFunc   = getCountFuncEnv,
    .initFunc     = functionSetup,
    .processFunc  = countFunction,
H
Haojun Liao 已提交
34
    .finalizeFunc = functionFinalize
35
  },
X
Xiaoyu Wang 已提交
36 37 38 39
  {
    .name = "sum",
    .type = FUNCTION_TYPE_SUM,
    .classification = FUNC_MGT_AGG_FUNC,
X
Xiaoyu Wang 已提交
40
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
41 42 43
    .getEnvFunc   = getSumFuncEnv,
    .initFunc     = functionSetup,
    .processFunc  = sumFunction,
H
Haojun Liao 已提交
44
    .finalizeFunc = functionFinalize
X
Xiaoyu Wang 已提交
45
  },
46 47 48
  {
    .name = "min",
    .type = FUNCTION_TYPE_MIN,
49
    .classification = FUNC_MGT_AGG_FUNC,
X
Xiaoyu Wang 已提交
50
    .checkFunc    = checkAndGetResultType,
51 52 53
    .getEnvFunc   = getMinmaxFuncEnv,
    .initFunc     = minFunctionSetup,
    .processFunc  = minFunction,
H
Haojun Liao 已提交
54
    .finalizeFunc = functionFinalize
55 56 57 58
  },
  {
    .name = "max",
    .type = FUNCTION_TYPE_MAX,
59
    .classification = FUNC_MGT_AGG_FUNC,
X
Xiaoyu Wang 已提交
60
    .checkFunc    = checkAndGetResultType,
61 62 63
    .getEnvFunc   = getMinmaxFuncEnv,
    .initFunc     = maxFunctionSetup,
    .processFunc  = maxFunction,
H
Haojun Liao 已提交
64
    .finalizeFunc = functionFinalize
65
  },
H
Haojun Liao 已提交
66
  {
H
Haojun Liao 已提交
67 68 69
    .name = "stddev",
    .type = FUNCTION_TYPE_STDDEV,
    .classification = FUNC_MGT_AGG_FUNC,
X
Xiaoyu Wang 已提交
70
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
71 72 73 74 75 76 77 78 79
    .getEnvFunc   = getStddevFuncEnv,
    .initFunc     = stddevFunctionSetup,
    .processFunc  = stddevFunction,
    .finalizeFunc = stddevFinalize
  },
  {
    .name = "percentile",
    .type = FUNCTION_TYPE_PERCENTILE,
    .classification = FUNC_MGT_AGG_FUNC,
X
Xiaoyu Wang 已提交
80
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
81 82 83 84 85 86 87 88 89
    .getEnvFunc   = getPercentileFuncEnv,
    .initFunc     = percentileFunctionSetup,
    .processFunc  = percentileFunction,
    .finalizeFunc = percentileFinalize
  },
  {
    .name = "apercentile",
    .type = FUNCTION_TYPE_APERCENTILE,
    .classification = FUNC_MGT_AGG_FUNC,
X
Xiaoyu Wang 已提交
90
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
91 92 93 94 95 96 97 98 99
    .getEnvFunc   = getMinmaxFuncEnv,
    .initFunc     = maxFunctionSetup,
    .processFunc  = maxFunction,
    .finalizeFunc = functionFinalize
  },
  {
    .name = "top",
    .type = FUNCTION_TYPE_TOP,
    .classification = FUNC_MGT_AGG_FUNC,
X
Xiaoyu Wang 已提交
100
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
101 102 103 104 105 106 107 108 109
    .getEnvFunc   = getMinmaxFuncEnv,
    .initFunc     = maxFunctionSetup,
    .processFunc  = maxFunction,
    .finalizeFunc = functionFinalize
  },
  {
    .name = "bottom",
    .type = FUNCTION_TYPE_BOTTOM,
    .classification = FUNC_MGT_AGG_FUNC,
X
Xiaoyu Wang 已提交
110
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
111 112 113 114 115 116 117 118 119
    .getEnvFunc   = getMinmaxFuncEnv,
    .initFunc     = maxFunctionSetup,
    .processFunc  = maxFunction,
    .finalizeFunc = functionFinalize
  },
  {
    .name = "spread",
    .type = FUNCTION_TYPE_SPREAD,
    .classification = FUNC_MGT_AGG_FUNC,
X
Xiaoyu Wang 已提交
120
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
121 122 123 124 125 126 127 128 129
    .getEnvFunc   = getMinmaxFuncEnv,
    .initFunc     = maxFunctionSetup,
    .processFunc  = maxFunction,
    .finalizeFunc = functionFinalize
  },
  {
    .name = "last_row",
    .type = FUNCTION_TYPE_LAST_ROW,
    .classification = FUNC_MGT_AGG_FUNC,
X
Xiaoyu Wang 已提交
130
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
131 132 133 134
    .getEnvFunc   = getMinmaxFuncEnv,
    .initFunc     = maxFunctionSetup,
    .processFunc  = maxFunction,
    .finalizeFunc = functionFinalize
H
Haojun Liao 已提交
135
  },
H
Haojun Liao 已提交
136 137 138 139
  {
    .name = "first",
    .type = FUNCTION_TYPE_FIRST,
    .classification = FUNC_MGT_AGG_FUNC,
X
Xiaoyu Wang 已提交
140
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
141 142 143
    .getEnvFunc   = getFirstLastFuncEnv,
    .initFunc     = functionSetup,
    .processFunc  = firstFunction,
H
Haojun Liao 已提交
144
    .finalizeFunc = functionFinalize
H
Haojun Liao 已提交
145 146 147 148 149
  },
  {
    .name = "last",
    .type = FUNCTION_TYPE_LAST,
    .classification = FUNC_MGT_AGG_FUNC,
X
Xiaoyu Wang 已提交
150
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
151 152 153
    .getEnvFunc   = getFirstLastFuncEnv,
    .initFunc     = functionSetup,
    .processFunc  = lastFunction,
H
Haojun Liao 已提交
154
    .finalizeFunc = functionFinalize
H
Haojun Liao 已提交
155
  },
H
Haojun Liao 已提交
156 157 158 159
  {
    .name = "diff",
    .type = FUNCTION_TYPE_DIFF,
    .classification = FUNC_MGT_NONSTANDARD_SQL_FUNC,
X
Xiaoyu Wang 已提交
160
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
161 162 163 164 165
    .getEnvFunc   = getDiffFuncEnv,
    .initFunc     = diffFunctionSetup,
    .processFunc  = diffFunction,
    .finalizeFunc = functionFinalize
  },
166 167 168 169
  {
    .name = "abs",
    .type = FUNCTION_TYPE_ABS,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
170
    .checkFunc    = checkAndGetResultType,
171 172 173 174 175 176 177 178 179
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = absFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "log",
    .type = FUNCTION_TYPE_LOG,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
180
    .checkFunc    = checkAndGetResultType,
181 182 183 184 185 186
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = logFunction,
    .finalizeFunc = NULL
  },
  {
G
Ganlin Zhao 已提交
187
    .name = "pow",
188 189
    .type = FUNCTION_TYPE_POW,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
190
    .checkFunc    = checkAndGetResultType,
191 192 193 194 195 196 197 198 199
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = powFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "sqrt",
    .type = FUNCTION_TYPE_SQRT,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
200
    .checkFunc    = checkAndGetResultType,
201 202 203 204 205 206 207 208 209
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = sqrtFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "ceil",
    .type = FUNCTION_TYPE_CEIL,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
210
    .checkFunc    = checkAndGetResultType,
211 212 213 214 215 216 217 218 219
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = ceilFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "floor",
    .type = FUNCTION_TYPE_FLOOR,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
220
    .checkFunc    = checkAndGetResultType,
221 222 223 224 225 226 227 228 229
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = floorFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "round",
    .type = FUNCTION_TYPE_ROUND,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
230
    .checkFunc    = checkAndGetResultType,
231 232 233 234 235 236 237 238 239
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = roundFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "sin",
    .type = FUNCTION_TYPE_SIN,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
240
    .checkFunc    = checkAndGetResultType,
241 242 243 244 245 246 247 248 249
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = sinFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "cos",
    .type = FUNCTION_TYPE_COS,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
250
    .checkFunc    = checkAndGetResultType,
251 252 253 254 255 256 257 258 259
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = cosFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "tan",
    .type = FUNCTION_TYPE_TAN,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
260
    .checkFunc    = checkAndGetResultType,
261 262 263 264 265 266 267 268 269
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = tanFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "asin",
    .type = FUNCTION_TYPE_ASIN,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
270
    .checkFunc    = checkAndGetResultType,
271 272 273 274 275 276 277 278 279
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = asinFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "acos",
    .type = FUNCTION_TYPE_ACOS,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
280
    .checkFunc    = checkAndGetResultType,
281 282 283 284 285 286 287 288 289
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = acosFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "atan",
    .type = FUNCTION_TYPE_ATAN,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
290
    .checkFunc    = checkAndGetResultType,
291 292 293 294 295
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = atanFunction,
    .finalizeFunc = NULL
  },
G
Ganlin Zhao 已提交
296 297 298 299
  {
    .name = "length",
    .type = FUNCTION_TYPE_LENGTH,
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
X
Xiaoyu Wang 已提交
300
    .checkFunc    = checkAndGetResultType,
G
Ganlin Zhao 已提交
301 302 303 304 305 306 307 308 309
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = lengthFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "char_length",
    .type = FUNCTION_TYPE_CHAR_LENGTH,
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
X
Xiaoyu Wang 已提交
310
    .checkFunc    = checkAndGetResultType,
G
Ganlin Zhao 已提交
311 312 313 314 315
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = charLengthFunction,
    .finalizeFunc = NULL
  },
316 317 318 319
  {
    .name = "concat",
    .type = FUNCTION_TYPE_CONCAT,
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
X
Xiaoyu Wang 已提交
320
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
321 322
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
G
Ganlin Zhao 已提交
323 324 325 326 327 328 329
    .sprocessFunc = concatFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "concat_ws",
    .type = FUNCTION_TYPE_CONCAT_WS,
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
X
Xiaoyu Wang 已提交
330
    .checkFunc    = checkAndGetResultType,
G
Ganlin Zhao 已提交
331 332 333 334 335 336 337 338 339
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = concatWsFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "lower",
    .type = FUNCTION_TYPE_LOWER,
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
X
Xiaoyu Wang 已提交
340
    .checkFunc    = checkAndGetResultType,
G
Ganlin Zhao 已提交
341 342 343 344 345 346 347 348 349
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = lowerFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "upper",
    .type = FUNCTION_TYPE_UPPER,
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
X
Xiaoyu Wang 已提交
350
    .checkFunc    = checkAndGetResultType,
G
Ganlin Zhao 已提交
351 352 353 354 355 356 357 358 359
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = upperFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "ltrim",
    .type = FUNCTION_TYPE_LTRIM,
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
X
Xiaoyu Wang 已提交
360
    .checkFunc    = checkAndGetResultType,
G
Ganlin Zhao 已提交
361 362 363 364 365 366 367 368 369
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = ltrimFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "rtrim",
    .type = FUNCTION_TYPE_RTRIM,
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
X
Xiaoyu Wang 已提交
370
    .checkFunc    = checkAndGetResultType,
G
Ganlin Zhao 已提交
371 372 373 374 375 376 377 378 379
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = rtrimFunction,
    .finalizeFunc = NULL
  },
  {
    .name = "substr",
    .type = FUNCTION_TYPE_SUBSTR,
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
X
Xiaoyu Wang 已提交
380
    .checkFunc    = checkAndGetResultType,
G
Ganlin Zhao 已提交
381 382 383
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = substrFunction,
384
    .finalizeFunc = NULL
385
  },
386 387 388 389
  {
    .name = "cast",
    .type = FUNCTION_TYPE_CAST,
    .classification = FUNC_MGT_SCALAR_FUNC,
X
Xiaoyu Wang 已提交
390
    .checkFunc    = checkAndGetResultType,
391 392
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
G
Ganlin Zhao 已提交
393
    .sprocessFunc = castFunction,
394 395
    .finalizeFunc = NULL
  },
396 397 398 399 400 401 402 403 404 405
  {
    .name = "to_iso8601",
    .type = FUNCTION_TYPE_TO_ISO8601,
    .classification = FUNC_MGT_SCALAR_FUNC,
    .checkFunc    = checkAndGetResultType,
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = toISO8601Function,
    .finalizeFunc = NULL
  },
406 407 408 409 410 411 412 413 414 415
  {
    .name = "to_unixtimestamp",
    .type = FUNCTION_TYPE_TO_UNIXTIMESTAMP,
    .classification = FUNC_MGT_SCALAR_FUNC,
    .checkFunc    = checkAndGetResultType,
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = toUnixtimestampFunction,
    .finalizeFunc = NULL
  },
416 417 418 419
  {
    .name = "_rowts",
    .type = FUNCTION_TYPE_ROWTS,
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC,
X
Xiaoyu Wang 已提交
420
    .checkFunc    = checkAndGetResultType,
H
Haojun Liao 已提交
421
    .getEnvFunc   = getTimePseudoFuncEnv,
422 423 424 425 426 427 428 429
    .initFunc     = NULL,
    .sprocessFunc = NULL,
    .finalizeFunc = NULL
  },
  {
    .name = "tbname",
    .type = FUNCTION_TYPE_TBNAME,
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC,
X
Xiaoyu Wang 已提交
430
    .checkFunc    = checkAndGetResultType,
431 432 433 434 435 436 437 438
    .getEnvFunc   = NULL,
    .initFunc     = NULL,
    .sprocessFunc = NULL,
    .finalizeFunc = NULL
  },
  {
    .name = "_qstartts",
    .type = FUNCTION_TYPE_QSTARTTS,
439
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_WINDOW_PC_FUNC,
X
Xiaoyu Wang 已提交
440
    .checkFunc    = checkAndGetResultType,
441
    .getEnvFunc   = getTimePseudoFuncEnv,
442
    .initFunc     = NULL,
443
    .sprocessFunc = qStartTsFunction,
444 445 446 447 448
    .finalizeFunc = NULL
  },
  {
    .name = "_qendts",
    .type = FUNCTION_TYPE_QENDTS,
449
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_WINDOW_PC_FUNC,
X
Xiaoyu Wang 已提交
450
    .checkFunc    = checkAndGetResultType,
451
    .getEnvFunc   = getTimePseudoFuncEnv,
452
    .initFunc     = NULL,
453
    .sprocessFunc = qEndTsFunction,
454 455 456 457
    .finalizeFunc = NULL
  },
  {
    .name = "_wstartts",
458
    .type = FUNCTION_TYPE_WSTARTTS,
459
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_WINDOW_PC_FUNC,
X
Xiaoyu Wang 已提交
460
    .checkFunc    = checkAndGetResultType,
461
    .getEnvFunc   = getTimePseudoFuncEnv,
462
    .initFunc     = NULL,
463
    .sprocessFunc = winStartTsFunction,
464 465 466 467 468 469
    .finalizeFunc = NULL
  },
  {
    .name = "_wendts",
    .type = FUNCTION_TYPE_QENDTS,
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_WINDOW_PC_FUNC,
X
Xiaoyu Wang 已提交
470
    .checkFunc    = checkAndGetResultType,
471
    .getEnvFunc   = getTimePseudoFuncEnv,
472
    .initFunc     = NULL,
473
    .sprocessFunc = winEndTsFunction,
474 475 476 477 478 479
    .finalizeFunc = NULL
  },
  {
    .name = "_wduration",
    .type = FUNCTION_TYPE_WDURATION,
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_WINDOW_PC_FUNC,
X
Xiaoyu Wang 已提交
480
    .checkFunc    = checkAndGetResultType,
481
    .getEnvFunc   = getTimePseudoFuncEnv,
482
    .initFunc     = NULL,
483
    .sprocessFunc = winDurFunction,
484
    .finalizeFunc = NULL
X
Xiaoyu Wang 已提交
485 486 487 488 489
  },
  {
    .name = "now",
    .type = FUNCTION_TYPE_NOW,
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_DATETIME_FUNC,
X
Xiaoyu Wang 已提交
490
    .checkFunc    = checkAndGetResultType,
X
Xiaoyu Wang 已提交
491 492 493 494
    .getEnvFunc   = getTimePseudoFuncEnv,
    .initFunc     = NULL,
    .sprocessFunc = winDurFunction,
    .finalizeFunc = NULL
495 496 497
  }
};

X
Xiaoyu Wang 已提交
498
const int32_t funcMgtBuiltinsNum = (sizeof(funcMgtBuiltins) / sizeof(SBuiltinFuncDefinition));
499

X
Xiaoyu Wang 已提交
500
int32_t checkAndGetResultType(SFunctionNode* pFunc) {
H
Haojun Liao 已提交
501
  switch(pFunc->funcType) {
502
    case FUNCTION_TYPE_WDURATION:
H
Haojun Liao 已提交
503
    case FUNCTION_TYPE_COUNT: {
X
Xiaoyu Wang 已提交
504 505
      pFunc->node.resType = (SDataType){.bytes = sizeof(int64_t), .type = TSDB_DATA_TYPE_BIGINT};
      break;
H
Haojun Liao 已提交
506 507
    }

508 509 510 511 512
    case FUNCTION_TYPE_SUM: {
      SColumnNode* pParam = nodesListGetNode(pFunc->pParameterList, 0);
      int32_t paraType = pParam->node.resType.type;

      int32_t resType  = 0;
513
      if (IS_SIGNED_NUMERIC_TYPE(paraType) || paraType == TSDB_DATA_TYPE_BOOL) {
514 515 516 517 518 519 520 521 522 523 524 525
        resType = TSDB_DATA_TYPE_BIGINT;
      } else if (IS_UNSIGNED_NUMERIC_TYPE(paraType)) {
        resType = TSDB_DATA_TYPE_UBIGINT;
      } else if (IS_FLOAT_TYPE(paraType)) {
        resType = TSDB_DATA_TYPE_DOUBLE;
      } else {
        ASSERT(0);
      }

      pFunc->node.resType = (SDataType) { .bytes = tDataTypes[resType].bytes, .type = resType };
      break;
    }
H
Haojun Liao 已提交
526 527

    case FUNCTION_TYPE_DIFF:
H
Haojun Liao 已提交
528 529
    case FUNCTION_TYPE_FIRST:
    case FUNCTION_TYPE_LAST:
530 531 532 533 534
    case FUNCTION_TYPE_MIN:
    case FUNCTION_TYPE_MAX: {
      SColumnNode* pParam = nodesListGetNode(pFunc->pParameterList, 0);
      int32_t paraType = pParam->node.resType.type;
      pFunc->node.resType = (SDataType) { .bytes = tDataTypes[paraType].bytes, .type = paraType };
H
Haojun Liao 已提交
535
      break;
536
    }
H
Haojun Liao 已提交
537

H
Haojun Liao 已提交
538
    case FUNCTION_TYPE_ROWTS:
539
    case FUNCTION_TYPE_QSTARTTS:
H
Haojun Liao 已提交
540 541 542
    case FUNCTION_TYPE_QENDTS:
    case FUNCTION_TYPE_WSTARTTS:
    case FUNCTION_TYPE_WENDTS:{
543
      pFunc->node.resType = (SDataType){.bytes = sizeof(int64_t), .type = TSDB_DATA_TYPE_TIMESTAMP};
X
Xiaoyu Wang 已提交
544
      break;
545
    }
546

G
Ganlin Zhao 已提交
547 548 549 550
    case FUNCTION_TYPE_ABS:
    case FUNCTION_TYPE_CEIL:
    case FUNCTION_TYPE_FLOOR:
    case FUNCTION_TYPE_ROUND: {
551 552 553 554 555 556
      SColumnNode* pParam = nodesListGetNode(pFunc->pParameterList, 0);
      int32_t paraType = pParam->node.resType.type;
      pFunc->node.resType = (SDataType) { .bytes = tDataTypes[paraType].bytes, .type = paraType };
      break;
    }

H
Haojun Liao 已提交
557
    case FUNCTION_TYPE_PERCENTILE:
H
Haojun Liao 已提交
558
    case FUNCTION_TYPE_STDDEV:
G
Ganlin Zhao 已提交
559 560 561 562 563 564 565 566 567 568 569 570
    case FUNCTION_TYPE_SIN:
    case FUNCTION_TYPE_COS:
    case FUNCTION_TYPE_TAN:
    case FUNCTION_TYPE_ASIN:
    case FUNCTION_TYPE_ACOS:
    case FUNCTION_TYPE_ATAN:
    case FUNCTION_TYPE_SQRT:
    case FUNCTION_TYPE_LOG:
    case FUNCTION_TYPE_POW: {
      pFunc->node.resType = (SDataType) { .bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE };
      break;
    }
H
Haojun Liao 已提交
571

G
Ganlin Zhao 已提交
572 573 574 575 576 577
    case FUNCTION_TYPE_LENGTH:
    case FUNCTION_TYPE_CHAR_LENGTH: {
      pFunc->node.resType = (SDataType) { .bytes = tDataTypes[TSDB_DATA_TYPE_SMALLINT].bytes, .type = TSDB_DATA_TYPE_SMALLINT };
      break;
    }

578 579
    case FUNCTION_TYPE_CONCAT:
    case FUNCTION_TYPE_CONCAT_WS: {
580
      int32_t paraType, paraBytes = 0;
581
      bool typeSet = false;
582
      for (int32_t i = 0; i < pFunc->pParameterList->length; ++i) {
583
        SColumnNode* pParam = nodesListGetNode(pFunc->pParameterList, i);
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606
        if (pParam->node.type == QUERY_NODE_COLUMN) {
          if (typeSet == false) {
            paraType = pParam->node.resType.type;
            typeSet = true;
          } else {
            //columns have to be the same type
            if (paraType != pParam->node.resType.type) {
              return TSDB_CODE_FAILED;
            }
          }
          paraBytes += pParam->node.resType.bytes;
        }
      }

      for (int32_t i = 0; i < pFunc->pParameterList->length; ++i) {
        SColumnNode* pParam = nodesListGetNode(pFunc->pParameterList, i);
        if (pParam->node.type == QUERY_NODE_VALUE) {
          if (paraType == TSDB_DATA_TYPE_NCHAR) {
            paraBytes += pParam->node.resType.bytes * TSDB_NCHAR_SIZE;
          } else {
            paraBytes += pParam->node.resType.bytes;
          }
        }
607
      }
608
      pFunc->node.resType = (SDataType) { .bytes = paraBytes, .type = paraType };
609
      break;
610
    }
G
Ganlin Zhao 已提交
611 612 613 614 615 616
    case FUNCTION_TYPE_LOWER:
    case FUNCTION_TYPE_UPPER:
    case FUNCTION_TYPE_LTRIM:
    case FUNCTION_TYPE_RTRIM:
    case FUNCTION_TYPE_SUBSTR: {
      SColumnNode* pParam = nodesListGetNode(pFunc->pParameterList, 0);
617 618 619
      int32_t paraType  = pParam->node.resType.type;
      int32_t paraBytes = pParam->node.resType.bytes;
      pFunc->node.resType = (SDataType) { .bytes = paraBytes, .type = paraType };
G
Ganlin Zhao 已提交
620 621
      break;
    }
622
    case FUNCTION_TYPE_CAST: {
G
Ganlin Zhao 已提交
623 624 625 626 627 628 629
      //type
      SValueNode* pParam = nodesListGetNode(pFunc->pParameterList, 1);
      int32_t paraType = pParam->datum.i;
      //bytes
      pParam = nodesListGetNode(pFunc->pParameterList, 2);
      int32_t paraBytes = pParam->datum.i;
      pFunc->node.resType = (SDataType) { .bytes = paraBytes, .type = paraType};
630 631
      break;
    }
632 633 634
    case FUNCTION_TYPE_TO_ISO8601: {
      pFunc->node.resType = (SDataType) { .bytes = 64, .type = TSDB_DATA_TYPE_BINARY};
    }
635 636 637
    case FUNCTION_TYPE_TO_UNIXTIMESTAMP: {
      pFunc->node.resType = (SDataType) { .bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
    }
G
Ganlin Zhao 已提交
638

639
    case FUNCTION_TYPE_TBNAME: {
G
Ganlin Zhao 已提交
640 641
      // todo
      break;
642
    }
G
Ganlin Zhao 已提交
643

X
Xiaoyu Wang 已提交
644 645 646
    case FUNCTION_TYPE_NOW:
      // todo
      break;
647 648
    default:
      ASSERT(0); // to found the fault ASAP.
H
Haojun Liao 已提交
649 650
  }

651 652
  return TSDB_CODE_SUCCESS;
}