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

taosdata / TDengine / #3873

21 Apr 2025 07:22AM UTC coverage: 63.063% (+0.1%) from 62.968%
#3873

push

travis-ci

GitHub
docs(opc): add perssit data support (#30783)

156631 of 316378 branches covered (49.51%)

Branch coverage included in aggregate %.

242184 of 316027 relevant lines covered (76.63%)

20271838.47 hits per line

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

81.33
/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, ...) {
52,181✔
30
  va_list vArgList;
31
  va_start(vArgList, pFormat);
52,181✔
32
  (void)vsnprintf(pErrBuf, len, pFormat, vArgList);
52,181✔
33
  va_end(vArgList);
52,181✔
34
  return errCode;
52,181✔
35
}
36

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

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

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

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

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

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

63
  if (pVal->literal[0] != '1' ||
68,435✔
64
      (pVal->literal[1] != 'u' && pVal->literal[1] != 'a' && pVal->literal[1] != 's' && pVal->literal[1] != 'm' &&
65,411✔
65
       pVal->literal[1] != 'h' && pVal->literal[1] != 'd' && pVal->literal[1] != 'w' && pVal->literal[1] != 'b')) {
23,819✔
66
    return TSDB_CODE_FUNC_TIME_UNIT_INVALID;
3,052✔
67
  }
68

69
  return TSDB_CODE_SUCCESS;
65,383✔
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) {
85✔
81
  if (hour < 0 || hour > 12) {
85!
82
    return false;
16✔
83
  }
84

85
  return true;
69✔
86
}
87

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

93
  return false;
16✔
94
}
95

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

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

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

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

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

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

172
  return true;
53✔
173
}
174

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

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

189
  return numOfSpaces;
328✔
190
}
191

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

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

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

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

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

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

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

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

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

275
static SDataType* getSDataTypeFromNode(SNode* pNode) {
9,906,462✔
276
  if (pNode == NULL) return NULL;
9,906,462!
277
  if (nodesIsExprNode(pNode)) {
9,906,462!
278
    return &((SExprNode*)pNode)->resType;
9,906,521✔
279
  } else {
280
    return NULL;
×
281
  }
282
}
283

284
static bool paramSupportNull(uint64_t typeFlag) {
306,156✔
285
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NULL_TYPE) ||
612,127✔
286
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
305,971✔
287
}
288

289
static bool paramSupportBool(uint64_t typeFlag) {
15,456✔
290
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BOOL_TYPE) ||
30,740✔
291
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
15,284✔
292
}
293

294
static bool paramSupportTinyint(uint64_t typeFlag) {
108,712✔
295
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TINYINT_TYPE) ||
217,340✔
296
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
108,628✔
297
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
90,031✔
298
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
218,972✔
299
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,632!
300
}
301

302
static bool paramSupportSmallint(uint64_t typeFlag) {
113,459✔
303
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_SMALLINT_TYPE) ||
226,918✔
304
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
113,459✔
305
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
92,485✔
306
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
228,550!
307
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,632!
308
}
309

310
static bool paramSupportInt(uint64_t typeFlag) {
891,016✔
311
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INT_TYPE) ||
1,782,032✔
312
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
891,016✔
313
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
735,121✔
314
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,783,734!
315
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,702!
316
}
317

318
static bool paramSupportBigint(uint64_t typeFlag) {
906,650✔
319
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BIGINT_TYPE) ||
1,791,985✔
320
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
885,335✔
321
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
827,888✔
322
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,794,082✔
323
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
2,097✔
324
}
325

326
static bool paramSupportFloat(uint64_t typeFlag) {
103,828✔
327
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FLOAT_TYPE) ||
207,656✔
328
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
182,041!
329
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
78,213✔
330
}
331

332
static bool paramSupportDouble(uint64_t typeFlag) {
206,098✔
333
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_DOUBLE_TYPE) ||
412,184✔
334
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
366,158✔
335
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
160,060✔
336
}
337

338
static bool paramSupportVarchar(uint64_t typeFlag) {
1,140,399✔
339
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARCHAR_TYPE) ||
1,261,370✔
340
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
120,971✔
341
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
55,906✔
342
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
1,285,157!
343
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
23,787✔
344
}
345

346
static bool paramSupportTimestamp(uint64_t typeFlag) {
678,784✔
347
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE) ||
1,154,190✔
348
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
684,850✔
349
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
6,066✔
350
}
351

352
static bool paramSupportNchar(uint64_t typeFlag) {
201,302✔
353
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NCHAR_TYPE) ||
251,606✔
354
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
50,304✔
355
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
25,803✔
356
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
274,922!
357
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
23,316!
358
}
359

360
static bool paramSupportUTinyInt(uint64_t typeFlag) {
16,270✔
361
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UTINYINT_TYPE) ||
32,540✔
362
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
16,270✔
363
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
3,634!
364
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
32,540!
365
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
366
}
367

368
static bool paramSupportUSmallInt(uint64_t typeFlag) {
15,592✔
369
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_USMALLINT_TYPE) ||
31,184✔
370
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
15,592✔
371
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
14,082!
372
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
31,184!
373
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
374
}
375

376
static bool paramSupportUInt(uint64_t typeFlag) {
27,271✔
377
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UINT_TYPE) ||
54,542✔
378
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
27,271✔
379
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
16,507!
380
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
54,542!
381
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
382
}
383

384
static bool paramSupportUBigInt(uint64_t typeFlag) {
27,250✔
385
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UBIGINT_TYPE) ||
54,500✔
386
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
27,250✔
387
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
5,496✔
388
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
54,500!
389
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
390
}
391

392
static bool paramSupportJSON(uint64_t typeFlag) {
78✔
393
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_JSON_TYPE) ||
156✔
394
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
102!
395
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE);
24!
396
}
397

398
static bool paramSupportVarBinary(uint64_t typeFlag) {
55,205✔
399
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARB_TYPE) ||
110,410✔
400
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
55,205✔
401
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
165,589!
402
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE);
55,179✔
403
}
404

405
static bool paramSupportGeometry(uint64_t typeFlag) {
104✔
406
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_GEOMETRY_TYPE) ||
104✔
407
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
104!
408
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE);
×
409
}
410

411
static bool paramSupportDecimal(uint64_t typeFlag) {
1,457✔
412
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_DECIMAL_TYPE) ||
2,393✔
413
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
936!
414
}
415

416
static bool paramSupportValueNode(uint64_t typeFlag) {
581,924✔
417
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VALUE_NODE) ||
808,789✔
418
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE);
226,865✔
419
}
420

421
static bool paramSupportOperatorNode(uint64_t typeFlag) {
55,912✔
422
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
56,153✔
423
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_OPERATOR_NODE) ||
56,153!
424
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
241✔
425
}
426

427
static bool paramSupportFunctionNode(uint64_t typeFlag) {
670,178✔
428
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
671,462✔
429
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FUNCTION_NODE) ||
671,462!
430
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
1,284✔
431
}
432

433
static bool paramSupportLogicConNode(uint64_t typeFlag) {
×
434
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
×
435
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_LOGIC_CONDITION_NODE) ||
×
436
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
×
437
}
438

439
static bool paramSupportCaseWhenNode(uint64_t typeFlag) {
1,079✔
440
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
1,079✔
441
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_CASE_WHEN_NODE) ||
1,079!
442
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
×
443
}
444

445
static bool paramSupportColumnNode(uint64_t typeFlag) {
3,384,463✔
446
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
3,433,609✔
447
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_COLUMN_NODE) ||
3,408,777✔
448
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
24,314✔
449
}
450

451
static bool paramSupportNodeType(SNode* pNode, uint64_t typeFlag) {
4,693,556✔
452
  switch (pNode->type) {
4,693,556!
453
    case QUERY_NODE_VALUE:
581,924✔
454
      return paramSupportValueNode(typeFlag);
581,924✔
455
    case QUERY_NODE_OPERATOR:
55,912✔
456
      return paramSupportOperatorNode(typeFlag);
55,912✔
457
    case QUERY_NODE_FUNCTION:
670,178✔
458
      return paramSupportFunctionNode(typeFlag);
670,178✔
459
    case QUERY_NODE_LOGIC_CONDITION:
×
460
      return paramSupportLogicConNode(typeFlag);
×
461
    case QUERY_NODE_CASE_WHEN:
1,079✔
462
      return paramSupportCaseWhenNode(typeFlag);
1,079✔
463
    case QUERY_NODE_COLUMN:
3,384,475✔
464
      return paramSupportColumnNode(typeFlag);
3,384,475✔
465
    default:
×
466
      return false;
×
467
  }
468
}
469

