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

taosdata / TDengine / #4394

28 Jun 2025 01:36AM UTC coverage: 62.635% (+2.3%) from 60.352%
#4394

push

travis-ci

web-flow
enh/TS-5619-add-case-crypted-pass (#31508)

157447 of 320798 branches covered (49.08%)

Branch coverage included in aggregate %.

243780 of 319780 relevant lines covered (76.23%)

6556506.39 hits per line

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

82.36
/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,186✔
30
  va_list vArgList;
31
  va_start(vArgList, pFormat);
52,186✔
32
  (void)vsnprintf(pErrBuf, len, pFormat, vArgList);
52,186✔
33
  va_end(vArgList);
52,186✔
34
  return errCode;
52,186✔
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,862✔
42
  return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_TYPE, "Invalid parameter data type : %s", pFuncName);
33,862✔
43
}
44

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

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

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

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

63
  if (pVal->literal[0] != '1' ||
70,142✔
64
      (pVal->literal[1] != 'u' && pVal->literal[1] != 'a' && pVal->literal[1] != 's' && pVal->literal[1] != 'm' &&
67,118✔
65
       pVal->literal[1] != 'h' && pVal->literal[1] != 'd' && pVal->literal[1] != 'w' && pVal->literal[1] != 'b')) {
32,232✔
66
    return TSDB_CODE_FUNC_TIME_UNIT_INVALID;
3,053✔
67
  }
68

69
  return TSDB_CODE_SUCCESS;
67,089✔
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,432✔
193
  char      buf[TD_TIME_STR_LEN] = {0};
40,432✔
194
  time_t    t;
195
  int32_t code = taosTime(&t);
40,432✔
196
  if (code != 0) {
40,432!
197
    return code;
×
198
  }
199
  struct tm tmInfo;
200
  if (taosLocalTime(&t, &tmInfo, buf, sizeof(buf), tz) != NULL) {
40,432!
201
    (void)taosStrfTime(buf, sizeof(buf), "%z", &tmInfo);
40,432✔
202
  }
203
  int32_t len = (int32_t)strlen(buf);
40,432✔
204

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

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

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

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

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

252
  code = nodesListMakeAppend(pList, (SNode*)pVal);
1,240,363✔
253
  if (TSDB_CODE_SUCCESS != code) {
1,240,363!
254
    nodesDestroyNode((SNode*)pVal);
×
255
    return code;
×
256
  }
257
  return TSDB_CODE_SUCCESS;
1,240,363✔
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) {
8,451,679✔
276
  if (pNode == NULL) return NULL;
8,451,679!
277
  if (nodesIsExprNode(pNode)) {
8,451,679!
278
    return &((SExprNode*)pNode)->resType;
8,451,696✔
279
  } else {
280
    return NULL;
×
281
  }
282
}
283

284
static bool paramSupportNull(uint64_t typeFlag) {
105,638✔
285
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NULL_TYPE) ||
211,087✔
286
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
105,449✔
287
}
288

289
static bool paramSupportBool(uint64_t typeFlag) {
13,684✔
290
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BOOL_TYPE) ||
27,181✔
291
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
13,497✔
292
}
293

294
static bool paramSupportTinyint(uint64_t typeFlag) {
121,877✔
295
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TINYINT_TYPE) ||
243,670✔
296
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
121,793✔
297
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
96,856✔
298
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
245,302✔
299
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,632!
300
}
301

302
static bool paramSupportSmallint(uint64_t typeFlag) {
109,934✔
303
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_SMALLINT_TYPE) ||
219,868✔
304
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
109,934✔
305
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
91,746✔
306
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
221,500!
307
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,632!
308
}
309

310
static bool paramSupportInt(uint64_t typeFlag) {
753,512✔
311
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INT_TYPE) ||
1,507,027✔
312
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
753,515✔
313
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
607,713✔
314
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,508,729!
315
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,702!
316
}
317

318
static bool paramSupportBigint(uint64_t typeFlag) {
844,670✔
319
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BIGINT_TYPE) ||
1,669,462✔
320
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
824,792✔
321
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
763,511✔
322
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,671,559✔
323
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
2,097✔
324
}
325

326
static bool paramSupportFloat(uint64_t typeFlag) {
95,028✔
327
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FLOAT_TYPE) ||
190,056✔
328
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
172,673!
329
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
77,645✔
330
}
331

332
static bool paramSupportDouble(uint64_t typeFlag) {
202,809✔
333
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_DOUBLE_TYPE) ||
405,606✔
334
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
359,212✔
335
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
156,403✔
336
}
337

338
static bool paramSupportVarchar(uint64_t typeFlag) {
1,041,314✔
339
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARCHAR_TYPE) ||
1,161,742✔
340
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
120,428✔
341
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
54,587✔
342
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
1,185,579!
343
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
23,837✔
344
}
345

346
static bool paramSupportTimestamp(uint64_t typeFlag) {
377,996✔
347
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE) ||
549,598✔
348
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
384,086✔
349
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
6,090✔
350
}
351

352
static bool paramSupportNchar(uint64_t typeFlag) {
207,440✔
353
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NCHAR_TYPE) ||
257,422✔
354
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
49,982✔
355
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
27,678✔
356
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
280,788!
357
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
23,366!
358
}
359

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

368
static bool paramSupportUSmallInt(uint64_t typeFlag) {
14,648✔
369
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_USMALLINT_TYPE) ||
29,296✔
370
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
14,648✔
371
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
12,624!
372
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
29,296!
373
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
374
}
375

376
static bool paramSupportUInt(uint64_t typeFlag) {
26,928✔
377
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UINT_TYPE) ||
53,856✔
378
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
26,928✔
379
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
15,172!
380
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
53,856!
381
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
382
}
383

384
static bool paramSupportUBigInt(uint64_t typeFlag) {
26,522✔
385
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UBIGINT_TYPE) ||
53,044✔
386
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
26,522✔
387
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
5,633✔
388
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
53,044!
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,267✔
399
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARB_TYPE) ||
110,534✔
400
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
55,267✔
401
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
165,775!
402
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE);
55,241✔
403
}
404

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

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

416
static bool paramSupportValueNode(uint64_t typeFlag) {
568,943✔
417
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VALUE_NODE) ||
783,294✔
418
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE);
214,351✔
419
}
420

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

427
static bool paramSupportFunctionNode(uint64_t typeFlag) {
654,214✔
428
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
655,498✔
429
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FUNCTION_NODE) ||
655,498!
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,080✔
440
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
1,080✔
441
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_CASE_WHEN_NODE) ||
1,080!
442
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
×
443
}
444

445
static bool paramSupportColumnNode(uint64_t typeFlag) {
2,614,641✔
446
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
2,663,988✔
447
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_COLUMN_NODE) ||
2,639,155✔
448
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
24,514✔
449
}
450

451
static bool paramSupportNodeType(SNode* pNode, uint64_t typeFlag) {
3,894,922✔
452
  switch (pNode->type) {
3,894,922!
453
    case QUERY_NODE_VALUE:
568,943✔
454
      return paramSupportValueNode(typeFlag);
568,943✔
455
    case QUERY_NODE_OPERATOR:
56,040✔
456
      return paramSupportOperatorNode(typeFlag);
56,040✔
457
    case QUERY_NODE_FUNCTION:
654,214✔
458
      return paramSupportFunctionNode(typeFlag);
654,214✔
459
    case QUERY_NODE_LOGIC_CONDITION:
×
460
      return paramSupportLogicConNode(typeFlag);
×
461
    case QUERY_NODE_CASE_WHEN:
1,080✔
462
      return paramSupportCaseWhenNode(typeFlag);
1,080✔
463
    case QUERY_NODE_COLUMN:
2,614,646✔
464
      return paramSupportColumnNode(typeFlag);
2,614,646✔
465
    default:
×
466
      return false;
×
467
  }
468
}
469

