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

taosdata / TDengine / #3633

11 Mar 2025 12:59PM UTC coverage: 0.0% (-60.7%) from 60.719%
#3633

push

travis-ci

web-flow
Merge pull request #30118 from taosdata/wl30

udpate ci workflow

0 of 280412 branches covered (0.0%)

Branch coverage included in aggregate %.

0 of 275582 relevant lines covered (0.0%)

0.0 hits per line

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

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

16
#include "builtins.h"
17
#include "builtinsimpl.h"
18
#include "cJSON.h"
19
#include "geomFunc.h"
20
#include "querynodes.h"
21
#include "scalar.h"
22
#include "tanalytics.h"
23
#include "taoserror.h"
24
#include "ttime.h"
25
#include "functionMgt.h"
26
#include "ttypes.h"
27
#include "tglobal.h"
28

29
static int32_t buildFuncErrMsg(char* pErrBuf, int32_t len, int32_t errCode, const char* pFormat, ...) {
×
30
  va_list vArgList;
31
  va_start(vArgList, pFormat);
×
32
  (void)vsnprintf(pErrBuf, len, pFormat, vArgList);
×
33
  va_end(vArgList);
×
34
  return errCode;
×
35
}
36

37
static int32_t invaildFuncParaNumErrMsg(char* pErrBuf, int32_t len, const char* pFuncName) {
×
38
  return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_NUM, "Invalid number of parameters : %s", pFuncName);
×
39
}
40

41
static int32_t invaildFuncParaTypeErrMsg(char* pErrBuf, int32_t len, const char* pFuncName) {
×
42
  return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_TYPE, "Invalid parameter data type : %s", pFuncName);
×
43
}
44

45
static int32_t invaildFuncParaValueErrMsg(char* pErrBuf, int32_t len, const char* pFuncName) {
×
46
  return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_VALUE, "Invalid parameter value : %s", pFuncName);
×
47
}
48

49
static int32_t validateTimeUnitParam(uint8_t dbPrec, const SValueNode* pVal) {
×
50
  if (!IS_DURATION_VAL(pVal->flag)) {
×
51
    return TSDB_CODE_FUNC_TIME_UNIT_INVALID;
×
52
  }
53

54
  if (TSDB_TIME_PRECISION_MILLI == dbPrec &&
×
55
      (0 == strcasecmp(pVal->literal, "1u") || 0 == strcasecmp(pVal->literal, "1b"))) {
×
56
    return TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL;
×
57
  }
58

59
  if (TSDB_TIME_PRECISION_MICRO == dbPrec && 0 == strcasecmp(pVal->literal, "1b")) {
×
60
    return TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL;
×
61
  }
62

63
  if (pVal->literal[0] != '1' ||
×
64
      (pVal->literal[1] != 'u' && pVal->literal[1] != 'a' && pVal->literal[1] != 's' && pVal->literal[1] != 'm' &&
×
65
       pVal->literal[1] != 'h' && pVal->literal[1] != 'd' && pVal->literal[1] != 'w' && pVal->literal[1] != 'b')) {
×
66
    return TSDB_CODE_FUNC_TIME_UNIT_INVALID;
×
67
  }
68

69
  return TSDB_CODE_SUCCESS;
×
70
}
71

72
/* Following are valid ISO-8601 timezone format:
73
 * 1 z/Z
74
 * 2 ±hh:mm
75
 * 3 ±hhmm
76
 * 4 ±hh
77
 *
78
 */
79

80
static bool validateHourRange(int8_t hour) {
×
81
  if (hour < 0 || hour > 12) {
×
82
    return false;
×
83
  }
84

85
  return true;
×
86
}
87

88
static bool validateMinuteRange(int8_t hour, int8_t minute, char sign) {
×
89
  if (minute == 0 || (minute == 30 && (hour == 3 || hour == 5) && sign == '+')) {
×
90
    return true;
×
91
  }
92

93
  return false;
×
94
}
95

96
static bool validateTimezoneFormat(const SValueNode* pVal) {
×
97
  if (TSDB_DATA_TYPE_BINARY != pVal->node.resType.type) {
×
98
    return false;
×
99
  }
100

101
  char*   tz = varDataVal(pVal->datum.p);
×
102
  int32_t len = varDataLen(pVal->datum.p);
×
103

104
  char   buf[3] = {0};
×
105
  int8_t hour = -1, minute = -1;
×
106
  if (len == 0) {
×
107
    return false;
×
108
  } else if (len == 1 && (tz[0] == 'z' || tz[0] == 'Z')) {
×
109
    return true;
×
110
  } else if ((tz[0] == '+' || tz[0] == '-')) {
×
111
    switch (len) {
×
112
      case 3:
×
113
      case 5: {
114
        for (int32_t i = 1; i < len; ++i) {
×
115
          if (!isdigit(tz[i])) {
×
116
            return false;
×
117
          }
118

119
          if (i == 2) {
×
120
            (void)memcpy(buf, &tz[i - 1], 2);
×
121
            hour = taosStr2Int8(buf, NULL, 10);
×
122
            if (!validateHourRange(hour)) {
×
123
              return false;
×
124
            }
125
          } else if (i == 4) {
×
126
            (void)memcpy(buf, &tz[i - 1], 2);
×
127
            minute = taosStr2Int8(buf, NULL, 10);
×
128
            if (!validateMinuteRange(hour, minute, tz[0])) {
×
129
              return false;
×
130
            }
131
          }
132
        }
133
        break;
×
134
      }
135
      case 6: {
×
136
        for (int32_t i = 1; i < len; ++i) {
×
137
          if (i == 3) {
×
138
            if (tz[i] != ':') {
×
139
              return false;
×
140
            }
141
            continue;
×
142
          }
143

144
          if (!isdigit(tz[i])) {
×
145
            return false;
×
146
          }
147

148
          if (i == 2) {
×
149
            (void)memcpy(buf, &tz[i - 1], 2);
×
150
            hour = taosStr2Int8(buf, NULL, 10);
×
151
            if (!validateHourRange(hour)) {
×
152
              return false;
×
153
            }
154
          } else if (i == 5) {
×
155
            (void)memcpy(buf, &tz[i - 1], 2);
×
156
            minute = taosStr2Int8(buf, NULL, 10);
×
157
            if (!validateMinuteRange(hour, minute, tz[0])) {
×
158
              return false;
×
159
            }
160
          }
161
        }
162
        break;
×
163
      }
164
      default: {
×
165
        return false;
×
166
      }
167
    }
168
  } else {
169
    return false;
×
170
  }
171

172
  return true;
×
173
}
174

175
static int32_t countTrailingSpaces(const SValueNode* pVal, bool isLtrim) {
×
176
  int32_t numOfSpaces = 0;
×
177
  int32_t len = varDataLen(pVal->datum.p);
×
178
  char*   str = varDataVal(pVal->datum.p);
×
179

180
  int32_t startPos = isLtrim ? 0 : len - 1;
×
181
  int32_t step = isLtrim ? 1 : -1;
×
182
  for (int32_t i = startPos; i < len || i >= 0; i += step) {
×
183
    if (!isspace(str[i])) {
×
184
      break;
×
185
    }
186
    numOfSpaces++;
×
187
  }
188

189
  return numOfSpaces;
×
190
}
191

192
static int32_t addTimezoneParam(SNodeList* pList, timezone_t tz) {
×
193
  char      buf[TD_TIME_STR_LEN] = {0};
×
194
  time_t    t;
195
  int32_t code = taosTime(&t);
×
196
  if (code != 0) {
×
197
    return code;
×
198
  }
199
  struct tm tmInfo;
200
  if (taosLocalTime(&t, &tmInfo, buf, sizeof(buf), tz) != NULL) {
×
201
    (void)taosStrfTime(buf, sizeof(buf), "%z", &tmInfo);
×
202
  }
203
  int32_t len = (int32_t)strlen(buf);
×
204

205
  SValueNode* pVal = NULL;
×
206
  code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal);
×
207
  if (pVal == NULL) {
×
208
    return code;
×
209
  }
210

211
  pVal->literal = taosStrndup(buf, len);
×
212
  if (pVal->literal == NULL) {
×
213
    nodesDestroyNode((SNode*)pVal);
×
214
    return terrno;
×
215
  }
216
  pVal->translate = true;
×
217
  pVal->node.resType.type = TSDB_DATA_TYPE_BINARY;
×
218
  pVal->node.resType.bytes = len + VARSTR_HEADER_SIZE;
×
219
  pVal->node.resType.precision = TSDB_TIME_PRECISION_MILLI;
×
220
  pVal->datum.p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE + 1);
×
221
  if (pVal->datum.p == NULL) {
×
222
    nodesDestroyNode((SNode*)pVal);
×
223
    return terrno;
×
224
  }
225
  varDataSetLen(pVal->datum.p, len);
×
226
  tstrncpy(varDataVal(pVal->datum.p), pVal->literal, len + 1);
×
227

228
  code = nodesListAppend(pList, (SNode*)pVal);
×
229
  if (TSDB_CODE_SUCCESS != code) {
×
230
    nodesDestroyNode((SNode*)pVal);
×
231
    return code;
×
232
  }
233
  return TSDB_CODE_SUCCESS;
×
234
}
235

236
static int32_t addUint8Param(SNodeList** pList, uint8_t param) {
×
237
  SValueNode* pVal = NULL;
×
238
  int32_t     code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal);
×
239
  if (pVal == NULL) {
×
240
    return code;
×
241
  }
242

243
  pVal->literal = NULL;
×
244
  pVal->translate = true;
×
245
  pVal->notReserved = true;
×
246
  pVal->node.resType.type = TSDB_DATA_TYPE_TINYINT;
×
247
  pVal->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_TINYINT].bytes;
×
248
  pVal->node.resType.precision = param;
×
249
  pVal->datum.i = (int64_t)param;
×
250
  pVal->typeData = (int64_t)param;
×
251

252
  code = nodesListMakeAppend(pList, (SNode*)pVal);
×
253
  if (TSDB_CODE_SUCCESS != code) {
×
254
    nodesDestroyNode((SNode*)pVal);
×
255
    return code;
×
256
  }
257
  return TSDB_CODE_SUCCESS;
×
258
}
259

260
static int32_t addPseudoParam(SNodeList** pList) {
×
261
  SNode*  pseudoNode = NULL;
×
262
  int32_t code = nodesMakeNode(QUERY_NODE_LEFT_VALUE, &pseudoNode);
×
263
  if (pseudoNode == NULL) {
×
264
    return code;
×
265
  }
266

267
  code = nodesListMakeAppend(pList, pseudoNode);
×
268
  if (TSDB_CODE_SUCCESS != code) {
×
269
    nodesDestroyNode(pseudoNode);
×
270
    return code;
×
271
  }
272
  return TSDB_CODE_SUCCESS;
×
273
}
274

275
static SDataType* getSDataTypeFromNode(SNode* pNode) {
×
276
  if (pNode == NULL) return NULL;
×
277
  if (nodesIsExprNode(pNode)) {
×
278
    return &((SExprNode*)pNode)->resType;
×
279
  } else if (QUERY_NODE_COLUMN_REF == pNode->type) {
×
280
    return &((SColumnRefNode*)pNode)->resType;
×
281
  } else {
282
    return NULL;
×
283
  }
284
}
285

286
static bool paramSupportNull(uint64_t typeFlag) {
×
287
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NULL_TYPE) ||
×
288
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
×
289
}
290

291
static bool paramSupportBool(uint64_t typeFlag) {
×
292
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BOOL_TYPE) ||
×
293
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
×
294
}
295

296
static bool paramSupportTinyint(uint64_t typeFlag) {
×
297
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TINYINT_TYPE) ||
×
298
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
299
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
×
300
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
×
301
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
302
}
303

304
static bool paramSupportSmallint(uint64_t typeFlag) {
×
305
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_SMALLINT_TYPE) ||
×
306
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
307
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
×
308
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
×
309
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
310
}
311

312
static bool paramSupportInt(uint64_t typeFlag) {
×
313
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INT_TYPE) ||
×
314
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
315
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
×
316
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
×
317
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
318
}
319

320
static bool paramSupportBigint(uint64_t typeFlag) {
×
321
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BIGINT_TYPE) ||
×
322
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
323
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
×
324
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
×
325
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
326
}
327

328
static bool paramSupportFloat(uint64_t typeFlag) {
×
329
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FLOAT_TYPE) ||
×
330
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
331
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
×
332
}
333

334
static bool paramSupportDouble(uint64_t typeFlag) {
×
335
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_DOUBLE_TYPE) ||
×
336
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
337
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
×
338
}
339

340
static bool paramSupportVarchar(uint64_t typeFlag) {
×
341
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARCHAR_TYPE) ||
×
342
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
343
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
×
344
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
×
345
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
346
}
347

348
static bool paramSupportTimestamp(uint64_t typeFlag) {
×
349
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE) ||
×
350
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
351
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
352
}
353

354
static bool paramSupportNchar(uint64_t typeFlag) {
×
355
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NCHAR_TYPE) ||
×
356
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
357
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
×
358
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
×
359
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
360
}
361

362
static bool paramSupportUTinyInt(uint64_t typeFlag) {
×
363
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UTINYINT_TYPE) ||
×
364
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
365
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
×
366
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
×
367
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
368
}
369

370
static bool paramSupportUSmallInt(uint64_t typeFlag) {
×
371
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_USMALLINT_TYPE) ||
×
372
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
373
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
×
374
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
×
375
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
376
}
377

378
static bool paramSupportUInt(uint64_t typeFlag) {
×
379
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UINT_TYPE) ||
×
380
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
381
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
×
382
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
×
383
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
384
}
385

386
static bool paramSupportUBigInt(uint64_t typeFlag) {
×
387
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UBIGINT_TYPE) ||
×
388
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
389
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
×
390
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
×
391
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
392
}
393

394
static bool paramSupportJSON(uint64_t typeFlag) {
×
395
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_JSON_TYPE) ||
×
396
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
397
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE);
×
398
}
399

400
static bool paramSupportVarBinary(uint64_t typeFlag) {
×
401
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARB_TYPE) ||
×
402
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
403
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
×
404
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE);
×
405
}
406

407
static bool paramSupportGeometry(uint64_t typeFlag) {
×
408
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_GEOMETRY_TYPE) ||
×
409
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
410
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE);
×
411
}
412

413
static bool paramSupportValueNode(uint64_t typeFlag) {
×
414
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VALUE_NODE) ||
×
415
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE);
×
416
}
417

418
static bool paramSupportOperatorNode(uint64_t typeFlag) {
×
419
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
×
420
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_OPERATOR_NODE) ||
×
421
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
×
422
}
423

424
static bool paramSupportFunctionNode(uint64_t typeFlag) {
×
425
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
×
426
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FUNCTION_NODE) ||
×
427
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
×
428
}
429

430
static bool paramSupportLogicConNode(uint64_t typeFlag) {
×
431
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
×
432
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_LOGIC_CONDITION_NODE) ||
×
433
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
×
434
}
435

436
static bool paramSupportCaseWhenNode(uint64_t typeFlag) {
×
437
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
×
438
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_CASE_WHEN_NODE) ||
×
439
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
×
440
}
441

442
static bool paramSupportColumnNode(uint64_t typeFlag) {
×
443
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
×
444
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_COLUMN_NODE) ||
×
445
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
×
446
}
447

448
static bool paramSupportNodeType(SNode* pNode, uint64_t typeFlag) {
×
449
  switch (pNode->type) {
×
450
    case QUERY_NODE_VALUE:
×
451
      return paramSupportValueNode(typeFlag);
×
452
    case QUERY_NODE_OPERATOR:
×
453
      return paramSupportOperatorNode(typeFlag);
×
454
    case QUERY_NODE_FUNCTION:
×
455
      return paramSupportFunctionNode(typeFlag);
×
456
    case QUERY_NODE_LOGIC_CONDITION:
×
457
      return paramSupportLogicConNode(typeFlag);
×
458
    case QUERY_NODE_CASE_WHEN:
×
459
      return paramSupportCaseWhenNode(typeFlag);
×
460
    case QUERY_NODE_COLUMN:
×
461
      return paramSupportColumnNode(typeFlag);
×
462
    default:
×
463
      return false;
×
464
  }
465
}
466

467
static bool paramSupportDataType(SDataType* pDataType, uint64_t typeFlag) {
×
468
  switch (pDataType->type) {
×
469
    case TSDB_DATA_TYPE_NULL:
×
470
      return paramSupportNull(typeFlag);
×
471
    case TSDB_DATA_TYPE_BOOL:
×
472
      return paramSupportBool(typeFlag);
×
473
    case TSDB_DATA_TYPE_TINYINT:
×
474
      return paramSupportTinyint(typeFlag);
×
475
    case TSDB_DATA_TYPE_SMALLINT:
×
476
      return paramSupportSmallint(typeFlag);
×
477
    case TSDB_DATA_TYPE_INT:
×
478
      return paramSupportInt(typeFlag);
×
479
    case TSDB_DATA_TYPE_BIGINT:
×
480
      return paramSupportBigint(typeFlag);
×
481
    case TSDB_DATA_TYPE_FLOAT:
×
482
      return paramSupportFloat(typeFlag);
×
483
    case TSDB_DATA_TYPE_DOUBLE:
×
484
      return paramSupportDouble(typeFlag);
×
485
    case TSDB_DATA_TYPE_VARCHAR:
×
486
      return paramSupportVarchar(typeFlag);
×
487
    case TSDB_DATA_TYPE_TIMESTAMP:
×
488
      return paramSupportTimestamp(typeFlag);
×
489
    case TSDB_DATA_TYPE_NCHAR:
×
490
      return paramSupportNchar(typeFlag);
×
491
    case TSDB_DATA_TYPE_UTINYINT:
×
492
      return paramSupportUTinyInt(typeFlag);
×
493
    case TSDB_DATA_TYPE_USMALLINT:
×
494
      return paramSupportUSmallInt(typeFlag);
×
495
    case TSDB_DATA_TYPE_UINT:
×
496
      return paramSupportUInt(typeFlag);
×
497
    case TSDB_DATA_TYPE_UBIGINT:
×
498
      return paramSupportUBigInt(typeFlag);
×
499
    case TSDB_DATA_TYPE_JSON:
×
500
      return paramSupportJSON(typeFlag);
×
501
    case TSDB_DATA_TYPE_VARBINARY:
×
502
      return paramSupportVarBinary(typeFlag);
×
503
    case TSDB_DATA_TYPE_GEOMETRY:
×
504
      return paramSupportGeometry(typeFlag);
×
505
    default:
×
506
      return false;
×
507
  }
508
}
509

510
typedef enum { UNKNOWN_BIN = 0, USER_INPUT_BIN, LINEAR_BIN, LOG_BIN } EHistoBinType;
511

512
static int8_t validateHistogramBinType(char* binTypeStr) {
×
513
  int8_t binType;
514
  if (strcasecmp(binTypeStr, "user_input") == 0) {
×
515
    binType = USER_INPUT_BIN;
×
516
  } else if (strcasecmp(binTypeStr, "linear_bin") == 0) {
×
517
    binType = LINEAR_BIN;
×
518
  } else if (strcasecmp(binTypeStr, "log_bin") == 0) {
×
519
    binType = LOG_BIN;
×
520
  } else {
521
    binType = UNKNOWN_BIN;
×
522
  }
523

524
  return binType;
×
525
}
526

527
static int32_t validateHistogramBinDesc(char* binDescStr, int8_t binType, char* errMsg, int32_t msgLen) {
×
528
  const char* msg1 = "HISTOGRAM function requires four parameters";
×
529
  const char* msg3 = "HISTOGRAM function invalid format for binDesc parameter";
×
530
  const char* msg4 = "HISTOGRAM function binDesc parameter \"count\" should be in range [1, 1000]";
×
531
  const char* msg5 = "HISTOGRAM function bin/parameter should be in range [-DBL_MAX, DBL_MAX]";
×
532
  const char* msg6 = "HISTOGRAM function binDesc parameter \"width\" cannot be 0";
×
533
  const char* msg7 = "HISTOGRAM function binDesc parameter \"start\" cannot be 0 with \"log_bin\" type";
×
534
  const char* msg8 = "HISTOGRAM function binDesc parameter \"factor\" cannot be negative or equal to 0/1";
×
535
  const char* msg9 = "HISTOGRAM function out of memory";
×
536

537
  cJSON*  binDesc = cJSON_Parse(binDescStr);
×
538
  int32_t numOfBins;
539
  double* intervals;
540
  if (cJSON_IsObject(binDesc)) { /* linaer/log bins */
×
541
    int32_t numOfParams = cJSON_GetArraySize(binDesc);
×
542
    int32_t startIndex;
543
    if (numOfParams != 4) {
×
544
      (void)snprintf(errMsg, msgLen, "%s", msg1);
×
545
      cJSON_Delete(binDesc);
×
546
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
547
    }
548

549
    cJSON* start = cJSON_GetObjectItem(binDesc, "start");
×
550
    cJSON* factor = cJSON_GetObjectItem(binDesc, "factor");
×
551
    cJSON* width = cJSON_GetObjectItem(binDesc, "width");
×
552
    cJSON* count = cJSON_GetObjectItem(binDesc, "count");
×
553
    cJSON* infinity = cJSON_GetObjectItem(binDesc, "infinity");
×
554

555
    if (!cJSON_IsNumber(start) || !cJSON_IsNumber(count) || !cJSON_IsBool(infinity)) {
×
556
      (void)snprintf(errMsg, msgLen, "%s", msg3);
×
557
      cJSON_Delete(binDesc);
×
558
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
559
    }
560

561
    if (count->valueint <= 0 || count->valueint > 1000) {  // limit count to 1000
×
562
      (void)snprintf(errMsg, msgLen, "%s", msg4);
×
563
      cJSON_Delete(binDesc);
×
564
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
565
    }
566

567
    if (isinf(start->valuedouble) || (width != NULL && isinf(width->valuedouble)) ||
×
568
        (factor != NULL && isinf(factor->valuedouble)) || (count != NULL && isinf(count->valuedouble))) {
×
569
      (void)snprintf(errMsg, msgLen, "%s", msg5);
×
570
      cJSON_Delete(binDesc);
×
571
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
572
    }
573

574
    int32_t counter = (int32_t)count->valueint;
×
575
    if (infinity->valueint == false) {
×
576
      startIndex = 0;
×
577
      numOfBins = counter + 1;
×
578
    } else {
579
      startIndex = 1;
×
580
      numOfBins = counter + 3;
×
581
    }
582

583
    intervals = taosMemoryCalloc(numOfBins, sizeof(double));
×
584
    if (intervals == NULL) {
×
585
      (void)snprintf(errMsg, msgLen, "%s", msg9);
×
586
      cJSON_Delete(binDesc);
×
587
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
588
    }
589
    if (cJSON_IsNumber(width) && factor == NULL && binType == LINEAR_BIN) {
×
590
      // linear bin process
591
      if (width->valuedouble == 0) {
×
592
        (void)snprintf(errMsg, msgLen, "%s", msg6);
×
593
        taosMemoryFree(intervals);
×
594
        cJSON_Delete(binDesc);
×
595
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
596
      }
597
      for (int i = 0; i < counter + 1; ++i) {
×
598
        intervals[startIndex] = start->valuedouble + i * width->valuedouble;
×
599
        if (isinf(intervals[startIndex])) {
×
600
          (void)snprintf(errMsg, msgLen, "%s", msg5);
×
601
          taosMemoryFree(intervals);
×
602
          cJSON_Delete(binDesc);
×
603
          return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
604
        }
605
        startIndex++;
×
606
      }
607
    } else if (cJSON_IsNumber(factor) && width == NULL && binType == LOG_BIN) {
×
608
      // log bin process
609
      if (start->valuedouble == 0) {
×
610
        (void)snprintf(errMsg, msgLen, "%s", msg7);
×
611
        taosMemoryFree(intervals);
×
612
        cJSON_Delete(binDesc);
×
613
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
614
      }
615
      if (factor->valuedouble < 0 || factor->valuedouble == 0 || factor->valuedouble == 1) {
×
616
        (void)snprintf(errMsg, msgLen, "%s", msg8);
×
617
        taosMemoryFree(intervals);
×
618
        cJSON_Delete(binDesc);
×
619
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
620
      }
621
      for (int i = 0; i < counter + 1; ++i) {
×
622
        intervals[startIndex] = start->valuedouble * pow(factor->valuedouble, i * 1.0);
×
623
        if (isinf(intervals[startIndex])) {
×
624
          (void)snprintf(errMsg, msgLen, "%s", msg5);
×
625
          taosMemoryFree(intervals);
×
626
          cJSON_Delete(binDesc);
×
627
          return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
628
        }
629
        startIndex++;
×
630
      }
631
    } else {
632
      (void)snprintf(errMsg, msgLen, "%s", msg3);
×
633
      taosMemoryFree(intervals);
×
634
      cJSON_Delete(binDesc);
×
635
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
636
    }
637

638
    if (infinity->valueint == true) {
×
639
      intervals[0] = -INFINITY;
×
640
      intervals[numOfBins - 1] = INFINITY;
×
641
      // in case of desc bin orders, -inf/inf should be swapped
642
      if (numOfBins < 4) {
×
643
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
644
      }
645

646
      if (intervals[1] > intervals[numOfBins - 2]) {
×
647
        TSWAP(intervals[0], intervals[numOfBins - 1]);
×
648
      }
649
    }
650
  } else if (cJSON_IsArray(binDesc)) { /* user input bins */
×
651
    if (binType != USER_INPUT_BIN) {
×
652
      (void)snprintf(errMsg, msgLen, "%s", msg3);
×
653
      cJSON_Delete(binDesc);
×
654
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
655
    }
656
    numOfBins = cJSON_GetArraySize(binDesc);
×
657
    intervals = taosMemoryCalloc(numOfBins, sizeof(double));
×
658
    if (intervals == NULL) {
×
659
      (void)snprintf(errMsg, msgLen, "%s", msg9);
×
660
      cJSON_Delete(binDesc);
×
661
      return terrno;
×
662
    }
663
    cJSON* bin = binDesc->child;
×
664
    if (bin == NULL) {
×
665
      (void)snprintf(errMsg, msgLen, "%s", msg3);
×
666
      taosMemoryFree(intervals);
×
667
      cJSON_Delete(binDesc);
×
668
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
669
    }
670
    int i = 0;
×
671
    while (bin) {
×
672
      intervals[i] = bin->valuedouble;
×
673
      if (!cJSON_IsNumber(bin)) {
×
674
        (void)snprintf(errMsg, msgLen, "%s", msg3);
×
675
        taosMemoryFree(intervals);
×
676
        cJSON_Delete(binDesc);
×
677
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
678
      }
679
      if (i != 0 && intervals[i] <= intervals[i - 1]) {
×
680
        (void)snprintf(errMsg, msgLen, "%s", msg3);
×
681
        taosMemoryFree(intervals);
×
682
        cJSON_Delete(binDesc);
×
683
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
684
      }
685
      bin = bin->next;
×
686
      i++;
×
687
    }
688
  } else {
689
    (void)snprintf(errMsg, msgLen, "%s", msg3);
×
690
    cJSON_Delete(binDesc);
×
691
    return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
692
  }
693

694
  cJSON_Delete(binDesc);
×
695
  taosMemoryFree(intervals);
×
696
  return TSDB_CODE_SUCCESS;
×
697
}
698

699
static int32_t checkRangeValue(SNode* pNode, SParamRange range, bool* isMatch) {
×
700
  int32_t code = TSDB_CODE_SUCCESS;
×
701
  if (pNode->type == QUERY_NODE_VALUE) {
×
702
    SValueNode* pVal = (SValueNode*)pNode;
×
703
    if (IS_INTEGER_TYPE(getSDataTypeFromNode(pNode)->type)) {
×
704
      if (pVal->datum.i < range.iMinVal || pVal->datum.i > range.iMaxVal) {
×
705
        code = TSDB_CODE_FUNC_FUNTION_PARA_RANGE;
×
706
        *isMatch = false;
×
707
      }
708
    } else {
709
      if ((int64_t)pVal->datum.d < range.iMinVal || (int64_t)pVal->datum.d > range.iMaxVal) {
×
710
        code = TSDB_CODE_FUNC_FUNTION_PARA_RANGE;
×
711
        *isMatch = false;
×
712
      }
713
    }
714
  } else {
715
    // for other node type, range check should be done in process function
716
  }
717
  return code;
×
718
}
719