470
static bool paramSupportDataType(SDataType* pDataType, uint64_t typeFlag) {
4,692,773✔
471
  switch (pDataType->type) {
4,692,773!
472
    case TSDB_DATA_TYPE_NULL:
306,157✔
473
      return paramSupportNull(typeFlag);
306,157✔
474
    case TSDB_DATA_TYPE_BOOL:
15,456✔
475
      return paramSupportBool(typeFlag);
15,456✔
476
    case TSDB_DATA_TYPE_TINYINT:
108,712✔
477
      return paramSupportTinyint(typeFlag);
108,712✔
478
    case TSDB_DATA_TYPE_SMALLINT:
113,459✔
479
      return paramSupportSmallint(typeFlag);
113,459✔
480
    case TSDB_DATA_TYPE_INT:
891,016✔
481
      return paramSupportInt(typeFlag);
891,016✔
482
    case TSDB_DATA_TYPE_BIGINT:
906,650✔
483
      return paramSupportBigint(typeFlag);
906,650✔
484
    case TSDB_DATA_TYPE_FLOAT:
103,829✔
485
      return paramSupportFloat(typeFlag);
103,829✔
486
    case TSDB_DATA_TYPE_DOUBLE:
206,098✔
487
      return paramSupportDouble(typeFlag);
206,098✔
488
    case TSDB_DATA_TYPE_VARCHAR:
1,095,141✔
489
      return paramSupportVarchar(typeFlag);
1,095,141✔
490
    case TSDB_DATA_TYPE_TIMESTAMP:
678,784✔
491
      return paramSupportTimestamp(typeFlag);
678,784✔
492
    case TSDB_DATA_TYPE_NCHAR:
179,453✔
493
      return paramSupportNchar(typeFlag);
179,453✔
494
    case TSDB_DATA_TYPE_UTINYINT:
16,270✔
495
      return paramSupportUTinyInt(typeFlag);
16,270✔
496
    case TSDB_DATA_TYPE_USMALLINT:
15,592✔
497
      return paramSupportUSmallInt(typeFlag);
15,592✔
498
    case TSDB_DATA_TYPE_UINT:
27,271✔
499
      return paramSupportUInt(typeFlag);
27,271✔
500
    case TSDB_DATA_TYPE_UBIGINT:
27,250✔
501
      return paramSupportUBigInt(typeFlag);
27,250✔
502
    case TSDB_DATA_TYPE_JSON:
78✔
503
      return paramSupportJSON(typeFlag);
78✔
504
    case TSDB_DATA_TYPE_VARBINARY:
37✔
505
      return paramSupportVarBinary(typeFlag);
37✔
506
    case TSDB_DATA_TYPE_GEOMETRY:
104✔
507
      return paramSupportGeometry(typeFlag);
104✔
508
    case TSDB_DATA_TYPE_DECIMAL64:
1,457✔
509
    case TSDB_DATA_TYPE_DECIMAL:
510
      return paramSupportDecimal(typeFlag);
1,457✔
511
    default:
×
512
      return false;
×
513
  }
514
}
515

516
typedef enum { UNKNOWN_BIN = 0, USER_INPUT_BIN, LINEAR_BIN, LOG_BIN } EHistoBinType;
517

518
static int8_t validateHistogramBinType(char* binTypeStr) {
13,312✔
519
  int8_t binType;
520
  if (strcasecmp(binTypeStr, "user_input") == 0) {
13,312✔
521
    binType = USER_INPUT_BIN;
4,982✔
522
  } else if (strcasecmp(binTypeStr, "linear_bin") == 0) {
8,330✔
523
    binType = LINEAR_BIN;
6,963✔
524
  } else if (strcasecmp(binTypeStr, "log_bin") == 0) {
1,367!
525
    binType = LOG_BIN;
1,367✔
526
  } else {
527
    binType = UNKNOWN_BIN;
×
528
  }
529

530
  return binType;
13,312✔
531
}
532

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

543
  cJSON*  binDesc = cJSON_Parse(binDescStr);
13,312✔
544
  int32_t numOfBins;
545
  double* intervals;