470
static bool paramSupportDataType(SDataType* pDataType, uint64_t typeFlag) {
3,894,137✔
471
  switch (pDataType->type) {
3,894,137!
472
    case TSDB_DATA_TYPE_NULL:
105,637✔
473
      return paramSupportNull(typeFlag);
105,637✔
474
    case TSDB_DATA_TYPE_BOOL:
13,684✔
475
      return paramSupportBool(typeFlag);
13,684✔
476
    case TSDB_DATA_TYPE_TINYINT:
121,877✔
477
      return paramSupportTinyint(typeFlag);
121,877✔
478
    case TSDB_DATA_TYPE_SMALLINT:
109,934✔
479
      return paramSupportSmallint(typeFlag);
109,934✔
480
    case TSDB_DATA_TYPE_INT:
753,513✔
481
      return paramSupportInt(typeFlag);
753,513✔
482
    case TSDB_DATA_TYPE_BIGINT:
844,671✔
483
      return paramSupportBigint(typeFlag);
844,671✔
484
    case TSDB_DATA_TYPE_FLOAT:
95,028✔
485
      return paramSupportFloat(typeFlag);
95,028✔
486
    case TSDB_DATA_TYPE_DOUBLE:
202,809✔
487
      return paramSupportDouble(typeFlag);
202,809✔
488
    case TSDB_DATA_TYPE_VARCHAR:
997,455✔
489
      return paramSupportVarchar(typeFlag);
997,455✔
490
    case TSDB_DATA_TYPE_TIMESTAMP:
377,996✔
491
      return paramSupportTimestamp(typeFlag);
377,996✔
492
    case TSDB_DATA_TYPE_NCHAR:
185,541✔
493
      return paramSupportNchar(typeFlag);
185,541✔
494
    case TSDB_DATA_TYPE_UTINYINT:
16,258✔
495
      return paramSupportUTinyInt(typeFlag);
16,258✔
496
    case TSDB_DATA_TYPE_USMALLINT:
14,648✔
497
      return paramSupportUSmallInt(typeFlag);
14,648✔
498
    case TSDB_DATA_TYPE_UINT:
26,928✔
499
      return paramSupportUInt(typeFlag);
26,928✔
500
    case TSDB_DATA_TYPE_UBIGINT:
26,522✔
501
      return paramSupportUBigInt(typeFlag);
26,522✔
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:
107✔
507
      return paramSupportGeometry(typeFlag);
107✔
508
    case TSDB_DATA_TYPE_DECIMAL64:
1,427✔
509
    case TSDB_DATA_TYPE_DECIMAL:
510
      return paramSupportDecimal(typeFlag);
1,427✔
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;
3,627✔
522
  } else if (strcasecmp(binTypeStr, "linear_bin") == 0) {
9,685✔
523
    binType = LINEAR_BIN;
4,828✔
524
  } else if (strcasecmp(binTypeStr, "log_bin") == 0) {
4,857!
525
    binType = LOG_BIN;
4,857✔
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);
9,620✔
548
    int32_t startIndex;
549
    if (numOfParams != 4) {
9,620✔
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");
9,608✔
556
    cJSON* factor = cJSON_GetObjectItem(binDesc, "factor");
9,608✔
557
    cJSON* width = cJSON_GetObjectItem(binDesc, "width");
9,608✔
558
    cJSON* count = cJSON_GetObjectItem(binDesc, "count");
9,608✔
559
    cJSON* infinity = cJSON_GetObjectItem(binDesc, "infinity");
9,608✔
560

561
    if (!cJSON_IsNumber(start) || !cJSON_IsNumber(count) || !cJSON_IsBool(infinity)) {
9,608✔
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
9,548✔
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)) ||
9,516!
574
        (factor != NULL && isinf(factor->valuedouble)) || (count != NULL && isinf(count->valuedouble))) {
9,516!
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;
9,516✔
581
    if (infinity->valueint == false) {
9,516✔
582
      startIndex = 0;
3,231✔
583
      numOfBins = counter + 1;
3,231✔
584
    } else {
585
      startIndex = 1;
6,285✔
586
      numOfBins = counter + 3;
6,285✔
587
    }
588

589
    intervals = taosMemoryCalloc(numOfBins, sizeof(double));
9,516!
590
    if (intervals == NULL) {
9,516!
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) {
9,516!
596
      // linear bin process
597
      if (width->valuedouble == 0) {
4,736✔
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) {
37,308✔
604
        intervals[startIndex] = start->valuedouble + i * width->valuedouble;
32,576✔
605
        if (isinf(intervals[startIndex])) {
32,576!
606
          (void)snprintf(errMsg, msgLen, "%s", msg5);
×
607
          taosMemoryFree(intervals);
×
608
          cJSON_Delete(binDesc);
×
609
          return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
610
        }
611
        startIndex++;
32,576✔
612
      }
613
    } else if (cJSON_IsNumber(factor) && width == NULL && binType == LOG_BIN) {
4,780!
614
      // log bin process
615
      if (start->valuedouble == 0) {
4,752✔
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) {
4,748✔
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) {
32,032✔
628
        intervals[startIndex] = start->valuedouble * pow(factor->valuedouble, i * 1.0);
27,316✔
629
        if (isinf(intervals[startIndex])) {
27,316!
630
          (void)snprintf(errMsg, msgLen, "%s", msg5);
×
631
          taosMemoryFree(intervals);
×
632
          cJSON_Delete(binDesc);
×
633
          return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
634
        }
635
        startIndex++;
27,316✔
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) {
9,448✔
645
      intervals[0] = -INFINITY;
6,249✔
646
      intervals[numOfBins - 1] = INFINITY;
6,249✔
647
      // in case of desc bin orders, -inf/inf should be swapped
648
      if (numOfBins < 4) {
6,249!
649
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
650
      }
651

652
      if (intervals[1] > intervals[numOfBins - 2]) {
6,249✔
653
        TSWAP(intervals[0], intervals[numOfBins - 1]);
2,135✔
654
      }
655
    }
656
  } else if (cJSON_IsArray(binDesc)) { /* user input bins */
3,692✔
657
    if (binType != USER_INPUT_BIN) {
3,611✔
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);
3,607✔
663
    intervals = taosMemoryCalloc(numOfBins, sizeof(double));
3,607!
664
    if (intervals == NULL) {
3,607!
665
      (void)snprintf(errMsg, msgLen, "%s", msg9);
×
666
      cJSON_Delete(binDesc);
×
667
      return terrno;
×
668
    }
669
    cJSON* bin = binDesc->child;
3,607✔
670
    if (bin == NULL) {
3,607✔
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;
3,603✔
677
    while (bin) {
16,831✔
678
      intervals[i] = bin->valuedouble;
13,232✔
679
      if (!cJSON_IsNumber(bin)) {
13,232!
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]) {
13,232✔
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;
13,228✔
692
      i++;
13,228✔
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) {
116,436✔
706
  int32_t code = TSDB_CODE_SUCCESS;
116,436✔
707
  if (pNode->type == QUERY_NODE_VALUE) {
116,436!
708
    SValueNode* pVal = (SValueNode*)pNode;
116,436✔
709
    if (IS_INTEGER_TYPE(getSDataTypeFromNode(pNode)->type)) {
116,436!
710
      if (pVal->datum.i < range.iMinVal || pVal->datum.i > range.iMaxVal) {
116,263✔
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) {
173!
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;
116,436✔
724
}
725

726
static int32_t checkFixedValue(SNode* pNode, const SParamInfo* paramPattern, int32_t paramIdx, bool* isMatch) {
55,230✔
727
  int32_t code = TSDB_CODE_SUCCESS;
55,230✔
728
  bool    checkStr = paramSupportVarBinary(paramPattern->validDataType) ||
99,089✔
729
                  paramSupportVarchar(paramPattern->validDataType) || paramSupportNchar(paramPattern->validDataType);
99,089!
730
  if (pNode->type == QUERY_NODE_VALUE) {
55,230!
731
    SValueNode* pVal = (SValueNode*)pNode;
55,230✔
732
    if (!checkStr) {
55,230✔
733
      for (int32_t k = 0; k < paramPattern->fixedValueSize; k++) {
32,994✔
734
        if (pVal->datum.i == paramPattern->fixedNumValue[k]) {
32,968✔
735
          code = TSDB_CODE_SUCCESS;
21,873✔
736
          *isMatch = true;
21,873✔
737
          break;
21,873✔
738
        } else {
739
          code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
11,095✔
740
          *isMatch = false;
11,095✔
741
        }
742
      }
743
    } else {
744
      for (int32_t k = 0; k < paramPattern->fixedValueSize; k++) {
87,318✔
745
        if (taosStrcasecmp(pVal->literal, paramPattern->fixedStrValue[k]) == 0) {
87,247✔
746
          code = TSDB_CODE_SUCCESS;
33,260✔
747
          *isMatch = true;
33,260✔
748
          break;
33,260✔
749
        } else {
750
          code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
53,987✔
751
          *isMatch = false;
53,987✔
752
        }
753
      }
754
    }
755
  } else {
756
    // for other node type, fixed value check should be done in process function
757
  }
758
  return code;
55,230✔
759
}
760

761
static int32_t checkPrimTS(SNode* pNode, bool* isMatch) {
24,653✔
762
  int32_t code = TSDB_CODE_SUCCESS;
24,653✔
763
  if (nodeType(pNode) != QUERY_NODE_COLUMN || !IS_TIMESTAMP_TYPE(getSDataTypeFromNode(pNode)->type) ||
24,653!
764
      !((SColumnNode*)pNode)->isPrimTs) {
24,653✔
765
    code = TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS;
98✔
766
    *isMatch = false;
98✔
767
  }
768
  return code;
24,653✔
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) {
20,250✔
782
  int32_t code = TSDB_CODE_SUCCESS;
20,250✔
783
  if (!nodesExprHasColumn(pNode)) {
20,250✔
784
    code = TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL;
40✔
785
    *isMatch = false;
40✔
786
  }
787
  return code;
20,250✔
788
}
789

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

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

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

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

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

826
  // check param num
827
  if ((funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum != -1 &&
2,714,660✔
828
       LIST_LENGTH(paramList) > funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum) ||
2,484,455✔
829
      LIST_LENGTH(paramList) < funcMgtBuiltins[pFunc->funcId].parameters.minParamNum) {
2,710,356✔
830
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
8,670✔
831
  }
832

833
  // check each param
834
  for (int32_t i = 0; i < funcMgtBuiltins[pFunc->funcId].parameters.paramInfoPattern; i++) {
2,749,177✔
835
    bool              isMatch = true;
2,705,983✔
836
    int32_t           paramIdx = 0;
2,705,983✔
837
    const SParamInfo* paramPattern = funcMgtBuiltins[pFunc->funcId].parameters.inputParaInfo[i];
2,705,983✔
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;
3,446,803✔
842
           j <= (paramPattern[paramIdx].endParam == -1 ? INT32_MAX - 1 : paramPattern[paramIdx].endParam); j++) {
7,298,555✔
843
        if (j > LIST_LENGTH(paramList)) {
4,578,978✔
844
          code = TSDB_CODE_SUCCESS;
684,057✔
845
          isMatch = true;
684,057✔
846
          break;
684,057✔
847
        }
848
        SNode* pNode = nodesListGetNode(paramList, j - 1);
3,894,921✔
849
        if (NULL == pNode) {
3,894,937!
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)) {
3,894,937✔
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)) {
3,894,145✔
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) {
3,861,209✔
867
          SValueNode* pVal = (SValueNode*)pNode;
354,339✔
868
          pVal->notReserved = true;
354,339✔
869
        }
870
        switch (paramPattern[paramIdx].valueRangeFlag) {
3,861,209!
871
          case FUNC_PARAM_NO_SPECIFIC_VALUE:
3,689,543✔
872
            break;
3,689,543✔
873
          case FUNC_PARAM_HAS_RANGE:
116,436✔
874
            code = checkRangeValue(pNode, paramPattern[paramIdx].range, &isMatch);
116,436✔
875
            break;
116,436✔
876
          case FUNC_PARAM_HAS_FIXED_VALUE:
55,230✔
877
            code = checkFixedValue(pNode, &paramPattern[paramIdx], paramIdx, &isMatch);
55,230✔
878
            break;
55,230✔
879
          default:
×
880
            break;
×
881
        }
882
        if (!isMatch) {
3,861,209✔
883
          break;
6,024✔
884
        }
885
        switch (paramPattern[paramIdx].paramAttribute) {
3,855,185✔
886
          case FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE:
3,457,647✔
887
            break;
3,457,647✔
888
          case FUNC_PARAM_MUST_BE_PRIMTS:
24,653✔
889
            code = checkPrimTS(pNode, &isMatch);
24,653✔
890
            break;
24,653✔
891
          case FUNC_PARAM_MUST_BE_PK:
1✔
892
            code = checkPrimaryKey(pNode, &isMatch);
1✔
893
            break;
1✔
894
          case FUNC_PARAM_MUST_HAVE_COLUMN:
20,250✔
895
            code = checkHasColumn(pNode, &isMatch);
20,250✔
896
            break;
20,250✔
897
          case FUNC_PARAM_VALUE_NODE_NOT_NULL:
282,376✔
898
            code = checkValueNodeNotNull(pNode, &isMatch);
282,376✔
899
            break;
282,386✔
900
          case FUNC_PARAM_MUST_BE_TIME_UNIT:
70,250✔
901
            code = checkTimeUnit(pNode, pFunc->node.resType.precision, &isMatch);
70,250✔
902
            break;
70,250✔
903
          default:
8✔
904
            break;
8✔
905
        }
906
        if (!isMatch) {
3,855,195✔
907
          break;
3,443✔
908
        }
909
      }
910

911
      if (paramPattern[paramIdx].isLastParam || !isMatch) {
3,446,815✔
912
        break;
913
      }
914
      paramIdx++;
740,820✔
915
    }
916
    if (isMatch) {
2,705,995✔
917
      return TSDB_CODE_SUCCESS;
2,662,808✔
918
    }
919
  }
920
  switch (code) {
43,194!
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,053✔
940
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_INVALID, "Invalid timzone format : %s",
3,053✔
941
                             pFunc->functionName);
3,053✔
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:
13✔
951
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Function check parameter failed : %s",
13✔
952
                             pFunc->functionName);
13✔
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) {
52,112✔
958
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
52,112✔
959
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
51,369✔
960
  if (IS_NULL_TYPE(paraType)) {
51,369✔
961
    paraType = TSDB_DATA_TYPE_BIGINT;
18✔
962
  }
963
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[paraType].bytes, .type = paraType};
51,369✔
964
  return TSDB_CODE_SUCCESS;