720
static int32_t checkFixedValue(SNode* pNode, const SParamInfo* paramPattern, int32_t paramIdx, bool* isMatch) {
×
721
  int32_t code = TSDB_CODE_SUCCESS;
×
722
  bool    checkStr = paramSupportVarBinary(paramPattern->validDataType) ||
×
723
                  paramSupportVarchar(paramPattern->validDataType) || paramSupportNchar(paramPattern->validDataType);
×
724
  if (pNode->type == QUERY_NODE_VALUE) {
×
725
    SValueNode* pVal = (SValueNode*)pNode;
×
726
    if (!checkStr) {
×
727
      for (int32_t k = 0; k < paramPattern->fixedValueSize; k++) {
×
728
        if (pVal->datum.i == paramPattern->fixedNumValue[k]) {
×
729
          code = TSDB_CODE_SUCCESS;
×
730
          *isMatch = true;
×
731
          break;
×
732
        } else {
733
          code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
×
734
          *isMatch = false;
×
735
        }
736
      }
737
    } else {
738
      for (int32_t k = 0; k < paramPattern->fixedValueSize; k++) {
×
739
        if (strcasecmp(pVal->literal, paramPattern->fixedStrValue[k]) == 0) {
×
740
          code = TSDB_CODE_SUCCESS;
×
741
          *isMatch = true;
×
742
          break;
×
743
        } else {
744
          code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
×
745
          *isMatch = false;
×
746
        }
747
      }
748
    }
749
  } else {
750
    // for other node type, fixed value check should be done in process function
751
  }
752
  return code;
×
753
}
754

755
static int32_t checkPrimTS(SNode* pNode, bool* isMatch) {
×
756
  int32_t code = TSDB_CODE_SUCCESS;
×
757
  if (nodeType(pNode) != QUERY_NODE_COLUMN || !IS_TIMESTAMP_TYPE(getSDataTypeFromNode(pNode)->type) ||
×
758
      !((SColumnNode*)pNode)->isPrimTs) {
×
759
    code = TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS;
×
760
    *isMatch = false;
×
761
  }
762
  return code;
×
763
}
764

765
static int32_t checkPrimaryKey(SNode* pNode, bool* isMatch) {
×
766
  int32_t code = TSDB_CODE_SUCCESS;
×
767
  if (nodeType(pNode) != QUERY_NODE_COLUMN || !IS_INTEGER_TYPE(getSDataTypeFromNode(pNode)->type) ||
×
768
      !((SColumnNode*)pNode)->isPk) {
×
769
    code = TSDB_CODE_FUNC_FUNTION_PARA_PK;
×
770
    *isMatch = false;
×
771
  }
772
  return code;
×
773
}
774

775
static int32_t checkHasColumn(SNode* pNode, bool* isMatch) {
×
776
  int32_t code = TSDB_CODE_SUCCESS;
×
777
  if (!nodesExprHasColumn(pNode)) {
×
778
    code = TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL;
×
779
    *isMatch = false;
×
780
  }
781
  return code;
×
782
}
783

784
static int32_t checkValueNodeNotNull(SNode* pNode, bool* isMatch) {
×
785
  int32_t code = TSDB_CODE_SUCCESS;
×
786
  if (IS_NULL_TYPE(getSDataTypeFromNode(pNode)->type) && QUERY_NODE_VALUE == nodeType(pNode)) {
×
787
    code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
×
788
    *isMatch = false;
×
789
  }
790
  return code;
×
791
}
792

793
static int32_t checkTimeUnit(SNode* pNode, int32_t precision, bool* isMatch) {
×
794
  if (nodeType(pNode) != QUERY_NODE_VALUE || !IS_INTEGER_TYPE(getSDataTypeFromNode(pNode)->type)) {
×
795
    *isMatch = false;
×
796
    return TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
×
797
  }
798

799
  if (IS_NULL_TYPE(getSDataTypeFromNode(pNode)->type)) {
×
800
    *isMatch = true;
×
801
    return TSDB_CODE_SUCCESS;
×
802
  }
803

804
  int32_t code = validateTimeUnitParam(precision, (SValueNode*)pNode);
×
805
  if (TSDB_CODE_SUCCESS != code) {
×
806
    *isMatch = false;
×
807
  }
808
  return code;
×
809
}
810
static int32_t validateParam(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
811
  int32_t    code = TSDB_CODE_SUCCESS;
×
812
  SNodeList* paramList = pFunc->pParameterList;
×
813
  char       errMsg[128] = {0};
×
814

815
  // no need to check
816
  if (funcMgtBuiltins[pFunc->funcId].parameters.paramInfoPattern == 0) {
×
817
    return TSDB_CODE_SUCCESS;
×
818
  }
819

820
  // check param num
821
  if ((funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum != -1 &&
×
822
       LIST_LENGTH(paramList) > funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum) ||
×
823
      LIST_LENGTH(paramList) < funcMgtBuiltins[pFunc->funcId].parameters.minParamNum) {
×
824
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
825
  }
826

827
  // check each param
828
  for (int32_t i = 0; i < funcMgtBuiltins[pFunc->funcId].parameters.paramInfoPattern; i++) {
×
829
    bool              isMatch = true;
×
830
    int32_t           paramIdx = 0;
×
831
    const SParamInfo* paramPattern = funcMgtBuiltins[pFunc->funcId].parameters.inputParaInfo[i];
×
832

833
    while (1) {
834
      // one table can have at most 4096 columns, int32_t is enough.
835
      for (int32_t j = paramPattern[paramIdx].startParam;
×
836
           j <= (paramPattern[paramIdx].endParam == -1 ? INT32_MAX - 1 : paramPattern[paramIdx].endParam); j++) {
×
837
        if (j > LIST_LENGTH(paramList)) {
×
838
          code = TSDB_CODE_SUCCESS;
×
839
          isMatch = true;
×
840
          break;
×
841
        }
842
        SNode* pNode = nodesListGetNode(paramList, j - 1);
×
843
        if (NULL == pNode) {
×
844
          code = TSDB_CODE_FUNC_FUNTION_PARA_NUM;
×
845
          isMatch = false;
×
846
          break;
×
847
        }
848
        // check node type
849
        if (!paramSupportNodeType(pNode, paramPattern[paramIdx].validNodeType)) {
×
850
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
×
851
          isMatch = false;
×
852
          break;
×
853
        }
854
        // check data type
855
        if (!paramSupportDataType(getSDataTypeFromNode(pNode), paramPattern[paramIdx].validDataType)) {
×
856
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
×
857
          isMatch = false;
×
858
          break;
×
859
        }
860
        if (paramPattern[paramIdx].validNodeType == FUNC_PARAM_SUPPORT_VALUE_NODE) {
×
861
          SValueNode* pVal = (SValueNode*)pNode;
×
862
          pVal->notReserved = true;
×
863
        }
864
        switch (paramPattern[paramIdx].valueRangeFlag) {
×
865
          case FUNC_PARAM_NO_SPECIFIC_VALUE:
×
866
            break;
×
867
          case FUNC_PARAM_HAS_RANGE:
×
868
            code = checkRangeValue(pNode, paramPattern[paramIdx].range, &isMatch);
×
869
            break;
×
870
          case FUNC_PARAM_HAS_FIXED_VALUE:
×
871
            code = checkFixedValue(pNode, &paramPattern[paramIdx], paramIdx, &isMatch);
×
872
            break;
×
873
          default:
×
874
            break;
×
875
        }
876
        if (!isMatch) {
×
877
          break;
×
878
        }
879
        switch (paramPattern[paramIdx].paramAttribute) {
×
880
          case FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE:
×
881
            break;
×
882
          case FUNC_PARAM_MUST_BE_PRIMTS:
×
883
            code = checkPrimTS(pNode, &isMatch);
×
884
            break;
×
885
          case FUNC_PARAM_MUST_BE_PK:
×
886
            code = checkPrimaryKey(pNode, &isMatch);
×
887
            break;
×
888
          case FUNC_PARAM_MUST_HAVE_COLUMN:
×
889
            code = checkHasColumn(pNode, &isMatch);
×
890
            break;
×
891
          case FUNC_PARAM_VALUE_NODE_NOT_NULL:
×
892
            code = checkValueNodeNotNull(pNode, &isMatch);
×
893
            break;
×
894
          case FUNC_PARAM_MUST_BE_TIME_UNIT:
×
895
            code = checkTimeUnit(pNode, pFunc->node.resType.precision, &isMatch);
×
896
            break;
×
897
          default:
×
898
            break;
×
899
        }
900
        if (!isMatch) {
×
901
          break;
×
902
        }
903
      }
904

905
      if (paramPattern[paramIdx].isLastParam || !isMatch) {
×
906
        break;
907
      }
908
      paramIdx++;
×
909
    }
910
    if (isMatch) {
×
911
      return TSDB_CODE_SUCCESS;
×
912
    }
913
  }
914
  switch (code) {
×
915
    case TSDB_CODE_FUNC_FUNTION_PARA_NUM:
×
916
      return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
917
    case TSDB_CODE_FUNC_FUNTION_PARA_TYPE:
×
918
      return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
919
    case TSDB_CODE_FUNC_FUNTION_PARA_VALUE:
×
920
      return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName);
×
921
    case TSDB_CODE_FUNC_FUNTION_PARA_RANGE:
×
922
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_RANGE, "Invalid parameter range : %s",
×
923
                             pFunc->functionName);
×
924
    case TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS:
×
925
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS,
×
926
                             "Parameter should be primary timestamp : %s", pFunc->functionName);
×
927
    case TSDB_CODE_FUNC_FUNTION_PARA_PK:
×
928
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_PK, "Parameter should be primary key : %s",
×
929
                             pFunc->functionName);
×
930
    case TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL:
×
931
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL, "Parameter should have column : %s",
×
932
                             pFunc->functionName);
×
933
    case TSDB_CODE_FUNC_TIME_UNIT_INVALID:
×
934
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_INVALID, "Invalid timzone format : %s",
×
935
                             pFunc->functionName);
×
936
    case TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL:
×
937
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL, "Time unit is too small : %s",
×
938
                             pFunc->functionName);
×
939
    case TSDB_CODE_FUNC_FUNCTION_HISTO_TYPE:
×
940
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNCTION_HISTO_TYPE, "Invalid histogram bin type : %s",
×
941
                             pFunc->functionName);
×
942
    case TSDB_CODE_FUNC_HISTOGRAM_ERROR:
×
943
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_HISTOGRAM_ERROR, errMsg, pFunc->functionName);
×
944
    default:
×
945
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Function check parameter failed : %s",
×
946
                             pFunc->functionName);
×
947
  }
948
}
949

950
// There is only one parameter of numeric type, and the return type is parameter type
951
static int32_t translateOutNum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
952
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
953
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
954
  if (IS_NULL_TYPE(paraType)) {
×
955
    paraType = TSDB_DATA_TYPE_BIGINT;
×
956
  }
957
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[paraType].bytes, .type = paraType};
×
958
  return TSDB_CODE_SUCCESS;
×
959
}
960

961
// There is only one parameter, and the return type is parameter type
962
static int32_t translateMinMax(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
963
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
964

965
  SDataType* dataType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
×
966
  uint8_t    paraType = IS_NULL_TYPE(dataType->type) ? TSDB_DATA_TYPE_BIGINT : dataType->type;
×
967
  int32_t    bytes = IS_STR_DATA_TYPE(paraType) ? dataType->bytes : tDataTypes[paraType].bytes;
×
968
  pFunc->node.resType = (SDataType){.bytes = bytes, .type = paraType};
×
969
  return TSDB_CODE_SUCCESS;
×
970
}
971

972
// The return type is DOUBLE type
973
static int32_t translateOutDouble(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
974
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
975
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
×
976
  return TSDB_CODE_SUCCESS;
×
977
}
978

979
static int32_t translateTrimStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len, bool isLtrim) {
×
980
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
981

982
  SDataType* pRestType1 = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
×
983

984
  int32_t numOfSpaces = 0;
×
985
  SNode*  pParamNode1 = nodesListGetNode(pFunc->pParameterList, 0);
×
986
  // for select trim functions with constant value from table,
987
  // need to set the proper result result schema bytes to avoid
988
  // trailing garbage characters
989
  if (nodeType(pParamNode1) == QUERY_NODE_VALUE) {
×
990
    SValueNode* pValue = (SValueNode*)pParamNode1;
×
991
    numOfSpaces = countTrailingSpaces(pValue, isLtrim);
×
992
  }
993

994
  int32_t resBytes = pRestType1->bytes - numOfSpaces;
×
995
  pFunc->node.resType = (SDataType){.bytes = resBytes, .type = pRestType1->type};
×
996
  return TSDB_CODE_SUCCESS;
×
997
}
998

999
static int32_t translateLtrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1000
  return translateTrimStr(pFunc, pErrBuf, len, true);
×
1001
}
1002

1003
static int32_t translateRtrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1004
  return translateTrimStr(pFunc, pErrBuf, len, false);
×
1005
}
1006

1007
// The return type is BIGINT type
1008
static int32_t translateOutBigInt(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1009
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1010
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
×
1011
  return TSDB_CODE_SUCCESS;
×
1012
}
1013

1014
static int32_t translateSum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1015
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1016

1017
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
1018
  uint8_t resType = 0;
×
1019
  if (IS_SIGNED_NUMERIC_TYPE(paraType) || TSDB_DATA_TYPE_BOOL == paraType || IS_NULL_TYPE(paraType)) {
×
1020
    resType = TSDB_DATA_TYPE_BIGINT;
×
1021
  } else if (IS_UNSIGNED_NUMERIC_TYPE(paraType)) {
×
1022
    resType = TSDB_DATA_TYPE_UBIGINT;
×
1023
  } else if (IS_FLOAT_TYPE(paraType)) {
×
1024
    resType = TSDB_DATA_TYPE_DOUBLE;
×
1025
  }
1026

1027
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
×
1028
  return TSDB_CODE_SUCCESS;
×
1029
}
1030

1031
static int32_t translateWduration(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1032
  // pseudo column do not need to check parameters
1033
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes,
×
1034
                                    .type = TSDB_DATA_TYPE_BIGINT,
1035
                                    .precision = pFunc->node.resType.precision};
×
1036
  return TSDB_CODE_SUCCESS;
×
1037
}
1038

1039
static int32_t translateNowToday(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1040
  // pseudo column do not need to check parameters
1041

1042
  // add database precision as param
1043
  uint8_t dbPrec = pFunc->node.resType.precision;
×
1044
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
×
1045
  if (code != TSDB_CODE_SUCCESS) {
×
1046
    return code;
×
1047
  }
1048

1049
  pFunc->node.resType =
×
1050
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
×
1051
  return TSDB_CODE_SUCCESS;
×
1052
}
1053

1054
static int32_t translateRand(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1055
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1056

1057
  if (!pFunc->dual) {
×
1058
    int32_t code = addPseudoParam(&pFunc->pParameterList);
×
1059
    if (code != TSDB_CODE_SUCCESS) {
×
1060
      return code;
×
1061
    }
1062
  }
1063

1064
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
×
1065
  return TSDB_CODE_SUCCESS;
×
1066
}
1067

1068
// return type is same as first input parameter's type
1069
static int32_t translateOutFirstIn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1070
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1071
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
×
1072
  return TSDB_CODE_SUCCESS;
×
1073
}
1074

1075
static int32_t translateTimePseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1076
  // pseudo column do not need to check parameters
1077

1078
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes,
×
1079
                                    .type = TSDB_DATA_TYPE_TIMESTAMP,
1080
                                    .precision = pFunc->node.resType.precision};
×
1081
  return TSDB_CODE_SUCCESS;
×
1082
}
1083

1084
static int32_t translateIsFilledPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1085
  // pseudo column do not need to check parameters
1086

1087
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes, .type = TSDB_DATA_TYPE_BOOL};
×
1088
  return TSDB_CODE_SUCCESS;
×
1089
}
1090

1091
static int32_t translatePercentile(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1092
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1093
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
×
1094

1095
  // set result type
1096
  if (numOfParams > 2) {
×
1097
    pFunc->node.resType = (SDataType){.bytes = 3200, .type = TSDB_DATA_TYPE_VARCHAR};
×
1098
  } else {
1099
    pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
×
1100
  }
1101
  return TSDB_CODE_SUCCESS;
×
1102
}
1103

1104
static int32_t translateVgIdColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1105
  // pseudo column do not need to check parameters
1106
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
×
1107
  return TSDB_CODE_SUCCESS;
×
1108
}
1109

1110
static int32_t reserveFirstMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
×
1111
  int32_t code = nodesListMakeAppend(pParameters, pPartialRes);
×
1112
  if (TSDB_CODE_SUCCESS == code) {
×
1113
    SNode* pNew = NULL;
×
1114
    code = nodesCloneNode(nodesListGetNode(pRawParameters, 1), &pNew);
×
1115
    if (TSDB_CODE_SUCCESS == code) {
×
1116
      code = nodesListStrictAppend(*pParameters, pNew);
×
1117
    }
1118
  }
1119
  return code;
×
1120
}
1121

1122
int32_t topBotCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
×
1123
  return reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
×
1124
}
1125

1126
int32_t apercentileCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
×
1127
  int32_t code = reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
×
1128
  if (TSDB_CODE_SUCCESS == code && pRawParameters->length >= 3) {
×
1129
    SNode* pNew = NULL;
×
1130
    code = nodesCloneNode(nodesListGetNode(pRawParameters, 2), &pNew);
×
1131
    if (TSDB_CODE_SUCCESS == code) {
×
1132
      code = nodesListStrictAppend(*pParameters, pNew);
×
1133
    }
1134
  }
1135
  return code;
×
1136
}
1137

1138
static int32_t translateElapsedPartial(SFunctionNode* pFunc, char* pErrBuf, int32_t len) { return 0; }
×
1139

1140
static int32_t translateElapsedMerge(SFunctionNode* pFunc, char* pErrBuf, int32_t len) { return 0; }
×
1141

1142
static int32_t translateCsum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1143
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1144
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
1145
  uint8_t resType;
1146
  if (IS_SIGNED_NUMERIC_TYPE(colType)) {
×
1147
    resType = TSDB_DATA_TYPE_BIGINT;
×
1148
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
×
1149
    resType = TSDB_DATA_TYPE_UBIGINT;
×
1150
  } else if (IS_FLOAT_TYPE(colType)) {
×
1151
    resType = TSDB_DATA_TYPE_DOUBLE;
×
1152
  } else {
1153
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
1154
  }
1155
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
×
1156
  return TSDB_CODE_SUCCESS;
×
1157
}
1158

1159
static EFuncReturnRows csumEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
×
1160

1161
static int32_t translateSampleTail(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1162
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1163

1164
  SDataType* pSDataType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
×
1165
  uint8_t    colType = pSDataType->type;
×
1166

1167
  // set result type
1168
  pFunc->node.resType =
×
1169
      (SDataType){.bytes = IS_STR_DATA_TYPE(colType) ? pSDataType->bytes : tDataTypes[colType].bytes, .type = colType};
×
1170
  return TSDB_CODE_SUCCESS;
×
1171
}
1172

1173
static EFuncReturnRows derivativeEstReturnRows(SFunctionNode* pFunc) {
×
1174
  return 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 2))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
×
1175
                                                                                 : FUNC_RETURN_ROWS_N_MINUS_1;
×
1176
}
1177

1178
static int32_t translateAddPrecOutDouble(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1179
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1180
  // add database precision as param
1181
  uint8_t dbPrec = pFunc->node.resType.precision;
×
1182
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
×
1183
  if (code != TSDB_CODE_SUCCESS) {
×
1184
    return code;
×
1185
  }
1186

1187
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
×
1188
  return TSDB_CODE_SUCCESS;
×
1189
}
1190

1191
static int32_t translateInterp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1192
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1193
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
×
1194
  return TSDB_CODE_SUCCESS;
×
1195
}
1196

1197
static EFuncReturnRows interpEstReturnRows(SFunctionNode* pFunc) {
×
1198
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
×
1199
  if (1 < numOfParams && 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i) {
×
1200
    return FUNC_RETURN_ROWS_INDEFINITE;
×
1201
  } else {
1202
    return FUNC_RETURN_ROWS_N;
×
1203
  }
1204
}
1205

1206
static int32_t translateForecast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1207
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
×
1208
  if (2 != numOfParams && 1 != numOfParams) {
×
1209
    return invaildFuncParaNumErrMsg(pErrBuf, len, "FORECAST require 1 or 2 parameters");
×
1210
  }
1211

1212
  uint8_t valType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
1213
  if (!IS_MATHABLE_TYPE(valType)) {
×
1214
    return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST only support mathable column");
×
1215
  }
1216

1217
  if (numOfParams == 2) {
×
1218
    uint8_t optionType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
×
1219
    if (TSDB_DATA_TYPE_BINARY != optionType) {
×
1220
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be varchar");
×
1221
    }
1222

1223
    SNode* pOption = nodesListGetNode(pFunc->pParameterList, 1);
×
1224
    if (QUERY_NODE_VALUE != nodeType(pOption)) {
×
1225
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be value");
×
1226
    }
1227

1228
    SValueNode* pValue = (SValueNode*)pOption;
×
1229
    if (!taosAnalyGetOptStr(pValue->literal, "algo", NULL, 0) != 0) {
×
1230
      return invaildFuncParaValueErrMsg(pErrBuf, len, "FORECAST option should include algo field");
×
1231
    }
1232

1233
    pValue->notReserved = true;
×
1234
  }
1235

1236
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[valType].bytes, .type = valType};
×
1237
  return TSDB_CODE_SUCCESS;
×
1238
}
1239

1240
static int32_t translateForecastConf(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1241
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_FLOAT].bytes, .type = TSDB_DATA_TYPE_FLOAT};
×
1242
  return TSDB_CODE_SUCCESS;
×
1243
}
1244

1245
static EFuncReturnRows forecastEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
×
1246

1247
static int32_t translateDiff(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1248
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1249
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
1250

1251
  uint8_t resType;
1252
  if (IS_SIGNED_NUMERIC_TYPE(colType) || IS_TIMESTAMP_TYPE(colType) || TSDB_DATA_TYPE_BOOL == colType) {
×
1253
    resType = TSDB_DATA_TYPE_BIGINT;
×
1254
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
×
1255
    resType = TSDB_DATA_TYPE_BIGINT;
×
1256
  } else {
1257
    resType = TSDB_DATA_TYPE_DOUBLE;
×
1258
  }
1259
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
×
1260
  return TSDB_CODE_SUCCESS;
×
1261
}
1262

1263
static EFuncReturnRows diffEstReturnRows(SFunctionNode* pFunc) {
×
1264
  if (1 == LIST_LENGTH(pFunc->pParameterList)) {
×
1265
    return FUNC_RETURN_ROWS_N_MINUS_1;
×
1266
  }
1267
  return 1 < ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
×
1268
                                                                                : FUNC_RETURN_ROWS_N_MINUS_1;
×
1269
}
1270

1271
static int32_t translateConcatImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len, int32_t minParaNum,
×
1272
                                   int32_t maxParaNum, bool hasSep) {
1273
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1274
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
×
1275

1276
  uint8_t resultType = TSDB_DATA_TYPE_BINARY;
×
1277
  int32_t resultBytes = 0;
×
1278
  int32_t sepBytes = 0;
×
1279

1280
  /* For concat/concat_ws function, if params have NCHAR type, promote the final result to NCHAR */
1281
  for (int32_t i = 0; i < numOfParams; ++i) {
×
1282
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
×
1283
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
×
1284
    if (TSDB_DATA_TYPE_NCHAR == paraType) {
×
1285
      resultType = paraType;
×
1286
    }
1287
  }
1288

1289
  for (int32_t i = 0; i < numOfParams; ++i) {
×
1290
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
×
1291
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
×
1292
    int32_t paraBytes = getSDataTypeFromNode(pPara)->bytes;
×
1293
    int32_t factor = 1;
×
1294
    if (IS_NULL_TYPE(paraType)) {
×
1295
      resultType = TSDB_DATA_TYPE_VARCHAR;
×
1296
      resultBytes = 0;
×
1297
      sepBytes = 0;
×
1298
      break;
×
1299
    }
1300
    if (TSDB_DATA_TYPE_NCHAR == resultType && TSDB_DATA_TYPE_VARCHAR == paraType) {
×
1301
      factor *= TSDB_NCHAR_SIZE;
×
1302
    }
1303
    resultBytes += paraBytes * factor;
×
1304

1305
    if (i == 0) {
×
1306
      sepBytes = paraBytes * factor;
×
1307
    }
1308
  }
1309

1310
  if (hasSep) {
×
1311
    resultBytes += sepBytes * (numOfParams - 3);
×
1312
  }
1313

1314
  pFunc->node.resType = (SDataType){.bytes = resultBytes, .type = resultType};
×
1315
  return TSDB_CODE_SUCCESS;
×
1316
}
1317

1318
static int32_t translateConcat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1319
  return translateConcatImpl(pFunc, pErrBuf, len, 2, 8, false);
×
1320
}
1321

1322
static int32_t translateConcatWs(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1323
  return translateConcatImpl(pFunc, pErrBuf, len, 3, 9, true);
×
1324
}
1325

1326
static int32_t translateChar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1327
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1328
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
×
1329
  pFunc->node.resType = (SDataType){.bytes = 4 * numOfParams + 2, .type = TSDB_DATA_TYPE_VARCHAR};
×
1330
  return TSDB_CODE_SUCCESS;
×
1331
}
1332

1333
static int32_t translateAscii(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1334
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1335
  pFunc->node.resType =
×
1336
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_UTINYINT].bytes, .type = TSDB_DATA_TYPE_UTINYINT};
×
1337
  return TSDB_CODE_SUCCESS;
×
1338
}
1339

1340
static int32_t translateTrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1341
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1342

1343
  uint8_t para0Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
1344
  int32_t resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
×
1345
  uint8_t type = para0Type;
×
1346

1347
  if (2 == LIST_LENGTH(pFunc->pParameterList)) {
×
1348
    uint8_t para1Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
×
1349
    resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
×
1350
    type = para1Type;
×
1351
  }
1352
  if (type == TSDB_DATA_TYPE_NCHAR) {
×
1353
    resLen *= TSDB_NCHAR_SIZE;
×
1354
  }
1355
  uint8_t trimType = pFunc->trimType;
×
1356
  int32_t code = addUint8Param(&pFunc->pParameterList, trimType);
×
1357
  if (code != TSDB_CODE_SUCCESS) {
×
1358
    return code;
×
1359
  }
1360
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
×
1361
  return TSDB_CODE_SUCCESS;
×
1362
}
1363

1364
static int32_t translateReplace(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1365
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1366

1367
  uint8_t orgType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
1368
  uint8_t fromType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
×
1369
  uint8_t toType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->type;
×
1370
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
×
1371
  int32_t fromLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
×
1372
  int32_t toLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->bytes;
×
1373

1374
  int32_t resLen;
1375
  // Since we don't know the accurate length of result, estimate the maximum length here.
1376
  // To make the resLen bigger, we should make fromLen smaller and toLen bigger.
1377
  if (orgType == TSDB_DATA_TYPE_VARBINARY && fromType != orgType) {
×
1378
    fromLen = fromLen / TSDB_NCHAR_SIZE;
×
1379
  }
1380
  if (orgType == TSDB_DATA_TYPE_NCHAR && toType != orgType) {
×
1381
    toLen = toLen * TSDB_NCHAR_SIZE;
×
1382
  }
1383
  resLen = TMAX(orgLen, orgLen + orgLen / fromLen * (toLen - fromLen));
×
1384
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = orgType};
×
1385
  return TSDB_CODE_SUCCESS;
×
1386
}
1387

1388
static int32_t translateRepeat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1389
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1390

1391
  uint8_t type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
1392
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
×
1393
  int32_t resLen;
1394
  if (nodeType(nodesListGetNode(pFunc->pParameterList, 1)) == QUERY_NODE_VALUE) {
×
1395
    resLen = orgLen * TMAX((int32_t)((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i, 1);
×
1396
  } else {
1397
    resLen = TSDB_MAX_BINARY_LEN;
×
1398
  }
1399
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
×
1400
  return TSDB_CODE_SUCCESS;
×
1401
}
1402

1403
static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1404
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
×
1405
  if (numOfParams <= 0) {
×
1406
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1407
  }
1408

1409
  // The number of parameters has been limited by the syntax definition
1410

1411
  SExprNode* pPara0 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
×
1412
  uint8_t    para0Type = pPara0->resType.type;
×
1413
  if (TSDB_DATA_TYPE_VARBINARY == para0Type) {
×
1414
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
1415
  }
1416

1417
  // The function return type has been set during syntax parsing
1418
  uint8_t para2Type = pFunc->node.resType.type;
×
1419

1420
  int32_t para2Bytes = pFunc->node.resType.bytes;
×
1421
  if (IS_STR_DATA_TYPE(para2Type)) {
×
1422
    para2Bytes -= VARSTR_HEADER_SIZE;
×
1423
  }
1424
  if (para2Bytes <= 0 ||
×
1425
      para2Bytes > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) {  // cast dst var type length limits to 4096 bytes
×
1426
    if (TSDB_DATA_TYPE_NCHAR == para2Type) {
×
1427
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1428
                             "CAST function converted length should be in range (0, %d] NCHARS",
1429
                             (TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE);
1430
    } else {
1431
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1432
                             "CAST function converted length should be in range (0, %d] bytes",
1433
                             TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE);
1434
    }
1435
  }