546
  if (cJSON_IsObject(binDesc)) { /* linaer/log bins */
13,312✔
547
    int32_t numOfParams = cJSON_GetArraySize(binDesc);
8,265✔
548
    int32_t startIndex;
549
    if (numOfParams != 4) {
8,265✔
550
      (void)snprintf(errMsg, msgLen, "%s", msg1);
12✔
551
      cJSON_Delete(binDesc);
12✔
552
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
12✔
553
    }
554

555
    cJSON* start = cJSON_GetObjectItem(binDesc, "start");
8,253✔
556
    cJSON* factor = cJSON_GetObjectItem(binDesc, "factor");
8,253✔
557
    cJSON* width = cJSON_GetObjectItem(binDesc, "width");
8,253✔
558
    cJSON* count = cJSON_GetObjectItem(binDesc, "count");
8,253✔
559
    cJSON* infinity = cJSON_GetObjectItem(binDesc, "infinity");
8,253✔
560

561
    if (!cJSON_IsNumber(start) || !cJSON_IsNumber(count) || !cJSON_IsBool(infinity)) {
8,253✔
562
      (void)snprintf(errMsg, msgLen, "%s", msg3);
60✔
563
      cJSON_Delete(binDesc);
60✔
564
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
60✔
565
    }
566

567
    if (count->valueint <= 0 || count->valueint > 1000) {  // limit count to 1000
8,193✔
568
      (void)snprintf(errMsg, msgLen, "%s", msg4);
32✔
569
      cJSON_Delete(binDesc);
32✔
570
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
32✔
571
    }
572

573
    if (isinf(start->valuedouble) || (width != NULL && isinf(width->valuedouble)) ||
8,161!
574
        (factor != NULL && isinf(factor->valuedouble)) || (count != NULL && isinf(count->valuedouble))) {
8,161!
575
      (void)snprintf(errMsg, msgLen, "%s", msg5);
×
576
      cJSON_Delete(binDesc);
×
577
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
578
    }
579

580
    int32_t counter = (int32_t)count->valueint;
8,161✔
581
    if (infinity->valueint == false) {
8,161✔
582
      startIndex = 0;
5,366✔
583
      numOfBins = counter + 1;
5,366✔
584
    } else {
585
      startIndex = 1;
2,795✔
586
      numOfBins = counter + 3;
2,795✔
587
    }
588

589
    intervals = taosMemoryCalloc(numOfBins, sizeof(double));
8,161!
590
    if (intervals == NULL) {
8,161!
591
      (void)snprintf(errMsg, msgLen, "%s", msg9);
×
592
      cJSON_Delete(binDesc);
×
593
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
594
    }
595
    if (cJSON_IsNumber(width) && factor == NULL && binType == LINEAR_BIN) {
8,161!
596
      // linear bin process
597
      if (width->valuedouble == 0) {
6,871✔
598
        (void)snprintf(errMsg, msgLen, "%s", msg6);
4✔
599
        taosMemoryFree(intervals);
4!
600
        cJSON_Delete(binDesc);
4✔
601
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
4✔
602
      }
603
      for (int i = 0; i < counter + 1; ++i) {
52,253✔
604
        intervals[startIndex] = start->valuedouble + i * width->valuedouble;
45,386✔
605
        if (isinf(intervals[startIndex])) {
45,386!
606
          (void)snprintf(errMsg, msgLen, "%s", msg5);
×
607
          taosMemoryFree(intervals);
×
608
          cJSON_Delete(binDesc);
×
609
          return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
610
        }
611
        startIndex++;
45,386✔
612
      }
613
    } else if (cJSON_IsNumber(factor) && width == NULL && binType == LOG_BIN) {
1,290!
614
      // log bin process
615
      if (start->valuedouble == 0) {
1,262✔
616
        (void)snprintf(errMsg, msgLen, "%s", msg7);
4✔
617
        taosMemoryFree(intervals);
4!
618
        cJSON_Delete(binDesc);
4✔
619
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
4✔
620
      }
621
      if (factor->valuedouble < 0 || factor->valuedouble == 0 || factor->valuedouble == 1) {
1,258✔
622
        (void)snprintf(errMsg, msgLen, "%s", msg8);
32✔
623
        taosMemoryFree(intervals);
32!
624
        cJSON_Delete(binDesc);
32✔
625
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
32✔
626
      }
627
      for (int i = 0; i < counter + 1; ++i) {
7,602✔
628
        intervals[startIndex] = start->valuedouble * pow(factor->valuedouble, i * 1.0);
6,376✔
629
        if (isinf(intervals[startIndex])) {
6,376!
630
          (void)snprintf(errMsg, msgLen, "%s", msg5);
×
631
          taosMemoryFree(intervals);
×
632
          cJSON_Delete(binDesc);
×
633
          return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
634
        }
635
        startIndex++;
6,376✔
636
      }
637
    } else {
638
      (void)snprintf(errMsg, msgLen, "%s", msg3);
28✔
639
      taosMemoryFree(intervals);
28!
640
      cJSON_Delete(binDesc);
28✔
641
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
28✔
642
    }
643

644
    if (infinity->valueint == true) {
8,093✔
645
      intervals[0] = -INFINITY;
2,759✔
646
      intervals[numOfBins - 1] = INFINITY;
2,759✔
647
      // in case of desc bin orders, -inf/inf should be swapped
648
      if (numOfBins < 4) {
2,759!
649
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
650
      }
651

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

700
  cJSON_Delete(binDesc);
13,047✔
701
  taosMemoryFree(intervals);
13,047!
702
  return TSDB_CODE_SUCCESS;
13,047✔
703
}
704

705
static int32_t checkRangeValue(SNode* pNode, SParamRange range, bool* isMatch) {
118,598✔
706
  int32_t code = TSDB_CODE_SUCCESS;
118,598✔
707
  if (pNode->type == QUERY_NODE_VALUE) {
118,598!
708
    SValueNode* pVal = (SValueNode*)pNode;
118,598✔
709
    if (IS_INTEGER_TYPE(getSDataTypeFromNode(pNode)->type)) {
118,598!
710
      if (pVal->datum.i < range.iMinVal || pVal->datum.i > range.iMaxVal) {
118,431✔
711
        code = TSDB_CODE_FUNC_FUNTION_PARA_RANGE;
5,927✔
712
        *isMatch = false;
5,927✔
713
      }
714
    } else {
715
      if ((int64_t)pVal->datum.d < range.iMinVal || (int64_t)pVal->datum.d > range.iMaxVal) {
167!
716
        code = TSDB_CODE_FUNC_FUNTION_PARA_RANGE;
×
717
        *isMatch = false;
×
718
      }
719
    }
720
  } else {
721
    // for other node type, range check should be done in process function
722
  }
723
  return code;
118,598✔
724
}
725

726
static int32_t checkFixedValue(SNode* pNode, const SParamInfo* paramPattern, int32_t paramIdx, bool* isMatch) {
55,168✔
727
  int32_t code = TSDB_CODE_SUCCESS;
55,168✔
728
  bool    checkStr = paramSupportVarBinary(paramPattern->validDataType) ||
100,426✔
729
                  paramSupportVarchar(paramPattern->validDataType) || paramSupportNchar(paramPattern->validDataType);
100,426!
730
  if (pNode->type == QUERY_NODE_VALUE) {
55,168!
731
    SValueNode* pVal = (SValueNode*)pNode;
55,168✔
732
    if (!checkStr) {
55,168✔
733
      for (int32_t k = 0; k < paramPattern->fixedValueSize; k++) {
34,827✔
734
        if (pVal->datum.i == paramPattern->fixedNumValue[k]) {
34,801✔
735
          code = TSDB_CODE_SUCCESS;
21,823✔
736
          *isMatch = true;
21,823✔
737
          break;
21,823✔
738
        } else {
739
          code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
12,978✔
740
          *isMatch = false;
12,978✔
741
        }
742
      }
743
    } else {
744
      for (int32_t k = 0; k < paramPattern->fixedValueSize; k++) {
85,074✔
745
        if (taosStrcasecmp(pVal->literal, paramPattern->fixedStrValue[k]) == 0) {
85,003✔
746
          code = TSDB_CODE_SUCCESS;
33,248✔
747
          *isMatch = true;
33,248✔
748
          break;
33,248✔
749
        } else {
750
          code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
51,755✔
751
          *isMatch = false;
51,755✔
752
        }
753
      }
754
    }
755
  } else {
756
    // for other node type, fixed value check should be done in process function
757
  }
758
  return code;
55,168✔
759
}
760

761
static int32_t checkPrimTS(SNode* pNode, bool* isMatch) {
24,648✔
762
  int32_t code = TSDB_CODE_SUCCESS;
24,648✔
763
  if (nodeType(pNode) != QUERY_NODE_COLUMN || !IS_TIMESTAMP_TYPE(getSDataTypeFromNode(pNode)->type) ||
24,648!
764
      !((SColumnNode*)pNode)->isPrimTs) {
24,648✔
765
    code = TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS;
98✔
766
    *isMatch = false;
98✔
767
  }
768
  return code;
24,648✔
769
}
770

771
static int32_t checkPrimaryKey(SNode* pNode, bool* isMatch) {
1✔
772
  int32_t code = TSDB_CODE_SUCCESS;
1✔
773
  if (nodeType(pNode) != QUERY_NODE_COLUMN || !IS_INTEGER_TYPE(getSDataTypeFromNode(pNode)->type) ||
1!
774
      !((SColumnNode*)pNode)->isPk) {
1!
775
    code = TSDB_CODE_FUNC_FUNTION_PARA_PK;
×
776
    *isMatch = false;
×
777
  }
778
  return code;
1✔
779
}
780

781
static int32_t checkHasColumn(SNode* pNode, bool* isMatch) {
19,912✔
782
  int32_t code = TSDB_CODE_SUCCESS;
19,912✔
783
  if (!nodesExprHasColumn(pNode)) {
19,912✔
784
    code = TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL;
40✔
785
    *isMatch = false;
40✔
786
  }
787
  return code;
19,912✔
788
}
789

790
static int32_t checkValueNodeNotNull(SNode* pNode, bool* isMatch) {
478,260✔
791
  int32_t code = TSDB_CODE_SUCCESS;
478,260✔
792
  if (IS_NULL_TYPE(getSDataTypeFromNode(pNode)->type) && QUERY_NODE_VALUE == nodeType(pNode)) {
478,260✔
793
    code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
144✔
794
    *isMatch = false;
144✔
795
  }
796
  return code;
478,271✔
797
}
798

799
static int32_t checkTimeUnit(SNode* pNode, int32_t precision, bool* isMatch) {
68,543✔
800
  if (nodeType(pNode) != QUERY_NODE_VALUE || !IS_INTEGER_TYPE(getSDataTypeFromNode(pNode)->type)) {
68,543!
801
    *isMatch = false;
×
802
    return TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
×
803
  }
804

805
  if (IS_NULL_TYPE(getSDataTypeFromNode(pNode)->type)) {
68,543!
806
    *isMatch = true;
×
807
    return TSDB_CODE_SUCCESS;
×
808
  }
809

810
  int32_t code = validateTimeUnitParam(precision, (SValueNode*)pNode);
68,543✔
811
  if (TSDB_CODE_SUCCESS != code) {
68,543✔
812
    *isMatch = false;
3,160✔
813
  }
814
  return code;
68,543✔
815
}
816
static int32_t validateParam(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
3,951,802✔
817
  int32_t    code = TSDB_CODE_SUCCESS;
3,951,802✔
818
  SNodeList* paramList = pFunc->pParameterList;
3,951,802✔
819
  char       errMsg[128] = {0};
3,951,802✔
820

821
  // no need to check
822
  if (funcMgtBuiltins[pFunc->funcId].parameters.paramInfoPattern == 0) {
3,951,802✔
823
    return TSDB_CODE_SUCCESS;
441,819✔
824
  }
825

826
  // check param num
827
  if ((funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum != -1 &&
3,509,983✔
828
       LIST_LENGTH(paramList) > funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum) ||
3,080,923!
829
      LIST_LENGTH(paramList) < funcMgtBuiltins[pFunc->funcId].parameters.minParamNum) {
3,505,699✔
830
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
8,651✔
831
  }
832

833
  // check each param
834
  for (int32_t i = 0; i < funcMgtBuiltins[pFunc->funcId].parameters.paramInfoPattern; i++) {
3,544,504✔
835
    bool              isMatch = true;
3,501,318✔
836
    int32_t           paramIdx = 0;
3,501,318✔
837
    const SParamInfo* paramPattern = funcMgtBuiltins[pFunc->funcId].parameters.inputParaInfo[i];
3,501,318✔
838

839
    while (1) {
840
      // one table can have at most 4096 columns, int32_t is enough.
841
      for (int32_t j = paramPattern[paramIdx].startParam;
4,253,221✔
842
           j <= (paramPattern[paramIdx].endParam == -1 ? INT32_MAX - 1 : paramPattern[paramIdx].endParam); j++) {
8,903,602✔
843
        if (j > LIST_LENGTH(paramList)) {
5,587,029✔
844
          code = TSDB_CODE_SUCCESS;
893,448✔
845
          isMatch = true;
893,448✔
846
          break;
893,448✔
847
        }
848
        SNode* pNode = nodesListGetNode(paramList, j - 1);
4,693,581✔
849
        if (NULL == pNode) {
4,693,615!
850
          code = TSDB_CODE_FUNC_FUNTION_PARA_NUM;
×
851
          isMatch = false;
×
852
          break;
×
853
        }
854
        // check node type
855
        if (!paramSupportNodeType(pNode, paramPattern[paramIdx].validNodeType)) {
4,693,615✔
856
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
781✔
857
          isMatch = false;
781✔
858
          break;
781✔
859
        }
860
        // check data type
861
        if (!paramSupportDataType(getSDataTypeFromNode(pNode), paramPattern[paramIdx].validDataType)) {
4,692,801✔
862
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
32,933✔
863
          isMatch = false;
32,933✔
864
          break;
32,933✔
865
        }
866
        if (paramPattern[paramIdx].validNodeType == FUNC_PARAM_SUPPORT_VALUE_NODE) {
4,659,845✔
867
          SValueNode* pVal = (SValueNode*)pNode;
354,806✔
868
          pVal->notReserved = true;
354,806✔
869
        }
870
        switch (paramPattern[paramIdx].valueRangeFlag) {
4,659,845!
871
          case FUNC_PARAM_NO_SPECIFIC_VALUE:
4,486,079✔
872
            break;
4,486,079✔
873
          case FUNC_PARAM_HAS_RANGE:
118,598✔
874
            code = checkRangeValue(pNode, paramPattern[paramIdx].range, &isMatch);
118,598✔
875
            break;
118,598✔
876
          case FUNC_PARAM_HAS_FIXED_VALUE:
55,168✔
877
            code = checkFixedValue(pNode, &paramPattern[paramIdx], paramIdx, &isMatch);
55,168✔
878
            break;
55,168✔
879
          default:
×
880
            break;
×
881
        }
882
        if (!isMatch) {
4,659,845✔
883
          break;
6,024✔
884
        }
885
        switch (paramPattern[paramIdx].paramAttribute) {
4,653,821✔
886
          case FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE:
4,062,440✔
887
            break;
4,062,440✔
888
          case FUNC_PARAM_MUST_BE_PRIMTS:
24,648✔
889
            code = checkPrimTS(pNode, &isMatch);
24,648✔
890
            break;
24,648✔
891
          case FUNC_PARAM_MUST_BE_PK:
1✔
892
            code = checkPrimaryKey(pNode, &isMatch);
1✔
893
            break;
1✔
894
          case FUNC_PARAM_MUST_HAVE_COLUMN:
19,912✔
895
            code = checkHasColumn(pNode, &isMatch);
19,912✔
896
            break;
19,912✔
897
          case FUNC_PARAM_VALUE_NODE_NOT_NULL:
478,270✔
898
            code = checkValueNodeNotNull(pNode, &isMatch);
478,270✔
899
            break;
478,272✔
900
          case FUNC_PARAM_MUST_BE_TIME_UNIT:
68,543✔
901
            code = checkTimeUnit(pNode, pFunc->node.resType.precision, &isMatch);
68,543✔
902
            break;
68,543✔
903
          default:
7✔
904
            break;
7✔
905
        }
906
        if (!isMatch) {
4,653,823✔
907
          break;
3,442✔
908
        }
909
      }
910

911
      if (paramPattern[paramIdx].isLastParam || !isMatch) {
4,253,201✔
912
        break;
913
      }
914
      paramIdx++;
751,903✔
915
    }
916
    if (isMatch) {
3,501,298✔
917
      return TSDB_CODE_SUCCESS;
3,458,126✔
918
    }
919
  }
920
  switch (code) {
43,186!
921
    case TSDB_CODE_FUNC_FUNTION_PARA_NUM:
×
922
      return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
923
    case TSDB_CODE_FUNC_FUNTION_PARA_TYPE:
33,858✔
924
      return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
33,858✔
925
    case TSDB_CODE_FUNC_FUNTION_PARA_VALUE:
97✔
926
      return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName);
97✔
927
    case TSDB_CODE_FUNC_FUNTION_PARA_RANGE:
5,927✔
928
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_RANGE, "Invalid parameter range : %s",
5,927✔
929
                             pFunc->functionName);
5,927✔
930
    case TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS:
98✔
931
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS,
98✔
932
                             "Parameter should be primary timestamp : %s", pFunc->functionName);
98✔
933
    case TSDB_CODE_FUNC_FUNTION_PARA_PK:
×
934
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_PK, "Parameter should be primary key : %s",
×
935
                             pFunc->functionName);
×
936
    case TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL:
40✔
937
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL, "Parameter should have column : %s",
40✔
938
                             pFunc->functionName);
40✔
939
    case TSDB_CODE_FUNC_TIME_UNIT_INVALID:
3,052✔
940
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_INVALID, "Invalid timzone format : %s",
3,052✔
941
                             pFunc->functionName);
3,052✔
942
    case TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL:
108✔
943
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL, "Time unit is too small : %s",
108✔
944
                             pFunc->functionName);
108✔
945
    case TSDB_CODE_FUNC_FUNCTION_HISTO_TYPE:
×
946
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNCTION_HISTO_TYPE, "Invalid histogram bin type : %s",
×
947
                             pFunc->functionName);
×
948
    case TSDB_CODE_FUNC_HISTOGRAM_ERROR:
×
949
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_HISTOGRAM_ERROR, errMsg, pFunc->functionName);
×
950
    default:
6✔
951
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Function check parameter failed : %s",
6✔
952
                             pFunc->functionName);
6✔
953
  }
954
}
955

956
// There is only one parameter of numeric type, and the return type is parameter type
957
static int32_t translateOutNum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
50,818✔
958
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
50,818✔
959
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
50,075✔
960
  if (IS_NULL_TYPE(paraType)) {
50,075✔
961
    paraType = TSDB_DATA_TYPE_BIGINT;
18✔
962
  }
963
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[paraType].bytes, .type = paraType};
50,075✔
964
  return TSDB_CODE_SUCCESS;
50,075✔
965
}
966

967
// There is only one parameter, and the return type is parameter type
968
static int32_t translateMinMax(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
536,884✔
969
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
536,884✔
970

971
  SDataType* dataType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
536,796✔
972
  uint8_t    paraType = IS_NULL_TYPE(dataType->type) ? TSDB_DATA_TYPE_BIGINT : dataType->type;
536,796✔
973
  int32_t    bytes = IS_STR_DATA_TYPE(paraType) ? dataType->bytes : tDataTypes[paraType].bytes;
536,796!
974
  uint8_t    prec = IS_DECIMAL_TYPE(paraType) ? dataType->precision : pFunc->node.resType.precision;
536,796✔
975
  pFunc->node.resType = (SDataType){.bytes = bytes, .type = paraType, .precision = prec, .scale = dataType->scale};
536,796✔
976
  return TSDB_CODE_SUCCESS;
536,796✔
977
}
978

979
static int32_t translateAvg(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
143,147✔
980
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
143,147✔
981

982
  uint8_t dt = TSDB_DATA_TYPE_DOUBLE, prec = 0, scale = 0;
143,018✔
983

984
  bool       isMergeFunc = pFunc->funcType == FUNCTION_TYPE_AVG_MERGE || pFunc->funcType == FUNCTION_TYPE_AVG_STATE_MERGE;
143,018!
985
  SDataType* pInputDt = getSDataTypeFromNode(
201,271✔
986
      nodesListGetNode(isMergeFunc ? pFunc->pSrcFuncRef->pParameterList : pFunc->pParameterList, 0));
58,253✔
987
  pFunc->srcFuncInputType = *pInputDt;
143,018✔
988
  if (IS_DECIMAL_TYPE(pInputDt->type)) {
143,018✔
989
    SDataType sumDt = {.type = TSDB_DATA_TYPE_DECIMAL,
110✔
990
                       .bytes = tDataTypes[TSDB_DATA_TYPE_DECIMAL].bytes,
110✔
991
                       .precision = TSDB_DECIMAL_MAX_PRECISION,
992
                       .scale = pInputDt->scale};
110✔
993
    SDataType countDt = {
110✔
994
        .type = TSDB_DATA_TYPE_BIGINT, .bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .precision = 0, .scale = 0};
110✔
995
    SDataType avgDt = {0};
110✔
996
    int32_t   code = decimalGetRetType(&sumDt, &countDt, OP_TYPE_DIV, &avgDt);
110✔
997
    if (code != 0) return code;
110!
998
    dt = TSDB_DATA_TYPE_DECIMAL;
110✔
999
    prec = TSDB_DECIMAL_MAX_PRECISION;
110✔
1000
    scale = avgDt.scale;
110✔
1001
  }
1002
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[dt].bytes, .type = dt, .precision = prec, .scale = scale};
143,018✔
1003
  return TSDB_CODE_SUCCESS;
143,018✔
1004
}
1005

1006
// The return type is DOUBLE type
1007
static int32_t translateOutDouble(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
297,590✔
1008
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
297,590✔
1009
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
294,456✔
1010
  return TSDB_CODE_SUCCESS;
294,456✔
1011
}
1012

1013
static int32_t translateBase64(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
17✔
1014
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
17!
1015

1016
  SDataType* pRestType1 = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
17✔
1017
  int32_t outputLength = base64BufSize(pRestType1->bytes);
17✔
1018

1019
  pFunc->node.resType = (SDataType){.bytes = outputLength, .type = TSDB_DATA_TYPE_VARCHAR};
17✔
1020
  return TSDB_CODE_SUCCESS;
17✔
1021
}
1022

1023
static int32_t translateTrimStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len, bool isLtrim) {
77,144✔
1024
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
77,144✔
1025

1026
  SDataType* pRestType1 = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
68,583✔
1027

1028
  int32_t numOfSpaces = 0;
68,583✔
1029
  SNode*  pParamNode1 = nodesListGetNode(pFunc->pParameterList, 0);
68,583✔
1030
  // for select trim functions with constant value from table,
1031
  // need to set the proper result result schema bytes to avoid
1032
  // trailing garbage characters
1033
  if (nodeType(pParamNode1) == QUERY_NODE_VALUE) {
68,583✔
1034
    SValueNode* pValue = (SValueNode*)pParamNode1;
328✔
1035
    numOfSpaces = countTrailingSpaces(pValue, isLtrim);
328✔
1036
  }
1037

1038
  int32_t resBytes = pRestType1->bytes - numOfSpaces;
68,583✔
1039
  pFunc->node.resType = (SDataType){.bytes = resBytes, .type = pRestType1->type};
68,583✔
1040
  return TSDB_CODE_SUCCESS;
68,583✔
1041
}
1042

1043
static int32_t translateLtrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
41,307✔
1044
  return translateTrimStr(pFunc, pErrBuf, len, true);
41,307✔
1045
}
1046

1047
static int32_t translateRtrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
35,837✔
1048
  return translateTrimStr(pFunc, pErrBuf, len, false);
35,837✔
1049
}
1050

1051
// The return type is BIGINT type
1052
static int32_t translateOutBigInt(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
829,861✔
1053
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
829,861✔
1054
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
822,341✔
1055
  return TSDB_CODE_SUCCESS;
822,341✔
1056
}
1057

1058
static int32_t translateSum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
448,049✔
1059
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
448,049✔
1060

1061
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
448,012✔
1062
  uint8_t resType = 0;
448,011✔
1063
  uint8_t prec = 0, scale = 0;
448,011✔
1064
  if (IS_SIGNED_NUMERIC_TYPE(paraType) || TSDB_DATA_TYPE_BOOL == paraType || IS_NULL_TYPE(paraType)) {
448,011!
1065
    resType = TSDB_DATA_TYPE_BIGINT;
432,230✔
1066
  } else if (IS_UNSIGNED_NUMERIC_TYPE(paraType)) {
15,781✔
1067
    resType = TSDB_DATA_TYPE_UBIGINT;
237✔
1068
  } else if (IS_FLOAT_TYPE(paraType)) {
15,544✔
1069
    resType = TSDB_DATA_TYPE_DOUBLE;
15,419✔
1070
  } else if (IS_DECIMAL_TYPE(paraType)) {
125!
1071
    resType = TSDB_DATA_TYPE_DECIMAL;
125✔
1072
    prec = TSDB_DECIMAL_MAX_PRECISION;
125✔
1073
    scale = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.scale;
125✔
1074
  }
1075

1076
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType, .precision = prec, .scale = scale};
448,011✔
1077
  return TSDB_CODE_SUCCESS;
448,011✔
1078
}
1079

1080
static int32_t translateWduration(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
600✔
1081
  // pseudo column do not need to check parameters
1082
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes,
600✔
1083
                                    .type = TSDB_DATA_TYPE_BIGINT,
1084
                                    .precision = pFunc->node.resType.precision};
600✔
1085
  return TSDB_CODE_SUCCESS;
600✔
1086
}
1087

1088
static int32_t translateNowToday(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
146,598✔
1089
  // pseudo column do not need to check parameters
1090

1091
  // add database precision as param
1092
  uint8_t dbPrec = pFunc->node.resType.precision;
146,598✔
1093
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
146,598✔
1094
  if (code != TSDB_CODE_SUCCESS) {
146,598!
1095
    return code;
×
1096
  }
1097

1098
  pFunc->node.resType =
146,598✔
1099
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
146,598✔
1100
  return TSDB_CODE_SUCCESS;
146,598✔
1101
}
1102

1103
static int32_t translateRand(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
26✔
1104
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
26✔
1105

1106
  if (!pFunc->dual) {
22✔
1107
    int32_t code = addPseudoParam(&pFunc->pParameterList);
3✔
1108
    if (code != TSDB_CODE_SUCCESS) {
3!
1109
      return code;
×
1110
    }
1111
  }
1112

1113
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
22✔
1114
  return TSDB_CODE_SUCCESS;
22✔
1115
}
1116

1117
// return type is same as first input parameter's type
1118
static int32_t translateOutFirstIn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
608,824✔
1119
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
608,824✔
1120
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
588,639✔
1121
  return TSDB_CODE_SUCCESS;
588,634✔
1122
}
1123

1124
static int32_t translateTimePseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
117,109✔
1125
  // pseudo column do not need to check parameters
1126

1127
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes,
117,109✔
1128
                                    .type = TSDB_DATA_TYPE_TIMESTAMP,
1129
                                    .precision = pFunc->node.resType.precision};
117,109✔
1130
  return TSDB_CODE_SUCCESS;
117,109✔
1131
}
1132

1133
static int32_t translateIsFilledPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
13,609✔
1134
  // pseudo column do not need to check parameters
1135

1136
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes, .type = TSDB_DATA_TYPE_BOOL};
13,609✔
1137
  return TSDB_CODE_SUCCESS;
13,609✔
1138
}
1139

1140
static int32_t translatePercentile(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,223✔
1141
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
1,223✔
1142
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
932!
1143

1144
  // set result type
1145
  if (numOfParams > 2) {
932✔
1146
    pFunc->node.resType = (SDataType){.bytes = 3200, .type = TSDB_DATA_TYPE_VARCHAR};
25✔
1147
  } else {
1148
    pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
907✔
1149
  }
1150
  return TSDB_CODE_SUCCESS;
932✔
1151
}
1152

1153
static int32_t translateVgIdColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
39,452✔
1154
  // pseudo column do not need to check parameters
1155
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
39,452✔
1156
  return TSDB_CODE_SUCCESS;
39,452✔
1157
}
1158

1159
static int32_t reserveFirstMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
6,584✔
1160
  int32_t code = nodesListMakeAppend(pParameters, pPartialRes);
6,584✔
1161
  if (TSDB_CODE_SUCCESS == code) {
6,584!
1162
    SNode* pNew = NULL;
6,584✔
1163
    code = nodesCloneNode(nodesListGetNode(pRawParameters, 1), &pNew);
6,584✔
1164
    if (TSDB_CODE_SUCCESS == code) {
6,584!
1165
      code = nodesListStrictAppend(*pParameters, pNew);
6,584✔
1166
    }
1167
  }
1168
  return code;
6,584✔
1169
}
1170

1171
int32_t topBotCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
1,488✔
1172
  return reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
1,488✔
1173
}
1174

1175
int32_t apercentileCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
5,096✔
1176
  int32_t code = reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
5,096✔
1177
  if (TSDB_CODE_SUCCESS == code && pRawParameters->length >= 3) {
5,096!
1178
    SNode* pNew = NULL;
482✔
1179
    code = nodesCloneNode(nodesListGetNode(pRawParameters, 2), &pNew);
482✔
1180
    if (TSDB_CODE_SUCCESS == code) {
482!
1181
      code = nodesListStrictAppend(*pParameters, pNew);
482✔
1182
    }
1183
  }
1184
  return code;
5,096✔
1185
}
1186

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

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

1191
static int32_t translateCsum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
9,205✔
1192
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
9,205✔
1193
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
8,897✔
1194
  uint8_t resType;
1195
  if (IS_SIGNED_NUMERIC_TYPE(colType)) {
8,897!
1196
    resType = TSDB_DATA_TYPE_BIGINT;
4,899✔
1197
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
3,998!
1198
    resType = TSDB_DATA_TYPE_UBIGINT;
128✔
1199
  } else if (IS_FLOAT_TYPE(colType)) {
3,870!
1200
    resType = TSDB_DATA_TYPE_DOUBLE;
3,870✔
1201
  } else {
1202
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
1203
  }
1204
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
8,897✔
1205
  return TSDB_CODE_SUCCESS;
8,897✔
1206
}
1207

1208
static EFuncReturnRows csumEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
8,638✔
1209

1210
static int32_t translateSampleTail(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
21,510✔
1211
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
21,510✔
1212

1213
  SDataType* pSDataType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
21,050✔
1214
  uint8_t    colType = pSDataType->type;
21,050✔
1215

1216
  // set result type
1217
  pFunc->node.resType =
21,050✔
1218
      (SDataType){.bytes = IS_STR_DATA_TYPE(colType) ? pSDataType->bytes : tDataTypes[colType].bytes, .type = colType};
21,050✔
1219
  return TSDB_CODE_SUCCESS;
21,050✔
1220
}
1221

1222
static EFuncReturnRows derivativeEstReturnRows(SFunctionNode* pFunc) {
2,178✔
1223
  return 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 2))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
2,178✔
1224
                                                                                 : FUNC_RETURN_ROWS_N_MINUS_1;
2,178✔
1225
}
1226

1227
static int32_t translateAddPrecOutDouble(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
3,026✔
1228
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
3,026✔
1229
  // add database precision as param
1230
  uint8_t dbPrec = pFunc->node.resType.precision;
2,882✔
1231
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
2,882✔
1232
  if (code != TSDB_CODE_SUCCESS) {
2,882!
1233
    return code;
×
1234
  }
1235

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

1240
static int32_t translateInterp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1241
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1242
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
×
1243
  return TSDB_CODE_SUCCESS;
×
1244
}
1245

1246
static EFuncReturnRows interpEstReturnRows(SFunctionNode* pFunc) {
36,087✔
1247
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
36,087!
1248
  if (1 < numOfParams && 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i) {
36,087✔
1249
    return FUNC_RETURN_ROWS_INDEFINITE;
93✔
1250
  } else {
1251
    return FUNC_RETURN_ROWS_N;
35,994✔
1252
  }
1253
}
1254

1255
static int32_t translateForecast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1256
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
×
1257
  if (2 != numOfParams && 1 != numOfParams) {
×
1258
    return invaildFuncParaNumErrMsg(pErrBuf, len, "FORECAST require 1 or 2 parameters");
×
1259
  }
1260

1261
  uint8_t valType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
1262
  if (!IS_MATHABLE_TYPE(valType)) {
×
1263
    return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST only support mathable column");
×
1264
  }
1265

1266
  if (numOfParams == 2) {
×
1267
    uint8_t optionType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
×
1268
    if (TSDB_DATA_TYPE_BINARY != optionType) {
×
1269
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be varchar");
×
1270
    }
1271

1272
    SNode* pOption = nodesListGetNode(pFunc->pParameterList, 1);
×
1273
    if (QUERY_NODE_VALUE != nodeType(pOption)) {
×
1274
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be value");
×
1275
    }
1276

1277
    SValueNode* pValue = (SValueNode*)pOption;
×
1278
    if (!taosAnalyGetOptStr(pValue->literal, "algo", NULL, 0) != 0) {
×
1279
      return invaildFuncParaValueErrMsg(pErrBuf, len, "FORECAST option should include algo field");
×
1280
    }
1281

1282
    pValue->notReserved = true;
×
1283
  }
1284

1285
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[valType].bytes, .type = valType};
×
1286
  return TSDB_CODE_SUCCESS;
×
1287
}
1288

1289
static int32_t translateForecastConf(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1290
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_FLOAT].bytes, .type = TSDB_DATA_TYPE_FLOAT};
×
1291
  return TSDB_CODE_SUCCESS;
×
1292
}
1293

1294
static EFuncReturnRows forecastEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
×
1295

1296
static int32_t translateDiff(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
7,591✔
1297
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
7,591✔
1298
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
7,369✔
1299

1300
  uint8_t resType;
1301
  if (IS_SIGNED_NUMERIC_TYPE(colType) || IS_TIMESTAMP_TYPE(colType) || TSDB_DATA_TYPE_BOOL == colType) {
7,369✔
1302
    resType = TSDB_DATA_TYPE_BIGINT;
5,487✔
1303
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
1,882!
1304
    resType = TSDB_DATA_TYPE_BIGINT;
472✔
1305
  } else {
1306
    resType = TSDB_DATA_TYPE_DOUBLE;
1,410✔
1307
  }
1308
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
7,369✔
1309
  return TSDB_CODE_SUCCESS;
7,369✔
1310
}
1311

1312
static EFuncReturnRows diffEstReturnRows(SFunctionNode* pFunc) {
7,240✔
1313
  if (1 == LIST_LENGTH(pFunc->pParameterList)) {
7,240!
1314
    return FUNC_RETURN_ROWS_N_MINUS_1;
4,526✔
1315
  }
1316
  return 1 < ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
2,714✔
1317
                                                                                : FUNC_RETURN_ROWS_N_MINUS_1;
2,714✔
1318
}
1319

1320
static int32_t translateConcatImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len, int32_t minParaNum,
170,514✔
1321
                                   int32_t maxParaNum, bool hasSep) {
1322
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
170,514✔
1323
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
163,890!
1324

1325
  uint8_t resultType = TSDB_DATA_TYPE_BINARY;
163,890✔
1326
  int32_t resultBytes = 0;
163,890✔
1327
  int32_t sepBytes = 0;
163,890✔
1328

1329
  /* For concat/concat_ws function, if params have NCHAR type, promote the final result to NCHAR */
1330
  for (int32_t i = 0; i < numOfParams; ++i) {
863,041✔
1331
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
699,151✔
1332
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
699,151✔
1333
    if (TSDB_DATA_TYPE_NCHAR == paraType) {
699,151✔
1334
      resultType = paraType;
67,951✔
1335
    }
1336
  }
1337

1338
  for (int32_t i = 0; i < numOfParams; ++i) {
863,001✔
1339
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
699,127✔
1340
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
699,127✔
1341
    int32_t paraBytes = getSDataTypeFromNode(pPara)->bytes;
699,127✔
1342
    int32_t factor = 1;
699,127✔
1343
    if (IS_NULL_TYPE(paraType)) {
699,127✔
1344
      resultType = TSDB_DATA_TYPE_VARCHAR;
16✔
1345
      resultBytes = 0;
16✔
1346
      sepBytes = 0;
16✔
1347
      break;
16✔
1348
    }
1349
    if (TSDB_DATA_TYPE_NCHAR == resultType && TSDB_DATA_TYPE_VARCHAR == paraType) {
699,111✔
1350
      factor *= TSDB_NCHAR_SIZE;
116,870✔
1351
    }
1352
    resultBytes += paraBytes * factor;
699,111✔
1353

1354
    if (i == 0) {
699,111✔
1355
      sepBytes = paraBytes * factor;
163,874✔
1356
    }
1357
  }
1358

1359
  if (hasSep) {
163,890✔
1360
    resultBytes += sepBytes * (numOfParams - 3);
69,912✔
1361
  }
1362

1363
  pFunc->node.resType = (SDataType){.bytes = resultBytes, .type = resultType};
163,890✔
1364
  return TSDB_CODE_SUCCESS;
163,890✔
1365
}
1366

1367
static int32_t translateConcat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
96,922✔
1368
  return translateConcatImpl(pFunc, pErrBuf, len, 2, 8, false);
96,922✔
1369
}
1370

1371
static int32_t translateConcatWs(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
73,592✔
1372
  return translateConcatImpl(pFunc, pErrBuf, len, 3, 9, true);
73,592✔
1373
}
1374

1375
static int32_t translateChar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
38✔
1376
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
38!
1377
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
38!
1378
  pFunc->node.resType = (SDataType){.bytes = 4 * numOfParams + 2, .type = TSDB_DATA_TYPE_VARCHAR};
38✔
1379
  return TSDB_CODE_SUCCESS;
38✔
1380
}
1381

1382
static int32_t translateAscii(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
54✔
1383
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
54✔
1384
  pFunc->node.resType =
53✔
1385
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_UTINYINT].bytes, .type = TSDB_DATA_TYPE_UTINYINT};
53✔
1386
  return TSDB_CODE_SUCCESS;
53✔
1387
}
1388

1389
static int32_t translateTrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
162✔
1390
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
162!
1391

1392
  uint8_t para0Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
162✔
1393
  int32_t resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
162✔
1394
  uint8_t type = para0Type;
162✔
1395

1396
  if (2 == LIST_LENGTH(pFunc->pParameterList)) {
162!
1397
    uint8_t para1Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
126✔
1398
    resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
126✔
1399
    type = para1Type;
126✔
1400
  }
1401
  if (type == TSDB_DATA_TYPE_NCHAR) {
162✔
1402
    resLen *= TSDB_NCHAR_SIZE;
32✔
1403
  }
1404
  uint8_t trimType = pFunc->trimType;
162✔
1405
  int32_t code = addUint8Param(&pFunc->pParameterList, trimType);
162✔
1406
  if (code != TSDB_CODE_SUCCESS) {
162!
1407
    return code;
×
1408
  }
1409
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
162✔
1410
  return TSDB_CODE_SUCCESS;
162✔
1411
}
1412

1413
static int32_t translateReplace(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
131✔
1414
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
131!
1415

1416
  uint8_t orgType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
131✔
1417
  uint8_t fromType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
131✔
1418
  uint8_t toType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->type;
131✔
1419
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
131✔
1420
  int32_t fromLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
131✔
1421
  int32_t toLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->bytes;
131✔
1422

1423
  int32_t resLen;
1424
  // Since we don't know the accurate length of result, estimate the maximum length here.
1425
  // To make the resLen bigger, we should make fromLen smaller and toLen bigger.
1426
  if (orgType == TSDB_DATA_TYPE_VARBINARY && fromType != orgType) {
131!
1427
    fromLen = fromLen / TSDB_NCHAR_SIZE;
×
1428
  }
1429
  if (orgType == TSDB_DATA_TYPE_NCHAR && toType != orgType) {
131✔
1430
    toLen = toLen * TSDB_NCHAR_SIZE;
33✔
1431
  }
1432
  resLen = TMAX(orgLen, orgLen + orgLen / fromLen * (toLen - fromLen));
131✔
1433
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = orgType};
131✔
1434
  return TSDB_CODE_SUCCESS;
131✔
1435
}
1436

1437
static int32_t translateRepeat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
74✔
1438
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
74!
1439

1440
  uint8_t type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
74✔
1441
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
74✔
1442
  int32_t resLen;
1443
  if (nodeType(nodesListGetNode(pFunc->pParameterList, 1)) == QUERY_NODE_VALUE) {
74✔
1444
    resLen = orgLen * TMAX((int32_t)((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i, 1);
65✔
1445
  } else {
1446
    resLen = TSDB_MAX_BINARY_LEN;
9✔
1447
  }
1448
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
74✔
1449
  return TSDB_CODE_SUCCESS;
74✔
1450
}
1451

1452
static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
934,225✔
1453
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
934,225!
1454
  if (numOfParams <= 0) {
934,225!
1455
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1456
  }
1457

1458
  // The number of parameters has been limited by the syntax definition
1459

1460
  SExprNode* pPara0 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
934,225✔
1461
  uint8_t    para0Type = pPara0->resType.type;
934,225✔
1462
  if (TSDB_DATA_TYPE_VARBINARY == para0Type) {
934,225✔
1463
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
1✔
1464
  }
1465

1466
  // The function return type has been set during syntax parsing
1467
  uint8_t para2Type = pFunc->node.resType.type;
934,224✔
1468

1469
  int32_t para2Bytes = pFunc->node.resType.bytes;
934,224✔
1470
  if (IS_STR_DATA_TYPE(para2Type)) {
934,224✔
1471
    para2Bytes -= VARSTR_HEADER_SIZE;
730,680✔
1472
  }
1473
  if (para2Bytes <= 0 ||
934,224!
1474
      para2Bytes > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) {  // cast dst var type length limits to 4096 bytes
934,224!
1475
    if (TSDB_DATA_TYPE_NCHAR == para2Type) {
×
1476
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1477
                             "CAST function converted length should be in range (0, %d] NCHARS",
1478
                             (TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE);
1479
    } else {
1480
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1481
                             "CAST function converted length should be in range (0, %d] bytes",
1482
                             TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE);
1483
    }
1484
  }
1485

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

1493
  return TSDB_CODE_SUCCESS;
934,224✔
1494
}
1495

1496
static int32_t translateToIso8601(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
21,093✔
1497
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
21,093✔
1498
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
21,072!
1499
  // param1
1500
  if (numOfParams == 2) {
21,072✔
1501
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
110✔
1502
    if (!validateTimezoneFormat(pValue)) {
110✔
1503
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Invalid timzone format");
48✔
1504
    }
1505
  } else {  // add default client timezone
1506
    int32_t code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
20,962✔
1507
    if (code != TSDB_CODE_SUCCESS) {
20,962!
1508
      return code;
×
1509
    }
1510
  }
1511

1512
  // set result type
1513
  pFunc->node.resType = (SDataType){.bytes = 64, .type = TSDB_DATA_TYPE_BINARY};
21,024✔
1514
  return TSDB_CODE_SUCCESS;
21,024✔
1515
}
1516

1517
static int32_t translateToUnixtimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
20,865✔
1518
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
20,865✔
1519
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
20,796!
1520
  int16_t resType = TSDB_DATA_TYPE_BIGINT;
20,796✔
1521
  if (2 == numOfParams) {
20,796✔
1522
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
10✔
1523
    if (pValue->datum.i == 1) {
10✔
1524
      resType = TSDB_DATA_TYPE_TIMESTAMP;
6✔
1525
    } else if (pValue->datum.i == 0) {
4!
1526
      resType = TSDB_DATA_TYPE_BIGINT;
4✔
1527
    } else {
1528
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1529
                             "TO_UNIXTIMESTAMP function second parameter should be 0/1");
1530
    }
1531
  }
1532

1533
  // add database precision as param
1534
  uint8_t dbPrec = pFunc->node.resType.precision;
20,796✔
1535
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
20,796✔
1536
  if (code != TSDB_CODE_SUCCESS) {
20,796!
1537
    return code;
×
1538
  }
1539

1540
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
20,796✔
1541
  return TSDB_CODE_SUCCESS;
20,796✔
1542
}
1543

1544
static int32_t translateToTimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,135✔
1545
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
1,135!
1546
  pFunc->node.resType =
1,135✔
1547
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
1,135✔
1548
  return TSDB_CODE_SUCCESS;
1,135✔
1549
}
1550

1551
static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
20,210✔
1552
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
20,210✔
1553
  uint8_t dbPrec = pFunc->node.resType.precision;
19,922✔
1554
  // add database precision as param
1555
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
19,922✔
1556
  if (code != TSDB_CODE_SUCCESS) {
19,922!
1557
    return code;
×
1558
  }
1559

1560
  // add client timezone as param
1561
  code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
19,922✔
1562
  if (code != TSDB_CODE_SUCCESS) {
19,922!
1563
    return code;
×
1564
  }
1565

1566
  pFunc->node.resType =
19,922✔
1567
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
19,922✔
1568
  return TSDB_CODE_SUCCESS;
19,922✔
1569
}
1570

1571
static int32_t translateAddPrecOutBigint(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
126,772✔
1572
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
126,772✔
1573

1574
  // add database precision as param
1575
  uint8_t dbPrec = pFunc->node.resType.precision;
123,964✔
1576

1577
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
123,964✔
1578
  if (code != TSDB_CODE_SUCCESS) {
123,964!
1579
    return code;
×
1580
  }
1581

1582
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
123,964✔
1583
  return TSDB_CODE_SUCCESS;
123,964✔
1584
}
1585

1586
static int32_t translateToJson(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
17✔
1587
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
17✔
1588
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_JSON].bytes, .type = TSDB_DATA_TYPE_JSON};
16✔
1589
  return TSDB_CODE_SUCCESS;
16✔
1590
}
1591

1592
static int32_t translateOutGeom(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
77✔
1593
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
77✔
1594
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
74✔
1595
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_GEOMETRY};
74✔
1596

1597
  return TSDB_CODE_SUCCESS;
74✔
1598
}
1599

1600
static int32_t translateInGeomOutStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
12✔
1601
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
12✔
1602
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
9✔
1603
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_VARCHAR};
9✔
1604

1605
  return TSDB_CODE_SUCCESS;
9✔
1606
}
1607

1608
static int32_t translateIn2GeomOutBool(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
84✔
1609
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
84✔
1610
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes, .type = TSDB_DATA_TYPE_BOOL};
54✔
1611

1612
  return TSDB_CODE_SUCCESS;
54✔
1613
}
1614

1615
static int32_t translateSelectValue(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
123,321✔
1616
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
123,321!
1617
  if (numOfParams <= 0) {
123,321!
1618
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1619
  }
1620

1621
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
123,321✔
1622
  return TSDB_CODE_SUCCESS;
123,321✔
1623
}
1624

1625
static int32_t translateBlockDistFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1626
  pFunc->node.resType = (SDataType){.bytes = 128, .type = TSDB_DATA_TYPE_VARCHAR};
×
1627
  return TSDB_CODE_SUCCESS;
×
1628
}
1629

1630
static bool getBlockDistFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
1,628✔
1631
  pEnv->calcMemSize = sizeof(STableBlockDistInfo);
1,628✔
1632
  return true;
1,628✔
1633
}
1634
static bool getBlockDBUsageFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
2✔
1635
  pEnv->calcMemSize = sizeof(SDBBlockUsageInfo);
2✔
1636
  return true;
2✔
1637
}
1638

1639
static int32_t translateGroupKey(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
258,465✔
1640
  if (1 != LIST_LENGTH(pFunc->pParameterList)) {
258,465!
1641
    return TSDB_CODE_SUCCESS;
×
1642
  }
1643
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
258,465✔
1644
  return TSDB_CODE_SUCCESS;
258,465✔
1645
}
1646

1647
static int32_t translateServerStatusFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
780✔
1648
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
780✔
1649
  return TSDB_CODE_SUCCESS;
780✔
1650
}
1651

1652
static int32_t translateTagsPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
27✔
1653
  // The _tags pseudo-column will be expanded to the actual tags on the client side
1654
  return TSDB_CODE_SUCCESS;
27✔
1655
}
1656

1657
static int32_t translateOutVarchar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
541,735✔
1658
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
541,735✔
1659
  int32_t bytes = 0;
541,692✔
1660
  switch (pFunc->funcType) {
541,692!
1661
    case FUNCTION_TYPE_MD5:
292✔
1662
      bytes = MD5_OUTPUT_LEN + VARSTR_HEADER_SIZE;
292✔
1663
      break;
292✔
1664
    case FUNCTION_TYPE_USER:
8✔
1665
    case FUNCTION_TYPE_CURRENT_USER:
1666
      bytes = TSDB_USER_LEN;
8✔
1667
      break;
8✔
1668
    case FUNCTION_TYPE_SERVER_VERSION:
1,545✔
1669
    case FUNCTION_TYPE_CLIENT_VERSION:
1670
      bytes = TSDB_VERSION_LEN;
1,545✔
1671
      break;
1,545✔
1672
    case FUNCTION_TYPE_DATABASE:
415✔
1673
      bytes = TSDB_DB_NAME_LEN;
415✔
1674
      break;
415✔
1675
    case FUNCTION_TYPE_BLOCK_DIST:
32✔
1676
    case FUNCTION_TYPE_BLOCK_DIST_INFO:
1677
      bytes = sizeof(STableBlockDistInfo);
32✔
1678
      break;
32✔
1679
    case FUNCTION_TYPE_TO_CHAR:
9,555✔
1680
      bytes = 4096;
9,555✔
1681
      break;
9,555✔
1682
    case FUNCTION_TYPE_HYPERLOGLOG_STATE_MERGE:
4,479✔
1683
    case FUNCTION_TYPE_HYPERLOGLOG_PARTIAL:
1684
    case FUNCTION_TYPE_HYPERLOGLOG_STATE:
1685
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
4,479✔
1686
      break;
4,479✔
1687
    case FUNCTION_TYPE_SPREAD_PARTIAL:
2,441✔
1688
    case FUNCTION_TYPE_SPREAD_STATE:
1689
    case FUNCTION_TYPE_SPREAD_STATE_MERGE:
1690
      bytes = getSpreadInfoSize() + VARSTR_HEADER_SIZE;
2,441✔
1691
      break;
2,441✔
1692
    case FUNCTION_TYPE_APERCENTILE_PARTIAL:
2,548✔
1693
      bytes = getApercentileMaxSize() + VARSTR_HEADER_SIZE;
2,548✔
1694
      break;
2,548✔
1695
    case FUNCTION_TYPE_STD_STATE:
2,525✔
1696
    case FUNCTION_TYPE_STD_STATE_MERGE:
1697
    case FUNCTION_TYPE_STD_PARTIAL:
1698
      bytes = getStdInfoSize() + VARSTR_HEADER_SIZE;
2,525✔
1699
      break;
2,525✔
1700
    case FUNCTION_TYPE_AVG_PARTIAL:
57,558✔
1701
    case FUNCTION_TYPE_AVG_STATE:
1702
      pFunc->srcFuncInputType = ((SExprNode*)pFunc->pParameterList->pHead->pNode)->resType;
57,558✔
1703
      bytes = getAvgInfoSize(pFunc) + VARSTR_HEADER_SIZE;
57,558✔
1704
      break;
57,558✔
1705
    case FUNCTION_TYPE_AVG_STATE_MERGE:
11,512✔
1706
      if (pFunc->pSrcFuncRef) pFunc->srcFuncInputType = pFunc->pSrcFuncRef->srcFuncInputType;
11,512✔
1707
      bytes = getAvgInfoSize(pFunc) + VARSTR_HEADER_SIZE;
11,512✔
1708
      break;
11,512✔
1709
    case FUNCTION_TYPE_HISTOGRAM_PARTIAL:
×
1710
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
×
1711
      break;
×
1712
    case FUNCTION_TYPE_HISTOGRAM:
6,202✔
1713
    case FUNCTION_TYPE_HISTOGRAM_MERGE:
1714
      bytes = 512;
6,202✔
1715
      break;
6,202✔
1716
    case FUNCTION_TYPE_LEASTSQUARES:
6,617✔
1717
      bytes = LEASTSQUARES_BUFF_LENGTH;
6,617✔
1718
      break;
6,617✔
1719
    case FUNCTION_TYPE_TBNAME:
357,947✔
1720
      bytes = TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE;
357,947✔
1721
      break;
357,947✔
1722
    case FUNCTION_TYPE_TIMEZONE:{
42,354✔
1723
      if (pFunc->tz == NULL) {
42,354✔
1724
        bytes = VARSTR_HEADER_SIZE + strlen(tsTimezoneStr);
42,349✔
1725
      }else{
1726
        char *tzName  = (char*)taosHashGet(pTimezoneNameMap, &pFunc->tz, sizeof(timezone_t));
5✔
1727
        if (tzName == NULL){
5!
1728
          tzName = TZ_UNKNOWN;
×
1729
        }
1730
        bytes = strlen(tzName) + VARSTR_HEADER_SIZE;
5✔
1731
      }
1732
      break;
42,354✔
1733
    }
1734
    case FUNCTION_TYPE_IRATE_PARTIAL:
84✔
1735
      bytes = getIrateInfoSize((pFunc->hasPk) ? pFunc->pkBytes : 0) + VARSTR_HEADER_SIZE;
84✔
1736
      break;
84✔
1737
    case FUNCTION_TYPE_FIRST_PARTIAL:
35,554✔
1738
    case FUNCTION_TYPE_LAST_PARTIAL:
1739
    case FUNCTION_TYPE_FIRST_STATE:
1740
    case FUNCTION_TYPE_LAST_STATE:
1741
      bytes = getFirstLastInfoSize(getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes,
35,554✔
1742
                                   (pFunc->hasPk) ? pFunc->pkBytes : 0) +
35,554✔
1743
              VARSTR_HEADER_SIZE;
1744
      break;
35,556✔
1745
    case FUNCTION_TYPE_FIRST_STATE_MERGE:
20✔
1746
    case FUNCTION_TYPE_LAST_STATE_MERGE:
1747
      bytes = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
20✔
1748
      break;
20✔
1749
    case FUNCTION_TYPE_DB_USAGE:
4✔
1750
    case FUNCTION_TYPE_DB_USAGE_INFO:
1751
      bytes = 128;
4✔
1752
      break;
4✔
1753
    default:
×
1754
      bytes = 0;
×
1755
      break;
×
1756
  }
1757
  pFunc->node.resType = (SDataType){.bytes = bytes, .type = TSDB_DATA_TYPE_VARCHAR};
541,694✔
1758
  return TSDB_CODE_SUCCESS;
541,694✔
1759
}
1760

1761
static int32_t invalidColsFunction(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1762
  return TSDB_CODE_PAR_INVALID_COLS_FUNCTION;
×
1763
}
1764

1765
static int32_t translateHistogramImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
13,425✔
1766
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
13,425✔
1767
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
13,312!
1768
  int8_t  binType;
1769
  char*   binDesc;
1770
  for (int32_t i = 1; i < numOfParams; ++i) {
52,718✔
1771
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, i);
39,671✔
1772
    if (i == 1) {
39,671✔
1773
      binType = validateHistogramBinType(varDataVal(pValue->datum.p));
13,312✔
1774
      if (binType == UNKNOWN_BIN) {
13,312!
1775
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1776
                               "HISTOGRAM function binType parameter should be "
1777
                               "\"user_input\", \"log_bin\" or \"linear_bin\"");
1778
      }
1779
    }
1780

1781
    if (i == 2) {
39,671✔
1782
      char errMsg[128] = {0};
13,312✔
1783
      binDesc = varDataVal(pValue->datum.p);
13,312✔
1784
      if (TSDB_CODE_SUCCESS != validateHistogramBinDesc(binDesc, binType, errMsg, (int32_t)sizeof(errMsg))) {
13,312✔
1785
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, errMsg);
265✔
1786
      }
1787
    }
1788
  }
1789
  return TSDB_CODE_SUCCESS;
13,047✔
1790
}
1791

1792
static int32_t translateHitogram(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
10,324✔
1793
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
10,324✔
1794
  pFunc->node.resType = (SDataType){.bytes = 512, .type = TSDB_DATA_TYPE_BINARY};
9,946✔
1795
  return TSDB_CODE_SUCCESS;
9,946✔
1796
}
1797
static int32_t translateHistogramPartial(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
3,101✔
1798
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
3,101!
1799
  pFunc->node.resType =
3,101✔
1800
      (SDataType){.bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY};
3,101✔
1801
  return TSDB_CODE_SUCCESS;
3,101✔
1802
}
1803

1804
#define NUMERIC_TO_STRINGS_LEN 25
1805
static int32_t translateGreatestleast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
500✔
1806
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
500✔
1807

1808
  bool mixTypeToStrings = tsCompareAsStrInGreatest;
495✔
1809

1810
  SDataType res = {.type = 0};
495✔
1811
  bool     resInit = false;
495✔
1812
  for (int32_t i = 0; i < LIST_LENGTH(pFunc->pParameterList); i++) {
2,917!
1813
    SDataType* para = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, i));
2,428✔
1814

1815
    if (IS_NULL_TYPE(para->type)) {
2,428✔
1816
      res.type = TSDB_DATA_TYPE_NULL;
6✔
1817
      res.bytes = tDataTypes[TSDB_DATA_TYPE_NULL].bytes;
6✔
1818
      break;
6✔
1819
    }
1820

1821
    if (!resInit) {
2,422✔
1822
      res.type = para->type;
493✔
1823
      res.bytes = para->bytes;
493✔
1824
      resInit = true;
493✔
1825
      continue;
493✔
1826
    }
1827

1828
    if (IS_MATHABLE_TYPE(para->type)) {
1,929!
1829
      if (res.type == para->type) {
1,135✔
1830
        continue;
194✔
1831
      } else if (IS_MATHABLE_TYPE(res.type) || !mixTypeToStrings) {
941!
1832
        int32_t resType = vectorGetConvertType(res.type, para->type);
302✔
1833
        res.type = resType == 0 ? res.type : resType;
302!
1834
        res.bytes = tDataTypes[res.type].bytes;
302✔
1835
      } else {
1836
        // last res is strings, para is numeric and mixTypeToStrings is true
1837
        res.bytes = TMAX(res.bytes, NUMERIC_TO_STRINGS_LEN);
639✔
1838
      }
1839
    } else {
1840
      if (IS_COMPARE_STR_DATA_TYPE(res.type)) {
794✔
1841
        int32_t resType = vectorGetConvertType(res.type, para->type);
598✔
1842
        res.type = resType == 0 ? res.type : resType;
598✔
1843
        res.bytes = TMAX(res.bytes, para->bytes);
598✔
1844
      } else if (mixTypeToStrings) {
196✔
1845
        // last res is numeric, para is string, and mixTypeToStrings is true
1846
        res.type = para->type;
81✔
1847
        res.bytes = TMAX(para->bytes, NUMERIC_TO_STRINGS_LEN);
81✔
1848
      } else {
1849
        // last res is numeric, para is string, and mixTypeToStrings is false
1850
        int32_t resType = vectorGetConvertType(res.type, para->type);
115✔
1851
        res.type = resType == 0 ? res.type : resType;
115!
1852
        res.bytes = tDataTypes[resType].bytes;
115✔
1853
      }
1854
    }
1855
  }
1856
  pFunc->node.resType = res;
495✔
1857
  return TSDB_CODE_SUCCESS;
495✔
1858
}
1859

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

5867
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