51,369✔
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) {
463,956✔
969
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
463,956✔
970

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

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

982
  uint8_t dt = TSDB_DATA_TYPE_DOUBLE, prec = 0, scale = 0;
65,974✔
983

984
  bool       isMergeFunc = pFunc->funcType == FUNCTION_TYPE_AVG_MERGE || pFunc->funcType == FUNCTION_TYPE_AVG_STATE_MERGE;
65,974!
985
  SDataType* pInputDt = getSDataTypeFromNode(
74,905✔
986
      nodesListGetNode(isMergeFunc ? pFunc->pSrcFuncRef->pParameterList : pFunc->pParameterList, 0));
8,931✔
987
  pFunc->srcFuncInputType = *pInputDt;
65,974✔
988
  if (IS_DECIMAL_TYPE(pInputDt->type)) {
65,974✔
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};
65,974✔
1003
  return TSDB_CODE_SUCCESS;
65,974✔
1004
}
1005

1006
// The return type is DOUBLE type
1007
static int32_t translateOutDouble(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
291,222✔
1008
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
291,222✔
1009
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
288,088✔
1010
  return TSDB_CODE_SUCCESS;
288,088✔
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) {
73,221✔
1024
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
73,221✔
1025

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

1028
  int32_t numOfSpaces = 0;
64,660✔
1029
  SNode*  pParamNode1 = nodesListGetNode(pFunc->pParameterList, 0);
64,660✔
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) {
64,660✔
1034
    SValueNode* pValue = (SValueNode*)pParamNode1;
328✔
1035
    numOfSpaces = countTrailingSpaces(pValue, isLtrim);
328✔
1036
  }
1037

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

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

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

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

1058
static int32_t translateOutUnsignedInt(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
25✔
1059
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
25!
1060
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_UINT].bytes, .type = TSDB_DATA_TYPE_UINT};
25✔
1061
  return TSDB_CODE_SUCCESS;
25✔
1062
}
1063

1064
static int32_t translateSum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
397,879✔
1065
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
397,879✔
1066

1067
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
397,840✔
1068
  uint8_t resType = 0;
397,841✔
1069
  uint8_t prec = 0, scale = 0;
397,841✔
1070
  if (IS_SIGNED_NUMERIC_TYPE(paraType) || TSDB_DATA_TYPE_BOOL == paraType || IS_NULL_TYPE(paraType)) {
397,841!
1071
    resType = TSDB_DATA_TYPE_BIGINT;
381,677✔
1072
  } else if (IS_UNSIGNED_NUMERIC_TYPE(paraType)) {
16,164✔
1073
    resType = TSDB_DATA_TYPE_UBIGINT;
249✔
1074
  } else if (IS_FLOAT_TYPE(paraType)) {
15,915✔
1075
    resType = TSDB_DATA_TYPE_DOUBLE;
15,790✔
1076
  } else if (IS_DECIMAL_TYPE(paraType)) {
125!
1077
    resType = TSDB_DATA_TYPE_DECIMAL;
126✔
1078
    prec = TSDB_DECIMAL_MAX_PRECISION;
126✔
1079
    scale = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.scale;
126✔
1080
  }
1081

1082
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType, .precision = prec, .scale = scale};
397,840✔
1083
  return TSDB_CODE_SUCCESS;
397,840✔
1084
}
1085

1086
static int32_t translateWduration(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
558✔
1087
  // pseudo column do not need to check parameters
1088
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes,
558✔
1089
                                    .type = TSDB_DATA_TYPE_BIGINT,
1090
                                    .precision = pFunc->node.resType.precision};
558✔
1091
  return TSDB_CODE_SUCCESS;
558✔
1092
}
1093

1094
static int32_t translateNowToday(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
143,638✔
1095
  // pseudo column do not need to check parameters
1096

1097
  // add database precision as param
1098
  uint8_t dbPrec = pFunc->node.resType.precision;
143,638✔
1099
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
143,638✔
1100
  if (code != TSDB_CODE_SUCCESS) {
143,638!
1101
    return code;
×
1102
  }
1103

1104
  pFunc->node.resType =
143,638✔
1105
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
143,638✔
1106
  return TSDB_CODE_SUCCESS;
143,638✔
1107
}
1108

1109
static int32_t translateRand(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
26✔
1110
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
26✔
1111

1112
  if (!pFunc->dual) {
22✔
1113
    int32_t code = addPseudoParam(&pFunc->pParameterList);
3✔
1114
    if (code != TSDB_CODE_SUCCESS) {
3!
1115
      return code;
×
1116
    }
1117
  }
1118

1119
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
22✔
1120
  return TSDB_CODE_SUCCESS;
22✔
1121
}
1122

1123
// return type is same as first input parameter's type
1124
static int32_t translateOutFirstIn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
405,608✔
1125
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
405,608✔
1126
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
385,408✔
1127
  return TSDB_CODE_SUCCESS;
385,414✔
1128
}
1129

1130
static int32_t translateTimePseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
100,370✔
1131
  // pseudo column do not need to check parameters
1132

1133
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes,
100,370✔
1134
                                    .type = TSDB_DATA_TYPE_TIMESTAMP,
1135
                                    .precision = pFunc->node.resType.precision};
100,370✔
1136
  return TSDB_CODE_SUCCESS;
100,370✔
1137
}
1138

1139
static int32_t translateIsFilledPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
13,671✔
1140
  // pseudo column do not need to check parameters
1141

1142
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes, .type = TSDB_DATA_TYPE_BOOL};
13,671✔
1143
  return TSDB_CODE_SUCCESS;
13,671✔
1144
}
1145

1146
static int32_t translatePercentile(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,205✔
1147
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
1,205✔
1148
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
914!
1149

1150
  // set result type
1151
  if (numOfParams > 2) {
914✔
1152
    pFunc->node.resType = (SDataType){.bytes = 3200, .type = TSDB_DATA_TYPE_VARCHAR};
25✔
1153
  } else {
1154
    pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
889✔
1155
  }
1156
  return TSDB_CODE_SUCCESS;
914✔
1157
}
1158

1159
static int32_t translateVgIdColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
39,308✔
1160
  // pseudo column do not need to check parameters
1161
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
39,308✔
1162
  return TSDB_CODE_SUCCESS;
39,308✔
1163
}
1164

1165
static int32_t reserveFirstMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
6,014✔
1166
  int32_t code = nodesListMakeAppend(pParameters, pPartialRes);
6,014✔
1167
  if (TSDB_CODE_SUCCESS == code) {
6,014!
1168
    SNode* pNew = NULL;
6,014✔
1169
    code = nodesCloneNode(nodesListGetNode(pRawParameters, 1), &pNew);
6,014✔
1170
    if (TSDB_CODE_SUCCESS == code) {
6,014!
1171
      code = nodesListStrictAppend(*pParameters, pNew);
6,014✔
1172
    }
1173
  }
1174
  return code;
6,014✔
1175
}
1176

1177
int32_t topBotCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
1,658✔
1178
  return reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
1,658✔
1179
}
1180

1181
int32_t apercentileCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
4,356✔
1182
  int32_t code = reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
4,356✔
1183
  if (TSDB_CODE_SUCCESS == code && pRawParameters->length >= 3) {
4,356!
1184
    SNode* pNew = NULL;
482✔
1185
    code = nodesCloneNode(nodesListGetNode(pRawParameters, 2), &pNew);
482✔
1186
    if (TSDB_CODE_SUCCESS == code) {
482!
1187
      code = nodesListStrictAppend(*pParameters, pNew);
482✔
1188
    }
1189
  }
1190
  return code;
4,356✔
1191
}
1192

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

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

1197
static int32_t translateCsum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
9,211✔
1198
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
9,211✔
1199
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
8,903✔
1200
  uint8_t resType;
1201
  if (IS_SIGNED_NUMERIC_TYPE(colType)) {
8,903!
1202
    resType = TSDB_DATA_TYPE_BIGINT;
4,891✔
1203
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
4,012!
1204
    resType = TSDB_DATA_TYPE_UBIGINT;
132✔
1205
  } else if (IS_FLOAT_TYPE(colType)) {
3,880!
1206
    resType = TSDB_DATA_TYPE_DOUBLE;
3,880✔
1207
  } else {
1208
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
1209
  }
1210
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
8,903✔
1211
  return TSDB_CODE_SUCCESS;
8,903✔
1212
}
1213

1214
static EFuncReturnRows csumEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
8,644✔
1215

1216
static int32_t translateSampleTail(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
21,516✔
1217
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
21,516✔
1218

1219
  SDataType* pSDataType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
21,056✔
1220
  uint8_t    colType = pSDataType->type;
21,056✔
1221

1222
  // set result type
1223
  pFunc->node.resType =
21,056✔
1224
      (SDataType){.bytes = IS_STR_DATA_TYPE(colType) ? pSDataType->bytes : tDataTypes[colType].bytes, .type = colType};
21,056✔
1225
  return TSDB_CODE_SUCCESS;
21,056✔
1226
}
1227

1228
static EFuncReturnRows derivativeEstReturnRows(SFunctionNode* pFunc) {
2,396✔
1229
  return 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 2))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
2,396✔
1230
                                                                                 : FUNC_RETURN_ROWS_N_MINUS_1;
2,396✔
1231
}
1232

1233
static int32_t translateAddPrecOutDouble(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
2,894✔
1234
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
2,894✔
1235
  // add database precision as param
1236
  uint8_t dbPrec = pFunc->node.resType.precision;
2,750✔
1237
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
2,750✔
1238
  if (code != TSDB_CODE_SUCCESS) {
2,750!
1239
    return code;
×
1240
  }
1241

1242
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
2,750✔
1243
  return TSDB_CODE_SUCCESS;
2,750✔
1244
}
1245

1246
static int32_t translateInterp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1247
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1248
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
×
1249
  return TSDB_CODE_SUCCESS;
×
1250
}
1251

1252
static EFuncReturnRows interpEstReturnRows(SFunctionNode* pFunc) {
36,323✔
1253
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
36,323!
1254
  if (1 < numOfParams && 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i) {
36,323✔
1255
    return FUNC_RETURN_ROWS_INDEFINITE;
93✔
1256
  } else {
1257
    return FUNC_RETURN_ROWS_N;
36,230✔
1258
  }
1259
}
1260

1261
static int32_t translateForecast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
27✔
1262
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
27!
1263
  if (numOfParams < 1) {
27!
1264
    return invaildFuncParaNumErrMsg(pErrBuf, len, "FORECAST require at least one parameter");
×
1265
  }
1266

1267
  uint8_t valType = 0;
27✔
1268

1269
  // check all input parameters
1270
  int32_t num = numOfParams - 1;
27✔
1271
  if (numOfParams > 1) {
27!
1272
    for (int32_t i = 0; i < num; ++i) {
51✔
1273
      valType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, i))->type;
27✔
1274
      if (!IS_MATHABLE_TYPE(valType)) {
27!
1275
        return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST only support mathable column");
3✔
1276
      }
1277
    }
1278
  } else {
1279
    valType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
1280
    if (!IS_MATHABLE_TYPE(valType)) {
×
1281
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST only support mathable column");
×
1282
    }
1283
  }
1284

1285
  if (numOfParams >= 2) {
24!
1286
    uint8_t optionType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, numOfParams - 1))->type;
24✔
1287
    if (TSDB_DATA_TYPE_VARCHAR != optionType) {
24!
1288
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be varchar");
×
1289
    }
1290

1291
    SNode* pOption = nodesListGetNode(pFunc->pParameterList, numOfParams - 1);
24✔
1292
    if (QUERY_NODE_VALUE != nodeType(pOption)) {
24!
1293
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be value");
×
1294
    }
1295

1296
    SValueNode* pValue = (SValueNode*)pOption;
24✔
1297
    if (!taosAnalyGetOptStr(pValue->literal, "algo", NULL, 0) != 0) {
24✔
1298
      return invaildFuncParaValueErrMsg(pErrBuf, len, "FORECAST option should include algo field");
1✔
1299
    }
1300

1301
    pValue->notReserved = true;
23✔
1302
  }
1303

1304
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
23✔
1305
  return TSDB_CODE_SUCCESS;
23✔
1306
}
1307

1308
static int32_t translateForecastConf(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
20✔
1309
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_FLOAT].bytes, .type = TSDB_DATA_TYPE_FLOAT};
20✔
1310
  return TSDB_CODE_SUCCESS;
20✔
1311
}
1312

1313
static EFuncReturnRows forecastEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
23✔
1314

1315
static int32_t translateDiff(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
7,388✔
1316
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
7,388✔
1317
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
7,166✔
1318

1319
  uint8_t resType;
1320
  if (IS_SIGNED_NUMERIC_TYPE(colType) || IS_TIMESTAMP_TYPE(colType) || TSDB_DATA_TYPE_BOOL == colType) {
7,166✔
1321
    resType = TSDB_DATA_TYPE_BIGINT;
5,416✔
1322
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
1,750!
1323
    resType = TSDB_DATA_TYPE_BIGINT;
472✔
1324
  } else {
1325
    resType = TSDB_DATA_TYPE_DOUBLE;
1,278✔
1326
  }
1327
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
7,166✔
1328
  return TSDB_CODE_SUCCESS;
7,166✔
1329
}
1330

1331
static EFuncReturnRows diffEstReturnRows(SFunctionNode* pFunc) {
7,037✔
1332
  if (1 == LIST_LENGTH(pFunc->pParameterList)) {
7,037!
1333
    return FUNC_RETURN_ROWS_N_MINUS_1;
4,491✔
1334
  }
1335
  return 1 < ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
2,546✔
1336
                                                                                : FUNC_RETURN_ROWS_N_MINUS_1;
2,546✔
1337
}
1338

1339
static int32_t translateConcatImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len, int32_t minParaNum,
165,819✔
1340
                                   int32_t maxParaNum, bool hasSep) {
1341
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
165,819✔
1342
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
159,195!
1343

1344
  uint8_t resultType = TSDB_DATA_TYPE_BINARY;
159,195✔
1345
  int32_t resultBytes = 0;
159,195✔
1346
  int32_t sepBytes = 0;
159,195✔
1347

1348
  /* For concat/concat_ws function, if params have NCHAR type, promote the final result to NCHAR */
1349
  for (int32_t i = 0; i < numOfParams; ++i) {
853,265✔
1350
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
694,070✔
1351
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
694,070✔
1352
    if (TSDB_DATA_TYPE_NCHAR == paraType) {
694,070✔
1353
      resultType = paraType;
67,313✔
1354
    }
1355
  }
1356

1357
  for (int32_t i = 0; i < numOfParams; ++i) {
853,225✔
1358
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
694,046✔
1359
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
694,046✔
1360
    int32_t paraBytes = getSDataTypeFromNode(pPara)->bytes;
694,046✔
1361
    int32_t factor = 1;
694,046✔
1362
    if (IS_NULL_TYPE(paraType)) {
694,046✔
1363
      resultType = TSDB_DATA_TYPE_VARCHAR;
16✔
1364
      resultBytes = 0;
16✔
1365
      sepBytes = 0;
16✔
1366
      break;
16✔
1367
    }
1368
    if (TSDB_DATA_TYPE_NCHAR == resultType && TSDB_DATA_TYPE_VARCHAR == paraType) {
694,030✔
1369
      factor *= TSDB_NCHAR_SIZE;
119,252✔
1370
    }
1371
    resultBytes += paraBytes * factor;
694,030✔
1372

1373
    if (i == 0) {
694,030✔
1374
      sepBytes = paraBytes * factor;
159,179✔
1375
    }
1376
  }
1377

1378
  if (hasSep) {
159,195✔
1379
    resultBytes += sepBytes * (numOfParams - 3);
69,918✔
1380
  }
1381

1382
  pFunc->node.resType = (SDataType){.bytes = resultBytes, .type = resultType};
159,195✔
1383
  return TSDB_CODE_SUCCESS;
159,195✔
1384
}
1385

1386
static int32_t translateConcat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
92,221✔
1387
  return translateConcatImpl(pFunc, pErrBuf, len, 2, 8, false);
92,221✔
1388
}
1389

1390
static int32_t translateConcatWs(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
73,598✔
1391
  return translateConcatImpl(pFunc, pErrBuf, len, 3, 9, true);
73,598✔
1392
}
1393

1394
static int32_t translateChar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
44✔
1395
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
44!
1396
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
44!
1397
  pFunc->node.resType = (SDataType){.bytes = 4 * numOfParams + 2, .type = TSDB_DATA_TYPE_VARCHAR};
44✔
1398
  return TSDB_CODE_SUCCESS;
44✔
1399
}
1400

1401
static int32_t translateAscii(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
60✔
1402
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
60✔
1403
  pFunc->node.resType =
59✔
1404
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_UTINYINT].bytes, .type = TSDB_DATA_TYPE_UTINYINT};
59✔
1405
  return TSDB_CODE_SUCCESS;
59✔
1406
}
1407

1408
static int32_t translateTrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
164✔
1409
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
164!
1410

1411
  uint8_t para0Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
164✔
1412
  int32_t resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
164✔
1413
  uint8_t type = para0Type;
164✔
1414

1415
  if (2 == LIST_LENGTH(pFunc->pParameterList)) {
164!
1416
    uint8_t para1Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
126✔
1417
    resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
126✔
1418
    type = para1Type;
126✔
1419
  }
1420
  if (type == TSDB_DATA_TYPE_NCHAR) {
164✔
1421
    resLen *= TSDB_NCHAR_SIZE;
32✔
1422
  }
1423
  uint8_t trimType = pFunc->trimType;
164✔
1424
  int32_t code = addUint8Param(&pFunc->pParameterList, trimType);
164✔
1425
  if (code != TSDB_CODE_SUCCESS) {
164!
1426
    return code;
×
1427
  }
1428
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
164✔
1429
  return TSDB_CODE_SUCCESS;
164✔
1430
}
1431

1432
static int32_t translateReplace(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
137✔
1433
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
137!
1434

1435
  uint8_t orgType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
137✔
1436
  uint8_t fromType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
137✔
1437
  uint8_t toType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->type;
137✔
1438
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
137✔
1439
  int32_t fromLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
137✔
1440
  int32_t toLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->bytes;
137✔
1441

1442
  int32_t resLen;
1443
  // Since we don't know the accurate length of result, estimate the maximum length here.
1444
  // To make the resLen bigger, we should make fromLen smaller and toLen bigger.
1445
  if (orgType == TSDB_DATA_TYPE_VARBINARY && fromType != orgType) {
137!
1446
    fromLen = fromLen / TSDB_NCHAR_SIZE;
×
1447
  }
1448
  if (orgType == TSDB_DATA_TYPE_NCHAR && toType != orgType) {
137✔
1449
    toLen = toLen * TSDB_NCHAR_SIZE;
33✔
1450
  }
1451
  resLen = TMAX(orgLen, orgLen + orgLen / fromLen * (toLen - fromLen));
137✔
1452
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = orgType};
137✔
1453
  return TSDB_CODE_SUCCESS;
137✔
1454
}
1455

1456
static int32_t translateRepeat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
82✔
1457
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
82!
1458

1459
  uint8_t type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
82✔
1460
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
82✔
1461
  int32_t resLen;
1462
  if (nodeType(nodesListGetNode(pFunc->pParameterList, 1)) == QUERY_NODE_VALUE) {
82✔
1463
    resLen = orgLen * TMAX((int32_t)((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i, 1);
73✔
1464
  } else {
1465
    resLen = TSDB_MAX_BINARY_LEN;
9✔
1466
  }
1467
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
82✔
1468
  return TSDB_CODE_SUCCESS;
82✔
1469
}
1470

1471
static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
930,036✔
1472
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
930,036!
1473
  if (numOfParams <= 0) {
930,036!
1474
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1475
  }
1476

1477
  // The number of parameters has been limited by the syntax definition
1478

1479
  SExprNode* pPara0 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
930,036✔
1480
  uint8_t    para0Type = pPara0->resType.type;
930,036✔
1481
  if (TSDB_DATA_TYPE_VARBINARY == para0Type) {
930,036✔
1482
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
1✔
1483
  }
1484

1485
  // The function return type has been set during syntax parsing
1486
  uint8_t para2Type = pFunc->node.resType.type;
930,035✔
1487

1488
  int32_t para2Bytes = pFunc->node.resType.bytes;
930,035✔
1489
  if (IS_STR_DATA_TYPE(para2Type)) {
930,035✔
1490
    para2Bytes -= VARSTR_HEADER_SIZE;
731,256✔
1491
  }
1492
  if (para2Bytes <= 0 ||
930,035!
1493
      para2Bytes > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) {  // cast dst var type length limits to 4096 bytes
930,035!
1494
    if (TSDB_DATA_TYPE_NCHAR == para2Type) {
×
1495
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1496
                             "CAST function converted length should be in range (0, %d] NCHARS",
1497
                             (TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE);
1498
    } else {
1499
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1500
                             "CAST function converted length should be in range (0, %d] bytes",
1501
                             TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE);
1502
    }
1503
  }
1504

1505
  // add database precision as param
1506
  uint8_t dbPrec = pFunc->node.resType.precision;
930,035✔
1507
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
930,035✔
1508
  if (code != TSDB_CODE_SUCCESS) {
930,035!
1509
    return code;
×
1510
  }
1511

1512
  return TSDB_CODE_SUCCESS;
930,035✔
1513
}
1514

1515
static int32_t translateToIso8601(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
20,634✔
1516
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
20,634✔
1517
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
20,613!
1518
  // param1
1519
  if (numOfParams == 2) {
20,613✔
1520
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
110✔
1521
    if (!validateTimezoneFormat(pValue)) {
110✔
1522
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Invalid timzone format");
48✔
1523
    }
1524
  } else {  // add default client timezone
1525
    int32_t code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
20,503✔
1526
    if (code != TSDB_CODE_SUCCESS) {
20,503!
1527
      return code;
×
1528
    }
1529
  }
1530

1531
  // set result type
1532
  pFunc->node.resType = (SDataType){.bytes = 64, .type = TSDB_DATA_TYPE_BINARY};
20,565✔
1533
  return TSDB_CODE_SUCCESS;
20,565✔
1534
}
1535

1536
static int32_t translateToUnixtimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
20,400✔
1537
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
20,400✔
1538
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
20,331!
1539
  int16_t resType = TSDB_DATA_TYPE_BIGINT;
20,331✔
1540
  if (2 == numOfParams) {
20,331✔
1541
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
10✔
1542
    if (pValue->datum.i == 1) {
10✔
1543
      resType = TSDB_DATA_TYPE_TIMESTAMP;
6✔
1544
    } else if (pValue->datum.i == 0) {
4!
1545
      resType = TSDB_DATA_TYPE_BIGINT;
4✔
1546
    } else {
1547
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1548
                             "TO_UNIXTIMESTAMP function second parameter should be 0/1");
1549
    }
1550
  }
1551

1552
  // add database precision as param
1553
  uint8_t dbPrec = pFunc->node.resType.precision;
20,331✔
1554
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
20,331✔
1555
  if (code != TSDB_CODE_SUCCESS) {
20,331!
1556
    return code;
×
1557
  }
1558

1559
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
20,331✔
1560
  return TSDB_CODE_SUCCESS;
20,331✔
1561
}
1562

1563
static int32_t translateToTimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
826✔
1564
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
826!
1565
  pFunc->node.resType =
826✔
1566
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
826✔
1567
  return TSDB_CODE_SUCCESS;
826✔
1568
}
1569

1570
static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
20,218✔
1571
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
20,218✔
1572
  uint8_t dbPrec = pFunc->node.resType.precision;
19,929✔
1573
  // add database precision as param
1574
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
19,929✔
1575
  if (code != TSDB_CODE_SUCCESS) {
19,929!
1576
    return code;
×
1577
  }
1578

1579
  // add client timezone as param
1580
  code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
19,929✔
1581
  if (code != TSDB_CODE_SUCCESS) {
19,929!
1582
    return code;
×
1583
  }
1584

1585
  pFunc->node.resType =
19,929✔
1586
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
19,929✔
1587
  return TSDB_CODE_SUCCESS;
19,929✔
1588
}
1589

1590
static int32_t translateAddPrecOutBigint(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
126,324✔
1591
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
126,324✔
1592

1593
  // add database precision as param
1594
  uint8_t dbPrec = pFunc->node.resType.precision;
123,516✔
1595

1596
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
123,516✔
1597
  if (code != TSDB_CODE_SUCCESS) {
123,516!
1598
    return code;
×
1599
  }
1600

1601
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
123,516✔
1602
  return TSDB_CODE_SUCCESS;
123,516✔
1603
}
1604

1605
static int32_t translateToJson(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
17✔
1606
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
17✔
1607
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_JSON].bytes, .type = TSDB_DATA_TYPE_JSON};
16✔
1608
  return TSDB_CODE_SUCCESS;
16✔
1609
}
1610

1611
static int32_t translateOutGeom(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
77✔
1612
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
77✔
1613
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
74✔
1614
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_GEOMETRY};
74✔
1615

1616
  return TSDB_CODE_SUCCESS;
74✔
1617
}
1618

1619
static int32_t translateInGeomOutStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
12✔
1620
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
12✔
1621
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
9✔
1622
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_VARCHAR};
9✔
1623

1624
  return TSDB_CODE_SUCCESS;
9✔
1625
}
1626

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

1631
  return TSDB_CODE_SUCCESS;
54✔
1632
}
1633

1634
static int32_t translateSelectValue(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
125,116✔
1635
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
125,116!
1636
  if (numOfParams <= 0) {
125,116!
1637
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1638
  }
1639

1640
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
125,116✔
1641
  return TSDB_CODE_SUCCESS;
125,116✔
1642
}
1643

1644
static int32_t translateBlockDistFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1645
  pFunc->node.resType = (SDataType){.bytes = 128, .type = TSDB_DATA_TYPE_VARCHAR};
×
1646
  return TSDB_CODE_SUCCESS;
×
1647
}
1648

1649
static bool getBlockDistFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
11✔
1650
  pEnv->calcMemSize = sizeof(STableBlockDistInfo);
11✔
1651
  return true;
11✔
1652
}
1653
static bool getBlockDBUsageFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
2✔
1654
  pEnv->calcMemSize = sizeof(SDBBlockUsageInfo);
2✔
1655
  return true;
2✔
1656
}
1657

1658
static int32_t translateGroupKey(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
217,114✔
1659
  if (1 != LIST_LENGTH(pFunc->pParameterList)) {
217,114!
1660
    return TSDB_CODE_SUCCESS;
×
1661
  }
1662
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
217,114✔
1663
  return TSDB_CODE_SUCCESS;
217,114✔
1664
}
1665

1666
static int32_t translateServerStatusFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
782✔
1667
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
782✔
1668
  return TSDB_CODE_SUCCESS;
782✔
1669
}
1670

1671
static int32_t translateTagsPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
27✔
1672
  // The _tags pseudo-column will be expanded to the actual tags on the client side
1673
  return TSDB_CODE_SUCCESS;
27✔
1674
}
1675

1676
static int32_t translateOutVarchar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
476,044✔
1677
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
476,044✔
1678
  int32_t bytes = 0;
476,008✔
1679
  switch (pFunc->funcType) {
476,008!
1680
    case FUNCTION_TYPE_MD5:
226✔
1681
      bytes = MD5_OUTPUT_LEN + VARSTR_HEADER_SIZE;
226✔
1682
      break;
226✔
1683
    case FUNCTION_TYPE_USER:
8✔
1684
    case FUNCTION_TYPE_CURRENT_USER:
1685
      bytes = TSDB_USER_LEN;
8✔
1686
      break;
8✔
1687
    case FUNCTION_TYPE_SERVER_VERSION:
1,548✔
1688
    case FUNCTION_TYPE_CLIENT_VERSION:
1689
      bytes = TSDB_VERSION_LEN;
1,548✔
1690
      break;
1,548✔
1691
    case FUNCTION_TYPE_DATABASE:
417✔
1692
      bytes = TSDB_DB_NAME_LEN;
417✔
1693
      break;
417✔
1694
    case FUNCTION_TYPE_BLOCK_DIST:
36✔
1695
    case FUNCTION_TYPE_BLOCK_DIST_INFO:
1696
      bytes = sizeof(STableBlockDistInfo);
36✔
1697
      break;
36✔
1698
    case FUNCTION_TYPE_TO_CHAR:
9,562✔
1699
      bytes = 4096;
9,562✔
1700
      break;
9,562✔
1701
    case FUNCTION_TYPE_HYPERLOGLOG_STATE_MERGE:
4,018✔
1702
    case FUNCTION_TYPE_HYPERLOGLOG_PARTIAL:
1703
    case FUNCTION_TYPE_HYPERLOGLOG_STATE:
1704
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
4,018✔
1705
      break;
4,018✔
1706
    case FUNCTION_TYPE_SPREAD_PARTIAL:
1,924✔
1707
    case FUNCTION_TYPE_SPREAD_STATE:
1708
    case FUNCTION_TYPE_SPREAD_STATE_MERGE:
1709
      bytes = getSpreadInfoSize() + VARSTR_HEADER_SIZE;
1,924✔
1710
      break;
1,924✔
1711
    case FUNCTION_TYPE_APERCENTILE_PARTIAL:
2,178✔
1712
      bytes = getApercentileMaxSize() + VARSTR_HEADER_SIZE;
2,178✔
1713
      break;
2,178✔
1714
    case FUNCTION_TYPE_STD_STATE:
2,017✔
1715
    case FUNCTION_TYPE_STD_STATE_MERGE:
1716
    case FUNCTION_TYPE_STD_PARTIAL:
1717
      bytes = getStdInfoSize() + VARSTR_HEADER_SIZE;
2,017✔
1718
      break;
2,017✔
1719
    case FUNCTION_TYPE_AVG_PARTIAL:
14,693✔
1720
    case FUNCTION_TYPE_AVG_STATE:
1721
      pFunc->srcFuncInputType = ((SExprNode*)pFunc->pParameterList->pHead->pNode)->resType;
14,693✔
1722
      bytes = getAvgInfoSize(pFunc) + VARSTR_HEADER_SIZE;
14,693✔
1723
      break;
14,693✔
1724
    case FUNCTION_TYPE_AVG_STATE_MERGE:
835✔
1725
      if (pFunc->pSrcFuncRef) pFunc->srcFuncInputType = pFunc->pSrcFuncRef->srcFuncInputType;
835✔
1726
      bytes = getAvgInfoSize(pFunc) + VARSTR_HEADER_SIZE;
835✔
1727
      break;
835✔
1728
    case FUNCTION_TYPE_HISTOGRAM_PARTIAL:
×
1729
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
×
1730
      break;
×
1731
    case FUNCTION_TYPE_HISTOGRAM:
6,202✔
1732
    case FUNCTION_TYPE_HISTOGRAM_MERGE:
1733
      bytes = 512;
6,202✔
1734
      break;
6,202✔
1735
    case FUNCTION_TYPE_LEASTSQUARES:
6,571✔
1736
      bytes = LEASTSQUARES_BUFF_LENGTH;
6,571✔
1737
      break;
6,571✔
1738
    case FUNCTION_TYPE_TBNAME:
346,687✔
1739
      bytes = TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE;
346,687✔
1740
      break;
346,687✔
1741
    case FUNCTION_TYPE_TIMEZONE:{
41,882✔
1742
      if (pFunc->tz == NULL) {
41,882✔
1743
        bytes = VARSTR_HEADER_SIZE + strlen(tsTimezoneStr);
41,877✔
1744
      }else{
1745
        char *tzName  = (char*)taosHashGet(pTimezoneNameMap, &pFunc->tz, sizeof(timezone_t));
5✔
1746
        if (tzName == NULL){
5!
1747
          tzName = TZ_UNKNOWN;
×
1748
        }
1749
        bytes = strlen(tzName) + VARSTR_HEADER_SIZE;
5✔
1750
      }
1751
      break;
41,882✔
1752
    }
1753
    case FUNCTION_TYPE_IRATE_PARTIAL:
84✔
1754
      bytes = getIrateInfoSize((pFunc->hasPk) ? pFunc->pkBytes : 0) + VARSTR_HEADER_SIZE;
84✔
1755
      break;
84✔
1756
    case FUNCTION_TYPE_FIRST_PARTIAL:
37,112✔
1757
    case FUNCTION_TYPE_LAST_PARTIAL:
1758
    case FUNCTION_TYPE_FIRST_STATE:
1759
    case FUNCTION_TYPE_LAST_STATE:
1760
      bytes = getFirstLastInfoSize(getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes,
37,112✔
1761
                                   (pFunc->hasPk) ? pFunc->pkBytes : 0) +
37,112✔
1762
              VARSTR_HEADER_SIZE;
1763
      break;
37,112✔
1764
    case FUNCTION_TYPE_FIRST_STATE_MERGE:
×
1765
    case FUNCTION_TYPE_LAST_STATE_MERGE:
1766
      bytes = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
×
1767
      break;
×
1768
    case FUNCTION_TYPE_DB_USAGE:
8✔
1769
    case FUNCTION_TYPE_DB_USAGE_INFO:
1770
      bytes = 128;
8✔
1771
      break;
8✔
1772
    default:
×
1773
      bytes = 0;
×
1774
      break;
×
1775
  }
1776
  pFunc->node.resType = (SDataType){.bytes = bytes, .type = TSDB_DATA_TYPE_VARCHAR};
476,008✔
1777
  return TSDB_CODE_SUCCESS;
476,008✔
1778
}
1779

1780
static int32_t invalidColsFunction(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1781
  return TSDB_CODE_PAR_INVALID_COLS_FUNCTION;
×
1782
}
1783

1784
static int32_t translateHistogramImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
13,425✔
1785
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
13,425✔
1786
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
13,312!
1787
  int8_t  binType;
1788
  char*   binDesc;
1789
  for (int32_t i = 1; i < numOfParams; ++i) {
52,718✔
1790
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, i);
39,671✔
1791
    if (i == 1) {
39,671✔
1792
      binType = validateHistogramBinType(varDataVal(pValue->datum.p));
13,312✔
1793
      if (binType == UNKNOWN_BIN) {
13,312!
1794
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1795
                               "HISTOGRAM function binType parameter should be "
1796
                               "\"user_input\", \"log_bin\" or \"linear_bin\"");
1797
      }
1798
    }
1799

1800
    if (i == 2) {
39,671✔
1801
      char errMsg[128] = {0};
13,312✔
1802
      binDesc = varDataVal(pValue->datum.p);
13,312✔
1803
      if (TSDB_CODE_SUCCESS != validateHistogramBinDesc(binDesc, binType, errMsg, (int32_t)sizeof(errMsg))) {
13,312✔
1804
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, errMsg);
265✔
1805
      }
1806
    }
1807
  }
1808
  return TSDB_CODE_SUCCESS;
13,047✔
1809
}
1810

1811
static int32_t translateHitogram(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
10,324✔
1812
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
10,324✔
1813
  pFunc->node.resType = (SDataType){.bytes = 512, .type = TSDB_DATA_TYPE_BINARY};
9,946✔
1814
  return TSDB_CODE_SUCCESS;
9,946✔
1815
}
1816
static int32_t translateHistogramPartial(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
3,101✔
1817
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
3,101!
1818
  pFunc->node.resType =
3,101✔
1819
      (SDataType){.bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY};
3,101✔
1820
  return TSDB_CODE_SUCCESS;
3,101✔
1821
}
1822

1823
#define NUMERIC_TO_STRINGS_LEN 25
1824
static int32_t translateGreatestleast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
500✔
1825
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
500✔
1826

1827
  bool mixTypeToStrings = tsCompareAsStrInGreatest;
495✔
1828

1829
  SDataType res = {.type = 0};
495✔
1830
  bool     resInit = false;
495✔
1831
  for (int32_t i = 0; i < LIST_LENGTH(pFunc->pParameterList); i++) {
2,917!
1832
    SDataType* para = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, i));
2,428✔
1833

1834
    if (IS_NULL_TYPE(para->type)) {
2,428✔
1835
      res.type = TSDB_DATA_TYPE_NULL;
6✔
1836
      res.bytes = tDataTypes[TSDB_DATA_TYPE_NULL].bytes;
6✔
1837
      break;
6✔
1838
    }
1839

1840
    if (!resInit) {
2,422✔
1841
      res.type = para->type;
493✔
1842
      res.bytes = para->bytes;
493✔
1843
      resInit = true;
493✔
1844
      continue;
493✔
1845
    }
1846

1847
    if (IS_MATHABLE_TYPE(para->type)) {
1,929!
1848
      if (res.type == para->type) {
1,135✔
1849
        continue;
194✔
1850
      } else if (IS_MATHABLE_TYPE(res.type) || !mixTypeToStrings) {
941!
1851
        int32_t resType = vectorGetConvertType(res.type, para->type);
302✔
1852
        res.type = resType == 0 ? res.type : resType;
302!
1853
        res.bytes = tDataTypes[res.type].bytes;
302✔
1854
      } else {
1855
        // last res is strings, para is numeric and mixTypeToStrings is true
1856
        res.bytes = TMAX(res.bytes, NUMERIC_TO_STRINGS_LEN);
639✔
1857
      }
1858
    } else {
1859
      if (IS_COMPARE_STR_DATA_TYPE(res.type)) {
794✔
1860
        int32_t resType = vectorGetConvertType(res.type, para->type);
598✔
1861
        res.type = resType == 0 ? res.type : resType;
598✔
1862
        res.bytes = TMAX(res.bytes, para->bytes);
598✔
1863
      } else if (mixTypeToStrings) {
196✔
1864
        // last res is numeric, para is string, and mixTypeToStrings is true
1865
        res.type = para->type;
81✔
1866
        res.bytes = TMAX(para->bytes, NUMERIC_TO_STRINGS_LEN);
81✔
1867
      } else {
1868
        // last res is numeric, para is string, and mixTypeToStrings is false
1869
        int32_t resType = vectorGetConvertType(res.type, para->type);
115✔
1870
        res.type = resType == 0 ? res.type : resType;
115!
1871
        res.bytes = tDataTypes[resType].bytes;
115✔
1872
      }
1873
    }
1874
  }
1875
  pFunc->node.resType = res;
495✔
1876
  return TSDB_CODE_SUCCESS;
495✔
1877
}
1878

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

5918
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