1436

1437
  // add database precision as param
1438
  uint8_t dbPrec = pFunc->node.resType.precision;
×
1439
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
×
1440
  if (code != TSDB_CODE_SUCCESS) {
×
1441
    return code;
×
1442
  }
1443

1444
  return TSDB_CODE_SUCCESS;
×
1445
}
1446

1447
static int32_t translateToIso8601(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1448
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1449
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
×
1450
  // param1
1451
  if (numOfParams == 2) {
×
1452
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
×
1453
    if (!validateTimezoneFormat(pValue)) {
×
1454
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Invalid timzone format");
×
1455
    }
1456
  } else {  // add default client timezone
1457
    int32_t code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
×
1458
    if (code != TSDB_CODE_SUCCESS) {
×
1459
      return code;
×
1460
    }
1461
  }
1462

1463
  // set result type
1464
  pFunc->node.resType = (SDataType){.bytes = 64, .type = TSDB_DATA_TYPE_BINARY};
×
1465
  return TSDB_CODE_SUCCESS;
×
1466
}
1467

1468
static int32_t translateToUnixtimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1469
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1470
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
×
1471
  int16_t resType = TSDB_DATA_TYPE_BIGINT;
×
1472
  if (2 == numOfParams) {
×
1473
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
×
1474
    if (pValue->datum.i == 1) {
×
1475
      resType = TSDB_DATA_TYPE_TIMESTAMP;
×
1476
    } else if (pValue->datum.i == 0) {
×
1477
      resType = TSDB_DATA_TYPE_BIGINT;
×
1478
    } else {
1479
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1480
                             "TO_UNIXTIMESTAMP function second parameter should be 0/1");
1481
    }
1482
  }
1483

1484
  // add database precision as param
1485
  uint8_t dbPrec = pFunc->node.resType.precision;
×
1486
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
×
1487
  if (code != TSDB_CODE_SUCCESS) {
×
1488
    return code;
×
1489
  }
1490

1491
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
×
1492
  return TSDB_CODE_SUCCESS;
×
1493
}
1494

1495
static int32_t translateToTimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1496
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1497
  pFunc->node.resType =
×
1498
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
×
1499
  return TSDB_CODE_SUCCESS;
×
1500
}
1501

1502
static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1503
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1504
  uint8_t dbPrec = pFunc->node.resType.precision;
×
1505
  // add database precision as param
1506
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
×
1507
  if (code != TSDB_CODE_SUCCESS) {
×
1508
    return code;
×
1509
  }
1510

1511
  // add client timezone as param
1512
  code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
×
1513
  if (code != TSDB_CODE_SUCCESS) {
×
1514
    return code;
×
1515
  }
1516

1517
  pFunc->node.resType =
×
1518
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
×
1519
  return TSDB_CODE_SUCCESS;
×
1520
}
1521

1522
static int32_t translateAddPrecOutBigint(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1523
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1524

1525
  // add database precision as param
1526
  uint8_t dbPrec = pFunc->node.resType.precision;
×
1527

1528
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
×
1529
  if (code != TSDB_CODE_SUCCESS) {
×
1530
    return code;
×
1531
  }
1532

1533
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
×
1534
  return TSDB_CODE_SUCCESS;
×
1535
}
1536

1537
static int32_t translateToJson(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1538
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1539
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_JSON].bytes, .type = TSDB_DATA_TYPE_JSON};
×
1540
  return TSDB_CODE_SUCCESS;
×
1541
}
1542

1543
static int32_t translateOutGeom(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1544
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1545
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
×
1546
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_GEOMETRY};
×
1547

1548
  return TSDB_CODE_SUCCESS;
×
1549
}
1550

1551
static int32_t translateInGeomOutStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1552
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1553
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
×
1554
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_VARCHAR};
×
1555

1556
  return TSDB_CODE_SUCCESS;
×
1557
}
1558

1559
static int32_t translateIn2GeomOutBool(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1560
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1561
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes, .type = TSDB_DATA_TYPE_BOOL};
×
1562

1563
  return TSDB_CODE_SUCCESS;
×
1564
}
1565

1566
static int32_t translateSelectValue(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1567
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
×
1568
  if (numOfParams <= 0) {
×
1569
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1570
  }
1571

1572
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
×
1573
  return TSDB_CODE_SUCCESS;
×
1574
}
1575

1576
static int32_t translateBlockDistFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1577
  pFunc->node.resType = (SDataType){.bytes = 128, .type = TSDB_DATA_TYPE_VARCHAR};
×
1578
  return TSDB_CODE_SUCCESS;
×
1579
}
1580

1581
static bool getBlockDistFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
×
1582
  pEnv->calcMemSize = sizeof(STableBlockDistInfo);
×
1583
  return true;
×
1584
}
1585
static bool getBlockDBUsageFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
×
1586
  pEnv->calcMemSize = sizeof(SDBBlockUsageInfo);
×
1587
  return true;
×
1588
}
1589

1590
static int32_t translateGroupKey(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1591
  if (1 != LIST_LENGTH(pFunc->pParameterList)) {
×
1592
    return TSDB_CODE_SUCCESS;
×
1593
  }
1594
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
×
1595
  return TSDB_CODE_SUCCESS;
×
1596
}
1597

1598
static int32_t translateServerStatusFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1599
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
×
1600
  return TSDB_CODE_SUCCESS;
×
1601
}
1602

1603
static int32_t translateTagsPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1604
  // The _tags pseudo-column will be expanded to the actual tags on the client side
1605
  return TSDB_CODE_SUCCESS;
×
1606
}
1607

1608
static int32_t translateOutVarchar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1609
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1610
  int32_t bytes = 0;
×
1611
  switch (pFunc->funcType) {
×
1612
    case FUNCTION_TYPE_MD5:
×
1613
      bytes = MD5_OUTPUT_LEN + VARSTR_HEADER_SIZE;
×
1614
      break;
×
1615
    case FUNCTION_TYPE_USER:
×
1616
    case FUNCTION_TYPE_CURRENT_USER:
1617
      bytes = TSDB_USER_LEN;
×
1618
      break;
×
1619
    case FUNCTION_TYPE_SERVER_VERSION:
×
1620
    case FUNCTION_TYPE_CLIENT_VERSION:
1621
      bytes = TSDB_VERSION_LEN;
×
1622
      break;
×
1623
    case FUNCTION_TYPE_DATABASE:
×
1624
      bytes = TSDB_DB_NAME_LEN;
×
1625
      break;
×
1626
    case FUNCTION_TYPE_BLOCK_DIST:
×
1627
    case FUNCTION_TYPE_BLOCK_DIST_INFO:
1628
      bytes = sizeof(STableBlockDistInfo);
×
1629
      break;
×
1630
    case FUNCTION_TYPE_TO_CHAR:
×
1631
      bytes = 4096;
×
1632
      break;
×
1633
    case FUNCTION_TYPE_HYPERLOGLOG_STATE_MERGE:
×
1634
    case FUNCTION_TYPE_HYPERLOGLOG_PARTIAL:
1635
    case FUNCTION_TYPE_HYPERLOGLOG_STATE:
1636
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
×
1637
      break;
×
1638
    case FUNCTION_TYPE_SPREAD_PARTIAL:
×
1639
    case FUNCTION_TYPE_SPREAD_STATE:
1640
    case FUNCTION_TYPE_SPREAD_STATE_MERGE:
1641
      bytes = getSpreadInfoSize() + VARSTR_HEADER_SIZE;
×
1642
      break;
×
1643
    case FUNCTION_TYPE_APERCENTILE_PARTIAL:
×
1644
      bytes = getApercentileMaxSize() + VARSTR_HEADER_SIZE;
×
1645
      break;
×
1646
    case FUNCTION_TYPE_STD_STATE:
×
1647
    case FUNCTION_TYPE_STD_STATE_MERGE:
1648
    case FUNCTION_TYPE_STD_PARTIAL:
1649
      bytes = getStdInfoSize() + VARSTR_HEADER_SIZE;
×
1650
      break;
×
1651
    case FUNCTION_TYPE_AVG_PARTIAL:
×
1652
    case FUNCTION_TYPE_AVG_STATE:
1653
    case FUNCTION_TYPE_AVG_STATE_MERGE:
1654
      bytes = getAvgInfoSize() + VARSTR_HEADER_SIZE;
×
1655
      break;
×
1656
    case FUNCTION_TYPE_HISTOGRAM_PARTIAL:
×
1657
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
×
1658
      break;
×
1659
    case FUNCTION_TYPE_HISTOGRAM:
×
1660
    case FUNCTION_TYPE_HISTOGRAM_MERGE:
1661
      bytes = 512;
×
1662
      break;
×
1663
    case FUNCTION_TYPE_LEASTSQUARES:
×
1664
      bytes = LEASTSQUARES_BUFF_LENGTH;
×
1665
      break;
×
1666
    case FUNCTION_TYPE_TBNAME:
×
1667
      bytes = TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE;
×
1668
      break;
×
1669
    case FUNCTION_TYPE_TIMEZONE:{
×
1670
      if (pFunc->tz == NULL) {
×
1671
        bytes = VARSTR_HEADER_SIZE + strlen(tsTimezoneStr);
×
1672
      }else{
1673
        char *tzName  = (char*)taosHashGet(pTimezoneNameMap, &pFunc->tz, sizeof(timezone_t));
×
1674
        if (tzName == NULL){
×
1675
          tzName = TZ_UNKNOWN;
×
1676
        }
1677
        bytes = strlen(tzName) + VARSTR_HEADER_SIZE;
×
1678
      }
1679
      break;
×
1680
    }
1681
    case FUNCTION_TYPE_IRATE_PARTIAL:
×
1682
      bytes = getIrateInfoSize((pFunc->hasPk) ? pFunc->pkBytes : 0) + VARSTR_HEADER_SIZE;
×
1683
      break;
×
1684
    case FUNCTION_TYPE_FIRST_PARTIAL:
×
1685
    case FUNCTION_TYPE_LAST_PARTIAL:
1686
    case FUNCTION_TYPE_FIRST_STATE:
1687
    case FUNCTION_TYPE_LAST_STATE:
1688
      bytes = getFirstLastInfoSize(getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes,
×
1689
                                   (pFunc->hasPk) ? pFunc->pkBytes : 0) +
×
1690
              VARSTR_HEADER_SIZE;
1691
      break;
×
1692
    case FUNCTION_TYPE_FIRST_STATE_MERGE:
×
1693
    case FUNCTION_TYPE_LAST_STATE_MERGE:
1694
      bytes = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
×
1695
      break;
×
1696
    case FUNCTION_TYPE_DB_USAGE:
×
1697
    case FUNCTION_TYPE_DB_USAGE_INFO:
1698
      bytes = 128;
×
1699
      break;
×
1700
    default:
×
1701
      bytes = 0;
×
1702
      break;
×
1703
  }
1704
  pFunc->node.resType = (SDataType){.bytes = bytes, .type = TSDB_DATA_TYPE_VARCHAR};
×
1705
  return TSDB_CODE_SUCCESS;
×
1706
}
1707

1708
static int32_t invalidColsFunction(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1709
  return TSDB_CODE_PAR_INVALID_COLS_FUNCTION;
×
1710
}
1711

1712
static int32_t translateHistogramImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1713
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1714
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
×
1715
  int8_t  binType;
1716
  char*   binDesc;
1717
  for (int32_t i = 1; i < numOfParams; ++i) {
×
1718
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, i);
×
1719
    if (i == 1) {
×
1720
      binType = validateHistogramBinType(varDataVal(pValue->datum.p));
×
1721
      if (binType == UNKNOWN_BIN) {
×
1722
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1723
                               "HISTOGRAM function binType parameter should be "
1724
                               "\"user_input\", \"log_bin\" or \"linear_bin\"");
1725
      }
1726
    }
1727

1728
    if (i == 2) {
×
1729
      char errMsg[128] = {0};
×
1730
      binDesc = varDataVal(pValue->datum.p);
×
1731
      if (TSDB_CODE_SUCCESS != validateHistogramBinDesc(binDesc, binType, errMsg, (int32_t)sizeof(errMsg))) {
×
1732
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, errMsg);
×
1733
      }
1734
    }
1735
  }
1736
  return TSDB_CODE_SUCCESS;
×
1737
}
1738

1739
static int32_t translateHitogram(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1740
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
×
1741
  pFunc->node.resType = (SDataType){.bytes = 512, .type = TSDB_DATA_TYPE_BINARY};
×
1742
  return TSDB_CODE_SUCCESS;
×
1743
}
1744
static int32_t translateHistogramPartial(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1745
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
×
1746
  pFunc->node.resType =
×
1747
      (SDataType){.bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY};
×
1748
  return TSDB_CODE_SUCCESS;
×
1749
}
1750

1751
#define NUMERIC_TO_STRINGS_LEN 25
1752
static int32_t translateGreatestleast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1753
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1754

1755
  bool mixTypeToStrings = tsCompareAsStrInGreatest;
×
1756

1757
  SDataType res = {.type = 0};
×
1758
  bool     resInit = false;
×
1759
  for (int32_t i = 0; i < LIST_LENGTH(pFunc->pParameterList); i++) {
×
1760
    SDataType* para = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, i));
×
1761

1762
    if (IS_NULL_TYPE(para->type)) {
×
1763
      res.type = TSDB_DATA_TYPE_NULL;
×
1764
      res.bytes = tDataTypes[TSDB_DATA_TYPE_NULL].bytes;
×
1765
      break;
×
1766
    }
1767

1768
    if (!resInit) {
×
1769
      res.type = para->type;
×
1770
      res.bytes = para->bytes;
×
1771
      resInit = true;
×
1772
      continue;
×
1773
    }
1774

1775
    if (IS_MATHABLE_TYPE(para->type)) {
×
1776
      if (res.type == para->type) {
×
1777
        continue;
×
1778
      } else if (IS_MATHABLE_TYPE(res.type) || !mixTypeToStrings) {
×
1779
        int32_t resType = vectorGetConvertType(res.type, para->type);
×
1780
        res.type = resType == 0 ? res.type : resType;
×
1781
        res.bytes = tDataTypes[res.type].bytes;
×
1782
      } else {
1783
        // last res is strings, para is numeric and mixTypeToStrings is true
1784
        res.bytes = TMAX(res.bytes, NUMERIC_TO_STRINGS_LEN);
×
1785
      }
1786
    } else {
1787
      if (IS_COMPARE_STR_DATA_TYPE(res.type)) {
×
1788
        int32_t resType = vectorGetConvertType(res.type, para->type);
×
1789
        res.type = resType == 0 ? res.type : resType;
×
1790
        res.bytes = TMAX(res.bytes, para->bytes);
×
1791
      } else if (mixTypeToStrings) {
×
1792
        // last res is numeric, para is string, and mixTypeToStrings is true
1793
        res.type = para->type;
×
1794
        res.bytes = TMAX(para->bytes, NUMERIC_TO_STRINGS_LEN);
×
1795
      } else {
1796
        // last res is numeric, para is string, and mixTypeToStrings is false
1797
        int32_t resType = vectorGetConvertType(res.type, para->type);
×
1798
        res.type = resType == 0 ? res.type : resType;
×
1799
        res.bytes = tDataTypes[resType].bytes;
×
1800
      }
1801
    }
1802
  }
1803
  pFunc->node.resType = res;
×
1804
  return TSDB_CODE_SUCCESS;
×
1805
}
1806

1807
// clang-format off
1808
const SBuiltinFuncDefinition funcMgtBuiltins[] = {
1809
  {
1810
    .name = "count",
1811
    .type = FUNCTION_TYPE_COUNT,
1812
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SPECIAL_DATA_REQUIRED | FUNC_MGT_IGNORE_NULL_FUNC | FUNC_MGT_TSMA_FUNC | FUNC_MGT_COUNT_LIKE_FUNC,
1813
    .parameters = {.minParamNum = 1,
1814
                   .maxParamNum = 1,
1815
                   .paramInfoPattern = 1,
1816
                   .inputParaInfo[0][0] = {.isLastParam = true,
1817
                                           .startParam = 1,
1818
                                           .endParam = 1,
1819
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
1820
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
1821
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
1822
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
1823
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
1824
    .translateFunc = translateOutBigInt,
1825
    .dataRequiredFunc = countDataRequired,
1826
    .getEnvFunc   = getCountFuncEnv,
1827
    .initFunc     = functionSetup,
1828
    .processFunc  = countFunction,
1829
    .sprocessFunc = countScalarFunction,
1830
    .finalizeFunc = functionFinalize,
1831
#ifdef BUILD_NO_CALL
1832
    .invertFunc   = countInvertFunction,
1833
#endif
1834
    .combineFunc  = combineFunction,
1835
    .pPartialFunc = "count",
1836
    .pStateFunc = "count",
1837
    .pMergeFunc   = "sum"
1838
  },
1839
  {
1840
    .name = "sum",
1841
    .type = FUNCTION_TYPE_SUM,
1842
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SPECIAL_DATA_REQUIRED | FUNC_MGT_IGNORE_NULL_FUNC | FUNC_MGT_TSMA_FUNC,
1843
    .parameters = {.minParamNum = 1,
1844
                   .maxParamNum = 1,
1845
                   .paramInfoPattern = 1,
1846
                   .inputParaInfo[0][0] = {.isLastParam = true,
1847
                                           .startParam = 1,
1848
                                           .endParam = 1,
1849
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
1850
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
1851
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
1852
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
1853
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE | FUNC_PARAM_SUPPORT_DOUBLE_TYPE | FUNC_PARAM_SUPPORT_UBIGINT_TYPE}},
1854
    .translateFunc = translateSum,
1855
    .dataRequiredFunc = statisDataRequired,
1856
    .getEnvFunc   = getSumFuncEnv,
1857
    .initFunc     = functionSetup,
1858
    .processFunc  = sumFunction,
1859
    .sprocessFunc = sumScalarFunction,
1860
    .finalizeFunc = functionFinalize,
1861
#ifdef BUILD_NO_CALL
1862
    .invertFunc   = sumInvertFunction,
1863
#endif
1864
    .combineFunc  = sumCombine,
1865
    .pPartialFunc = "sum",
1866
    .pStateFunc = "sum",
1867
    .pMergeFunc   = "sum"
1868
  },
1869
  {
1870
    .name = "min",
1871
    .type = FUNCTION_TYPE_MIN,
1872
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SPECIAL_DATA_REQUIRED | FUNC_MGT_SELECT_FUNC | FUNC_MGT_IGNORE_NULL_FUNC | FUNC_MGT_TSMA_FUNC,
1873
    .parameters = {.minParamNum = 1,
1874
                   .maxParamNum = 1,
1875
                   .paramInfoPattern = 1,
1876
                   .inputParaInfo[0][0] = {.isLastParam = true,
1877
                                           .startParam = 1,
1878
                                           .endParam = 1,
1879
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_STRING_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
1880
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
1881
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
1882
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
1883
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_STRING_TYPE}},
1884
    .translateFunc = translateMinMax,
1885
    .dataRequiredFunc = statisDataRequired,
1886
    .getEnvFunc   = getMinmaxFuncEnv,
1887
    .initFunc     = minmaxFunctionSetup,
1888
    .processFunc  = minFunction,
1889
    .sprocessFunc = minScalarFunction,
1890
    .finalizeFunc = minmaxFunctionFinalize,
1891
    .combineFunc  = minCombine,
1892
    .pPartialFunc = "min",
1893
    .pStateFunc = "min",
1894
    .pMergeFunc   = "min"
1895
  },
1896
  {
1897
    .name = "max",
1898
    .type = FUNCTION_TYPE_MAX,
1899
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SPECIAL_DATA_REQUIRED | FUNC_MGT_SELECT_FUNC | FUNC_MGT_IGNORE_NULL_FUNC | FUNC_MGT_TSMA_FUNC,
1900
    .parameters = {.minParamNum = 1,
1901
                   .maxParamNum = 1,
1902
                   .paramInfoPattern = 1,
1903
                   .inputParaInfo[0][0] = {.isLastParam = true,
1904
                                           .startParam = 1,
1905
                                           .endParam = 1,
1906
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_STRING_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
1907
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
1908
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
1909
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
1910
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_STRING_TYPE}},
1911
    .translateFunc = translateMinMax,
1912
    .dataRequiredFunc = statisDataRequired,
1913
    .getEnvFunc   = getMinmaxFuncEnv,
1914
    .initFunc     = minmaxFunctionSetup,
1915
    .processFunc  = maxFunction,
1916
    .sprocessFunc = maxScalarFunction,
1917
    .finalizeFunc = minmaxFunctionFinalize,
1918
    .combineFunc  = maxCombine,
1919
    .pPartialFunc = "max",
1920
    .pStateFunc = "max",
1921
    .pMergeFunc   = "max"
1922
  },
1923
  {
1924
    .name = "stddev",
1925
    .type = FUNCTION_TYPE_STDDEV,
1926
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TSMA_FUNC,
1927
    .parameters = {.minParamNum = 1,
1928
                   .maxParamNum = 1,
1929
                   .paramInfoPattern = 1,
1930
                   .inputParaInfo[0][0] = {.isLastParam = true,
1931
                                           .startParam = 1,
1932
                                           .endParam = 1,
1933
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
1934
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
1935
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
1936
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
1937
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
1938
    .translateFunc = translateOutDouble,
1939
    .getEnvFunc   = getStdFuncEnv,
1940
    .initFunc     = stdFunctionSetup,
1941
    .processFunc  = stdFunction,
1942
    .sprocessFunc = stdScalarFunction,
1943
    .finalizeFunc = stddevFinalize,
1944
#ifdef BUILD_NO_CALL
1945
    .invertFunc   = stdInvertFunction,
1946
#endif
1947
    .combineFunc  = stdCombine,
1948
    .pPartialFunc = "_std_partial",
1949
    .pStateFunc = "_std_state",
1950
    .pMergeFunc   = "_stddev_merge"
1951
  },
1952
  {
1953
    .name = "_std_partial",
1954
    .type = FUNCTION_TYPE_STD_PARTIAL,
1955
    .classification = FUNC_MGT_AGG_FUNC,
1956
    .parameters = {.minParamNum = 1,
1957
                   .maxParamNum = 1,
1958
                   .paramInfoPattern = 1,
1959
                   .inputParaInfo[0][0] = {.isLastParam = true,
1960
                                           .startParam = 1,
1961
                                           .endParam = 1,
1962
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
1963
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
1964
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
1965
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
1966
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
1967
    .translateFunc = translateOutVarchar,
1968
    .getEnvFunc   = getStdFuncEnv,
1969
    .initFunc     = stdFunctionSetup,
1970
    .processFunc  = stdFunction,
1971
    .finalizeFunc = stdPartialFinalize,
1972
#ifdef BUILD_NO_CALL
1973
    .invertFunc   = stdInvertFunction,
1974
#endif
1975
    .combineFunc  = stdCombine,
1976
  },
1977
  {
1978
    .name = "_stddev_merge",
1979
    .type = FUNCTION_TYPE_STDDEV_MERGE,
1980
    .classification = FUNC_MGT_AGG_FUNC,
1981
    .parameters = {.minParamNum = 1,
1982
                   .maxParamNum = 1,
1983
                   .paramInfoPattern = 1,
1984
                   .inputParaInfo[0][0] = {.isLastParam = true,
1985
                                           .startParam = 1,
1986
                                           .endParam = 1,
1987
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
1988
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
1989
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
1990
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
1991
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
1992
    .translateFunc = translateOutDouble,
1993
    .getEnvFunc   = getStdFuncEnv,
1994
    .initFunc     = stdFunctionSetup,
1995
    .processFunc  = stdFunctionMerge,
1996
    .finalizeFunc = stddevFinalize,
1997
#ifdef BUILD_NO_CALL
1998
    .invertFunc   = stdInvertFunction,
1999
#endif
2000
    .combineFunc  = stdCombine,
2001
    .pPartialFunc = "_std_state_merge",
2002
    .pMergeFunc = "_stddev_merge",
2003
  },
2004
  {
2005
    .name = "leastsquares",
2006
    .type = FUNCTION_TYPE_LEASTSQUARES,
2007
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC,
2008
    .parameters = {.minParamNum = 3,
2009
                   .maxParamNum = 3,
2010
                   .paramInfoPattern = 1,
2011
                   .inputParaInfo[0][0] = {.isLastParam = false,
2012
                                           .startParam = 1,
2013
                                           .endParam = 1,
2014
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2015
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2016
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2017
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2018
                   .inputParaInfo[0][1] = {.isLastParam = true,
2019
                                           .startParam = 2,
2020
                                           .endParam = 3,
2021
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2022
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2023
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2024
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2025
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
2026
    .translateFunc = translateOutVarchar,
2027
    .getEnvFunc   = getLeastSQRFuncEnv,
2028
    .initFunc     = leastSQRFunctionSetup,
2029
    .processFunc  = leastSQRFunction,
2030
    .sprocessFunc = leastSQRScalarFunction,
2031
    .finalizeFunc = leastSQRFinalize,
2032
#ifdef BUILD_NO_CALL
2033
    .invertFunc   = NULL,
2034
#endif
2035
    .combineFunc  = leastSQRCombine,
2036
  },
2037
  {
2038
    .name = "avg",
2039
    .type = FUNCTION_TYPE_AVG,
2040
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SPECIAL_DATA_REQUIRED | FUNC_MGT_IGNORE_NULL_FUNC | FUNC_MGT_TSMA_FUNC,
2041
    .parameters = {.minParamNum = 1,
2042
                   .maxParamNum = 1,
2043
                   .paramInfoPattern = 1,
2044
                   .inputParaInfo[0][0] = {.isLastParam = true,
2045
                                           .startParam = 1,
2046
                                           .endParam = 1,
2047
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
2048
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2049
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2050
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2051
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
2052
    .translateFunc = translateOutDouble,
2053
    .dataRequiredFunc = statisDataRequired,
2054
    .getEnvFunc   = getAvgFuncEnv,
2055
    .initFunc     = avgFunctionSetup,
2056
    .processFunc  = avgFunction,
2057
    .sprocessFunc = avgScalarFunction,
2058
    .finalizeFunc = avgFinalize,
2059
#ifdef BUILD_NO_CALL
2060
    .invertFunc   = avgInvertFunction,
2061
#endif
2062
    .combineFunc  = avgCombine,
2063
    .pPartialFunc = "_avg_partial",
2064
    .pMiddleFunc  = "_avg_middle",
2065
    .pMergeFunc   = "_avg_merge",
2066
    .pStateFunc = "_avg_state",
2067
  },
2068
  {
2069
    .name = "_avg_partial",
2070
    .type = FUNCTION_TYPE_AVG_PARTIAL,
2071
    .classification = FUNC_MGT_AGG_FUNC,
2072
    .parameters = {.minParamNum = 1,
2073
                   .maxParamNum = 1,
2074
                   .paramInfoPattern = 1,
2075
                   .inputParaInfo[0][0] = {.isLastParam = true,
2076
                                           .startParam = 1,
2077
                                           .endParam = 1,
2078
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
2079
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2080
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2081
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2082
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
2083
    .translateFunc = translateOutVarchar,
2084
    .dataRequiredFunc = statisDataRequired,
2085
    .getEnvFunc   = getAvgFuncEnv,
2086
    .initFunc     = avgFunctionSetup,
2087
    .processFunc  = avgFunction,
2088
    .finalizeFunc = avgPartialFinalize,
2089
#ifdef BUILD_NO_CALL
2090
    .invertFunc   = avgInvertFunction,
2091
#endif
2092
    .combineFunc  = avgCombine,
2093
  },
2094
  {
2095
    .name = "_avg_merge",
2096
    .type = FUNCTION_TYPE_AVG_MERGE,
2097
    .classification = FUNC_MGT_AGG_FUNC,
2098
    .parameters = {.minParamNum = 1,
2099
                   .maxParamNum = 1,
2100
                   .paramInfoPattern = 1,
2101
                   .inputParaInfo[0][0] = {.isLastParam = true,
2102
                                           .startParam = 1,
2103
                                           .endParam = 1,
2104
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
2105
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2106
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2107
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2108
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
2109
    .translateFunc = translateOutDouble,
2110
    .getEnvFunc   = getAvgFuncEnv,
2111
    .initFunc     = avgFunctionSetup,
2112
    .processFunc  = avgFunctionMerge,
2113
    .finalizeFunc = avgFinalize,
2114
#ifdef BUILD_NO_CALL
2115
    .invertFunc   = avgInvertFunction,
2116
#endif
2117
    .combineFunc  = avgCombine,
2118
    .pPartialFunc = "_avg_state_merge",
2119
    .pMergeFunc = "_avg_merge",
2120
  },
2121
  {
2122
    .name = "percentile",
2123
    .type = FUNCTION_TYPE_PERCENTILE,
2124
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_REPEAT_SCAN_FUNC | FUNC_MGT_SPECIAL_DATA_REQUIRED | FUNC_MGT_FORBID_STREAM_FUNC,
2125
    .parameters = {.minParamNum = 2,
2126
                   .maxParamNum = 11,
2127
                   .paramInfoPattern = 1,
2128
                   .inputParaInfo[0][0] = {.isLastParam = false,
2129
                                           .startParam = 1,
2130
                                           .endParam = 1,
2131
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2132
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2133
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2134
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2135
                   .inputParaInfo[0][1] = {.isLastParam = true,
2136
                                           .startParam = 2,
2137
                                           .endParam = 11,
2138
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2139
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2140
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2141
                                           .valueRangeFlag = FUNC_PARAM_HAS_RANGE,
2142
                                           .range = {.iMinVal = 0, .iMaxVal = 100}},
2143
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
2144
    .translateFunc = translatePercentile,
2145
    .dataRequiredFunc = statisDataRequired,
2146
    .getEnvFunc   = getPercentileFuncEnv,
2147
    .initFunc     = percentileFunctionSetup,
2148
    .processFunc  = percentileFunction,
2149
    .sprocessFunc = percentileScalarFunction,
2150
    .finalizeFunc = percentileFinalize,
2151
    .cleanupFunc  = percentileFunctionCleanupExt,
2152
#ifdef BUILD_NO_CALL
2153
    .invertFunc   = NULL,
2154
#endif
2155
    .combineFunc  = NULL,
2156
  },
2157
  {
2158
    .name = "apercentile",
2159
    .type = FUNCTION_TYPE_APERCENTILE,
2160
    .classification = FUNC_MGT_AGG_FUNC,
2161
    .parameters = {.minParamNum = 2,
2162
                   .maxParamNum = 3,
2163
                   .paramInfoPattern = 1,
2164
                   .inputParaInfo[0][0] = {.isLastParam = false,
2165
                                           .startParam = 1,
2166
                                           .endParam = 1,
2167
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2168
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2169
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2170
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2171
                   .inputParaInfo[0][1] = {.isLastParam = false,
2172
                                           .startParam = 2,
2173
                                           .endParam = 2,
2174
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
2175
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2176
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2177
                                           .valueRangeFlag = FUNC_PARAM_HAS_RANGE,
2178
                                           .range = {.iMinVal = 0, .iMaxVal = 100}},
2179
                   .inputParaInfo[0][2] = {.isLastParam = true,
2180
                                           .startParam = 3,
2181
                                           .endParam = 3,
2182
                                           .validDataType = FUNC_PARAM_SUPPORT_STRING_TYPE,
2183
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2184
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2185
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
2186
                                           .fixedValueSize = 2,
2187
                                           .fixedStrValue = {"default", "t-digest"}},
2188
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
2189
    .translateFunc = translateOutDouble,
2190
    .getEnvFunc   = getApercentileFuncEnv,
2191
    .initFunc     = apercentileFunctionSetup,
2192
    .processFunc  = apercentileFunction,
2193
    .sprocessFunc = apercentileScalarFunction,
2194
    .finalizeFunc = apercentileFinalize,
2195
#ifdef BUILD_NO_CALL
2196
    .invertFunc   = NULL,
2197
#endif
2198
    .combineFunc  = apercentileCombine,
2199
    .pPartialFunc = "_apercentile_partial",
2200
    .pMergeFunc   = "_apercentile_merge",
2201
    .createMergeParaFuc = apercentileCreateMergeParam
2202
  },
2203
  {
2204
    .name = "_apercentile_partial",
2205
    .type = FUNCTION_TYPE_APERCENTILE_PARTIAL,
2206
    .classification = FUNC_MGT_AGG_FUNC,
2207
    .parameters = {.minParamNum = 2,
2208
                   .maxParamNum = 3,
2209
                   .paramInfoPattern = 1,
2210
                   .inputParaInfo[0][0] = {.isLastParam = false,
2211
                                           .startParam = 1,
2212
                                           .endParam = 1,
2213
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2214
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2215
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2216
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2217
                   .inputParaInfo[0][1] = {.isLastParam = false,
2218
                                           .startParam = 2,
2219
                                           .endParam = 2,
2220
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
2221
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2222
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2223
                                           .valueRangeFlag = FUNC_PARAM_HAS_RANGE,
2224
                                           .range = {.iMinVal = 0, .iMaxVal = 100}},
2225
                   .inputParaInfo[0][2] = {.isLastParam = true,
2226
                                           .startParam = 3,
2227
                                           .endParam = 3,
2228
                                           .validDataType = FUNC_PARAM_SUPPORT_STRING_TYPE,
2229
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2230
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2231
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
2232
                                           .fixedValueSize = 2,
2233
                                           .fixedStrValue = {"default", "t-digest"}},
2234
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
2235
    .translateFunc = translateOutVarchar,
2236
    .getEnvFunc   = getApercentileFuncEnv,
2237
    .initFunc     = apercentileFunctionSetup,
2238
    .processFunc  = apercentileFunction,
2239
    .finalizeFunc = apercentilePartialFinalize,
2240
#ifdef BUILD_NO_CALL
2241
    .invertFunc   = NULL,
2242
#endif
2243
    .combineFunc = apercentileCombine,
2244
  },
2245
  {
2246
    .name = "_apercentile_merge",
2247
    .type = FUNCTION_TYPE_APERCENTILE_MERGE,
2248
    .classification = FUNC_MGT_AGG_FUNC,
2249
    .parameters = {.minParamNum = 2,
2250
                   .maxParamNum = 3,
2251
                   .paramInfoPattern = 1,
2252
                   .inputParaInfo[0][0] = {.isLastParam = false,
2253
                                           .startParam = 1,
2254
                                           .endParam = 1,
2255
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
2256
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2257
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2258
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2259
                   .inputParaInfo[0][1] = {.isLastParam = false,
2260
                                           .startParam = 2,
2261
                                           .endParam = 2,
2262
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
2263
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2264
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2265
                                           .valueRangeFlag = FUNC_PARAM_HAS_RANGE,
2266
                                           .range = {.iMinVal = 0, .iMaxVal = 100}},
2267
                   .inputParaInfo[0][2] = {.isLastParam = true,
2268
                                           .startParam = 3,
2269
                                           .endParam = 3,
2270
                                           .validDataType = FUNC_PARAM_SUPPORT_STRING_TYPE,
2271
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2272
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2273
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
2274
                                           .fixedValueSize = 2,
2275
                                           .fixedStrValue = {"default", "t-digest"}},
2276
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
2277
    .translateFunc = translateOutDouble,
2278
    .getEnvFunc   = getApercentileFuncEnv,
2279
    .initFunc     = apercentileFunctionSetup,
2280
    .processFunc  = apercentileFunctionMerge,
2281
    .finalizeFunc = apercentileFinalize,
2282
#ifdef BUILD_NO_CALL
2283
    .invertFunc   = NULL,
2284
#endif
2285
    .combineFunc = apercentileCombine,
2286
  },
2287
  {
2288
    .name = "top",
2289
    .type = FUNCTION_TYPE_TOP,
2290
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_ROWS_FUNC | FUNC_MGT_KEEP_ORDER_FUNC |
2291
                      FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_FORBID_FILL_FUNC | FUNC_MGT_IGNORE_NULL_FUNC,
2292
    .parameters = {.minParamNum = 2,
2293
                   .maxParamNum = 2,
2294
                   .paramInfoPattern = 1,
2295
                   .inputParaInfo[0][0] = {.isLastParam = false,
2296
                                           .startParam = 1,
2297
                                           .endParam = 1,
2298
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2299
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2300
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2301
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2302
                   .inputParaInfo[0][1] = {.isLastParam = true,
2303
                                           .startParam = 2,
2304
                                           .endParam = 2,
2305
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
2306
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2307
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2308
                                           .valueRangeFlag = FUNC_PARAM_HAS_RANGE,
2309
                                           .range = {.iMinVal = 1, .iMaxVal = TOP_BOTTOM_QUERY_LIMIT}},
2310
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE}},
2311
    .translateFunc = translateOutFirstIn,
2312
    .getEnvFunc   = getTopBotFuncEnv,
2313
    .initFunc     = topBotFunctionSetup,
2314
    .processFunc  = topFunction,
2315
    .sprocessFunc = topBotScalarFunction,
2316
    .finalizeFunc = topBotFinalize,
2317
    .combineFunc  = topCombine,
2318
    .pPartialFunc = "top",
2319
    .pMergeFunc   = "top",
2320
    .createMergeParaFuc = topBotCreateMergeParam
2321
  },
2322
  {
2323
    .name = "bottom",
2324
    .type = FUNCTION_TYPE_BOTTOM,
2325
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_ROWS_FUNC | FUNC_MGT_KEEP_ORDER_FUNC |
2326
                      FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_FORBID_FILL_FUNC | FUNC_MGT_IGNORE_NULL_FUNC,
2327
    .parameters = {.minParamNum = 2,
2328
                   .maxParamNum = 2,
2329
                   .paramInfoPattern = 1,
2330
                   .inputParaInfo[0][0] = {.isLastParam = false,
2331
                                           .startParam = 1,
2332
                                           .endParam = 1,
2333
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2334
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2335
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2336
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2337
                   .inputParaInfo[0][1] = {.isLastParam = true,
2338
                                           .startParam = 2,
2339
                                           .endParam = 2,
2340
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
2341
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2342
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2343
                                           .valueRangeFlag = FUNC_PARAM_HAS_RANGE,
2344
                                           .range = {.iMinVal = 1, .iMaxVal = TOP_BOTTOM_QUERY_LIMIT}},
2345
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE}},
2346
    .translateFunc = translateOutFirstIn,
2347
    .getEnvFunc   = getTopBotFuncEnv,
2348
    .initFunc     = topBotFunctionSetup,
2349
    .processFunc  = bottomFunction,
2350
    .sprocessFunc = topBotScalarFunction,
2351
    .finalizeFunc = topBotFinalize,
2352
    .combineFunc  = bottomCombine,
2353
    .pPartialFunc = "bottom",
2354
    .pMergeFunc   = "bottom",
2355
    .createMergeParaFuc = topBotCreateMergeParam
2356
  },
2357
  {
2358
    .name = "spread",
2359
    .type = FUNCTION_TYPE_SPREAD,
2360
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SPECIAL_DATA_REQUIRED | FUNC_MGT_TSMA_FUNC,
2361
    .parameters = {.minParamNum = 1,
2362
                   .maxParamNum = 1,
2363
                   .paramInfoPattern = 1,
2364
                   .inputParaInfo[0][0] = {.isLastParam = true,
2365
                                           .startParam = 1,
2366
                                           .endParam = 1,
2367
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE,
2368
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2369
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2370
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2371
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
2372
    .translateFunc = translateOutDouble,
2373
    .dataRequiredFunc = statisDataRequired,
2374
    .getEnvFunc   = getSpreadFuncEnv,
2375
    .initFunc     = spreadFunctionSetup,
2376
    .processFunc  = spreadFunction,
2377
    .sprocessFunc = spreadScalarFunction,
2378
    .finalizeFunc = spreadFinalize,
2379
#ifdef BUILD_NO_CALL
2380
    .invertFunc   = NULL,
2381
#endif
2382
    .combineFunc  = spreadCombine,
2383
    .pPartialFunc = "_spread_partial",
2384
    .pStateFunc = "_spread_state",
2385
    .pMergeFunc   = "_spread_merge"
2386
  },
2387
  {
2388
    .name = "_spread_partial",
2389
    .type = FUNCTION_TYPE_SPREAD_PARTIAL,
2390
    .classification = FUNC_MGT_AGG_FUNC,
2391
    .parameters = {.minParamNum = 1,
2392
                   .maxParamNum = 1,
2393
                   .paramInfoPattern = 1,
2394
                   .inputParaInfo[0][0] = {.isLastParam = true,
2395
                                           .startParam = 1,
2396
                                           .endParam = 1,
2397
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE,
2398
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2399
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2400
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2401
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
2402
    .translateFunc = translateOutVarchar,
2403
    .dataRequiredFunc = statisDataRequired,
2404
    .getEnvFunc   = getSpreadFuncEnv,
2405
    .initFunc     = spreadFunctionSetup,
2406
    .processFunc  = spreadFunction,
2407
    .finalizeFunc = spreadPartialFinalize,
2408
#ifdef BUILD_NO_CALL
2409
    .invertFunc   = NULL,
2410
#endif
2411
    .combineFunc  = spreadCombine,
2412
  },
2413
  {
2414
    .name = "_spread_merge",
2415
    .type = FUNCTION_TYPE_SPREAD_MERGE,
2416
    .parameters = {.minParamNum = 1,
2417
                   .maxParamNum = 1,
2418
                   .paramInfoPattern = 1,
2419
                   .inputParaInfo[0][0] = {.isLastParam = true,
2420
                                           .startParam = 1,
2421
                                           .endParam = 1,
2422
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
2423
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2424
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2425
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2426
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
2427
    .classification = FUNC_MGT_AGG_FUNC,
2428
    .translateFunc = translateOutDouble,
2429
    .dataRequiredFunc = statisDataRequired,
2430
    .getEnvFunc   = getSpreadFuncEnv,
2431
    .initFunc     = spreadFunctionSetup,
2432
    .processFunc  = spreadFunctionMerge,
2433
    .finalizeFunc = spreadFinalize,
2434
#ifdef BUILD_NO_CALL
2435
    .invertFunc   = NULL,
2436
#endif
2437
    .combineFunc  = spreadCombine,
2438
    .pPartialFunc = "_spread_state_merge",
2439
    .pMergeFunc = "_spread_merge",
2440
  },
2441
  {
2442
    .name = "elapsed",
2443
    .type = FUNCTION_TYPE_ELAPSED,
2444
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_INTERVAL_INTERPO_FUNC |
2445
                      FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_SPECIAL_DATA_REQUIRED,
2446
    .parameters = {.minParamNum = 1,
2447
                   .maxParamNum = 2,
2448
                   .paramInfoPattern = 1,
2449
                   .inputParaInfo[0][0] = {.isLastParam = false,
2450
                                           .startParam = 1,
2451
                                           .endParam = 1,
2452
                                           .validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE,
2453
                                           .validNodeType = FUNC_PARAM_SUPPORT_COLUMN_NODE,
2454
                                           .paramAttribute = FUNC_PARAM_MUST_BE_PRIMTS,
2455
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2456
                   .inputParaInfo[0][1] = {.isLastParam = true,
2457
                                           .startParam = 2,
2458
                                           .endParam = 2,
2459
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
2460
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2461
                                           .paramAttribute = FUNC_PARAM_MUST_BE_TIME_UNIT,
2462
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2463
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
2464
    .dataRequiredFunc = statisDataRequired,
2465
    .translateFunc = translateOutDouble,
2466
    .getEnvFunc   = getElapsedFuncEnv,
2467
    .initFunc     = elapsedFunctionSetup,
2468
    .processFunc  = elapsedFunction,
2469
    .finalizeFunc = elapsedFinalize,
2470
#ifdef BUILD_NO_CALL
2471
    .invertFunc   = NULL,
2472
#endif
2473
    .combineFunc  = elapsedCombine,
2474
  },
2475
  {
2476
    .name = "_elapsed_partial",
2477
    .type = FUNCTION_TYPE_ELAPSED,
2478
    .classification = FUNC_MGT_AGG_FUNC,
2479
    .dataRequiredFunc = statisDataRequired,
2480
    .translateFunc = translateElapsedPartial,
2481
    .getEnvFunc   = getElapsedFuncEnv,
2482
    .initFunc     = elapsedFunctionSetup,
2483
    .processFunc  = elapsedFunction,
2484
    .finalizeFunc = elapsedPartialFinalize,
2485
#ifdef BUILD_NO_CALL
2486
    .invertFunc   = NULL,
2487
#endif
2488
    .combineFunc  = elapsedCombine,
2489
  },
2490
  {
2491
    .name = "_elapsed_merge",
2492
    .type = FUNCTION_TYPE_ELAPSED,
2493
    .classification = FUNC_MGT_AGG_FUNC,
2494
    .dataRequiredFunc = statisDataRequired,
2495
    .translateFunc = translateElapsedMerge,
2496
    .getEnvFunc   = getElapsedFuncEnv,
2497
    .initFunc     = elapsedFunctionSetup,
2498
    .processFunc  = elapsedFunctionMerge,
2499
    .finalizeFunc = elapsedFinalize,
2500
  #ifdef BUILD_NO_CALL
2501
    .invertFunc   = NULL,
2502
  #endif
2503
    .combineFunc  = elapsedCombine,
2504
  },
2505
  {
2506
    .name = "interp",
2507
    .type = FUNCTION_TYPE_INTERP,
2508
    .classification = FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_INTERVAL_INTERPO_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
2509
                      FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
2510
    .parameters = {.minParamNum = 1,
2511
                   .maxParamNum = 2,
2512
                   .paramInfoPattern = 1,
2513
                   .inputParaInfo[0][0] = {.isLastParam = false,
2514
                                           .startParam = 1,
2515
                                           .endParam = 1,
2516
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_BOOL_TYPE,
2517
                                           .validNodeType = FUNC_PARAM_SUPPORT_NOT_VALUE_NODE,
2518
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2519
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2520
                   .inputParaInfo[0][1] = {.isLastParam = true,
2521
                                           .startParam = 2,
2522
                                           .endParam = 2,
2523
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
2524
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2525
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2526
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
2527
                                           .fixedValueSize = 2,
2528
                                           .fixedNumValue = {0, 1}},
2529
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE}},
2530
    .translateFunc = translateOutFirstIn,
2531
    .getEnvFunc    = getSelectivityFuncEnv,
2532
    .initFunc      = functionSetup,
2533
    .processFunc   = NULL,
2534
    .finalizeFunc  = NULL,
2535
    .estimateReturnRowsFunc = interpEstReturnRows,
2536
  },
2537
  {
2538
    .name = "derivative",
2539
    .type = FUNCTION_TYPE_DERIVATIVE,
2540
    .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
2541
                      FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_CUMULATIVE_FUNC | FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
2542
    .parameters = {.minParamNum = 3,
2543
                   .maxParamNum = 3,
2544
                   .paramInfoPattern = 1,
2545
                   .inputParaInfo[0][0] = {.isLastParam = false,
2546
                                           .startParam = 1,
2547
                                           .endParam = 1,
2548
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2549
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2550
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2551
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2552
                   .inputParaInfo[0][1] = {.isLastParam = false,
2553
                                           .startParam = 2,
2554
                                           .endParam = 2,
2555
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2556
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2557
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2558
                                           .valueRangeFlag = FUNC_PARAM_HAS_RANGE,
2559
                                           .range = {.iMinVal = 1, .iMaxVal = INT64_MAX}},
2560
                   .inputParaInfo[0][2] = {.isLastParam = true,
2561
                                           .startParam = 3,
2562
                                           .endParam = 3,
2563
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
2564
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2565
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2566
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
2567
                                           .fixedValueSize = 2,
2568
                                           .fixedNumValue = {0, 1}},
2569
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
2570
    .translateFunc = translateOutDouble,
2571
    .getEnvFunc   = getDerivativeFuncEnv,
2572
    .initFunc     = derivativeFuncSetup,
2573
    .processFunc  = derivativeFunction,
2574
    .sprocessFunc = derivativeScalarFunction,
2575
    .finalizeFunc = functionFinalize,
2576
    .estimateReturnRowsFunc = derivativeEstReturnRows,
2577
  },
2578
  {
2579
    .name = "irate",
2580
    .type = FUNCTION_TYPE_IRATE,
2581
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC | FUNC_MGT_FORBID_STREAM_FUNC |
2582
                      FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
2583
    .parameters = {.minParamNum = 1,
2584
                   .maxParamNum = 1,
2585
                   .paramInfoPattern = 1,
2586
                   .inputParaInfo[0][0] = {.isLastParam = true,
2587
                                           .startParam = 1,
2588
                                           .endParam = 1,
2589
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2590
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2591
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2592
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2593
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
2594
    .translateFunc = translateAddPrecOutDouble,
2595
    .getEnvFunc   = getIrateFuncEnv,
2596
    .initFunc     = irateFuncSetup,
2597
    .processFunc  = irateFunction,
2598
    .sprocessFunc = irateScalarFunction,
2599
    .finalizeFunc = irateFinalize,
2600
    .pPartialFunc = "_irate_partial",
2601
    .pMergeFunc   = "_irate_merge",
2602
  },
2603
  {
2604
    .name = "_irate_partial",
2605
    .type = FUNCTION_TYPE_IRATE_PARTIAL,
2606
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC | FUNC_MGT_FORBID_STREAM_FUNC |
2607
                      FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
2608
    .parameters = {.minParamNum = 3,
2609
                   .maxParamNum = 4,
2610
                   .paramInfoPattern = 1,
2611
                   .inputParaInfo[0][0] = {.isLastParam = false,
2612
                                           .startParam = 1,
2613
                                           .endParam = 1,
2614
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2615
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2616
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2617
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2618
                   .inputParaInfo[0][1] = {.isLastParam = false,
2619
                                           .startParam = 2,
2620
                                           .endParam = 2,
2621
                                           .validDataType = FUNC_PARAM_SUPPORT_TINYINT_TYPE,
2622
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2623
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2624
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2625
                   .inputParaInfo[0][2] = {.isLastParam = false,
2626
                                           .startParam = 3,
2627
                                           .endParam = 3,
2628
                                           .validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE,
2629
                                           .validNodeType = FUNC_PARAM_SUPPORT_COLUMN_NODE,
2630
                                           .paramAttribute = FUNC_PARAM_MUST_BE_PRIMTS,
2631
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2632
                   .inputParaInfo[0][3] = {.isLastParam = true,
2633
                                           .startParam = 4,
2634
                                           .endParam = 4,
2635
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
2636
                                           .validNodeType = FUNC_PARAM_SUPPORT_COLUMN_NODE,
2637
                                           .paramAttribute = FUNC_PARAM_MUST_BE_PK,
2638
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2639
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
2640
    .translateFunc = translateOutVarchar,
2641
    .getEnvFunc   = getIrateFuncEnv,
2642
    .initFunc     = irateFuncSetup,
2643
    .processFunc  = irateFunction,
2644
    .sprocessFunc = irateScalarFunction,
2645
    .finalizeFunc = iratePartialFinalize,
2646
  },
2647
  {
2648
    .name = "_irate_merge",
2649
    .type = FUNCTION_TYPE_IRATE_MERGE,
2650
    .classification = FUNC_MGT_AGG_FUNC,
2651
    .parameters = {.minParamNum = 1,
2652
                   .maxParamNum = 1,
2653
                   .paramInfoPattern = 1,
2654
                   .inputParaInfo[0][0] = {.isLastParam = true,
2655
                                           .startParam = 1,
2656
                                           .endParam = 1,
2657
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
2658
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2659
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2660
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2661
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
2662
    .translateFunc = translateAddPrecOutDouble,
2663
    .getEnvFunc   = getIrateFuncEnv,
2664
    .initFunc     = irateFuncSetup,
2665
    .processFunc  = irateFunctionMerge,
2666
    .sprocessFunc = irateScalarFunction,
2667
    .finalizeFunc = irateFinalize,
2668
  },
2669
  {
2670
    .name = "last_row",
2671
    .type = FUNCTION_TYPE_LAST_ROW,
2672
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
2673
                      FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
2674
    .parameters = {.minParamNum = 1,
2675
                   .maxParamNum = -1,
2676
                   .paramInfoPattern = 1,
2677
                   .inputParaInfo[0][0] = {.isLastParam = true,
2678
                                           .startParam = 1,
2679
                                           .endParam = -1,
2680
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
2681
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2682
                                           .paramAttribute = FUNC_PARAM_VALUE_NODE_NOT_NULL,
2683
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2684
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
2685
    .translateFunc = translateOutFirstIn,
2686
    .dynDataRequiredFunc = lastDynDataReq,
2687
    .getEnvFunc   = getFirstLastFuncEnv,
2688
    .initFunc     = functionSetup,
2689
    .processFunc  = lastRowFunction,
2690
    .sprocessFunc = firstLastScalarFunction,
2691
    .pPartialFunc = "_last_row_partial",
2692
    .pMergeFunc   = "_last_row_merge",
2693
    .finalizeFunc = firstLastFinalize,
2694
    .combineFunc  = lastCombine,
2695
  },
2696
  {
2697
    .name = "_cache_last_row",
2698
    .type = FUNCTION_TYPE_CACHE_LAST_ROW,
2699
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
2700
                      FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC,
2701
    .parameters = {.minParamNum = 1,
2702
                   .maxParamNum = -1,
2703
                   .paramInfoPattern = 1,
2704
                   .inputParaInfo[0][0] = {.isLastParam = true,
2705
                                           .startParam = 1,
2706
                                           .endParam = -1,
2707
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
2708
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2709
                                           .paramAttribute = FUNC_PARAM_VALUE_NODE_NOT_NULL,
2710
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2711
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
2712
    .translateFunc = translateOutFirstIn,
2713
    .getEnvFunc   = getFirstLastFuncEnv,
2714
    .initFunc     = functionSetup,
2715
    .processFunc  = cachedLastRowFunction,
2716
    .finalizeFunc = firstLastFinalize,
2717
  },
2718
  {
2719
    .name = "_cache_last",
2720
    .type = FUNCTION_TYPE_CACHE_LAST,
2721
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_IGNORE_NULL_FUNC,
2722
    .parameters = {.minParamNum = 1,
2723
                   .maxParamNum = -1,
2724
                   .paramInfoPattern = 1,
2725
                   .inputParaInfo[0][0] = {.isLastParam = true,
2726
                                           .startParam = 1,
2727
                                           .endParam = -1,
2728
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
2729
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2730
                                           .paramAttribute = FUNC_PARAM_VALUE_NODE_NOT_NULL,
2731
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2732
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
2733
    .translateFunc = translateOutFirstIn,
2734
    .getEnvFunc   = getFirstLastFuncEnv,
2735
    .initFunc     = functionSetup,
2736
    .processFunc  = lastFunctionMerge,
2737
    .finalizeFunc = firstLastFinalize,
2738
  },
2739
  {
2740
    .name = "_last_row_partial",
2741
    .type = FUNCTION_TYPE_LAST_PARTIAL,
2742
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
2743
                      FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
2744
    .parameters = {.minParamNum = 1,
2745
                   .maxParamNum = -1,
2746
                   .paramInfoPattern = 1,
2747
                   .inputParaInfo[0][0] = {.isLastParam = true,
2748
                                           .startParam = 1,
2749
                                           .endParam = -1,
2750
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
2751
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2752
                                           .paramAttribute = FUNC_PARAM_VALUE_NODE_NOT_NULL,
2753
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2754
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
2755
    .translateFunc = translateOutVarchar,
2756
    .dynDataRequiredFunc = lastDynDataReq,
2757
    .getEnvFunc   = getFirstLastFuncEnv,
2758
    .initFunc     = functionSetup,
2759
    .processFunc  = lastRowFunction,
2760
    .finalizeFunc = firstLastPartialFinalize,
2761
  },
2762
  {
2763
    .name = "_last_row_merge",
2764
    .type = FUNCTION_TYPE_LAST_MERGE,
2765
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
2766
                      FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
2767
    .parameters = {.minParamNum = 1,
2768
                   .maxParamNum = 1,
2769
                   .paramInfoPattern = 1,
2770
                   .inputParaInfo[0][0] = {.isLastParam = true,
2771
                                           .startParam = 1,
2772
                                           .endParam = -1,
2773
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
2774
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2775
                                           .paramAttribute = FUNC_PARAM_VALUE_NODE_NOT_NULL,
2776
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2777
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
2778
    .translateFunc = translateOutFirstIn,
2779
    .getEnvFunc   = getFirstLastFuncEnv,
2780
    .initFunc     = functionSetup,
2781
    .processFunc  = lastFunctionMerge,
2782
    .finalizeFunc = firstLastFinalize,
2783
  },
2784
  {
2785
    .name = "first",
2786
    .type = FUNCTION_TYPE_FIRST,
2787
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
2788
                      FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_IGNORE_NULL_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC | FUNC_MGT_TSMA_FUNC,
2789
    .parameters = {.minParamNum = 1,
2790
                   .maxParamNum = -1,
2791
                   .paramInfoPattern = 1,
2792
                   .inputParaInfo[0][0] = {.isLastParam = true,
2793
                                           .startParam = 1,
2794
                                           .endParam = -1,
2795
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
2796
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2797
                                           .paramAttribute = FUNC_PARAM_VALUE_NODE_NOT_NULL,
2798
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2799
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
2800
    .translateFunc = translateOutFirstIn,
2801
    .dynDataRequiredFunc = firstDynDataReq,
2802
    .getEnvFunc   = getFirstLastFuncEnv,
2803
    .initFunc     = firstLastFunctionSetup,
2804
    .processFunc  = firstFunction,
2805
    .sprocessFunc = firstLastScalarFunction,
2806
    .finalizeFunc = firstLastFinalize,
2807
    .pPartialFunc = "_first_partial",
2808
    .pStateFunc = "_first_state",
2809
    .pMergeFunc   = "_first_merge",
2810
    .combineFunc  = firstCombine,
2811
  },
2812
  {
2813
    .name = "_first_partial",
2814
    .type = FUNCTION_TYPE_FIRST_PARTIAL,
2815
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
2816
                      FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_IGNORE_NULL_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
2817
    .parameters = {.minParamNum = 1,
2818
                   .maxParamNum = -1,
2819
                   .paramInfoPattern = 1,
2820
                   .inputParaInfo[0][0] = {.isLastParam = true,
2821
                                           .startParam = 1,
2822
                                           .endParam = -1,
2823
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
2824
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2825
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2826
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2827
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
2828
    .translateFunc = translateOutVarchar,
2829
    .dynDataRequiredFunc = firstDynDataReq,
2830
    .getEnvFunc   = getFirstLastFuncEnv,
2831
    .initFunc     = functionSetup,
2832
    .processFunc  = firstFunction,
2833
    .finalizeFunc = firstLastPartialFinalize,
2834
    .combineFunc  = firstCombine,
2835
  },
2836
  {
2837
    .name = "_first_merge",
2838
    .type = FUNCTION_TYPE_FIRST_MERGE,
2839
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
2840
                      FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_IGNORE_NULL_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
2841
    .parameters = {.minParamNum = 1,
2842
                   .maxParamNum = 1,
2843
                   .paramInfoPattern = 1,
2844
                   .inputParaInfo[0][0] = {.isLastParam = true,
2845
                                           .startParam = 1,
2846
                                           .endParam = -1,
2847
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
2848
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2849
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2850
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2851
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
2852
    .translateFunc = translateOutFirstIn,
2853
    .getEnvFunc   = getFirstLastFuncEnv,
2854
    .initFunc     = functionSetup,
2855
    .processFunc  = firstFunctionMerge,
2856
    .finalizeFunc = firstLastFinalize,
2857
    .combineFunc  = firstCombine,
2858
    .pPartialFunc = "_first_state_merge",
2859
    .pMergeFunc = "_first_merge",
2860
  },
2861
  {
2862
    .name = "last",
2863
    .type = FUNCTION_TYPE_LAST,
2864
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
2865
                      FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_IGNORE_NULL_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC | FUNC_MGT_TSMA_FUNC,
2866
    .parameters = {.minParamNum = 1,
2867
                   .maxParamNum = -1,
2868
                   .paramInfoPattern = 1,
2869
                   .inputParaInfo[0][0] = {.isLastParam = true,
2870
                                           .startParam = 1,
2871
                                           .endParam = -1,
2872
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
2873
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2874
                                           .paramAttribute = FUNC_PARAM_VALUE_NODE_NOT_NULL,
2875
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2876
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
2877
    .translateFunc = translateOutFirstIn,
2878
    .dynDataRequiredFunc = lastDynDataReq,
2879
    .getEnvFunc   = getFirstLastFuncEnv,
2880
    .initFunc     = firstLastFunctionSetup,
2881
    .processFunc  = lastFunction,
2882
    .sprocessFunc = firstLastScalarFunction,
2883
    .finalizeFunc = firstLastFinalize,
2884
    .pPartialFunc = "_last_partial",
2885
    .pStateFunc = "_last_state",
2886
    .pMergeFunc   = "_last_merge",
2887
    .combineFunc  = lastCombine,
2888
  },
2889
  {
2890
    .name = "_last_partial",
2891
    .type = FUNCTION_TYPE_LAST_PARTIAL,
2892
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
2893
                      FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_IGNORE_NULL_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
2894
    .parameters = {.minParamNum = 1,
2895
                   .maxParamNum = -1,
2896
                   .paramInfoPattern = 1,
2897
                   .inputParaInfo[0][0] = {.isLastParam = true,
2898
                                           .startParam = 1,
2899
                                           .endParam = -1,
2900
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
2901
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2902
                                           .paramAttribute = FUNC_PARAM_VALUE_NODE_NOT_NULL,
2903
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2904
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
2905
    .translateFunc = translateOutVarchar,
2906
    .dynDataRequiredFunc = lastDynDataReq,
2907
    .getEnvFunc   = getFirstLastFuncEnv,
2908
    .initFunc     = functionSetup,
2909
    .processFunc  = lastFunction,
2910
    .finalizeFunc = firstLastPartialFinalize,
2911
    .combineFunc  = lastCombine,
2912
  },
2913
  {
2914
    .name = "_last_merge",
2915
    .type = FUNCTION_TYPE_LAST_MERGE,
2916
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
2917
                      FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_IGNORE_NULL_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
2918
    .parameters = {.minParamNum = 1,
2919
                   .maxParamNum = -1,
2920
                   .paramInfoPattern = 1,
2921
                   .inputParaInfo[0][0] = {.isLastParam = true,
2922
                                           .startParam = 1,
2923
                                           .endParam = -1,
2924
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
2925
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2926
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2927
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2928
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
2929
    .translateFunc = translateOutFirstIn,
2930
    .getEnvFunc   = getFirstLastFuncEnv,
2931
    .initFunc     = functionSetup,
2932
    .processFunc  = lastFunctionMerge,
2933
    .finalizeFunc = firstLastFinalize,
2934
    .combineFunc  = lastCombine,
2935
    .pPartialFunc = "_last_state_merge",
2936
    .pMergeFunc = "_last_merge",
2937
  },
2938
  {
2939
    .name = "twa",
2940
    .type = FUNCTION_TYPE_TWA,
2941
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_INTERVAL_INTERPO_FUNC |
2942
                      FUNC_MGT_IMPLICIT_TS_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
2943
    .parameters = {.minParamNum = 1,
2944
                   .maxParamNum = 1,
2945
                   .paramInfoPattern = 1,
2946
                   .inputParaInfo[0][0] = {.isLastParam = true,
2947
                                           .startParam = 1,
2948
                                           .endParam = 1,
2949
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
2950
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2951
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2952
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2953
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
2954
    .translateFunc = translateOutDouble,
2955
    .dataRequiredFunc = statisDataRequired,
2956
    .getEnvFunc    = getTwaFuncEnv,
2957
    .initFunc      = twaFunctionSetup,
2958
    .processFunc   = twaFunction,
2959
    .sprocessFunc  = twaScalarFunction,
2960
    .finalizeFunc  = twaFinalize,
2961
  },
2962
  {
2963
    .name = "histogram",
2964
    .type = FUNCTION_TYPE_HISTOGRAM,
2965
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_MULTI_ROWS_FUNC | FUNC_MGT_FORBID_FILL_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
2966
    .parameters = {.minParamNum = 4,
2967
                   .maxParamNum = 4,
2968
                   .paramInfoPattern = 1,
2969
                   .inputParaInfo[0][0] = {.isLastParam = false,
2970
                                           .startParam = 1,
2971
                                           .endParam = 1,
2972
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
2973
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
2974
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2975
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2976
                   .inputParaInfo[0][1] = {.isLastParam = false,
2977
                                           .startParam = 2,
2978
                                           .endParam = 2,
2979
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
2980
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2981
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2982
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
2983
                                           .fixedValueSize = 3,
2984
                                           .fixedStrValue = {"user_input", "linear_bin", "log_bin"}},
2985
                   .inputParaInfo[0][2] = {.isLastParam = false,
2986
                                           .startParam = 3,
2987
                                           .endParam = 3,
2988
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
2989
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2990
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2991
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
2992
                   .inputParaInfo[0][3] = {.isLastParam = true,
2993
                                           .startParam = 4,
2994
                                           .endParam = 4,
2995
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
2996
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
2997
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
2998
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
2999
                                           .fixedValueSize = 2,
3000
                                           .fixedNumValue = {0, 1}},
3001
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
3002
    .translateFunc = translateHitogram,
3003
    .getEnvFunc   = getHistogramFuncEnv,
3004
    .initFunc     = histogramFunctionSetup,
3005
    .processFunc  = histogramFunction,
3006
    .sprocessFunc = histogramScalarFunction,
3007
    .finalizeFunc = histogramFinalize,
3008
#ifdef BUILD_NO_CALL
3009
    .invertFunc   = NULL,
3010
#endif
3011
    .combineFunc  = histogramCombine,
3012
    .pPartialFunc = "_histogram_partial",
3013
    .pMergeFunc   = "_histogram_merge",
3014
  },
3015
  {
3016
    .name = "_histogram_partial",
3017
    .type = FUNCTION_TYPE_HISTOGRAM_PARTIAL,
3018
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_MULTI_ROWS_FUNC | FUNC_MGT_FORBID_FILL_FUNC,
3019
    .parameters = {.minParamNum = 4,
3020
                   .maxParamNum = 4,
3021
                   .paramInfoPattern = 1,
3022
                   .inputParaInfo[0][0] = {.isLastParam = false,
3023
                                           .startParam = 1,
3024
                                           .endParam = 1,
3025
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
3026
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3027
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3028
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3029
                   .inputParaInfo[0][1] = {.isLastParam = false,
3030
                                           .startParam = 2,
3031
                                           .endParam = 2,
3032
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
3033
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3034
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3035
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
3036
                                           .fixedValueSize = 3,
3037
                                           .fixedStrValue = {"user_input", "linear_bin", "log_bin"}},
3038
                   .inputParaInfo[0][2] = {.isLastParam = false,
3039
                                           .startParam = 3,
3040
                                           .endParam = 3,
3041
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
3042
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3043
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3044
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3045
                   .inputParaInfo[0][3] = {.isLastParam = true,
3046
                                           .startParam = 4,
3047
                                           .endParam = 4,
3048
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
3049
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3050
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3051
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
3052
                                           .fixedValueSize = 2,
3053
                                           .fixedNumValue = {0, 1}},
3054
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
3055
    .translateFunc = translateHistogramPartial,
3056
    .getEnvFunc   = getHistogramFuncEnv,
3057
    .initFunc     = histogramFunctionSetup,
3058
    .processFunc  = histogramFunctionPartial,
3059
    .finalizeFunc = histogramPartialFinalize,
3060
#ifdef BUILD_NO_CALL
3061
    .invertFunc   = NULL,
3062
#endif
3063
    .combineFunc  = histogramCombine,
3064
  },
3065
  {
3066
    .name = "_histogram_merge",
3067
    .type = FUNCTION_TYPE_HISTOGRAM_MERGE,
3068
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_MULTI_ROWS_FUNC | FUNC_MGT_FORBID_FILL_FUNC,
3069
    .parameters = {.minParamNum = 1,
3070
                   .maxParamNum = 1,
3071
                   .paramInfoPattern = 1,
3072
                   .inputParaInfo[0][0] = {.isLastParam = true,
3073
                                           .startParam = 1,
3074
                                           .endParam = 1,
3075
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
3076
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3077
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3078
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3079
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
3080
    .translateFunc = translateOutVarchar,
3081
    .getEnvFunc   = getHistogramFuncEnv,
3082
    .initFunc     = functionSetup,
3083
    .processFunc  = histogramFunctionMerge,
3084
    .finalizeFunc = histogramFinalize,
3085
#ifdef BUILD_NO_CALL
3086
    .invertFunc   = NULL,
3087
#endif
3088
    .combineFunc  = histogramCombine,
3089
  },
3090
  {
3091
    .name = "hyperloglog",
3092
    .type = FUNCTION_TYPE_HYPERLOGLOG,
3093
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_COUNT_LIKE_FUNC,
3094
    .parameters = {.minParamNum = 1,
3095
                   .maxParamNum = 1,
3096
                   .paramInfoPattern = 1,
3097
                   .inputParaInfo[0][0] = {.isLastParam = true,
3098
                                           .startParam = 1,
3099
                                           .endParam = 1,
3100
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
3101
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3102
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3103
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3104
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
3105
    .translateFunc = translateOutBigInt,
3106
    .getEnvFunc   = getHLLFuncEnv,
3107
    .initFunc     = functionSetup,
3108
    .processFunc  = hllFunction,
3109
    .sprocessFunc = hllScalarFunction,
3110
    .finalizeFunc = hllFinalize,
3111
#ifdef BUILD_NO_CALL
3112
    .invertFunc   = NULL,
3113
#endif
3114
    .combineFunc  = hllCombine,
3115
    .pPartialFunc = "_hyperloglog_partial",
3116
    .pMergeFunc   = "_hyperloglog_merge",
3117
  },
3118
  {
3119
    .name = "_hyperloglog_partial",
3120
    .type = FUNCTION_TYPE_HYPERLOGLOG_PARTIAL,
3121
    .parameters = {.minParamNum = 1,
3122
                   .maxParamNum = 1,
3123
                   .paramInfoPattern = 1,
3124
                   .inputParaInfo[0][0] = {.isLastParam = true,
3125
                                           .startParam = 1,
3126
                                           .endParam = 1,
3127
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
3128
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3129
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3130
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3131
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
3132
    .classification = FUNC_MGT_AGG_FUNC,
3133
    .translateFunc = translateOutVarchar,
3134
    .getEnvFunc   = getHLLFuncEnv,
3135
    .initFunc     = functionSetup,
3136
    .processFunc  = hllFunction,
3137
    .finalizeFunc = hllPartialFinalize,
3138
#ifdef BUILD_NO_CALL
3139
    .invertFunc   = NULL,
3140
#endif
3141
    .combineFunc  = hllCombine,
3142
  },
3143
  {
3144
    .name = "_hyperloglog_merge",
3145
    .type = FUNCTION_TYPE_HYPERLOGLOG_MERGE,
3146
    .parameters = {.minParamNum = 1,
3147
                   .maxParamNum = 1,
3148
                   .paramInfoPattern = 1,
3149
                   .inputParaInfo[0][0] = {.isLastParam = true,
3150
                                           .startParam = 1,
3151
                                           .endParam = 1,
3152
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
3153
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3154
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3155
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3156
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
3157
    .classification = FUNC_MGT_AGG_FUNC,
3158
    .translateFunc = translateOutBigInt,
3159
    .getEnvFunc   = getHLLFuncEnv,
3160
    .initFunc     = functionSetup,
3161
    .processFunc  = hllFunctionMerge,
3162
    .finalizeFunc = hllFinalize,
3163
#ifdef BUILD_NO_CALL
3164
    .invertFunc   = NULL,
3165
#endif
3166
    .combineFunc  = hllCombine,
3167
    .pMergeFunc = "_hyperloglog_merge",
3168
  },
3169
  {
3170
    .name = "diff",
3171
    .type = FUNCTION_TYPE_DIFF,
3172
    .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC | FUNC_MGT_PROCESS_BY_ROW |
3173
                      FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_CUMULATIVE_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
3174
    .parameters = {.minParamNum = 1,
3175
                   .maxParamNum = 2,
3176
                   .paramInfoPattern = 1,
3177
                   .inputParaInfo[0][0] = {.isLastParam = false,
3178
                                           .startParam = 1,
3179
                                           .endParam = 1,
3180
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE | FUNC_PARAM_SUPPORT_BOOL_TYPE,
3181
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3182
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3183
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3184
                   .inputParaInfo[0][1] = {.isLastParam = true,
3185
                                           .startParam = 2,
3186
                                           .endParam = 2,
3187
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
3188
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3189
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3190
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
3191
                                           .fixedValueSize = 4,
3192
                                           .fixedNumValue = {0, 1, 2, 3}},
3193
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE | FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
3194
    .translateFunc = translateDiff,
3195
    .getEnvFunc   = getDiffFuncEnv,
3196
    .initFunc     = diffFunctionSetup,
3197
    .processFunc  = diffFunction,
3198
    .sprocessFunc = diffScalarFunction,
3199
    .finalizeFunc = functionFinalize,
3200
    .estimateReturnRowsFunc = diffEstReturnRows,
3201
    .processFuncByRow  = diffFunctionByRow,
3202
  },
3203
  {
3204
    .name = "statecount",
3205
    .type = FUNCTION_TYPE_STATE_COUNT,
3206
    .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
3207
                      FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC,
3208
    .parameters = {.minParamNum = 3,
3209
                   .maxParamNum = 3,
3210
                   .paramInfoPattern = 1,
3211
                   .inputParaInfo[0][0] = {.isLastParam = false,
3212
                                           .startParam = 1,
3213
                                           .endParam = 1,
3214
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
3215
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3216
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3217
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3218
                   .inputParaInfo[0][1] = {.isLastParam = false,
3219
                                           .startParam = 2,
3220
                                           .endParam = 2,
3221
                                           .validDataType = FUNC_PARAM_SUPPORT_STRING_TYPE,
3222
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3223
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3224
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
3225
                                           .fixedValueSize = 6,
3226
                                           .fixedStrValue = {"LT", "GT", "LE", "GE", "NE", "EQ"}},
3227
                   .inputParaInfo[0][2] = {.isLastParam = true,
3228
                                           .startParam = 3,
3229
                                           .endParam = 3,
3230
                                           .validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE | FUNC_PARAM_SUPPORT_BIGINT_TYPE,
3231
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3232
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3233
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3234
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
3235
    .translateFunc = translateOutBigInt,
3236
    .getEnvFunc   = getStateFuncEnv,
3237
    .initFunc     = functionSetup,
3238
    .processFunc  = stateCountFunction,
3239
    .sprocessFunc = stateCountScalarFunction,
3240
    .finalizeFunc = NULL,
3241
  },
3242
  {
3243
    .name = "stateduration",
3244
    .type = FUNCTION_TYPE_STATE_DURATION,
3245
    .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
3246
                      FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC,
3247
    .parameters = {.minParamNum = 3,
3248
                   .maxParamNum = 4,
3249
                   .paramInfoPattern = 1,
3250
                   .inputParaInfo[0][0] = {.isLastParam = false,
3251
                                           .startParam = 1,
3252
                                           .endParam = 1,
3253
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
3254
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3255
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3256
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3257
                   .inputParaInfo[0][1] = {.isLastParam = false,
3258
                                           .startParam = 2,
3259
                                           .endParam = 2,
3260
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
3261
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3262
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3263
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
3264
                                           .fixedValueSize = 6,
3265
                                           .fixedStrValue = {"LT", "GT", "LE", "GE", "NE", "EQ"}},
3266
                   .inputParaInfo[0][2] = {.isLastParam = false,
3267
                                           .startParam = 3,
3268
                                           .endParam = 3,
3269
                                           .validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE | FUNC_PARAM_SUPPORT_BIGINT_TYPE,
3270
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3271
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3272
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3273
                   .inputParaInfo[0][3] = {.isLastParam = true,
3274
                                           .startParam = 4,
3275
                                           .endParam = 4,
3276
                                           .validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE,
3277
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3278
                                           .paramAttribute = FUNC_PARAM_MUST_BE_TIME_UNIT,
3279
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3280
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
3281
    .translateFunc = translateOutBigInt,
3282
    .getEnvFunc   = getStateFuncEnv,
3283
    .initFunc     = functionSetup,
3284
    .processFunc  = stateDurationFunction,
3285
    .sprocessFunc = stateDurationScalarFunction,
3286
    .finalizeFunc = NULL,
3287
  },
3288
  {
3289
    .name = "csum",
3290
    .type = FUNCTION_TYPE_CSUM,
3291
    .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
3292
                      FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_CUMULATIVE_FUNC | FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC,
3293
    .parameters = {.minParamNum = 1,
3294
                   .maxParamNum = 1,
3295
                   .paramInfoPattern = 1,
3296
                   .inputParaInfo[0][0] = {.isLastParam = true,
3297
                                           .startParam = 1,
3298
                                           .endParam = 1,
3299
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
3300
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3301
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3302
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3303
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE | FUNC_PARAM_SUPPORT_DOUBLE_TYPE | FUNC_PARAM_SUPPORT_UBIGINT_TYPE}},
3304
    .translateFunc = translateCsum,
3305
    .getEnvFunc   = getCsumFuncEnv,
3306
    .initFunc     = functionSetup,
3307
    .processFunc  = csumFunction,
3308
    .sprocessFunc = csumScalarFunction,
3309
    .finalizeFunc = NULL,
3310
    .estimateReturnRowsFunc = csumEstReturnRows,
3311
  },
3312
  {
3313
    .name = "mavg",
3314
    .type = FUNCTION_TYPE_MAVG,
3315
    .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
3316
                      FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC,
3317
    .parameters = {.minParamNum = 2,
3318
                   .maxParamNum = 2,
3319
                   .paramInfoPattern = 1,
3320
                   .inputParaInfo[0][0] = {.isLastParam = false,
3321
                                           .startParam = 1,
3322
                                           .endParam = 1,
3323
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE,
3324
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3325
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3326
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3327
                   .inputParaInfo[0][1] = {.isLastParam = true,
3328
                                           .startParam = 2,
3329
                                           .endParam = 2,
3330
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
3331
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3332
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3333
                                           .valueRangeFlag = FUNC_PARAM_HAS_RANGE,
3334
                                           .range = {.iMinVal = 1, .iMaxVal = 1000}},
3335
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
3336
    .translateFunc = translateOutDouble,
3337
    .getEnvFunc   = getMavgFuncEnv,
3338
    .initFunc     = mavgFunctionSetup,
3339
    .processFunc  = mavgFunction,
3340
    .sprocessFunc = mavgScalarFunction,
3341
    .finalizeFunc = NULL,
3342
  },
3343
  {
3344
    .name = "sample",
3345
    .type = FUNCTION_TYPE_SAMPLE,
3346
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_ROWS_FUNC | FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_FORBID_STREAM_FUNC |
3347
                      FUNC_MGT_FORBID_FILL_FUNC,
3348
    .parameters = {.minParamNum = 2,
3349
                   .maxParamNum = 2,
3350
                   .paramInfoPattern = 1,
3351
                   .inputParaInfo[0][0] = {.isLastParam = false,
3352
                                           .startParam = 1,
3353
                                           .endParam = 1,
3354
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
3355
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3356
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3357
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3358
                   .inputParaInfo[0][1] = {.isLastParam = true,
3359
                                           .startParam = 2,
3360
                                           .endParam = 2,
3361
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
3362
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3363
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3364
                                           .valueRangeFlag = FUNC_PARAM_HAS_RANGE,
3365
                                           .range = {.iMinVal = 1, .iMaxVal = 1000}},
3366
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
3367
    .translateFunc = translateSampleTail,
3368
    .getEnvFunc   = getSampleFuncEnv,
3369
    .initFunc     = sampleFunctionSetup,
3370
    .processFunc  = sampleFunction,
3371
    .sprocessFunc = sampleScalarFunction,
3372
    .finalizeFunc = sampleFinalize,
3373
  },
3374
  {
3375
    .name = "tail",
3376
    .type = FUNCTION_TYPE_TAIL,
3377
    .classification = FUNC_MGT_SELECT_FUNC | FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC,
3378
    .parameters = {.minParamNum = 2,
3379
                   .maxParamNum = 3,
3380
                   .paramInfoPattern = 1,
3381
                   .inputParaInfo[0][0] = {.isLastParam = false,
3382
                                           .startParam = 1,
3383
                                           .endParam = 1,
3384
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
3385
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3386
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3387
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3388
                   .inputParaInfo[0][1] = {.isLastParam = false,
3389
                                           .startParam = 2,
3390
                                           .endParam = 2,
3391
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
3392
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3393
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3394
                                           .valueRangeFlag = FUNC_PARAM_HAS_RANGE,
3395
                                           .range = {.iMinVal = 1, .iMaxVal = 100}},
3396
                   .inputParaInfo[0][2] = {.isLastParam = true,
3397
                                           .startParam = 3,
3398
                                           .endParam = 3,
3399
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
3400
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3401
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3402
                                           .valueRangeFlag = FUNC_PARAM_HAS_RANGE,
3403
                                           .range = {.iMinVal = 0, .iMaxVal = 100}},
3404
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
3405
    .translateFunc = translateSampleTail,
3406
    .getEnvFunc   = getTailFuncEnv,
3407
    .initFunc     = tailFunctionSetup,
3408
    .processFunc  = tailFunction,
3409
    .sprocessFunc = tailScalarFunction,
3410
    .finalizeFunc = NULL,
3411
  },
3412
  {
3413
    .name = "unique",
3414
    .type = FUNCTION_TYPE_UNIQUE,
3415
    .classification = FUNC_MGT_SELECT_FUNC | FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
3416
    .parameters = {.minParamNum = 1,
3417
                   .maxParamNum = 1,
3418
                   .paramInfoPattern = 1,
3419
                   .inputParaInfo[0][0] = {.isLastParam = true,
3420
                                           .startParam = 1,
3421
                                           .endParam = 1,
3422
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
3423
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3424
                                           .paramAttribute = FUNC_PARAM_MUST_HAVE_COLUMN,
3425
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3426
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
3427
    .translateFunc = translateOutFirstIn,
3428
    .getEnvFunc   = getUniqueFuncEnv,
3429
    .initFunc     = uniqueFunctionSetup,
3430
    .processFunc  = uniqueFunction,
3431
    .sprocessFunc = uniqueScalarFunction,
3432
    .finalizeFunc = NULL,
3433
  },
3434
  {
3435
    .name = "mode",
3436
    .type = FUNCTION_TYPE_MODE,
3437
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
3438
    .parameters = {.minParamNum = 1,
3439
                   .maxParamNum = 1,
3440
                   .paramInfoPattern = 1,
3441
                   .inputParaInfo[0][0] = {.isLastParam = true,
3442
                                           .startParam = 1,
3443
                                           .endParam = 1,
3444
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
3445
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3446
                                           .paramAttribute = FUNC_PARAM_MUST_HAVE_COLUMN,
3447
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3448
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
3449
    .translateFunc = translateOutFirstIn,
3450
    .getEnvFunc   = getModeFuncEnv,
3451
    .initFunc     = modeFunctionSetup,
3452
    .processFunc  = modeFunction,
3453
    .sprocessFunc = modeScalarFunction,
3454
    .finalizeFunc = modeFinalize,
3455
    .cleanupFunc  = modeFunctionCleanupExt,
3456
  },
3457
  {
3458
    .name = "abs",
3459
    .type = FUNCTION_TYPE_ABS,
3460
    .classification = FUNC_MGT_SCALAR_FUNC,
3461
    .parameters = {.minParamNum = 1,
3462
                   .maxParamNum = 1,
3463
                   .paramInfoPattern = 1,
3464
                   .inputParaInfo[0][0] = {.isLastParam = true,
3465
                                           .startParam = 1,
3466
                                           .endParam = 1,
3467
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3468
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3469
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3470
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3471
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE}},
3472
    .translateFunc = translateOutNum,
3473
    .getEnvFunc   = NULL,
3474
    .initFunc     = NULL,
3475
    .sprocessFunc = absFunction,
3476
    .finalizeFunc = NULL,
3477
  },
3478
  {
3479
    .name = "log",
3480
    .type = FUNCTION_TYPE_LOG,
3481
    .classification = FUNC_MGT_SCALAR_FUNC,
3482
    .parameters = {.minParamNum = 1,
3483
                   .maxParamNum = 2,
3484
                   .paramInfoPattern = 1,
3485
                   .inputParaInfo[0][0] = {.isLastParam = false,
3486
                                           .startParam = 1,
3487
                                           .endParam = 1,
3488
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3489
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3490
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3491
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3492
                   .inputParaInfo[0][1] = {.isLastParam = true,
3493
                                           .startParam = 2,
3494
                                           .endParam = 2,
3495
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3496
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3497
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3498
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3499
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
3500
    .translateFunc = translateOutDouble,
3501
    .getEnvFunc   = NULL,
3502
    .initFunc     = NULL,
3503
    .sprocessFunc = logFunction,
3504
    .finalizeFunc = NULL,
3505
  },
3506
  {
3507
    .name = "pow",
3508
    .type = FUNCTION_TYPE_POW,
3509
    .classification = FUNC_MGT_SCALAR_FUNC,
3510
    .parameters = {.minParamNum = 2,
3511
                   .maxParamNum = 2,
3512
                   .paramInfoPattern = 1,
3513
                   .inputParaInfo[0][0] = {.isLastParam = false,
3514
                                           .startParam = 1,
3515
                                           .endParam = 1,
3516
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3517
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3518
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3519
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3520
                   .inputParaInfo[0][1] = {.isLastParam = true,
3521
                                           .startParam = 2,
3522
                                           .endParam = 2,
3523
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3524
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3525
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3526
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3527
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
3528
    .translateFunc = translateOutDouble,
3529
    .getEnvFunc   = NULL,
3530
    .initFunc     = NULL,
3531
    .sprocessFunc = powFunction,
3532
    .finalizeFunc = NULL,
3533
  },
3534
  {
3535
    .name = "sqrt",
3536
    .type = FUNCTION_TYPE_SQRT,
3537
    .classification = FUNC_MGT_SCALAR_FUNC,
3538
    .parameters = {.minParamNum = 1,
3539
                   .maxParamNum = 1,
3540
                   .paramInfoPattern = 1,
3541
                   .inputParaInfo[0][0] = {.isLastParam = true,
3542
                                           .startParam = 1,
3543
                                           .endParam = 1,
3544
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3545
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3546
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3547
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3548
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
3549
    .translateFunc = translateOutDouble,
3550
    .getEnvFunc   = NULL,
3551
    .initFunc     = NULL,
3552
    .sprocessFunc = sqrtFunction,
3553
    .finalizeFunc = NULL,
3554
  },
3555
  {
3556
    .name = "ceil",
3557
    .type = FUNCTION_TYPE_CEIL,
3558
    .classification = FUNC_MGT_SCALAR_FUNC,
3559
    .parameters = {.minParamNum = 1,
3560
                   .maxParamNum = 1,
3561
                   .paramInfoPattern = 1,
3562
                   .inputParaInfo[0][0] = {.isLastParam = true,
3563
                                           .startParam = 1,
3564
                                           .endParam = 1,
3565
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3566
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3567
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3568
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3569
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE}},
3570
    .translateFunc = translateOutNum,
3571
    .getEnvFunc   = NULL,
3572
    .initFunc     = NULL,
3573
    .sprocessFunc = ceilFunction,
3574
    .finalizeFunc = NULL,
3575
  },
3576
  {
3577
    .name = "floor",
3578
    .type = FUNCTION_TYPE_FLOOR,
3579
    .classification = FUNC_MGT_SCALAR_FUNC,
3580
    .parameters = {.minParamNum = 1,
3581
                   .maxParamNum = 1,
3582
                   .paramInfoPattern = 1,
3583
                   .inputParaInfo[0][0] = {.isLastParam = true,
3584
                                           .startParam = 1,
3585
                                           .endParam = 1,
3586
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3587
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3588
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3589
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3590
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE}},
3591
    .translateFunc = translateOutNum,
3592
    .getEnvFunc   = NULL,
3593
    .initFunc     = NULL,
3594
    .sprocessFunc = floorFunction,
3595
    .finalizeFunc = NULL,
3596
  },
3597
  {
3598
    .name = "round",
3599
    .type = FUNCTION_TYPE_ROUND,
3600
    .classification = FUNC_MGT_SCALAR_FUNC,
3601
    .parameters = {.minParamNum = 1,
3602
                   .maxParamNum = 2,
3603
                   .paramInfoPattern = 1,
3604
                   .inputParaInfo[0][0] = {.isLastParam = false,
3605
                                           .startParam = 1,
3606
                                           .endParam = 1,
3607
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3608
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3609
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3610
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3611
                   .inputParaInfo[0][1] = {.isLastParam = true,
3612
                                           .startParam = 2,
3613
                                           .endParam = 2,
3614
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3615
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3616
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3617
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3618
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
3619
    .translateFunc = translateOutNum,
3620
    .getEnvFunc   = NULL,
3621
    .initFunc     = NULL,
3622
    .sprocessFunc = roundFunction,
3623
    .finalizeFunc = NULL,
3624
  },
3625
  {
3626
    .name = "sin",
3627
    .type = FUNCTION_TYPE_SIN,
3628
    .classification = FUNC_MGT_SCALAR_FUNC,
3629
    .parameters = {.minParamNum = 1,
3630
                   .maxParamNum = 1,
3631
                   .paramInfoPattern = 1,
3632
                   .inputParaInfo[0][0] = {.isLastParam = true,
3633
                                           .startParam = 1,
3634
                                           .endParam = 1,
3635
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3636
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3637
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3638
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3639
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
3640
    .translateFunc = translateOutDouble,
3641
    .getEnvFunc   = NULL,
3642
    .initFunc     = NULL,
3643
    .sprocessFunc = sinFunction,
3644
    .finalizeFunc = NULL,
3645
  },
3646
  {
3647
    .name = "cos",
3648
    .type = FUNCTION_TYPE_COS,
3649
    .classification = FUNC_MGT_SCALAR_FUNC,
3650
    .parameters = {.minParamNum = 1,
3651
                   .maxParamNum = 1,
3652
                   .paramInfoPattern = 1,
3653
                   .inputParaInfo[0][0] = {.isLastParam = true,
3654
                                           .startParam = 1,
3655
                                           .endParam = 1,
3656
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3657
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3658
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3659
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3660
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
3661
    .translateFunc = translateOutDouble,
3662
    .getEnvFunc   = NULL,
3663
    .initFunc     = NULL,
3664
    .sprocessFunc = cosFunction,
3665
    .finalizeFunc = NULL,
3666
  },
3667
  {
3668
    .name = "tan",
3669
    .type = FUNCTION_TYPE_TAN,
3670
    .classification = FUNC_MGT_SCALAR_FUNC,
3671
    .parameters = {.minParamNum = 1,
3672
                   .maxParamNum = 1,
3673
                   .paramInfoPattern = 1,
3674
                   .inputParaInfo[0][0] = {.isLastParam = true,
3675
                                           .startParam = 1,
3676
                                           .endParam = 1,
3677
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3678
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3679
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3680
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3681
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
3682
    .translateFunc = translateOutDouble,
3683
    .getEnvFunc   = NULL,
3684
    .initFunc     = NULL,
3685
    .sprocessFunc = tanFunction,
3686
    .finalizeFunc = NULL,
3687
  },
3688
  {
3689
    .name = "asin",
3690
    .type = FUNCTION_TYPE_ASIN,
3691
    .classification = FUNC_MGT_SCALAR_FUNC,
3692
    .parameters = {.minParamNum = 1,
3693
                   .maxParamNum = 1,
3694
                   .paramInfoPattern = 1,
3695
                   .inputParaInfo[0][0] = {.isLastParam = true,
3696
                                           .startParam = 1,
3697
                                           .endParam = 1,
3698
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3699
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3700
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3701
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3702
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
3703
    .translateFunc = translateOutDouble,
3704
    .getEnvFunc   = NULL,
3705
    .initFunc     = NULL,
3706
    .sprocessFunc = asinFunction,
3707
    .finalizeFunc = NULL,
3708
  },
3709
  {
3710
    .name = "acos",
3711
    .type = FUNCTION_TYPE_ACOS,
3712
    .classification = FUNC_MGT_SCALAR_FUNC,
3713
    .parameters = {.minParamNum = 1,
3714
                   .maxParamNum = 1,
3715
                   .paramInfoPattern = 1,
3716
                   .inputParaInfo[0][0] = {.isLastParam = true,
3717
                                           .startParam = 1,
3718
                                           .endParam = 1,
3719
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3720
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3721
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3722
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3723
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
3724
    .translateFunc = translateOutDouble,
3725
    .getEnvFunc   = NULL,
3726
    .initFunc     = NULL,
3727
    .sprocessFunc = acosFunction,
3728
    .finalizeFunc = NULL,
3729
  },
3730
  {
3731
    .name = "atan",
3732
    .type = FUNCTION_TYPE_ATAN,
3733
    .classification = FUNC_MGT_SCALAR_FUNC,
3734
    .parameters = {.minParamNum = 1,
3735
                   .maxParamNum = 1,
3736
                   .paramInfoPattern = 1,
3737
                   .inputParaInfo[0][0] = {.isLastParam = true,
3738
                                           .startParam = 1,
3739
                                           .endParam = 1,
3740
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3741
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3742
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3743
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3744
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
3745
    .translateFunc = translateOutDouble,
3746
    .getEnvFunc   = NULL,
3747
    .initFunc     = NULL,
3748
    .sprocessFunc = atanFunction,
3749
    .finalizeFunc = NULL,
3750
  },
3751
  {
3752
    .name = "length",
3753
    .type = FUNCTION_TYPE_LENGTH,
3754
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
3755
    .parameters = {.minParamNum = 1,
3756
                   .maxParamNum = 1,
3757
                   .paramInfoPattern = 1,
3758
                   .inputParaInfo[0][0] = {.isLastParam = true,
3759
                                           .startParam = 1,
3760
                                           .endParam = 1,
3761
                                           .validDataType = FUNC_PARAM_SUPPORT_STRING_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3762
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3763
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3764
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3765
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
3766
    .translateFunc = translateOutBigInt,
3767
    .getEnvFunc   = NULL,
3768
    .initFunc     = NULL,
3769
    .sprocessFunc = lengthFunction,
3770
    .finalizeFunc = NULL,
3771
  },
3772
  {
3773
    .name = "char_length",
3774
    .type = FUNCTION_TYPE_CHAR_LENGTH,
3775
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
3776
    .parameters = {.minParamNum = 1,
3777
                   .maxParamNum = 1,
3778
                   .paramInfoPattern = 1,
3779
                   .inputParaInfo[0][0] = {.isLastParam = true,
3780
                                           .startParam = 1,
3781
                                           .endParam = 1,
3782
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3783
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3784
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3785
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3786
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
3787
    .translateFunc = translateOutBigInt,
3788
    .getEnvFunc   = NULL,
3789
    .initFunc     = NULL,
3790
    .sprocessFunc = charLengthFunction,
3791
    .finalizeFunc = NULL,
3792
  },
3793
  {
3794
    .name = "concat",
3795
    .type = FUNCTION_TYPE_CONCAT,
3796
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
3797
    .parameters = {.minParamNum = 2,
3798
                   .maxParamNum = 8,
3799
                   .paramInfoPattern = 1,
3800
                   .inputParaInfo[0][0] = {.isLastParam = true,
3801
                                           .startParam = 1,
3802
                                           .endParam = 8,
3803
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3804
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3805
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3806
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3807
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE}},
3808
    .translateFunc = translateConcat,
3809
    .getEnvFunc   = NULL,
3810
    .initFunc     = NULL,
3811
    .sprocessFunc = concatFunction,
3812
    .finalizeFunc = NULL,
3813
  },
3814
  {
3815
    .name = "concat_ws",
3816
    .type = FUNCTION_TYPE_CONCAT_WS,
3817
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
3818
    .parameters = {.minParamNum = 3,
3819
                   .maxParamNum = 9,
3820
                   .paramInfoPattern = 1,
3821
                   .inputParaInfo[0][0] = {.isLastParam = false,
3822
                                           .startParam = 1,
3823
                                           .endParam = 1,
3824
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3825
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3826
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3827
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3828
                   .inputParaInfo[0][1] = {.isLastParam = true,
3829
                                           .startParam = 2,
3830
                                           .endParam = 9,
3831
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3832
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3833
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3834
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3835
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE}},
3836
    .translateFunc = translateConcatWs,
3837
    .getEnvFunc   = NULL,
3838
    .initFunc     = NULL,
3839
    .sprocessFunc = concatWsFunction,
3840
    .finalizeFunc = NULL,
3841
  },
3842
  {
3843
    .name = "lower",
3844
    .type = FUNCTION_TYPE_LOWER,
3845
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
3846
    .parameters = {.minParamNum = 1,
3847
                   .maxParamNum = 1,
3848
                   .paramInfoPattern = 1,
3849
                   .inputParaInfo[0][0] = {.isLastParam = true,
3850
                                           .startParam = 1,
3851
                                           .endParam = 1,
3852
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE,
3853
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3854
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3855
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3856
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE}},
3857
    .translateFunc = translateOutFirstIn,
3858
    .getEnvFunc   = NULL,
3859
    .initFunc     = NULL,
3860
    .sprocessFunc = lowerFunction,
3861
    .finalizeFunc = NULL,
3862
  },
3863
  {
3864
    .name = "upper",
3865
    .type = FUNCTION_TYPE_UPPER,
3866
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
3867
    .parameters = {.minParamNum = 1,
3868
                   .maxParamNum = 1,
3869
                   .paramInfoPattern = 1,
3870
                   .inputParaInfo[0][0] = {.isLastParam = true,
3871
                                           .startParam = 1,
3872
                                           .endParam = 1,
3873
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE,
3874
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3875
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3876
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3877
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE}},
3878
    .translateFunc = translateOutFirstIn,
3879
    .getEnvFunc   = NULL,
3880
    .initFunc     = NULL,
3881
    .sprocessFunc = upperFunction,
3882
    .finalizeFunc = NULL,
3883
  },
3884
  {
3885
    .name = "ltrim",
3886
    .type = FUNCTION_TYPE_LTRIM,
3887
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
3888
    .parameters = {.minParamNum = 1,
3889
                   .maxParamNum = 1,
3890
                   .paramInfoPattern = 1,
3891
                   .inputParaInfo[0][0] = {.isLastParam = true,
3892
                                           .startParam = 1,
3893
                                           .endParam = 1,
3894
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE,
3895
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3896
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3897
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3898
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE}},
3899
    .translateFunc = translateLtrim,
3900
    .getEnvFunc   = NULL,
3901
    .initFunc     = NULL,
3902
    .sprocessFunc = ltrimFunction,
3903
    .finalizeFunc = NULL,
3904
  },
3905
  {
3906
    .name = "rtrim",
3907
    .type = FUNCTION_TYPE_RTRIM,
3908
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
3909
    .parameters = {.minParamNum = 1,
3910
                   .maxParamNum = 1,
3911
                   .paramInfoPattern = 1,
3912
                   .inputParaInfo[0][0] = {.isLastParam = true,
3913
                                           .startParam = 1,
3914
                                           .endParam = 1,
3915
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE,
3916
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3917
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3918
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3919
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE}},
3920
    .translateFunc = translateRtrim,
3921
    .getEnvFunc   = NULL,
3922
    .initFunc     = NULL,
3923
    .sprocessFunc = rtrimFunction,
3924
    .finalizeFunc = NULL,
3925
  },
3926
  {
3927
    .name = "substr",
3928
    .type = FUNCTION_TYPE_SUBSTR,
3929
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
3930
    .parameters = {.minParamNum = 2,
3931
                   .maxParamNum = 3,
3932
                   .paramInfoPattern = 1,
3933
                   .inputParaInfo[0][0] = {.isLastParam = false,
3934
                                           .startParam = 1,
3935
                                           .endParam = 1,
3936
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3937
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3938
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3939
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3940
                   .inputParaInfo[0][1] = {.isLastParam = true,
3941
                                           .startParam = 2,
3942
                                           .endParam = 3,
3943
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
3944
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3945
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3946
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3947
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE}},
3948
    .translateFunc = translateOutFirstIn,
3949
    .getEnvFunc   = NULL,
3950
    .initFunc     = NULL,
3951
    .sprocessFunc = substrFunction,
3952
    .finalizeFunc = NULL,
3953
  },
3954
  {
3955
    .name = "cast",
3956
    .type = FUNCTION_TYPE_CAST,
3957
    .classification = FUNC_MGT_SCALAR_FUNC,
3958
    .parameters = {.minParamNum = 1,
3959
                   .maxParamNum = 1,
3960
                   .paramInfoPattern = 1,
3961
                   .inputParaInfo[0][0] = {.isLastParam = true,
3962
                                           .startParam = 1,
3963
                                           .endParam = 1,
3964
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_BOOL_TYPE | FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_GEOMETRY_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE | FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE,
3965
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3966
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3967
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3968
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
3969
    .translateFunc = translateCast,
3970
    .getEnvFunc   = NULL,
3971
    .initFunc     = NULL,
3972
    .sprocessFunc = castFunction,
3973
    .finalizeFunc = NULL,
3974
  },
3975
  {
3976
    .name = "to_iso8601",
3977
    .type = FUNCTION_TYPE_TO_ISO8601,
3978
    .classification = FUNC_MGT_SCALAR_FUNC,
3979
    .parameters = {.minParamNum = 1,
3980
                   .maxParamNum = 2,
3981
                   .paramInfoPattern = 1,
3982
                   .inputParaInfo[0][0] = {.isLastParam = false,
3983
                                           .startParam = 1,
3984
                                           .endParam = 1,
3985
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE | FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE,
3986
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
3987
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3988
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3989
                   .inputParaInfo[0][1] = {.isLastParam = true,
3990
                                           .startParam = 2,
3991
                                           .endParam = 2,
3992
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
3993
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
3994
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
3995
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
3996
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
3997
    .translateFunc = translateToIso8601,
3998
    .getEnvFunc   = NULL,
3999
    .initFunc     = NULL,
4000
    .sprocessFunc = toISO8601Function,
4001
    .finalizeFunc = NULL,
4002
  },
4003
  {
4004
    .name = "to_unixtimestamp",
4005
    .type = FUNCTION_TYPE_TO_UNIXTIMESTAMP,
4006
    .classification = FUNC_MGT_SCALAR_FUNC,
4007
    .parameters = {.minParamNum = 1,
4008
                   .maxParamNum = 2,
4009
                   .paramInfoPattern = 1,
4010
                   .inputParaInfo[0][0] = {.isLastParam = false,
4011
                                           .startParam = 1,
4012
                                           .endParam = 1,
4013
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE,
4014
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4015
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4016
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4017
                   .inputParaInfo[0][1] = {.isLastParam = true,
4018
                                           .startParam = 2,
4019
                                           .endParam = 2,
4020
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
4021
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
4022
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4023
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
4024
                                           .fixedValueSize = 2,
4025
                                           .fixedNumValue = {0, 1}},
4026
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE | FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE}},
4027
    .translateFunc = translateToUnixtimestamp,
4028
    .getEnvFunc   = NULL,
4029
    .initFunc     = NULL,
4030
    .sprocessFunc = toUnixtimestampFunction,
4031
    .finalizeFunc = NULL,
4032
  },
4033
  {
4034
    .name = "timetruncate",
4035
    .type = FUNCTION_TYPE_TIMETRUNCATE,
4036
    .classification = FUNC_MGT_SCALAR_FUNC,
4037
    .parameters = {.minParamNum = 2,
4038
                   .maxParamNum = 3,
4039
                   .paramInfoPattern = 1,
4040
                   .inputParaInfo[0][0] = {.isLastParam = false,
4041
                                           .startParam = 1,
4042
                                           .endParam = 1,
4043
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE | FUNC_PARAM_SUPPORT_INTEGER_TYPE,
4044
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4045
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4046
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4047
                   .inputParaInfo[0][1] = {.isLastParam = false,
4048
                                           .startParam = 2,
4049
                                           .endParam = 2,
4050
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
4051
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
4052
                                           .paramAttribute = FUNC_PARAM_MUST_BE_TIME_UNIT,
4053
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4054
                   .inputParaInfo[0][2] = {.isLastParam = true,
4055
                                           .startParam = 3,
4056
                                           .endParam = 3,
4057
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE,
4058
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
4059
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4060
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
4061
                                           .fixedValueSize = 2,
4062
                                           .fixedNumValue = {0, 1}},
4063
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE}},
4064
    .translateFunc = translateTimeTruncate,
4065
    .getEnvFunc   = NULL,
4066
    .initFunc     = NULL,
4067
    .sprocessFunc = timeTruncateFunction,
4068
    .finalizeFunc = NULL,
4069
  },
4070
  {
4071
    .name = "timediff",
4072
    .type = FUNCTION_TYPE_TIMEDIFF,
4073
    .classification = FUNC_MGT_SCALAR_FUNC,
4074
    .parameters = {.minParamNum = 2,
4075
                   .maxParamNum = 3,
4076
                   .paramInfoPattern = 1,
4077
                   .inputParaInfo[0][0] = {.isLastParam = false,
4078
                                           .startParam = 1,
4079
                                           .endParam = 2,
4080
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE | FUNC_PARAM_SUPPORT_INTEGER_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4081
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4082
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4083
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4084
                   .inputParaInfo[0][1] = {.isLastParam = true,
4085
                                           .startParam = 3,
4086
                                           .endParam = 3,
4087
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4088
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
4089
                                           .paramAttribute = FUNC_PARAM_MUST_BE_TIME_UNIT,
4090
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4091
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
4092
    .translateFunc = translateAddPrecOutBigint,
4093
    .getEnvFunc   = NULL,
4094
    .initFunc     = NULL,
4095
    .sprocessFunc = timeDiffFunction,
4096
    .finalizeFunc = NULL,
4097
  },
4098
  {
4099
    .name = "now",
4100
    .type = FUNCTION_TYPE_NOW,
4101
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_DATETIME_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
4102
    .parameters = {.minParamNum = 0,
4103
                   .maxParamNum = 0,
4104
                   .paramInfoPattern = 0,
4105
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE}},
4106
    .translateFunc = translateNowToday,
4107
    .getEnvFunc   = NULL,
4108
    .initFunc     = NULL,
4109
    .sprocessFunc = nowFunction,
4110
    .finalizeFunc = NULL,
4111
  },
4112
  {
4113
    .name = "today",
4114
    .type = FUNCTION_TYPE_TODAY,
4115
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_DATETIME_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
4116
    .parameters = {.minParamNum = 0,
4117
                   .maxParamNum = 0,
4118
                   .paramInfoPattern = 0,
4119
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE}},
4120
    .translateFunc = translateNowToday,
4121
    .getEnvFunc   = NULL,
4122
    .initFunc     = NULL,
4123
    .sprocessFunc = todayFunction,
4124
    .finalizeFunc = NULL,
4125
  },
4126
  {
4127
    .name = "timezone",
4128
    .type = FUNCTION_TYPE_TIMEZONE,
4129
    .classification = FUNC_MGT_SCALAR_FUNC,
4130
    .parameters = {.minParamNum = 0,
4131
                   .maxParamNum = 0,
4132
                   .paramInfoPattern = 0,
4133
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4134
    .translateFunc = translateOutVarchar,
4135
    .getEnvFunc   = NULL,
4136
    .initFunc     = NULL,
4137
    .sprocessFunc = timezoneFunction,
4138
    .finalizeFunc = NULL,
4139
  },
4140
  {
4141
    .name = "tbname",
4142
    .type = FUNCTION_TYPE_TBNAME,
4143
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_SCAN_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
4144
    .parameters = {.minParamNum = 0,
4145
                   .maxParamNum = 0,
4146
                   .paramInfoPattern = 0,
4147
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4148
    .translateFunc = translateOutVarchar,
4149
    .getEnvFunc   = NULL,
4150
    .initFunc     = NULL,
4151
    .sprocessFunc = qPseudoTagFunction,
4152
    .finalizeFunc = NULL,
4153
  },
4154
  {
4155
    .name = "_qstart",
4156
    .type = FUNCTION_TYPE_QSTART,
4157
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_CLIENT_PC_FUNC,
4158
    .parameters = {.minParamNum = 0,
4159
                   .maxParamNum = 0,
4160
                   .paramInfoPattern = 0,
4161
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE}},
4162
    .translateFunc = translateTimePseudoColumn,
4163
    .getEnvFunc   = NULL,
4164
    .initFunc     = NULL,
4165
    .sprocessFunc = NULL,
4166
    .finalizeFunc = NULL,
4167
  },
4168
  {
4169
    .name = "_qend",
4170
    .type = FUNCTION_TYPE_QEND,
4171
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_CLIENT_PC_FUNC,
4172
    .parameters = {.minParamNum = 0,
4173
                   .maxParamNum = 0,
4174
                   .paramInfoPattern = 0,
4175
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE}},
4176
    .translateFunc = translateTimePseudoColumn,
4177
    .getEnvFunc   = NULL,
4178
    .initFunc     = NULL,
4179
    .sprocessFunc = NULL,
4180
    .finalizeFunc = NULL,
4181
  },
4182
  {
4183
    .name = "_qduration",
4184
    .type = FUNCTION_TYPE_QDURATION,
4185
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_CLIENT_PC_FUNC,
4186
    .parameters = {.minParamNum = 0,
4187
                   .maxParamNum = 0,
4188
                   .paramInfoPattern = 0,
4189
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
4190
    .translateFunc = translateWduration,
4191
    .getEnvFunc   = NULL,
4192
    .initFunc     = NULL,
4193
    .sprocessFunc = NULL,
4194
    .finalizeFunc = NULL,
4195
  },
4196
  {
4197
    .name = "_wstart",
4198
    .type = FUNCTION_TYPE_WSTART,
4199
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_WINDOW_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_SKIP_SCAN_CHECK_FUNC,
4200
    .parameters = {.minParamNum = 0,
4201
                   .maxParamNum = 0,
4202
                   .paramInfoPattern = 0,
4203
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE}},
4204
    .translateFunc = translateTimePseudoColumn,
4205
    .getEnvFunc   = getTimePseudoFuncEnv,
4206
    .initFunc     = NULL,
4207
    .sprocessFunc = winStartTsFunction,
4208
    .finalizeFunc = NULL,
4209
  },
4210
  {
4211
    .name = "_wend",
4212
    .type = FUNCTION_TYPE_WEND,
4213
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_WINDOW_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_SKIP_SCAN_CHECK_FUNC,
4214
    .parameters = {.minParamNum = 0,
4215
                   .maxParamNum = 0,
4216
                   .paramInfoPattern = 0,
4217
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE}},
4218
    .translateFunc = translateTimePseudoColumn,
4219
    .getEnvFunc   = getTimePseudoFuncEnv,
4220
    .initFunc     = NULL,
4221
    .sprocessFunc = winEndTsFunction,
4222
    .finalizeFunc = NULL,
4223
  },
4224
  {
4225
    .name = "_wduration",
4226
    .type = FUNCTION_TYPE_WDURATION,
4227
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_WINDOW_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_SKIP_SCAN_CHECK_FUNC,
4228
    .parameters = {.minParamNum = 0,
4229
                   .maxParamNum = 0,
4230
                   .paramInfoPattern = 0,
4231
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
4232
    .translateFunc = translateWduration,
4233
    .getEnvFunc   = getTimePseudoFuncEnv,
4234
    .initFunc     = NULL,
4235
    .sprocessFunc = winDurFunction,
4236
    .finalizeFunc = NULL,
4237
  },
4238
  {
4239
    .name = "to_json",
4240
    .type = FUNCTION_TYPE_TO_JSON,
4241
    .classification = FUNC_MGT_SCALAR_FUNC,
4242
    .parameters = {.minParamNum = 1,
4243
                   .maxParamNum = 1,
4244
                   .paramInfoPattern = 1,
4245
                   .inputParaInfo[0][0] = {.isLastParam = true,
4246
                                           .startParam = 1,
4247
                                           .endParam = 1,
4248
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE,
4249
                                           .validNodeType = FUNC_PARAM_SUPPORT_VALUE_NODE,
4250
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4251
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4252
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_JSON_TYPE}},
4253
    .translateFunc = translateToJson,
4254
    .getEnvFunc   = NULL,
4255
    .initFunc     = NULL,
4256
    .sprocessFunc = toJsonFunction,
4257
    .finalizeFunc = NULL,
4258
  },
4259
  {
4260
    .name = "_select_value",
4261
    .type = FUNCTION_TYPE_SELECT_VALUE,
4262
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
4263
    .translateFunc = translateSelectValue,
4264
    .getEnvFunc   = getSelectivityFuncEnv,  // todo remove this function later.
4265
    .initFunc     = functionSetup,
4266
    .processFunc  = NULL,
4267
    .finalizeFunc = NULL,
4268
    .pPartialFunc = "_select_value",
4269
    .pMergeFunc   = "_select_value",
4270
  },
4271
  {
4272
    .name = "_block_dist",
4273
    .type = FUNCTION_TYPE_BLOCK_DIST,
4274
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
4275
    .parameters = {.minParamNum = 0,
4276
                   .maxParamNum = 0,
4277
                   .paramInfoPattern = 0,
4278
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4279
    .translateFunc = translateOutVarchar,
4280
    .getEnvFunc   = getBlockDistFuncEnv,
4281
    .initFunc     = blockDistSetup,
4282
    .processFunc  = blockDistFunction,
4283
    .finalizeFunc = blockDistFinalize
4284
  },
4285
  {
4286
    .name = "_block_dist_info",
4287
    .type = FUNCTION_TYPE_BLOCK_DIST_INFO,
4288
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_SCAN_PC_FUNC,
4289
    .parameters = {.minParamNum = 0,
4290
                   .maxParamNum = 0,
4291
                   .paramInfoPattern = 0,
4292
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4293
    .translateFunc = translateOutVarchar,
4294
  },
4295
  {
4296
    .name = "_group_key",
4297
    .type = FUNCTION_TYPE_GROUP_KEY,
4298
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_SKIP_SCAN_CHECK_FUNC,
4299
    .translateFunc = translateGroupKey,
4300
    .getEnvFunc   = getGroupKeyFuncEnv,
4301
    .initFunc     = functionSetup,
4302
    .processFunc  = groupKeyFunction,
4303
    .finalizeFunc = groupKeyFinalize,
4304
    .combineFunc  = groupKeyCombine,
4305
    .pPartialFunc = "_group_key",
4306
    .pMergeFunc   = "_group_key"
4307
  },
4308
  {
4309
    .name = "database",
4310
    .type = FUNCTION_TYPE_DATABASE,
4311
    .classification = FUNC_MGT_SYSTEM_INFO_FUNC | FUNC_MGT_SCALAR_FUNC,
4312
    .parameters = {.minParamNum = 0,
4313
                   .maxParamNum = 0,
4314
                   .paramInfoPattern = 0,
4315
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4316
    .translateFunc = translateOutVarchar,
4317
  },
4318
  {
4319
    .name = "client_version",
4320
    .type = FUNCTION_TYPE_CLIENT_VERSION,
4321
    .classification = FUNC_MGT_SYSTEM_INFO_FUNC | FUNC_MGT_SCALAR_FUNC,
4322
    .parameters = {.minParamNum = 0,
4323
                   .maxParamNum = 0,
4324
                   .paramInfoPattern = 0,
4325
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4326
    .translateFunc = translateOutVarchar,
4327
  },
4328
  {
4329
    .name = "server_version",
4330
    .type = FUNCTION_TYPE_SERVER_VERSION,
4331
    .classification = FUNC_MGT_SYSTEM_INFO_FUNC | FUNC_MGT_SCALAR_FUNC,
4332
    .parameters = {.minParamNum = 0,
4333
                   .maxParamNum = 0,
4334
                   .paramInfoPattern = 0,
4335
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4336
    .translateFunc = translateOutVarchar,
4337
  },
4338
  {
4339
    .name = "server_status",
4340
    .type = FUNCTION_TYPE_SERVER_STATUS,
4341
    .classification = FUNC_MGT_SYSTEM_INFO_FUNC | FUNC_MGT_SCALAR_FUNC,
4342
    .parameters = {.minParamNum = 0,
4343
                   .maxParamNum = 0,
4344
                   .paramInfoPattern = 0,
4345
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4346
    .translateFunc = translateServerStatusFunc,
4347
  },
4348
  {
4349
    .name = "current_user",
4350
    .type = FUNCTION_TYPE_CURRENT_USER,
4351
    .classification = FUNC_MGT_SYSTEM_INFO_FUNC | FUNC_MGT_SCALAR_FUNC,
4352
    .parameters = {.minParamNum = 0,
4353
                   .maxParamNum = 0,
4354
                   .paramInfoPattern = 0,
4355
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4356
    .translateFunc = translateOutVarchar,
4357
  },
4358
  {
4359
    .name = "user",
4360
    .type = FUNCTION_TYPE_USER,
4361
    .classification = FUNC_MGT_SYSTEM_INFO_FUNC | FUNC_MGT_SCALAR_FUNC,
4362
    .parameters = {.minParamNum = 0,
4363
                   .maxParamNum = 0,
4364
                   .paramInfoPattern = 0,
4365
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4366
    .translateFunc = translateOutVarchar,
4367
  },
4368
  {
4369
    .name = "_irowts",
4370
    .type = FUNCTION_TYPE_IROWTS,
4371
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_INTERP_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
4372
    .parameters = {.minParamNum = 0,
4373
                   .maxParamNum = 0,
4374
                   .paramInfoPattern = 0,
4375
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE}},
4376
    .translateFunc = translateTimePseudoColumn,
4377
    .getEnvFunc   = getTimePseudoFuncEnv,
4378
    .initFunc     = NULL,
4379
    .sprocessFunc = NULL,
4380
    .finalizeFunc = NULL
4381
  },
4382
  {
4383
    .name = "_isfilled",
4384
    .type = FUNCTION_TYPE_ISFILLED,
4385
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_INTERP_PC_FUNC,
4386
    .parameters = {.minParamNum = 0,
4387
                   .maxParamNum = 0,
4388
                   .paramInfoPattern = 0,
4389
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BOOL_TYPE}},
4390
    .translateFunc = translateIsFilledPseudoColumn,
4391
    .getEnvFunc   = NULL,
4392
    .initFunc     = NULL,
4393
    .sprocessFunc = NULL,
4394
    .finalizeFunc = NULL
4395
  },
4396
  {
4397
    .name = "_tags",
4398
    .type = FUNCTION_TYPE_TAGS,
4399
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_MULTI_RES_FUNC,
4400
    .translateFunc = translateTagsPseudoColumn,
4401
    .getEnvFunc   = NULL,
4402
    .initFunc     = NULL,
4403
    .sprocessFunc = NULL,
4404
    .finalizeFunc = NULL
4405
  },
4406
  {
4407
    .name = "_table_count",
4408
    .type = FUNCTION_TYPE_TABLE_COUNT,
4409
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_SCAN_PC_FUNC,
4410
    .parameters = {.minParamNum = 0,
4411
                   .maxParamNum = 0,
4412
                   .paramInfoPattern = 0,
4413
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
4414
    .translateFunc = translateOutBigInt,
4415
    .getEnvFunc   = NULL,
4416
    .initFunc     = NULL,
4417
    .sprocessFunc = NULL,
4418
    .finalizeFunc = NULL
4419
  },
4420
  {
4421
    .name = "st_geomfromtext",
4422
    .type = FUNCTION_TYPE_GEOM_FROM_TEXT,
4423
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_GEOMETRY_FUNC,
4424
    .parameters = {.minParamNum = 1,
4425
                   .maxParamNum = 1,
4426
                   .paramInfoPattern = 1,
4427
                   .inputParaInfo[0][0] = {.isLastParam = true,
4428
                                           .startParam = 1,
4429
                                           .endParam = 1,
4430
                                           .validDataType = FUNC_PARAM_SUPPORT_STRING_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4431
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4432
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4433
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4434
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_GEOMETRY_TYPE}},
4435
    .translateFunc = translateOutGeom,
4436
    .getEnvFunc   = NULL,
4437
    .initFunc     = NULL,
4438
    .sprocessFunc = geomFromTextFunction,
4439
    .finalizeFunc = NULL
4440
  },
4441
  {
4442
    .name = "st_astext",
4443
    .type = FUNCTION_TYPE_AS_TEXT,
4444
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_GEOMETRY_FUNC,
4445
    .parameters = {.minParamNum = 1,
4446
                   .maxParamNum = 1,
4447
                   .paramInfoPattern = 1,
4448
                   .inputParaInfo[0][0] = {.isLastParam = true,
4449
                                           .startParam = 1,
4450
                                           .endParam = 1,
4451
                                           .validDataType = FUNC_PARAM_SUPPORT_GEOMETRY_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4452
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4453
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4454
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4455
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_STRING_TYPE}},
4456
    .translateFunc = translateInGeomOutStr,
4457
    .getEnvFunc   = NULL,
4458
    .initFunc     = NULL,
4459
    .sprocessFunc = asTextFunction,
4460
    .finalizeFunc = NULL
4461
  },
4462
  {
4463
    .name = "st_makepoint",
4464
    .type = FUNCTION_TYPE_MAKE_POINT,
4465
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_GEOMETRY_FUNC,
4466
    .parameters = {.minParamNum = 2,
4467
                   .maxParamNum = 2,
4468
                   .paramInfoPattern = 1,
4469
                   .inputParaInfo[0][0] = {.isLastParam = true,
4470
                                           .startParam = 1,
4471
                                           .endParam = 2,
4472
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4473
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4474
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4475
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4476
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_GEOMETRY_TYPE}},
4477
    .translateFunc = translateOutGeom,
4478
    .getEnvFunc   = NULL,
4479
    .initFunc     = NULL,
4480
    .sprocessFunc = makePointFunction,
4481
    .finalizeFunc = NULL
4482
  },
4483
  {
4484
    .name = "st_intersects",
4485
    .type = FUNCTION_TYPE_INTERSECTS,
4486
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_GEOMETRY_FUNC,
4487
    .parameters = {.minParamNum = 2,
4488
                   .maxParamNum = 2,
4489
                   .paramInfoPattern = 1,
4490
                   .inputParaInfo[0][0] = {.isLastParam = true,
4491
                                           .startParam = 1,
4492
                                           .endParam = 2,
4493
                                           .validDataType = FUNC_PARAM_SUPPORT_GEOMETRY_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4494
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4495
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4496
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4497
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BOOL_TYPE}},
4498
    .translateFunc = translateIn2GeomOutBool,
4499
    .getEnvFunc   = NULL,
4500
    .initFunc     = NULL,
4501
    .sprocessFunc = intersectsFunction,
4502
    .finalizeFunc = NULL
4503
  },
4504
  {
4505
    .name = "st_equals",
4506
    .type = FUNCTION_TYPE_EQUALS,
4507
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_GEOMETRY_FUNC,
4508
    .parameters = {.minParamNum = 2,
4509
                   .maxParamNum = 2,
4510
                   .paramInfoPattern = 1,
4511
                   .inputParaInfo[0][0] = {.isLastParam = true,
4512
                                           .startParam = 1,
4513
                                           .endParam = 2,
4514
                                           .validDataType = FUNC_PARAM_SUPPORT_GEOMETRY_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4515
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4516
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4517
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4518
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BOOL_TYPE}},
4519
    .translateFunc = translateIn2GeomOutBool,
4520
    .getEnvFunc   = NULL,
4521
    .initFunc     = NULL,
4522
    .sprocessFunc = equalsFunction,
4523
    .finalizeFunc = NULL
4524
  },
4525
  {
4526
    .name = "st_touches",
4527
    .type = FUNCTION_TYPE_TOUCHES,
4528
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_GEOMETRY_FUNC,
4529
    .parameters = {.minParamNum = 2,
4530
                   .maxParamNum = 2,
4531
                   .paramInfoPattern = 1,
4532
                   .inputParaInfo[0][0] = {.isLastParam = true,
4533
                                           .startParam = 1,
4534
                                           .endParam = 2,
4535
                                           .validDataType = FUNC_PARAM_SUPPORT_GEOMETRY_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4536
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4537
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4538
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4539
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BOOL_TYPE}},
4540
    .translateFunc = translateIn2GeomOutBool,
4541
    .getEnvFunc   = NULL,
4542
    .initFunc     = NULL,
4543
    .sprocessFunc = touchesFunction,
4544
    .finalizeFunc = NULL
4545
  },
4546
  {
4547
    .name = "st_covers",
4548
    .type = FUNCTION_TYPE_COVERS,
4549
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_GEOMETRY_FUNC,
4550
    .parameters = {.minParamNum = 2,
4551
                   .maxParamNum = 2,
4552
                   .paramInfoPattern = 1,
4553
                   .inputParaInfo[0][0] = {.isLastParam = true,
4554
                                           .startParam = 1,
4555
                                           .endParam = 2,
4556
                                           .validDataType = FUNC_PARAM_SUPPORT_GEOMETRY_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4557
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4558
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4559
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4560
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BOOL_TYPE}},
4561
    .translateFunc = translateIn2GeomOutBool,
4562
    .getEnvFunc   = NULL,
4563
    .initFunc     = NULL,
4564
    .sprocessFunc = coversFunction,
4565
    .finalizeFunc = NULL
4566
  },
4567
  {
4568
    .name = "st_contains",
4569
    .type = FUNCTION_TYPE_CONTAINS,
4570
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_GEOMETRY_FUNC,
4571
    .parameters = {.minParamNum = 2,
4572
                   .maxParamNum = 2,
4573
                   .paramInfoPattern = 1,
4574
                   .inputParaInfo[0][0] = {.isLastParam = true,
4575
                                           .startParam = 1,
4576
                                           .endParam = 2,
4577
                                           .validDataType = FUNC_PARAM_SUPPORT_GEOMETRY_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4578
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4579
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4580
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4581
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BOOL_TYPE}},
4582
    .translateFunc = translateIn2GeomOutBool,
4583
    .getEnvFunc   = NULL,
4584
    .initFunc     = NULL,
4585
    .sprocessFunc = containsFunction,
4586
    .finalizeFunc = NULL
4587
  },
4588
  {
4589
    .name = "st_containsproperly",
4590
    .type = FUNCTION_TYPE_CONTAINS_PROPERLY,
4591
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_GEOMETRY_FUNC,
4592
    .parameters = {.minParamNum = 2,
4593
                   .maxParamNum = 2,
4594
                   .paramInfoPattern = 1,
4595
                   .inputParaInfo[0][0] = {.isLastParam = true,
4596
                                           .startParam = 1,
4597
                                           .endParam = 2,
4598
                                           .validDataType = FUNC_PARAM_SUPPORT_GEOMETRY_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4599
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4600
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4601
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4602
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BOOL_TYPE}},
4603
    .translateFunc = translateIn2GeomOutBool,
4604
    .getEnvFunc   = NULL,
4605
    .initFunc     = NULL,
4606
    .sprocessFunc = containsProperlyFunction,
4607
    .finalizeFunc = NULL
4608
  },
4609
  {
4610
    .name = "_tbuid",
4611
    .type = FUNCTION_TYPE_TBUID,
4612
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_SCAN_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
4613
    .parameters = {.minParamNum = 0,
4614
                   .maxParamNum = 0,
4615
                   .paramInfoPattern = 0,
4616
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
4617
    .translateFunc = translateOutBigInt,
4618
    .getEnvFunc   = NULL,
4619
    .initFunc     = NULL,
4620
    .sprocessFunc = qPseudoTagFunction,
4621
    .finalizeFunc = NULL
4622
  },
4623
  {
4624
    .name = "_vgid",
4625
    .type = FUNCTION_TYPE_VGID,
4626
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_SCAN_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
4627
    .parameters = {.minParamNum = 0,
4628
                   .maxParamNum = 0,
4629
                   .paramInfoPattern = 0,
4630
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_INT_TYPE}},
4631
    .translateFunc = translateVgIdColumn,
4632
    .getEnvFunc   = NULL,
4633
    .initFunc     = NULL,
4634
    .sprocessFunc = qPseudoTagFunction,
4635
    .finalizeFunc = NULL
4636
  },
4637
  {
4638
    .name = "to_timestamp",
4639
    .type = FUNCTION_TYPE_TO_TIMESTAMP,
4640
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_DATETIME_FUNC,
4641
    .parameters = {.minParamNum = 2,
4642
                   .maxParamNum = 2,
4643
                   .paramInfoPattern = 1,
4644
                   .inputParaInfo[0][0] = {.isLastParam = true,
4645
                                           .startParam = 1,
4646
                                           .endParam = 2,
4647
                                           .validDataType = FUNC_PARAM_SUPPORT_STRING_TYPE,
4648
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4649
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4650
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4651
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE}},
4652
    .translateFunc = translateToTimestamp,
4653
    .getEnvFunc = NULL,
4654
    .initFunc = NULL,
4655
    .sprocessFunc = toTimestampFunction,
4656
    .finalizeFunc = NULL
4657
  },
4658
  {
4659
    .name = "to_char",
4660
    .type = FUNCTION_TYPE_TO_CHAR,
4661
    .classification = FUNC_MGT_SCALAR_FUNC,
4662
    .parameters = {.minParamNum = 2,
4663
                   .maxParamNum = 2,
4664
                   .paramInfoPattern = 1,
4665
                   .inputParaInfo[0][0] = {.isLastParam = false,
4666
                                           .startParam = 1,
4667
                                           .endParam = 1,
4668
                                           .validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE,
4669
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4670
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4671
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4672
                   .inputParaInfo[0][1] = {.isLastParam = true,
4673
                                           .startParam = 2,
4674
                                           .endParam = 2,
4675
                                           .validDataType = FUNC_PARAM_SUPPORT_STRING_TYPE,
4676
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4677
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4678
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4679
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4680
    .translateFunc = translateOutVarchar,
4681
    .getEnvFunc = NULL,
4682
    .initFunc = NULL,
4683
    .sprocessFunc = toCharFunction,
4684
    .finalizeFunc = NULL
4685
  },
4686
  {
4687
    .name = "_avg_middle",
4688
    .type = FUNCTION_TYPE_AVG_PARTIAL,
4689
    .classification = FUNC_MGT_AGG_FUNC,
4690
    .parameters = {.minParamNum = 1,
4691
                   .maxParamNum = 1,
4692
                   .paramInfoPattern = 1,
4693
                   .inputParaInfo[0][0] = {.isLastParam = true,
4694
                                           .startParam = 1,
4695
                                           .endParam = 1,
4696
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
4697
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4698
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4699
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4700
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4701
    .translateFunc = translateOutVarchar,
4702
    .dataRequiredFunc = statisDataRequired,
4703
    .getEnvFunc   = getAvgFuncEnv,
4704
    .initFunc     = avgFunctionSetup,
4705
    .processFunc  = avgFunctionMerge,
4706
    .finalizeFunc = avgPartialFinalize,
4707
#ifdef BUILD_NO_CALL
4708
    .invertFunc   = avgInvertFunction,
4709
#endif
4710
    .combineFunc  = avgCombine,
4711
  },
4712
  {
4713
    .name = "_vgver",
4714
    .type = FUNCTION_TYPE_VGVER,
4715
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_SCAN_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
4716
    .parameters = {.minParamNum = 0,
4717
                   .maxParamNum = 0,
4718
                   .paramInfoPattern = 0,
4719
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
4720
    .translateFunc = translateOutBigInt,
4721
    .getEnvFunc   = NULL,
4722
    .initFunc     = NULL,
4723
    .sprocessFunc = qPseudoTagFunction,
4724
    .finalizeFunc = NULL
4725
  },
4726
  {
4727
    .name = "_std_state",
4728
    .type = FUNCTION_TYPE_STD_STATE,
4729
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TSMA_FUNC,
4730
    .parameters = {.minParamNum = 1,
4731
                   .maxParamNum = 1,
4732
                   .paramInfoPattern = 1,
4733
                   .inputParaInfo[0][0] = {.isLastParam = true,
4734
                                           .startParam = 1,
4735
                                           .endParam = 1,
4736
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4737
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4738
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4739
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4740
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4741
    .translateFunc = translateOutVarchar,
4742
    .getEnvFunc   = getStdFuncEnv,
4743
    .initFunc     = stdFunctionSetup,
4744
    .processFunc  = stdFunction,
4745
    .finalizeFunc = stdPartialFinalize,
4746
    .pPartialFunc = "_std_partial",
4747
    .pMergeFunc   = "_std_state_merge",
4748
  },
4749
  {
4750
    .name = "_std_state_merge",
4751
    .type = FUNCTION_TYPE_STD_STATE_MERGE,
4752
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TSMA_FUNC,
4753
    .parameters = {.minParamNum = 1,
4754
                   .maxParamNum = 1,
4755
                   .paramInfoPattern = 1,
4756
                   .inputParaInfo[0][0] = {.isLastParam = true,
4757
                                           .startParam = 1,
4758
                                           .endParam = 1,
4759
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
4760
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4761
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4762
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4763
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4764
    .translateFunc = translateOutVarchar,
4765
    .getEnvFunc = getStdFuncEnv,
4766
    .initFunc = stdFunctionSetup,
4767
    .processFunc = stdFunctionMerge,
4768
    .finalizeFunc = stdPartialFinalize,
4769
  },
4770
  {
4771
    .name = "_avg_state",
4772
    .type = FUNCTION_TYPE_AVG_STATE,
4773
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TSMA_FUNC,
4774
    .parameters = {.minParamNum = 1,
4775
                   .maxParamNum = 1,
4776
                   .paramInfoPattern = 1,
4777
                   .inputParaInfo[0][0] = {.isLastParam = true,
4778
                                           .startParam = 1,
4779
                                           .endParam = 1,
4780
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
4781
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4782
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4783
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4784
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4785
    .translateFunc = translateOutVarchar,
4786
    .getEnvFunc = getAvgFuncEnv,
4787
    .initFunc = avgFunctionSetup,
4788
    .processFunc = avgFunction,
4789
    .finalizeFunc = avgPartialFinalize,
4790
    .pPartialFunc = "_avg_partial",
4791
    .pMergeFunc = "_avg_state_merge"
4792
  },
4793
  {
4794
    .name = "_avg_state_merge",
4795
    .type = FUNCTION_TYPE_AVG_STATE_MERGE,
4796
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TSMA_FUNC,
4797
    .parameters = {.minParamNum = 1,
4798
                   .maxParamNum = 1,
4799
                   .paramInfoPattern = 1,
4800
                   .inputParaInfo[0][0] = {.isLastParam = true,
4801
                                           .startParam = 1,
4802
                                           .endParam = 1,
4803
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
4804
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4805
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4806
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4807
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4808
    .translateFunc = translateOutVarchar,
4809
    .getEnvFunc = getAvgFuncEnv,
4810
    .initFunc = avgFunctionSetup,
4811
    .processFunc = avgFunctionMerge,
4812
    .finalizeFunc = avgPartialFinalize,
4813
  },
4814
  {
4815
    .name = "_spread_state",
4816
    .type = FUNCTION_TYPE_SPREAD_STATE,
4817
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SPECIAL_DATA_REQUIRED | FUNC_MGT_TSMA_FUNC,
4818
    .parameters = {.minParamNum = 1,
4819
                   .maxParamNum = 1,
4820
                   .paramInfoPattern = 1,
4821
                   .inputParaInfo[0][0] = {.isLastParam = true,
4822
                                           .startParam = 1,
4823
                                           .endParam = 1,
4824
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE,
4825
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4826
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4827
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4828
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4829
    .translateFunc = translateOutVarchar,
4830
    .getEnvFunc = getSpreadFuncEnv,
4831
    .initFunc = spreadFunctionSetup,
4832
    .processFunc = spreadFunction,
4833
    .finalizeFunc = spreadPartialFinalize,
4834
    .pPartialFunc = "_spread_partial",
4835
    .pMergeFunc = "_spread_state_merge"
4836
  },
4837
  {
4838
    .name = "_spread_state_merge",
4839
    .type = FUNCTION_TYPE_SPREAD_STATE_MERGE,
4840
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TSMA_FUNC,
4841
    .parameters = {.minParamNum = 1,
4842
                   .maxParamNum = 1,
4843
                   .paramInfoPattern = 1,
4844
                   .inputParaInfo[0][0] = {.isLastParam = true,
4845
                                           .startParam = 1,
4846
                                           .endParam = 1,
4847
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
4848
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4849
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4850
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4851
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4852
    .translateFunc = translateOutVarchar,
4853
    .getEnvFunc = getSpreadFuncEnv,
4854
    .initFunc = spreadFunctionSetup,
4855
    .processFunc = spreadFunctionMerge,
4856
    .finalizeFunc = spreadPartialFinalize,
4857
  },
4858
  {
4859
    .name = "_first_state",
4860
    .type = FUNCTION_TYPE_FIRST_STATE,
4861
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
4862
                      FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_TSMA_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
4863
    .parameters = {.minParamNum = 1,
4864
                   .maxParamNum = -1,
4865
                   .paramInfoPattern = 1,
4866
                   .inputParaInfo[0][0] = {.isLastParam = true,
4867
                                           .startParam = 1,
4868
                                           .endParam = -1,
4869
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
4870
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4871
                                           .paramAttribute = FUNC_PARAM_VALUE_NODE_NOT_NULL,
4872
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4873
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4874
    .translateFunc = translateOutVarchar,
4875
    .getEnvFunc = getFirstLastFuncEnv,
4876
    .initFunc = functionSetup,
4877
    .processFunc = firstFunction,
4878
    .finalizeFunc = firstLastPartialFinalize,
4879
    .pPartialFunc = "_first_partial",
4880
    .pMergeFunc = "_first_state_merge"
4881
  },
4882
  {
4883
    .name = "_first_state_merge",
4884
    .type = FUNCTION_TYPE_FIRST_STATE_MERGE,
4885
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
4886
                      FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_TSMA_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
4887
    .parameters = {.minParamNum = 1,
4888
                   .maxParamNum = 1,
4889
                   .paramInfoPattern = 1,
4890
                   .inputParaInfo[0][0] = {.isLastParam = true,
4891
                                           .startParam = 1,
4892
                                           .endParam = 1,
4893
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
4894
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4895
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4896
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4897
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4898
    .translateFunc = translateOutVarchar,
4899
    .getEnvFunc = getFirstLastFuncEnv,
4900
    .initFunc = functionSetup,
4901
    .processFunc = firstFunctionMerge,
4902
    .finalizeFunc = firstLastPartialFinalize,
4903
  },
4904
  {
4905
    .name = "_last_state",
4906
    .type = FUNCTION_TYPE_LAST_STATE,
4907
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
4908
                      FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_TSMA_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
4909
    .parameters = {.minParamNum = 1,
4910
                   .maxParamNum = -1,
4911
                   .paramInfoPattern = 1,
4912
                   .inputParaInfo[0][0] = {.isLastParam = true,
4913
                                           .startParam = 1,
4914
                                           .endParam = -1,
4915
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
4916
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4917
                                           .paramAttribute = FUNC_PARAM_VALUE_NODE_NOT_NULL,
4918
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4919
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4920
    .translateFunc = translateOutVarchar,
4921
    .getEnvFunc = getFirstLastFuncEnv,
4922
    .initFunc = functionSetup,
4923
    .processFunc = lastFunction,
4924
    .finalizeFunc = firstLastPartialFinalize,
4925
    .pPartialFunc = "_last_partial",
4926
    .pMergeFunc = "_last_state_merge"
4927
  },
4928
  {
4929
    .name = "_last_state_merge",
4930
    .type = FUNCTION_TYPE_LAST_STATE_MERGE,
4931
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
4932
                      FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_TSMA_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,
4933
    .parameters = {.minParamNum = 1,
4934
                   .maxParamNum = 1,
4935
                   .paramInfoPattern = 1,
4936
                   .inputParaInfo[0][0] = {.isLastParam = true,
4937
                                           .startParam = 1,
4938
                                           .endParam = 1,
4939
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
4940
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4941
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4942
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4943
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4944
    .translateFunc = translateOutVarchar,
4945
    .getEnvFunc = getFirstLastFuncEnv,
4946
    .initFunc = functionSetup,
4947
    .processFunc = lastFunctionMerge,
4948
    .finalizeFunc = firstLastPartialFinalize,
4949
  },
4950
  {
4951
    .name = "_hyperloglog_state",
4952
    .type = FUNCTION_TYPE_HYPERLOGLOG_STATE,
4953
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_COUNT_LIKE_FUNC | FUNC_MGT_TSMA_FUNC,
4954
    .parameters = {.minParamNum = 1,
4955
                   .maxParamNum = 1,
4956
                   .paramInfoPattern = 1,
4957
                   .inputParaInfo[0][0] = {.isLastParam = true,
4958
                                           .startParam = 1,
4959
                                           .endParam = 1,
4960
                                           .validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE,
4961
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4962
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4963
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4964
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4965
    .translateFunc = translateOutVarchar,
4966
    .getEnvFunc = getHLLFuncEnv,
4967
    .initFunc = functionSetup,
4968
    .processFunc = hllFunction,
4969
    .finalizeFunc = hllPartialFinalize,
4970
    .pPartialFunc = "_hyperloglog_partial",
4971
    .pMergeFunc = "_hyperloglog_state_merge",
4972
  },
4973
  {
4974
    .name = "_hyperloglog_state_merge",
4975
    .type = FUNCTION_TYPE_HYPERLOGLOG_STATE_MERGE,
4976
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_COUNT_LIKE_FUNC | FUNC_MGT_TSMA_FUNC,
4977
    .parameters = {.minParamNum = 1,
4978
                   .maxParamNum = 1,
4979
                   .paramInfoPattern = 1,
4980
                   .inputParaInfo[0][0] = {.isLastParam = true,
4981
                                           .startParam = 1,
4982
                                           .endParam = 1,
4983
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
4984
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
4985
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
4986
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
4987
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
4988
    .translateFunc = translateOutVarchar,
4989
    .getEnvFunc = getHLLFuncEnv,
4990
    .initFunc = functionSetup,
4991
    .processFunc = hllFunctionMerge,
4992
    .finalizeFunc = hllPartialFinalize,
4993
  },
4994
  {
4995
    .name = "md5",
4996
    .type = FUNCTION_TYPE_MD5,
4997
    .classification = FUNC_MGT_SCALAR_FUNC,
4998
    .parameters = {.minParamNum = 1,
4999
                   .maxParamNum = 1,
5000
                   .paramInfoPattern = 1,
5001
                   .inputParaInfo[0][0] = {.isLastParam = true,
5002
                                           .startParam = 1,
5003
                                           .endParam = 1,
5004
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
5005
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5006
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5007
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5008
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
5009
    .translateFunc = translateOutVarchar,
5010
    .getEnvFunc = NULL,
5011
    .initFunc = NULL,
5012
    .sprocessFunc = md5Function,
5013
    .finalizeFunc = NULL
5014
  },
5015
  {
5016
    .name = "_group_const_value",
5017
    .type = FUNCTION_TYPE_GROUP_CONST_VALUE,
5018
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
5019
    .parameters = {.minParamNum = 0,
5020
                   .maxParamNum = 0,
5021
                   .paramInfoPattern = 0,
5022
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
5023
    .translateFunc = translateSelectValue,
5024
    .getEnvFunc   = getGroupKeyFuncEnv,
5025
    .initFunc     = functionSetup,
5026
    .processFunc  = groupConstValueFunction,
5027
    .finalizeFunc = groupConstValueFinalize,
5028
  },
5029
  {
5030
    .name = "stddev_pop",
5031
    .type = FUNCTION_TYPE_STDDEV,
5032
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TSMA_FUNC,
5033
    .parameters = {.minParamNum = 1,
5034
                   .maxParamNum = 1,
5035
                   .paramInfoPattern = 1,
5036
                   .inputParaInfo[0][0] = {.isLastParam = true,
5037
                                           .startParam = 1,
5038
                                           .endParam = 1,
5039
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5040
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5041
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5042
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5043
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
5044
    .translateFunc = translateOutDouble,
5045
    .getEnvFunc   = getStdFuncEnv,
5046
    .initFunc     = stdFunctionSetup,
5047
    .processFunc  = stdFunction,
5048
    .sprocessFunc = stdScalarFunction,
5049
    .finalizeFunc = stddevFinalize,
5050
  #ifdef BUILD_NO_CALL
5051
    .invertFunc   = stdInvertFunction,
5052
  #endif
5053
    .combineFunc  = stdCombine,
5054
    .pPartialFunc = "_std_partial",
5055
    .pStateFunc = "_std_state",
5056
    .pMergeFunc   = "_stddev_merge"
5057
  },
5058
  {
5059
    .name = "var_pop",
5060
    .type = FUNCTION_TYPE_STDVAR,
5061
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TSMA_FUNC,
5062
    .parameters = {.minParamNum = 1,
5063
                   .maxParamNum = 1,
5064
                   .paramInfoPattern = 1,
5065
                   .inputParaInfo[0][0] = {.isLastParam = true,
5066
                                           .startParam = 1,
5067
                                           .endParam = 1,
5068
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5069
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5070
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5071
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5072
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
5073
    .translateFunc = translateOutDouble,
5074
    .getEnvFunc   = getStdFuncEnv,
5075
    .initFunc     = stdFunctionSetup,
5076
    .processFunc  = stdFunction,
5077
    .sprocessFunc = stdScalarFunction,
5078
    .finalizeFunc = stdvarFinalize,
5079
  #ifdef BUILD_NO_CALL
5080
    .invertFunc   = stdInvertFunction,
5081
  #endif
5082
    .combineFunc  = stdCombine,
5083
    .pPartialFunc = "_std_partial",
5084
    .pStateFunc = "_std_state",
5085
    .pMergeFunc   = "_stdvar_merge"
5086
  },
5087
  {
5088
    .name = "_stdvar_merge",
5089
    .type = FUNCTION_TYPE_STDVAR_MERGE,
5090
    .classification = FUNC_MGT_AGG_FUNC,
5091
    .parameters = {.minParamNum = 1,
5092
                   .maxParamNum = 1,
5093
                   .paramInfoPattern = 1,
5094
                   .inputParaInfo[0][0] = {.isLastParam = true,
5095
                                           .startParam = 1,
5096
                                           .endParam = 1,
5097
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE,
5098
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5099
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5100
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5101
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
5102
    .translateFunc = translateOutDouble,
5103
    .getEnvFunc   = getStdFuncEnv,
5104
    .initFunc     = stdFunctionSetup,
5105
    .processFunc  = stdFunctionMerge,
5106
    .finalizeFunc = stdvarFinalize,
5107
  #ifdef BUILD_NO_CALL
5108
    .invertFunc   = stdInvertFunction,
5109
  #endif
5110
    .combineFunc  = stdCombine,
5111
    .pPartialFunc = "_std_state_merge",
5112
    .pMergeFunc = "_stdvar_merge",
5113
  },
5114
  {
5115
    .name = "pi",
5116
    .type = FUNCTION_TYPE_PI,
5117
    .classification = FUNC_MGT_SCALAR_FUNC,
5118
    .parameters = {.minParamNum = 0,
5119
                   .maxParamNum = 0,
5120
                   .paramInfoPattern = 0,
5121
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
5122
    .translateFunc = translateOutDouble,
5123
    .getEnvFunc   = NULL,
5124
    .initFunc     = NULL,
5125
    .sprocessFunc = piFunction,
5126
    .finalizeFunc = NULL
5127
  },
5128
  {
5129
    .name = "exp",
5130
    .type = FUNCTION_TYPE_EXP,
5131
    .classification = FUNC_MGT_SCALAR_FUNC,
5132
    .parameters = {.minParamNum = 1,
5133
                   .maxParamNum = 1,
5134
                   .paramInfoPattern = 1,
5135
                   .inputParaInfo[0][0] = {.isLastParam = true,
5136
                                           .startParam = 1,
5137
                                           .endParam = 1,
5138
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5139
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5140
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5141
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5142
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
5143
    .translateFunc = translateOutDouble,
5144
    .getEnvFunc   = NULL,
5145
    .initFunc     = NULL,
5146
    .sprocessFunc = expFunction,
5147
    .finalizeFunc = NULL
5148
  },
5149
  {
5150
    .name = "ln",
5151
    .type = FUNCTION_TYPE_LN,
5152
    .classification = FUNC_MGT_SCALAR_FUNC,
5153
    .parameters = {.minParamNum = 1,
5154
                   .maxParamNum = 1,
5155
                   .paramInfoPattern = 1,
5156
                   .inputParaInfo[0][0] = {.isLastParam = true,
5157
                                           .startParam = 1,
5158
                                           .endParam = 1,
5159
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5160
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5161
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5162
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5163
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
5164
    .translateFunc = translateOutDouble,
5165
    .getEnvFunc   = NULL,
5166
    .initFunc     = NULL,
5167
    .sprocessFunc = lnFunction,
5168
    .finalizeFunc = NULL
5169
  },
5170
  {
5171
    .name = "mod",
5172
    .type = FUNCTION_TYPE_MOD,
5173
    .classification = FUNC_MGT_SCALAR_FUNC,
5174
    .parameters = {.minParamNum = 2,
5175
                   .maxParamNum = 2,
5176
                   .paramInfoPattern = 1,
5177
                   .inputParaInfo[0][0] = {.isLastParam = false,
5178
                                           .startParam = 1,
5179
                                           .endParam = 1,
5180
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5181
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5182
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5183
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5184
                   .inputParaInfo[0][1] = {.isLastParam = true,
5185
                                           .startParam = 2,
5186
                                           .endParam = 2,
5187
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5188
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5189
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5190
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5191
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
5192
    .translateFunc = translateOutDouble,
5193
    .getEnvFunc   = NULL,
5194
    .initFunc     = NULL,
5195
    .sprocessFunc = modFunction,
5196
    .finalizeFunc = NULL
5197
  },
5198
  {
5199
    .name = "sign",
5200
    .type = FUNCTION_TYPE_SIGN,
5201
    .classification = FUNC_MGT_SCALAR_FUNC,
5202
    .parameters = {.minParamNum = 1,
5203
                   .maxParamNum = 1,
5204
                   .paramInfoPattern = 1,
5205
                   .inputParaInfo[0][0] = {.isLastParam = true,
5206
                                           .startParam = 1,
5207
                                           .endParam = 1,
5208
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5209
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5210
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5211
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5212
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE}},
5213
    .translateFunc = translateOutNum,
5214
    .getEnvFunc   = NULL,
5215
    .initFunc     = NULL,
5216
    .sprocessFunc = signFunction,
5217
    .finalizeFunc = NULL
5218
  },
5219
  {
5220
    .name = "degrees",
5221
    .type = FUNCTION_TYPE_DEGREES,
5222
    .classification = FUNC_MGT_SCALAR_FUNC,
5223
    .parameters = {.minParamNum = 1,
5224
                   .maxParamNum = 1,
5225
                   .paramInfoPattern = 1,
5226
                   .inputParaInfo[0][0] = {.isLastParam = true,
5227
                                           .startParam = 1,
5228
                                           .endParam = 1,
5229
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5230
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5231
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5232
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5233
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
5234
    .translateFunc = translateOutDouble,
5235
    .getEnvFunc   = NULL,
5236
    .initFunc     = NULL,
5237
    .sprocessFunc = degreesFunction,
5238
    .finalizeFunc = NULL
5239
  },
5240
  {
5241
    .name = "radians",
5242
    .type = FUNCTION_TYPE_RADIANS,
5243
    .classification = FUNC_MGT_SCALAR_FUNC,
5244
    .parameters = {.minParamNum = 1,
5245
                   .maxParamNum = 1,
5246
                   .paramInfoPattern = 1,
5247
                   .inputParaInfo[0][0] = {.isLastParam = true,
5248
                                           .startParam = 1,
5249
                                           .endParam = 1,
5250
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5251
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5252
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5253
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5254
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
5255
    .translateFunc = translateOutDouble,
5256
    .getEnvFunc   = NULL,
5257
    .initFunc     = NULL,
5258
    .sprocessFunc = radiansFunction,
5259
    .finalizeFunc = NULL
5260
  },
5261
  {
5262
    .name = "truncate",
5263
    .type = FUNCTION_TYPE_TRUNCATE,
5264
    .classification = FUNC_MGT_SCALAR_FUNC,
5265
    .parameters = {.minParamNum = 2,
5266
                   .maxParamNum = 2,
5267
                   .paramInfoPattern = 1,
5268
                   .inputParaInfo[0][0] = {.isLastParam = false,
5269
                                           .startParam = 1,
5270
                                           .endParam = 1,
5271
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5272
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5273
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5274
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5275
                   .inputParaInfo[0][1] = {.isLastParam = true,
5276
                                           .startParam = 2,
5277
                                           .endParam = 2,
5278
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5279
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5280
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5281
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5282
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
5283
    .translateFunc = translateOutFirstIn,
5284
    .getEnvFunc   = NULL,
5285
    .initFunc     = NULL,
5286
    .sprocessFunc = truncFunction,
5287
    .finalizeFunc = NULL
5288
  },
5289
  {
5290
    .name = "trunc",
5291
    .type = FUNCTION_TYPE_TRUNCATE,
5292
    .classification = FUNC_MGT_SCALAR_FUNC,
5293
    .parameters = {.minParamNum = 1,
5294
                   .maxParamNum = 2,
5295
                   .paramInfoPattern = 1,
5296
                   .inputParaInfo[0][0] = {.isLastParam = false,
5297
                                           .startParam = 1,
5298
                                           .endParam = 1,
5299
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5300
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5301
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5302
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5303
                   .inputParaInfo[0][1] = {.isLastParam = true,
5304
                                           .startParam = 2,
5305
                                           .endParam = 2,
5306
                                           .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5307
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5308
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5309
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5310
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
5311
    .translateFunc = translateOutFirstIn,
5312
    .getEnvFunc   = NULL,
5313
    .initFunc     = NULL,
5314
    .sprocessFunc = truncFunction,
5315
    .finalizeFunc = NULL
5316
  },
5317
  {
5318
    .name = "substring",
5319
    .type = FUNCTION_TYPE_SUBSTR,
5320
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
5321
    .parameters = {.minParamNum = 2,
5322
                   .maxParamNum = 3,
5323
                   .paramInfoPattern = 1,
5324
                   .inputParaInfo[0][0] = {.isLastParam = false,
5325
                                           .startParam = 1,
5326
                                           .endParam = 1,
5327
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5328
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5329
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5330
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5331
                   .inputParaInfo[0][1] = {.isLastParam = false,
5332
                                           .startParam = 2,
5333
                                           .endParam = 2,
5334
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5335
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5336
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5337
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5338
                   .inputParaInfo[0][2] = {.isLastParam = true,
5339
                                           .startParam = 3,
5340
                                           .endParam = 3,
5341
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5342
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5343
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5344
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5345
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE}},
5346
    .translateFunc = translateOutFirstIn,
5347
    .getEnvFunc   = NULL,
5348
    .initFunc     = NULL,
5349
    .sprocessFunc = substrFunction,
5350
    .finalizeFunc = NULL
5351
  },
5352
  {
5353
    .name = "substring_index",
5354
    .type = FUNCTION_TYPE_SUBSTR_IDX,
5355
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
5356
    .parameters = {.minParamNum = 3,
5357
                   .maxParamNum = 3,
5358
                   .paramInfoPattern = 1,
5359
                   .inputParaInfo[0][0] = {.isLastParam = false,
5360
                                           .startParam = 1,
5361
                                           .endParam = 1,
5362
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5363
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5364
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5365
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5366
                   .inputParaInfo[0][1] = {.isLastParam = false,
5367
                                           .startParam = 2,
5368
                                           .endParam = 2,
5369
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5370
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5371
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5372
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5373
                   .inputParaInfo[0][2] = {.isLastParam = true,
5374
                                           .startParam = 3,
5375
                                           .endParam = 3,
5376
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5377
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5378
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5379
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5380
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE}},
5381
    .translateFunc = translateOutFirstIn,
5382
    .getEnvFunc   = NULL,
5383
    .initFunc     = NULL,
5384
    .sprocessFunc = substrIdxFunction,
5385
    .finalizeFunc = NULL
5386
  },
5387
  {
5388
    .name = "char",
5389
    .type = FUNCTION_TYPE_CHAR,
5390
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
5391
    .parameters = {.minParamNum = 1,
5392
                   .maxParamNum = -1,
5393
                   .paramInfoPattern = 1,
5394
                   .inputParaInfo[0][0] = {.isLastParam = true,
5395
                                           .startParam = 1,
5396
                                           .endParam = -1,
5397
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5398
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5399
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5400
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5401
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
5402
    .translateFunc = translateChar,
5403
    .getEnvFunc   = NULL,
5404
    .initFunc     = NULL,
5405
    .sprocessFunc = charFunction,
5406
    .finalizeFunc = NULL
5407
  },
5408
  {
5409
    .name = "ascii",
5410
    .type = FUNCTION_TYPE_ASCII,
5411
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
5412
    .parameters = {.minParamNum = 1,
5413
                   .maxParamNum = 1,
5414
                   .paramInfoPattern = 1,
5415
                   .inputParaInfo[0][0] = {.isLastParam = true,
5416
                                           .startParam = 1,
5417
                                           .endParam = 1,
5418
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5419
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5420
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5421
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5422
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
5423
    .translateFunc = translateAscii,
5424
    .getEnvFunc   = NULL,
5425
    .initFunc     = NULL,
5426
    .sprocessFunc = asciiFunction,
5427
    .finalizeFunc = NULL
5428
  },
5429
  {
5430
    .name = "position",
5431
    .type = FUNCTION_TYPE_POSITION,
5432
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
5433
    .parameters = {.minParamNum = 2,
5434
                   .maxParamNum = 2,
5435
                   .paramInfoPattern = 1,
5436
                   .inputParaInfo[0][0] = {.isLastParam = true,
5437
                                           .startParam = 1,
5438
                                           .endParam = 2,
5439
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5440
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5441
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5442
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5443
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
5444
    .translateFunc = translateOutBigInt,
5445
    .getEnvFunc   = NULL,
5446
    .initFunc     = NULL,
5447
    .sprocessFunc = positionFunction,
5448
    .finalizeFunc = NULL
5449
  },
5450
  {
5451
    .name = "trim",
5452
    .type = FUNCTION_TYPE_TRIM,
5453
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
5454
    .parameters = {.minParamNum = 1,
5455
                   .maxParamNum = 2,
5456
                   .paramInfoPattern = 1,
5457
                   .inputParaInfo[0][0] = {.isLastParam = true,
5458
                                           .startParam = 1,
5459
                                           .endParam = 2,
5460
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5461
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5462
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5463
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5464
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE}},
5465
    .translateFunc = translateTrim,
5466
    .getEnvFunc   = NULL,
5467
    .initFunc     = NULL,
5468
    .sprocessFunc = trimFunction,
5469
    .finalizeFunc = NULL
5470
  },
5471
  {
5472
    .name = "replace",
5473
    .type = FUNCTION_TYPE_REPLACE,
5474
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
5475
    .parameters = {.minParamNum = 3,
5476
                   .maxParamNum = 3,
5477
                   .paramInfoPattern = 1,
5478
                   .inputParaInfo[0][0] = {.isLastParam = true,
5479
                                           .startParam = 1,
5480
                                           .endParam = 3,
5481
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5482
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5483
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5484
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5485
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE}},
5486
    .translateFunc = translateReplace,
5487
    .getEnvFunc   = NULL,
5488
    .initFunc     = NULL,
5489
    .sprocessFunc = replaceFunction,
5490
    .finalizeFunc = NULL
5491
  },
5492
  {
5493
    .name = "repeat",
5494
    .type = FUNCTION_TYPE_REPEAT,
5495
    .classification = FUNC_MGT_SCALAR_FUNC | FUNC_MGT_STRING_FUNC,
5496
    .parameters = {.minParamNum = 2,
5497
                   .maxParamNum = 2,
5498
                   .paramInfoPattern = 1,
5499
                   .inputParaInfo[0][0] = {.isLastParam = false,
5500
                                           .startParam = 1,
5501
                                           .endParam = 1,
5502
                                           .validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5503
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5504
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5505
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5506
                   .inputParaInfo[0][1] = {.isLastParam = true,
5507
                                           .startParam = 2,
5508
                                           .endParam = 2,
5509
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5510
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5511
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5512
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5513
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE}},
5514
    .translateFunc = translateRepeat,
5515
    .getEnvFunc   = NULL,
5516
    .initFunc     = NULL,
5517
    .sprocessFunc = repeatFunction,
5518
    .finalizeFunc = NULL
5519
  },
5520
  {
5521
    .name = "weekday",
5522
    .type = FUNCTION_TYPE_WEEKDAY,
5523
    .classification = FUNC_MGT_SCALAR_FUNC,
5524
    .parameters = {.minParamNum = 1,
5525
                   .maxParamNum = 1,
5526
                   .paramInfoPattern = 1,
5527
                   .inputParaInfo[0][0] = {.isLastParam = true,
5528
                                           .startParam = 1,
5529
                                           .endParam = 1,
5530
                                           .validDataType = FUNC_PARAM_SUPPORT_UNIX_TS_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5531
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5532
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5533
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5534
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
5535
    .translateFunc = translateAddPrecOutBigint,
5536
    .getEnvFunc   = NULL,
5537
    .initFunc     = NULL,
5538
    .sprocessFunc = weekdayFunction,
5539
    .finalizeFunc = NULL
5540
  },
5541
  {
5542
    .name = "dayofweek",
5543
    .type = FUNCTION_TYPE_DAYOFWEEK,
5544
    .classification = FUNC_MGT_SCALAR_FUNC,
5545
    .parameters = {.minParamNum = 1,
5546
                   .maxParamNum = 1,
5547
                   .paramInfoPattern = 1,
5548
                   .inputParaInfo[0][0] = {.isLastParam = true,
5549
                                           .startParam = 1,
5550
                                           .endParam = 1,
5551
                                           .validDataType = FUNC_PARAM_SUPPORT_UNIX_TS_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5552
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5553
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5554
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5555
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
5556
    .translateFunc = translateAddPrecOutBigint,
5557
    .getEnvFunc   = NULL,
5558
    .initFunc     = NULL,
5559
    .sprocessFunc = dayofweekFunction,
5560
    .finalizeFunc = NULL
5561
  },
5562
  {
5563
    .name = "week",
5564
    .type = FUNCTION_TYPE_WEEK,
5565
    .classification = FUNC_MGT_SCALAR_FUNC,
5566
    .parameters = {.minParamNum = 1,
5567
                   .maxParamNum = 2,
5568
                   .paramInfoPattern = 1,
5569
                   .inputParaInfo[0][0] = {.isLastParam = false,
5570
                                           .startParam = 1,
5571
                                           .endParam = 1,
5572
                                           .validDataType = FUNC_PARAM_SUPPORT_UNIX_TS_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5573
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5574
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5575
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5576
                   .inputParaInfo[0][1] = {.isLastParam = true,
5577
                                           .startParam = 2,
5578
                                           .endParam = 2,
5579
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5580
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5581
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5582
                                           .valueRangeFlag = FUNC_PARAM_HAS_FIXED_VALUE,
5583
                                           .fixedValueSize = 8,
5584
                                           .fixedNumValue = {0, 1, 2, 3, 4, 5, 6, 7}},
5585
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
5586
    .translateFunc = translateAddPrecOutBigint,
5587
    .getEnvFunc   = NULL,
5588
    .initFunc     = NULL,
5589
    .sprocessFunc = weekFunction,
5590
    .finalizeFunc = NULL
5591
  },
5592
  {
5593
    .name = "weekofyear",
5594
    .type = FUNCTION_TYPE_WEEKOFYEAR,
5595
    .classification = FUNC_MGT_SCALAR_FUNC,
5596
    .parameters = {.minParamNum = 1,
5597
                   .maxParamNum = 1,
5598
                   .paramInfoPattern = 1,
5599
                   .inputParaInfo[0][0] = {.isLastParam = true,
5600
                                           .startParam = 1,
5601
                                           .endParam = 1,
5602
                                           .validDataType = FUNC_PARAM_SUPPORT_UNIX_TS_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5603
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5604
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5605
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5606
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_BIGINT_TYPE}},
5607
    .translateFunc = translateAddPrecOutBigint,
5608
    .getEnvFunc   = NULL,
5609
    .initFunc     = NULL,
5610
    .sprocessFunc = weekofyearFunction,
5611
    .finalizeFunc = NULL
5612
  },
5613
  {
5614
    .name = "rand",
5615
    .type = FUNCTION_TYPE_RAND,
5616
    .classification = FUNC_MGT_SCALAR_FUNC,
5617
    .parameters = {.minParamNum = 0,
5618
                   .maxParamNum = 1,
5619
                   .paramInfoPattern = 1,
5620
                   .inputParaInfo[0][0] = {.isLastParam = true,
5621
                                           .startParam = 1,
5622
                                           .endParam = 1,
5623
                                           .validDataType = FUNC_PARAM_SUPPORT_INTEGER_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE,
5624
                                           .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5625
                                           .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5626
                                           .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5627
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_DOUBLE_TYPE}},
5628
    .translateFunc = translateRand,
5629
    .getEnvFunc   = NULL,
5630
    .initFunc     = NULL,
5631
    .sprocessFunc = randFunction,
5632
    .finalizeFunc = NULL
5633
  },
5634
  {
5635
    .name = "forecast",
5636
    .type = FUNCTION_TYPE_FORECAST,
5637
    .classification = FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
5638
                      FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_FORBID_SYSTABLE_FUNC | FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_PRIMARY_KEY_FUNC,    
5639
    .translateFunc = translateForecast,
5640
    .getEnvFunc    = getSelectivityFuncEnv,
5641
    .initFunc      = functionSetup,
5642
    .processFunc   = NULL,
5643
    .finalizeFunc  = NULL,
5644
    .estimateReturnRowsFunc = forecastEstReturnRows,
5645
  },
5646
    {
5647
    .name = "_frowts",
5648
    .type = FUNCTION_TYPE_FORECAST_ROWTS,
5649
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_FORECAST_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
5650
    .translateFunc = translateTimePseudoColumn,
5651
    .getEnvFunc   = getTimePseudoFuncEnv,
5652
    .initFunc     = NULL,
5653
    .sprocessFunc = NULL,
5654
    .finalizeFunc = NULL
5655
  },
5656
  {
5657
    .name = "_flow",
5658
    .type = FUNCTION_TYPE_FORECAST_LOW,
5659
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_FORECAST_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
5660
    .translateFunc = translateForecastConf,
5661
    .getEnvFunc   = getForecastConfEnv,
5662
    .initFunc     = NULL,
5663
    .sprocessFunc = NULL,
5664
    .finalizeFunc = NULL
5665
  },
5666
  {
5667
    .name = "_fhigh",
5668
    .type = FUNCTION_TYPE_FORECAST_HIGH,
5669
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_FORECAST_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
5670
    .translateFunc = translateForecastConf,
5671
    .getEnvFunc   = getForecastConfEnv,
5672
    .initFunc     = NULL,
5673
    .sprocessFunc = NULL,
5674
    .finalizeFunc = NULL
5675
  },
5676
  {
5677
    .name = "_irowts_origin",
5678
    .type = FUNCTION_TYPE_IROWTS_ORIGIN,
5679
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_INTERP_PC_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
5680
    .parameters = {.minParamNum = 0,
5681
                   .maxParamNum = 0,
5682
                   .paramInfoPattern = 0,
5683
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE}},
5684
    .translateFunc = translateTimePseudoColumn,
5685
    .getEnvFunc   = getTimePseudoFuncEnv,
5686
    .initFunc     = NULL,
5687
    .sprocessFunc = NULL,
5688
    .finalizeFunc = NULL
5689
  },
5690
  {
5691
    .name = "_db_usage",
5692
    .type = FUNCTION_TYPE_DB_USAGE,
5693
    .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
5694
    .parameters = {.minParamNum = 0,
5695
                   .maxParamNum = 0,
5696
                   .paramInfoPattern = 0,
5697
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
5698
    .translateFunc = translateOutVarchar,
5699
    .getEnvFunc   = getBlockDBUsageFuncEnv,
5700
    .initFunc     = blockDBUsageSetup,
5701
    .processFunc  = blockDBUsageFunction,
5702
    .finalizeFunc = blockDBUsageFinalize
5703
  },
5704
  {
5705
    .name = "_db_usage_info",
5706
    .type = FUNCTION_TYPE_DB_USAGE_INFO,
5707
    .classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_SCAN_PC_FUNC,
5708
    .parameters = {.minParamNum = 0,
5709
                   .maxParamNum = 0,
5710
                   .paramInfoPattern = 0,
5711
                   .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_VARCHAR_TYPE}},
5712
    .translateFunc = translateOutVarchar,
5713
  },
5714
  {
5715
    .name = "cols",
5716
    .translateFunc = invalidColsFunction,
5717
  },
5718
  {
5719
    .name = "greatest",
5720
    .type = FUNCTION_TYPE_GREATEST,
5721
    .classification = FUNC_MGT_SCALAR_FUNC,
5722
    .parameters = {.minParamNum = 2,
5723
      .maxParamNum = -1,
5724
      .paramInfoPattern = 1,
5725
      .inputParaInfo[0][0] = {.isLastParam = true,
5726
                              .startParam = 1,
5727
                              .endParam = -1,
5728
                              .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE | FUNC_PARAM_SUPPORT_BOOL_TYPE | FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE | FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE,
5729
                              .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5730
                              .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5731
                              .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5732
      .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
5733
    .translateFunc = translateGreatestleast,
5734
    .getEnvFunc   = NULL,
5735
    .initFunc     = NULL,
5736
    .sprocessFunc = greatestFunction,
5737
    .finalizeFunc = NULL
5738
  },
5739
  {
5740
    .name = "least",
5741
    .type = FUNCTION_TYPE_LEAST,
5742
    .classification = FUNC_MGT_SCALAR_FUNC,
5743
    .parameters = {.minParamNum = 2,
5744
      .maxParamNum = -1,
5745
      .paramInfoPattern = 1,
5746
      .inputParaInfo[0][0] = {.isLastParam = true,
5747
                              .startParam = 1,
5748
                              .endParam = -1,
5749
                              .validDataType = FUNC_PARAM_SUPPORT_NUMERIC_TYPE | FUNC_PARAM_SUPPORT_NULL_TYPE | FUNC_PARAM_SUPPORT_BOOL_TYPE | FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE | FUNC_PARAM_SUPPORT_VARCHAR_TYPE | FUNC_PARAM_SUPPORT_NCHAR_TYPE,
5750
                              .validNodeType = FUNC_PARAM_SUPPORT_EXPR_NODE,
5751
                              .paramAttribute = FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE,
5752
                              .valueRangeFlag = FUNC_PARAM_NO_SPECIFIC_VALUE,},
5753
      .outputParaInfo = {.validDataType = FUNC_PARAM_SUPPORT_ALL_TYPE}},
5754
    .translateFunc = translateGreatestleast,
5755
    .getEnvFunc   = NULL,
5756
    .initFunc     = NULL,
5757
    .sprocessFunc = leastFunction,
5758
    .finalizeFunc = NULL
5759
  },
5760
};
5761
// clang-format on
5762

5763
const int32_t funcMgtBuiltinsNum = (sizeof(funcMgtBuiltins) / sizeof(SBuiltinFuncDefinition));
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc