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

taosdata / TDengine / #3558

17 Dec 2024 06:05AM UTC coverage: 59.778% (+1.6%) from 58.204%
#3558

push

travis-ci

web-flow
Merge pull request #29179 from taosdata/merge/mainto3.0

merge: form main to 3.0 branch

132787 of 287595 branches covered (46.17%)

Branch coverage included in aggregate %.

104 of 191 new or added lines in 5 files covered. (54.45%)

6085 existing lines in 168 files now uncovered.

209348 of 284746 relevant lines covered (73.52%)

8164844.48 hits per line

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

75.6
/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

26
static int32_t buildFuncErrMsg(char* pErrBuf, int32_t len, int32_t errCode, const char* pFormat, ...) {
38,138✔
27
  va_list vArgList;
28
  va_start(vArgList, pFormat);
38,138✔
29
  (void)vsnprintf(pErrBuf, len, pFormat, vArgList);
38,138✔
30
  va_end(vArgList);
38,138✔
31
  return errCode;
38,138✔
32
}
33

34
static int32_t invaildFuncParaNumErrMsg(char* pErrBuf, int32_t len, const char* pFuncName) {
6,433✔
35
  return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_NUM, "Invalid number of parameters : %s", pFuncName);
6,433✔
36
}
37

38
static int32_t invaildFuncParaTypeErrMsg(char* pErrBuf, int32_t len, const char* pFuncName) {
24,686✔
39
  return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_TYPE, "Invalid parameter data type : %s", pFuncName);
24,686✔
40
}
41

42
static int32_t invaildFuncParaValueErrMsg(char* pErrBuf, int32_t len, const char* pFuncName) {
54✔
43
  return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_VALUE, "Invalid parameter value : %s", pFuncName);
54✔
44
}
45

46
static int32_t validateTimeUnitParam(uint8_t dbPrec, const SValueNode* pVal) {
62,009✔
47
  if (!IS_DURATION_VAL(pVal->flag)) {
62,009!
48
    return TSDB_CODE_FUNC_TIME_UNIT_INVALID;
×
49
  }
50

51
  if (TSDB_TIME_PRECISION_MILLI == dbPrec &&
62,009✔
52
      (0 == strcasecmp(pVal->literal, "1u") || 0 == strcasecmp(pVal->literal, "1b"))) {
58,684✔
53
    return TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL;
56✔
54
  }
55

56
  if (TSDB_TIME_PRECISION_MICRO == dbPrec && 0 == strcasecmp(pVal->literal, "1b")) {
61,953✔
57
    return TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL;
23✔
58
  }
59

60
  if (pVal->literal[0] != '1' ||
61,930✔
61
      (pVal->literal[1] != 'u' && pVal->literal[1] != 'a' && pVal->literal[1] != 's' && pVal->literal[1] != 'm' &&
59,662✔
62
       pVal->literal[1] != 'h' && pVal->literal[1] != 'd' && pVal->literal[1] != 'w' && pVal->literal[1] != 'b')) {
17,945✔
63
    return TSDB_CODE_FUNC_TIME_UNIT_INVALID;
2,288✔
64
  }
65

66
  return TSDB_CODE_SUCCESS;
59,642✔
67
}
68

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

77
static bool validateHourRange(int8_t hour) {
62✔
78
  if (hour < 0 || hour > 12) {
62!
79
    return false;
12✔
80
  }
81

82
  return true;
50✔
83
}
84

85
static bool validateMinuteRange(int8_t hour, int8_t minute, char sign) {
36✔
86
  if (minute == 0 || (minute == 30 && (hour == 3 || hour == 5) && sign == '+')) {
36!
87
    return true;
24✔
88
  }
89

90
  return false;
12✔
91
}
92

93
static bool validateTimezoneFormat(const SValueNode* pVal) {
81✔
94
  if (TSDB_DATA_TYPE_BINARY != pVal->node.resType.type) {
81!
95
    return false;
×
96
  }
97

98
  char*   tz = varDataVal(pVal->datum.p);
81✔
99
  int32_t len = varDataLen(pVal->datum.p);
81✔
100

101
  char   buf[3] = {0};
81✔
102
  int8_t hour = -1, minute = -1;
81✔
103
  if (len == 0) {
81!
104
    return false;
×
105
  } else if (len == 1 && (tz[0] == 'z' || tz[0] == 'Z')) {
81✔
106
    return true;
7✔
107
  } else if ((tz[0] == '+' || tz[0] == '-')) {
74✔
108
    switch (len) {
62!
109
      case 3:
50✔
110
      case 5: {
111
        for (int32_t i = 1; i < len; ++i) {
174✔
112
          if (!isdigit(tz[i])) {
148!
113
            return false;
×
114
          }
115

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

141
          if (!isdigit(tz[i])) {
48!
142
            return false;
×
143
          }
144

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

169
  return true;
38✔
170
}
171

172
static int32_t countTrailingSpaces(const SValueNode* pVal, bool isLtrim) {
248✔
173
  int32_t numOfSpaces = 0;
248✔
174
  int32_t len = varDataLen(pVal->datum.p);
248✔
175
  char*   str = varDataVal(pVal->datum.p);
248✔
176

177
  int32_t startPos = isLtrim ? 0 : len - 1;
248✔
178
  int32_t step = isLtrim ? 1 : -1;
248✔
179
  for (int32_t i = startPos; i < len || i >= 0; i += step) {
984!
180
    if (!isspace(str[i])) {
984✔
181
      break;
248✔
182
    }
183
    numOfSpaces++;
736✔
184
  }
185

186
  return numOfSpaces;
248✔
187
}
188

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

202
  SValueNode* pVal = NULL;
36,554✔
203
  code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal);
36,554✔
204
  if (pVal == NULL) {
36,554!
205
    return code;
×
206
  }
207

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

225
  code = nodesListAppend(pList, (SNode*)pVal);
36,554✔
226
  if (TSDB_CODE_SUCCESS != code) {
36,554!
227
    nodesDestroyNode((SNode*)pVal);
×
228
    return code;
×
229
  }
230
  return TSDB_CODE_SUCCESS;
36,554✔
231
}
232

233
static int32_t addUint8Param(SNodeList** pList, uint8_t param) {
948,782✔
234
  SValueNode* pVal = NULL;
948,782✔
235
  int32_t     code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal);
948,782✔
236
  if (pVal == NULL) {
948,782!
237
    return code;
×
238
  }
239

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

249
  code = nodesListMakeAppend(pList, (SNode*)pVal);
948,782✔
250
  if (TSDB_CODE_SUCCESS != code) {
948,782!
251
    nodesDestroyNode((SNode*)pVal);
×
252
    return code;
×
253
  }
254
  return TSDB_CODE_SUCCESS;
948,782✔
255
}
256

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

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

272
static SDataType* getSDataTypeFromNode(SNode* pNode) {
7,064,449✔
273
  if (pNode == NULL) return NULL;
7,064,449!
274
  if (nodesIsExprNode(pNode)) {
7,064,449!
275
    return &((SExprNode*)pNode)->resType;
7,064,490✔
276
  } else if (QUERY_NODE_COLUMN_REF == pNode->type) {
×
277
    return &((SColumnRefNode*)pNode)->resType;
×
278
  } else {
279
    return NULL;
×
280
  }
281
}
282

283
static bool paramSupportNull(uint64_t typeFlag) {
166,501✔
284
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NULL_TYPE) ||
332,890✔
285
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
166,389✔
286
}
287

288
static bool paramSupportBool(uint64_t typeFlag) {
7,617✔
289
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BOOL_TYPE) ||
15,128✔
290
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
7,511✔
291
}
292

293
static bool paramSupportTinyint(uint64_t typeFlag) {
92,604✔
294
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TINYINT_TYPE) ||
185,145✔
295
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
92,541✔
296
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
74,283✔
297
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
186,369✔
298
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,224!
299
}
300

301
static bool paramSupportSmallint(uint64_t typeFlag) {
91,901✔
302
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_SMALLINT_TYPE) ||
183,802✔
303
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
91,901✔
304
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
76,343✔
305
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
185,026!
306
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,224!
307
}
308

309
static bool paramSupportInt(uint64_t typeFlag) {
659,821✔
310
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INT_TYPE) ||
1,319,642✔
311
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
659,821✔
312
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
550,160✔
313
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,320,918!
314
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,276!
315
}
316

317
static bool paramSupportBigint(uint64_t typeFlag) {
756,027✔
318
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BIGINT_TYPE) ||
1,496,274✔
319
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
740,247✔
320
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
700,746✔
321
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,497,846✔
322
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,572✔
323
}
324

325
static bool paramSupportFloat(uint64_t typeFlag) {
77,166✔
326
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FLOAT_TYPE) ||
154,332✔
327
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
137,293!
328
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
60,127✔
329
}
330

331
static bool paramSupportDouble(uint64_t typeFlag) {
167,746✔
332
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_DOUBLE_TYPE) ||
335,480✔
333
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
294,961✔
334
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
127,215✔
335
}
336

337
static bool paramSupportVarchar(uint64_t typeFlag) {
856,360✔
338
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARCHAR_TYPE) ||
937,993✔
339
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
81,633✔
340
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
47,535✔
341
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
957,146!
342
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
19,153✔
343
}
344

345
static bool paramSupportTimestamp(uint64_t typeFlag) {
384,495✔
346
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE) ||
578,080✔
347
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
387,317✔
348
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
2,822✔
349
}
350

351
static bool paramSupportNchar(uint64_t typeFlag) {
186,562✔
352
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NCHAR_TYPE) ||
221,533✔
353
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
34,971✔
354
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
23,219✔
355
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
240,342!
356
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
18,809!
357
}
358

359
static bool paramSupportUTinyInt(uint64_t typeFlag) {
9,503✔
360
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UTINYINT_TYPE) ||
19,006✔
361
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
9,503✔
362
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
2,504!
363
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
19,006!
364
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
365
}
366

367
static bool paramSupportUSmallInt(uint64_t typeFlag) {
9,695✔
368
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_USMALLINT_TYPE) ||
19,390✔
369
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
9,695✔
370
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
9,290!
371
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
19,390!
372
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
373
}
374

375
static bool paramSupportUInt(uint64_t typeFlag) {
10,438✔
376
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UINT_TYPE) ||
20,876✔
377
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
10,438✔
378
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
10,036!
379
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
20,876!
380
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
381
}
382

383
static bool paramSupportUBigInt(uint64_t typeFlag) {
10,698✔
384
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UBIGINT_TYPE) ||
21,396✔
385
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
10,698✔
386
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
2,703✔
387
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
21,396!
388
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
389
}
390

391
static bool paramSupportJSON(uint64_t typeFlag) {
72✔
392
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_JSON_TYPE) ||
144✔
393
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
90!
394
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE);
18!
395
}
396

397
static bool paramSupportVarBinary(uint64_t typeFlag) {
47,131✔
398
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARB_TYPE) ||
94,262✔
399
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
47,131✔
400
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
141,378!
401
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE);
47,116✔
402
}
403

UNCOV
404
static bool paramSupportGeometry(uint64_t typeFlag) {
×
UNCOV
405
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_GEOMETRY_TYPE) ||
×
UNCOV
406
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
407
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE);
×
408
}
409

410
static bool paramSupportValueNode(uint64_t typeFlag) {
502,389✔
411
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VALUE_NODE) ||
702,034✔
412
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE);
199,645✔
413
}
414

415
static bool paramSupportOperatorNode(uint64_t typeFlag) {
47,636✔
416
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
47,763✔
417
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_OPERATOR_NODE) ||
47,763!
418
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
127✔
419
}
420

421
static bool paramSupportFunctionNode(uint64_t typeFlag) {
488,144✔
422
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
488,172✔
423
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FUNCTION_NODE) ||
488,172!
424
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
28✔
425
}
426

427
static bool paramSupportLogicConNode(uint64_t typeFlag) {
×
428
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
×
429
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_LOGIC_CONDITION_NODE) ||
×
430
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
×
431
}
432

433
static bool paramSupportCaseWhenNode(uint64_t typeFlag) {
821✔
434
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
821✔
435
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_CASE_WHEN_NODE) ||
821!
436
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
×
437
}
438

439
static bool paramSupportColumnNode(uint64_t typeFlag) {
2,395,628✔
440
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
2,440,705✔
441
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_COLUMN_NODE) ||
2,417,902✔
442
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
22,274✔
443
}
444

445
static bool paramSupportNodeType(SNode* pNode, uint64_t typeFlag) {
3,434,620✔
446
  switch (pNode->type) {
3,434,620!
447
    case QUERY_NODE_VALUE:
502,389✔
448
      return paramSupportValueNode(typeFlag);
502,389✔
449
    case QUERY_NODE_OPERATOR:
47,636✔
450
      return paramSupportOperatorNode(typeFlag);
47,636✔
451
    case QUERY_NODE_FUNCTION:
488,144✔
452
      return paramSupportFunctionNode(typeFlag);
488,144✔
453
    case QUERY_NODE_LOGIC_CONDITION:
×
454
      return paramSupportLogicConNode(typeFlag);
×
455
    case QUERY_NODE_CASE_WHEN:
821✔
456
      return paramSupportCaseWhenNode(typeFlag);
821✔
457
    case QUERY_NODE_COLUMN:
2,395,646✔
458
      return paramSupportColumnNode(typeFlag);
2,395,646✔
459
    default:
×
460
      return false;
×
461
  }
462
}
463

464
static bool paramSupportDataType(SDataType* pDataType, uint64_t typeFlag) {
3,434,097✔
465
  switch (pDataType->type) {
3,434,097!
466
    case TSDB_DATA_TYPE_NULL:
166,510✔
467
      return paramSupportNull(typeFlag);
166,510✔
468
    case TSDB_DATA_TYPE_BOOL:
7,617✔
469
      return paramSupportBool(typeFlag);
7,617✔
470
    case TSDB_DATA_TYPE_TINYINT:
92,604✔
471
      return paramSupportTinyint(typeFlag);
92,604✔
472
    case TSDB_DATA_TYPE_SMALLINT:
91,901✔
473
      return paramSupportSmallint(typeFlag);
91,901✔
474
    case TSDB_DATA_TYPE_INT:
659,821✔
475
      return paramSupportInt(typeFlag);
659,821✔
476
    case TSDB_DATA_TYPE_BIGINT:
756,027✔
477
      return paramSupportBigint(typeFlag);
756,027✔
478
    case TSDB_DATA_TYPE_FLOAT:
77,166✔
479
      return paramSupportFloat(typeFlag);
77,166✔
480
    case TSDB_DATA_TYPE_DOUBLE:
167,746✔
481
      return paramSupportDouble(typeFlag);
167,746✔
482
    case TSDB_DATA_TYPE_VARCHAR:
820,989✔
483
      return paramSupportVarchar(typeFlag);
820,989✔
484
    case TSDB_DATA_TYPE_TIMESTAMP:
384,495✔
485
      return paramSupportTimestamp(typeFlag);
384,495✔
486
    case TSDB_DATA_TYPE_NCHAR:
168,850✔
487
      return paramSupportNchar(typeFlag);
168,850✔
488
    case TSDB_DATA_TYPE_UTINYINT:
9,503✔
489
      return paramSupportUTinyInt(typeFlag);
9,503✔
490
    case TSDB_DATA_TYPE_USMALLINT:
9,695✔
491
      return paramSupportUSmallInt(typeFlag);
9,695✔
492
    case TSDB_DATA_TYPE_UINT:
10,438✔
493
      return paramSupportUInt(typeFlag);
10,438✔
494
    case TSDB_DATA_TYPE_UBIGINT:
10,698✔
495
      return paramSupportUBigInt(typeFlag);
10,698✔
496
    case TSDB_DATA_TYPE_JSON:
72✔
497
      return paramSupportJSON(typeFlag);
72✔
498
    case TSDB_DATA_TYPE_VARBINARY:
15✔
499
      return paramSupportVarBinary(typeFlag);
15✔
UNCOV
500
    case TSDB_DATA_TYPE_GEOMETRY:
×
UNCOV
501
      return paramSupportGeometry(typeFlag);
×
502
    default:
×
503
      return false;
×
504
  }
505
}
506

507
typedef enum { UNKNOWN_BIN = 0, USER_INPUT_BIN, LINEAR_BIN, LOG_BIN } EHistoBinType;
508

509
static int8_t validateHistogramBinType(char* binTypeStr) {
11,773✔
510
  int8_t binType;
511
  if (strcasecmp(binTypeStr, "user_input") == 0) {
11,773✔
512
    binType = USER_INPUT_BIN;
4,687✔
513
  } else if (strcasecmp(binTypeStr, "linear_bin") == 0) {
7,086✔
514
    binType = LINEAR_BIN;
5,963✔
515
  } else if (strcasecmp(binTypeStr, "log_bin") == 0) {
1,123!
516
    binType = LOG_BIN;
1,123✔
517
  } else {
518
    binType = UNKNOWN_BIN;
×
519
  }
520

521
  return binType;
11,773✔
522
}
523

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

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

546
    cJSON* start = cJSON_GetObjectItem(binDesc, "start");
7,085✔
547
    cJSON* factor = cJSON_GetObjectItem(binDesc, "factor");
7,085✔
548
    cJSON* width = cJSON_GetObjectItem(binDesc, "width");
7,085✔
549
    cJSON* count = cJSON_GetObjectItem(binDesc, "count");
7,085✔
550
    cJSON* infinity = cJSON_GetObjectItem(binDesc, "infinity");
7,085✔
551

552
    if (!cJSON_IsNumber(start) || !cJSON_IsNumber(count) || !cJSON_IsBool(infinity)) {
7,085!
553
      (void)snprintf(errMsg, msgLen, "%s", msg3);
×
554
      cJSON_Delete(binDesc);
×
555
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
556
    }
557

558
    if (count->valueint <= 0 || count->valueint > 1000) {  // limit count to 1000
7,085!
559
      (void)snprintf(errMsg, msgLen, "%s", msg4);
×
560
      cJSON_Delete(binDesc);
×
561
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
562
    }
563

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

571
    int32_t counter = (int32_t)count->valueint;
7,085✔
572
    if (infinity->valueint == false) {
7,085✔
573
      startIndex = 0;
4,946✔
574
      numOfBins = counter + 1;
4,946✔
575
    } else {
576
      startIndex = 1;
2,139✔
577
      numOfBins = counter + 3;
2,139✔
578
    }
579

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

635
    if (infinity->valueint == true) {
7,085✔
636
      intervals[0] = -INFINITY;
2,139✔
637
      intervals[numOfBins - 1] = INFINITY;
2,139✔
638
      // in case of desc bin orders, -inf/inf should be swapped
639
      if (numOfBins < 4) {
2,139!
640
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
641
      }
642

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

691
  cJSON_Delete(binDesc);
11,772✔
692
  taosMemoryFree(intervals);
11,772!
693
  return TSDB_CODE_SUCCESS;
11,772✔
694
}
695

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

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

752
static int32_t checkPrimTS(SNode* pNode, bool* isMatch) {
22,649✔
753
  int32_t code = TSDB_CODE_SUCCESS;
22,649✔
754
  if (nodeType(pNode) != QUERY_NODE_COLUMN || !IS_TIMESTAMP_TYPE(getSDataTypeFromNode(pNode)->type) ||
22,649!
755
      !((SColumnNode*)pNode)->isPrimTs) {
22,649✔
756
    code = TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS;
84✔
757
    *isMatch = false;
84✔
758
  }
759
  return code;
22,649✔
760
}
761

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

772
static int32_t checkHasColumn(SNode* pNode, bool* isMatch) {
17,086✔
773
  int32_t code = TSDB_CODE_SUCCESS;
17,086✔
774
  if (!nodesExprHasColumn(pNode)) {
17,086✔
775
    code = TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL;
30✔
776
    *isMatch = false;
30✔
777
  }
778
  return code;
17,086✔
779
}
780

781
static int32_t checkValueNodeNotNull(SNode* pNode, bool* isMatch) {
143,829✔
782
  int32_t code = TSDB_CODE_SUCCESS;
143,829✔
783
  if (IS_NULL_TYPE(getSDataTypeFromNode(pNode)->type) && QUERY_NODE_VALUE == nodeType(pNode)) {
143,829✔
784
    code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
108✔
785
    *isMatch = false;
108✔
786
  }
787
  return code;
143,837✔
788
}
789

790
static int32_t checkTimeUnit(SNode* pNode, int32_t precision, bool* isMatch) {
62,009✔
791
  if (nodeType(pNode) != QUERY_NODE_VALUE || !IS_INTEGER_TYPE(getSDataTypeFromNode(pNode)->type)) {
62,009!
792
    *isMatch = false;
×
793
    return TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
×
794
  }
795

796
  if (IS_NULL_TYPE(getSDataTypeFromNode(pNode)->type)) {
62,009!
797
    *isMatch = true;
×
798
    return TSDB_CODE_SUCCESS;
×
799
  }
800

801
  int32_t code = validateTimeUnitParam(precision, (SValueNode*)pNode);
62,009✔
802
  if (TSDB_CODE_SUCCESS != code) {
62,009✔
803
    *isMatch = false;
2,367✔
804
  }
805
  return code;
62,009✔
806
}
807
static int32_t validateParam(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
2,886,463✔
808
  int32_t    code = TSDB_CODE_SUCCESS;
2,886,463✔
809
  SNodeList* paramList = pFunc->pParameterList;
2,886,463✔
810
  char       errMsg[128] = {0};
2,886,463✔
811

812
  // no need to check
813
  if (funcMgtBuiltins[pFunc->funcId].parameters.paramInfoPattern == 0) {
2,886,463✔
814
    return TSDB_CODE_SUCCESS;
391,508✔
815
  }
816

817
  // check param num
818
  if ((funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum != -1 &&
2,494,955✔
819
       LIST_LENGTH(paramList) > funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum) ||
2,350,262!
820
      LIST_LENGTH(paramList) < funcMgtBuiltins[pFunc->funcId].parameters.minParamNum) {
2,491,758✔
821
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
6,382✔
822
  }
823

824
  // check each param
825
  for (int32_t i = 0; i < funcMgtBuiltins[pFunc->funcId].parameters.paramInfoPattern; i++) {
2,520,235✔
826
    bool              isMatch = true;
2,488,564✔
827
    int32_t           paramIdx = 0;
2,488,564✔
828
    const SParamInfo* paramPattern = funcMgtBuiltins[pFunc->funcId].parameters.inputParaInfo[i];
2,488,564✔
829

830
    while (1) {
831
      for (int8_t j = paramPattern[paramIdx].startParam;
3,128,403✔
832
           j <= (paramPattern[paramIdx].endParam == -1 ? INT8_MAX : paramPattern[paramIdx].endParam); j++) {
6,531,372✔
833
        if (j > LIST_LENGTH(paramList)) {
3,952,341✔
834
          code = TSDB_CODE_SUCCESS;
517,703✔
835
          isMatch = true;
517,703✔
836
          break;
517,703✔
837
        }
838
        SNode* pNode = nodesListGetNode(paramList, j - 1);
3,434,638✔
839
        // check node type
840
        if (!paramSupportNodeType(pNode, paramPattern[paramIdx].validNodeType)) {
3,434,663✔
841
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
519✔
842
          isMatch = false;
519✔
843
          break;
519✔
844
        }
845
        // check data type
846
        if (!paramSupportDataType(getSDataTypeFromNode(pNode), paramPattern[paramIdx].validDataType)) {
3,434,126✔
847
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
24,059✔
848
          isMatch = false;
24,059✔
849
          break;
24,059✔
850
        }
851
        if (paramPattern[paramIdx].validNodeType == FUNC_PARAM_SUPPORT_VALUE_NODE) {
3,410,051✔
852
          SValueNode* pVal = (SValueNode*)pNode;
302,566✔
853
          pVal->notReserved = true;
302,566✔
854
        }
855
        switch (paramPattern[paramIdx].valueRangeFlag) {
3,410,051!
856
          case FUNC_PARAM_NO_SPECIFIC_VALUE:
3,262,373✔
857
            break;
3,262,373✔
858
          case FUNC_PARAM_HAS_RANGE:
100,562✔
859
            code = checkRangeValue(pNode, paramPattern[paramIdx].range, &isMatch);
100,562✔
860
            break;
100,562✔
861
          case FUNC_PARAM_HAS_FIXED_VALUE:
47,116✔
862
            code = checkFixedValue(pNode, &paramPattern[paramIdx], paramIdx, &isMatch);
47,116✔
863
            break;
47,116✔
864
          default:
×
865
            break;
×
866
        }
867
        if (!isMatch) {
3,410,051✔
868
          break;
4,501✔
869
        }
870
        switch (paramPattern[paramIdx].paramAttribute) {
3,405,550!
871
          case FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE:
3,159,995✔
872
            break;
3,159,995✔
873
          case FUNC_PARAM_MUST_BE_PRIMTS:
22,649✔
874
            code = checkPrimTS(pNode, &isMatch);
22,649✔
875
            break;
22,649✔
876
          case FUNC_PARAM_MUST_BE_PK:
1✔
877
            code = checkPrimaryKey(pNode, &isMatch);
1✔
878
            break;
1✔
879
          case FUNC_PARAM_MUST_HAVE_COLUMN:
17,086✔
880
            code = checkHasColumn(pNode, &isMatch);
17,086✔
881
            break;
17,086✔
882
          case FUNC_PARAM_VALUE_NODE_NOT_NULL:
143,830✔
883
            code = checkValueNodeNotNull(pNode, &isMatch);
143,830✔
884
            break;
143,838✔
885
          case FUNC_PARAM_MUST_BE_TIME_UNIT:
62,009✔
886
            code = checkTimeUnit(pNode, pFunc->node.resType.precision, &isMatch);
62,009✔
887
            break;
62,009✔
888
          default:
×
889
            break;
×
890
        }
891
        if (!isMatch) {
3,405,558✔
892
          break;
2,589✔
893
        }
894
      }
895

896
      if (paramPattern[paramIdx].isLastParam || !isMatch) {
3,128,402✔
897
        break;
898
      }
899
      paramIdx++;
639,839✔
900
    }
901
    if (isMatch) {
2,488,563✔
902
      return TSDB_CODE_SUCCESS;
2,456,901✔
903
    }
904
  }
905
  switch (code) {
31,671!
906
    case TSDB_CODE_FUNC_FUNTION_PARA_NUM:
×
907
      return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
908
    case TSDB_CODE_FUNC_FUNTION_PARA_TYPE:
24,686✔
909
      return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
24,686✔
910
    case TSDB_CODE_FUNC_FUNTION_PARA_VALUE:
54✔
911
      return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName);
54✔
912
    case TSDB_CODE_FUNC_FUNTION_PARA_RANGE:
4,447✔
913
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_RANGE, "Invalid parameter range : %s",
4,447✔
914
                             pFunc->functionName);
4,447✔
915
    case TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS:
84✔
916
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS,
84✔
917
                             "Parameter should be primary timestamp : %s", pFunc->functionName);
84✔
918
    case TSDB_CODE_FUNC_FUNTION_PARA_PK:
×
919
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_PK, "Parameter should be primary key : %s",
×
920
                             pFunc->functionName);
×
921
    case TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL:
30✔
922
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL, "Parameter should have column : %s",
30✔
923
                             pFunc->functionName);
30✔
924
    case TSDB_CODE_FUNC_TIME_UNIT_INVALID:
2,288✔
925
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_INVALID, "Invalid timzone format : %s",
2,288✔
926
                             pFunc->functionName);
2,288✔
927
    case TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL:
79✔
928
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL, "Time unit is too small : %s",
79✔
929
                             pFunc->functionName);
79✔
930
    case TSDB_CODE_FUNC_FUNCTION_HISTO_TYPE:
×
931
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNCTION_HISTO_TYPE, "Invalid histogram bin type : %s",
×
932
                             pFunc->functionName);
×
933
    case TSDB_CODE_FUNC_HISTOGRAM_ERROR:
×
934
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_HISTOGRAM_ERROR, errMsg, pFunc->functionName);
×
935
    default:
3✔
936
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Function check parameter failed : %s",
3✔
937
                             pFunc->functionName);
3✔
938
  }
939
}
940

941
// There is only one parameter of numeric type, and the return type is parameter type
942
static int32_t translateOutNum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
42,348✔
943
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
42,348✔
944
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
41,791✔
945
  if (IS_NULL_TYPE(paraType)) {
41,791✔
946
    paraType = TSDB_DATA_TYPE_BIGINT;
14✔
947
  }
948
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[paraType].bytes, .type = paraType};
41,791✔
949
  return TSDB_CODE_SUCCESS;
41,791✔
950
}
951

952
// There is only one parameter, and the return type is parameter type
953
static int32_t translateMinMax(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
395,789✔
954
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
395,789✔
955

956
  SDataType* dataType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
395,714✔
957
  uint8_t    paraType = IS_NULL_TYPE(dataType->type) ? TSDB_DATA_TYPE_BIGINT : dataType->type;
395,714✔
958
  int32_t    bytes = IS_STR_DATA_TYPE(paraType) ? dataType->bytes : tDataTypes[paraType].bytes;
395,714!
959
  pFunc->node.resType = (SDataType){.bytes = bytes, .type = paraType};
395,714✔
960
  return TSDB_CODE_SUCCESS;
395,714✔
961
}
962

963
// The return type is DOUBLE type
964
static int32_t translateOutDouble(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
370,610✔
965
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
370,610✔
966
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
368,163✔
967
  return TSDB_CODE_SUCCESS;
368,163✔
968
}
969

970
static int32_t translateTrimStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len, bool isLtrim) {
65,962✔
971
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
65,962✔
972

973
  SDataType* pRestType1 = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
59,662✔
974

975
  int32_t numOfSpaces = 0;
59,662✔
976
  SNode*  pParamNode1 = nodesListGetNode(pFunc->pParameterList, 0);
59,662✔
977
  // for select trim functions with constant value from table,
978
  // need to set the proper result result schema bytes to avoid
979
  // trailing garbage characters
980
  if (nodeType(pParamNode1) == QUERY_NODE_VALUE) {
59,662✔
981
    SValueNode* pValue = (SValueNode*)pParamNode1;
248✔
982
    numOfSpaces = countTrailingSpaces(pValue, isLtrim);
248✔
983
  }
984

985
  int32_t resBytes = pRestType1->bytes - numOfSpaces;
59,662✔
986
  pFunc->node.resType = (SDataType){.bytes = resBytes, .type = pRestType1->type};
59,662✔
987
  return TSDB_CODE_SUCCESS;
59,662✔
988
}
989

990
static int32_t translateLtrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
32,194✔
991
  return translateTrimStr(pFunc, pErrBuf, len, true);
32,194✔
992
}
993

994
static int32_t translateRtrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
33,768✔
995
  return translateTrimStr(pFunc, pErrBuf, len, false);
33,768✔
996
}
997

998
// The return type is BIGINT type
999
static int32_t translateOutBigInt(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
557,792✔
1000
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
557,792✔
1001
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
552,427✔
1002
  return TSDB_CODE_SUCCESS;
552,427✔
1003
}
1004

1005
static int32_t translateSum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
344,151✔
1006
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
344,151✔
1007

1008
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
344,148✔
1009
  uint8_t resType = 0;
344,148✔
1010
  if (IS_SIGNED_NUMERIC_TYPE(paraType) || TSDB_DATA_TYPE_BOOL == paraType || IS_NULL_TYPE(paraType)) {
344,148!
1011
    resType = TSDB_DATA_TYPE_BIGINT;
332,406✔
1012
  } else if (IS_UNSIGNED_NUMERIC_TYPE(paraType)) {
11,742!
1013
    resType = TSDB_DATA_TYPE_UBIGINT;
37✔
1014
  } else if (IS_FLOAT_TYPE(paraType)) {
11,705!
1015
    resType = TSDB_DATA_TYPE_DOUBLE;
11,705✔
1016
  }
1017

1018
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
344,148✔
1019
  return TSDB_CODE_SUCCESS;
344,148✔
1020
}
1021

1022
static int32_t translateWduration(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
605✔
1023
  // pseudo column do not need to check parameters
1024
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes,
605✔
1025
                                    .type = TSDB_DATA_TYPE_BIGINT,
1026
                                    .precision = pFunc->node.resType.precision};
605✔
1027
  return TSDB_CODE_SUCCESS;
605✔
1028
}
1029

1030
static int32_t translateNowToday(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
125,285✔
1031
  // pseudo column do not need to check parameters
1032

1033
  // add database precision as param
1034
  uint8_t dbPrec = pFunc->node.resType.precision;
125,285✔
1035
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
125,285✔
1036
  if (code != TSDB_CODE_SUCCESS) {
125,285!
1037
    return code;
×
1038
  }
1039

1040
  pFunc->node.resType =
125,285✔
1041
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
125,285✔
1042
  return TSDB_CODE_SUCCESS;
125,285✔
1043
}
1044

1045
static int32_t translateRand(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
26✔
1046
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
26✔
1047

1048
  if (!pFunc->dual) {
22✔
1049
    int32_t code = addPseudoParam(&pFunc->pParameterList);
3✔
1050
    if (code != TSDB_CODE_SUCCESS) {
3!
1051
      return code;
×
1052
    }
1053
  }
1054

1055
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
22✔
1056
  return TSDB_CODE_SUCCESS;
22✔
1057
}
1058

1059
// return type is same as first input parameter's type
1060
static int32_t translateOutFirstIn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
297,663✔
1061
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
297,663✔
1062
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
282,806✔
1063
  return TSDB_CODE_SUCCESS;
282,803✔
1064
}
1065

1066
static int32_t translateTimePseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
86,370✔
1067
  // pseudo column do not need to check parameters
1068

1069
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes,
86,370✔
1070
                                    .type = TSDB_DATA_TYPE_TIMESTAMP,
1071
                                    .precision = pFunc->node.resType.precision};
86,370✔
1072
  return TSDB_CODE_SUCCESS;
86,370✔
1073
}
1074

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

1078
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes, .type = TSDB_DATA_TYPE_BOOL};
11,202✔
1079
  return TSDB_CODE_SUCCESS;
11,202✔
1080
}
1081

1082
static int32_t translatePercentile(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
957✔
1083
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
957✔
1084
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
738!
1085

1086
  // set result type
1087
  if (numOfParams > 2) {
738✔
1088
    pFunc->node.resType = (SDataType){.bytes = 3200, .type = TSDB_DATA_TYPE_VARCHAR};
21✔
1089
  } else {
1090
    pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
717✔
1091
  }
1092
  return TSDB_CODE_SUCCESS;
738✔
1093
}
1094

1095
static int32_t translateVgIdColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
37,316✔
1096
  // pseudo column do not need to check parameters
1097
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
37,316✔
1098
  return TSDB_CODE_SUCCESS;
37,316✔
1099
}
1100

1101
static int32_t reserveFirstMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
4,348✔
1102
  int32_t code = nodesListMakeAppend(pParameters, pPartialRes);
4,348✔
1103
  if (TSDB_CODE_SUCCESS == code) {
4,348!
1104
    SNode* pNew = NULL;
4,348✔
1105
    code = nodesCloneNode(nodesListGetNode(pRawParameters, 1), &pNew);
4,348✔
1106
    if (TSDB_CODE_SUCCESS == code) {
4,348!
1107
      code = nodesListStrictAppend(*pParameters, pNew);
4,348✔
1108
    }
1109
  }
1110
  return code;
4,348✔
1111
}
1112

1113
int32_t topBotCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
1,098✔
1114
  return reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
1,098✔
1115
}
1116

1117
int32_t apercentileCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
3,250✔
1118
  int32_t code = reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
3,250✔
1119
  if (TSDB_CODE_SUCCESS == code && pRawParameters->length >= 3) {
3,250!
1120
    SNode* pNew = NULL;
362✔
1121
    code = nodesCloneNode(nodesListGetNode(pRawParameters, 2), &pNew);
362✔
1122
    if (TSDB_CODE_SUCCESS == code) {
362!
1123
      code = nodesListStrictAppend(*pParameters, pNew);
362✔
1124
    }
1125
  }
1126
  return code;
3,250✔
1127
}
1128

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

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

1133
static int32_t translateCsum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
8,655✔
1134
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
8,655✔
1135
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
8,424✔
1136
  uint8_t resType;
1137
  if (IS_SIGNED_NUMERIC_TYPE(colType)) {
8,424!
1138
    resType = TSDB_DATA_TYPE_BIGINT;
5,707✔
1139
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
2,717!
1140
    resType = TSDB_DATA_TYPE_UBIGINT;
93✔
1141
  } else if (IS_FLOAT_TYPE(colType)) {
2,624!
1142
    resType = TSDB_DATA_TYPE_DOUBLE;
2,624✔
1143
  } else {
1144
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
1145
  }
1146
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
8,424✔
1147
  return TSDB_CODE_SUCCESS;
8,424✔
1148
}
1149

1150
static EFuncReturnRows csumEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
8,208✔
1151

1152
static int32_t translateSampleTail(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
19,141✔
1153
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
19,141✔
1154

1155
  SDataType* pSDataType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
18,796✔
1156
  uint8_t    colType = pSDataType->type;
18,796✔
1157

1158
  // set result type
1159
  pFunc->node.resType =
18,796✔
1160
      (SDataType){.bytes = IS_STR_DATA_TYPE(colType) ? pSDataType->bytes : tDataTypes[colType].bytes, .type = colType};
18,796!
1161
  return TSDB_CODE_SUCCESS;
18,796✔
1162
}
1163

1164
static EFuncReturnRows derivativeEstReturnRows(SFunctionNode* pFunc) {
1,094✔
1165
  return 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 2))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
1,094✔
1166
                                                                                 : FUNC_RETURN_ROWS_N_MINUS_1;
1,094✔
1167
}
1168

1169
static int32_t translateAddPrecOutDouble(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
2,582✔
1170
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
2,582✔
1171
  // add database precision as param
1172
  uint8_t dbPrec = pFunc->node.resType.precision;
2,474✔
1173
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
2,474✔
1174
  if (code != TSDB_CODE_SUCCESS) {
2,474!
1175
    return code;
×
1176
  }
1177

1178
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
2,474✔
1179
  return TSDB_CODE_SUCCESS;
2,474✔
1180
}
1181

1182
static int32_t translateInterp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1183
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1184
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
×
1185
  return TSDB_CODE_SUCCESS;
×
1186
}
1187

1188
static EFuncReturnRows interpEstReturnRows(SFunctionNode* pFunc) {
32,338✔
1189
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
32,338!
1190
  if (1 < numOfParams && 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i) {
32,338✔
1191
    return FUNC_RETURN_ROWS_INDEFINITE;
57✔
1192
  } else {
1193
    return FUNC_RETURN_ROWS_N;
32,281✔
1194
  }
1195
}
1196

1197
static int32_t translateForecast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1198
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
×
1199
  if (2 != numOfParams && 1 != numOfParams) {
×
1200
    return invaildFuncParaNumErrMsg(pErrBuf, len, "FORECAST require 1 or 2 parameters");
×
1201
  }
1202

1203
  uint8_t valType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
1204
  if (!IS_MATHABLE_TYPE(valType)) {
×
1205
    return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST only support mathable column");
×
1206
  }
1207

1208
  if (numOfParams == 2) {
×
1209
    uint8_t optionType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
×
1210
    if (TSDB_DATA_TYPE_BINARY != optionType) {
×
1211
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be varchar");
×
1212
    }
1213

1214
    SNode* pOption = nodesListGetNode(pFunc->pParameterList, 1);
×
1215
    if (QUERY_NODE_VALUE != nodeType(pOption)) {
×
1216
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be value");
×
1217
    }
1218

1219
    SValueNode* pValue = (SValueNode*)pOption;
×
1220
    if (!taosAnalGetOptStr(pValue->literal, "algo", NULL, 0) != 0) {
×
1221
      return invaildFuncParaValueErrMsg(pErrBuf, len, "FORECAST option should include algo field");
×
1222
    }
1223

1224
    pValue->notReserved = true;
×
1225
  }
1226

1227
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[valType].bytes, .type = valType};
×
1228
  return TSDB_CODE_SUCCESS;
×
1229
}
1230

1231
static int32_t translateForecastConf(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1232
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_FLOAT].bytes, .type = TSDB_DATA_TYPE_FLOAT};
×
1233
  return TSDB_CODE_SUCCESS;
×
1234
}
1235

1236
static EFuncReturnRows forecastEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
×
1237

1238
static int32_t translateDiff(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
5,387✔
1239
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
5,387✔
1240
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
5,220✔
1241

1242
  uint8_t resType;
1243
  if (IS_SIGNED_NUMERIC_TYPE(colType) || IS_TIMESTAMP_TYPE(colType) || TSDB_DATA_TYPE_BOOL == colType) {
5,220✔
1244
    resType = TSDB_DATA_TYPE_BIGINT;
3,909✔
1245
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
1,311!
1246
    resType = TSDB_DATA_TYPE_BIGINT;
42✔
1247
  } else {
1248
    resType = TSDB_DATA_TYPE_DOUBLE;
1,269✔
1249
  }
1250
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
5,220✔
1251
  return TSDB_CODE_SUCCESS;
5,220✔
1252
}
1253

1254
static EFuncReturnRows diffEstReturnRows(SFunctionNode* pFunc) {
5,111✔
1255
  if (1 == LIST_LENGTH(pFunc->pParameterList)) {
5,111!
1256
    return FUNC_RETURN_ROWS_N_MINUS_1;
2,766✔
1257
  }
1258
  return 1 < ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
2,345✔
1259
                                                                                : FUNC_RETURN_ROWS_N_MINUS_1;
2,345✔
1260
}
1261

1262
static int32_t translateConcatImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len, int32_t minParaNum,
135,127✔
1263
                                   int32_t maxParaNum, bool hasSep) {
1264
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
135,127✔
1265
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
130,159!
1266

1267
  uint8_t resultType = TSDB_DATA_TYPE_BINARY;
130,159✔
1268
  int32_t resultBytes = 0;
130,159✔
1269
  int32_t sepBytes = 0;
130,159✔
1270

1271
  /* For concat/concat_ws function, if params have NCHAR type, promote the final result to NCHAR */
1272
  for (int32_t i = 0; i < numOfParams; ++i) {
690,633✔
1273
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
560,474✔
1274
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
560,474✔
1275
    if (TSDB_DATA_TYPE_NCHAR == paraType) {
560,474✔
1276
      resultType = paraType;
67,869✔
1277
    }
1278
  }
1279

1280
  for (int32_t i = 0; i < numOfParams; ++i) {
690,603✔
1281
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
560,456✔
1282
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
560,456✔
1283
    int32_t paraBytes = getSDataTypeFromNode(pPara)->bytes;
560,456✔
1284
    int32_t factor = 1;
560,456✔
1285
    if (IS_NULL_TYPE(paraType)) {
560,456✔
1286
      resultType = TSDB_DATA_TYPE_VARCHAR;
12✔
1287
      resultBytes = 0;
12✔
1288
      sepBytes = 0;
12✔
1289
      break;
12✔
1290
    }
1291
    if (TSDB_DATA_TYPE_NCHAR == resultType && TSDB_DATA_TYPE_VARCHAR == paraType) {
560,444✔
1292
      factor *= TSDB_NCHAR_SIZE;
106,511✔
1293
    }
1294
    resultBytes += paraBytes * factor;
560,444✔
1295

1296
    if (i == 0) {
560,444✔
1297
      sepBytes = paraBytes * factor;
130,147✔
1298
    }
1299
  }
1300

1301
  if (hasSep) {
130,159✔
1302
    resultBytes += sepBytes * (numOfParams - 3);
55,083✔
1303
  }
1304

1305
  pFunc->node.resType = (SDataType){.bytes = resultBytes, .type = resultType};
130,159✔
1306
  return TSDB_CODE_SUCCESS;
130,159✔
1307
}
1308

1309
static int32_t translateConcat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
77,284✔
1310
  return translateConcatImpl(pFunc, pErrBuf, len, 2, 8, false);
77,284✔
1311
}
1312

1313
static int32_t translateConcatWs(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
57,843✔
1314
  return translateConcatImpl(pFunc, pErrBuf, len, 3, 9, true);
57,843✔
1315
}
1316

1317
static int32_t translateChar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
31✔
1318
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
31!
1319
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
31!
1320
  pFunc->node.resType = (SDataType){.bytes = 4 * numOfParams + 2, .type = TSDB_DATA_TYPE_VARCHAR};
31✔
1321
  return TSDB_CODE_SUCCESS;
31✔
1322
}
1323

1324
static int32_t translateAscii(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
46✔
1325
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
46✔
1326
  pFunc->node.resType =
45✔
1327
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_UTINYINT].bytes, .type = TSDB_DATA_TYPE_UTINYINT};
45✔
1328
  return TSDB_CODE_SUCCESS;
45✔
1329
}
1330

1331
static int32_t translateTrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
153✔
1332
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
153!
1333

1334
  uint8_t para0Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
153✔
1335
  int32_t resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
153✔
1336
  uint8_t type = para0Type;
153✔
1337

1338
  if (2 == LIST_LENGTH(pFunc->pParameterList)) {
153!
1339
    uint8_t para1Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
124✔
1340
    resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
124✔
1341
    type = para1Type;
124✔
1342
  }
1343
  if (type == TSDB_DATA_TYPE_NCHAR) {
153✔
1344
    resLen *= TSDB_NCHAR_SIZE;
29✔
1345
  }
1346
  uint8_t trimType = pFunc->trimType;
153✔
1347
  int32_t code = addUint8Param(&pFunc->pParameterList, trimType);
153✔
1348
  if (code != TSDB_CODE_SUCCESS) {
153!
1349
    return code;
×
1350
  }
1351
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
153✔
1352
  return TSDB_CODE_SUCCESS;
153✔
1353
}
1354

1355
static int32_t translateReplace(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
123✔
1356
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
123!
1357

1358
  uint8_t orgType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
123✔
1359
  uint8_t fromType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
123✔
1360
  uint8_t toType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->type;
123✔
1361
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
123✔
1362
  int32_t fromLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
123✔
1363
  int32_t toLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->bytes;
123✔
1364

1365
  int32_t resLen;
1366
  // Since we don't know the accurate length of result, estimate the maximum length here.
1367
  // To make the resLen bigger, we should make fromLen smaller and toLen bigger.
1368
  if (orgType == TSDB_DATA_TYPE_VARBINARY && fromType != orgType) {
123!
1369
    fromLen = fromLen / TSDB_NCHAR_SIZE;
×
1370
  }
1371
  if (orgType == TSDB_DATA_TYPE_NCHAR && toType != orgType) {
123✔
1372
    toLen = toLen * TSDB_NCHAR_SIZE;
31✔
1373
  }
1374
  resLen = TMAX(orgLen, orgLen + orgLen / fromLen * (toLen - fromLen));
123✔
1375
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = orgType};
123✔
1376
  return TSDB_CODE_SUCCESS;
123✔
1377
}
1378

1379
static int32_t translateRepeat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
65✔
1380
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
65!
1381

1382
  uint8_t type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
65✔
1383
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
65✔
1384
  int32_t resLen;
1385
  if (nodeType(nodesListGetNode(pFunc->pParameterList, 1)) == QUERY_NODE_VALUE) {
65✔
1386
    resLen = orgLen * TMAX((int32_t)((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i, 1);
56✔
1387
  } else {
1388
    resLen = TSDB_MAX_BINARY_LEN;
9✔
1389
  }
1390
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
65✔
1391
  return TSDB_CODE_SUCCESS;
65✔
1392
}
1393

1394
static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
670,232✔
1395
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
670,232!
1396
  if (numOfParams <= 0) {
670,232!
1397
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1398
  }
1399

1400
  // The number of parameters has been limited by the syntax definition
1401

1402
  SExprNode* pPara0 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
670,232✔
1403
  uint8_t    para0Type = pPara0->resType.type;
670,232✔
1404
  if (TSDB_DATA_TYPE_VARBINARY == para0Type) {
670,232!
1405
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
1406
  }
1407

1408
  // The function return type has been set during syntax parsing
1409
  uint8_t para2Type = pFunc->node.resType.type;
670,232✔
1410

1411
  int32_t para2Bytes = pFunc->node.resType.bytes;
670,232✔
1412
  if (IS_STR_DATA_TYPE(para2Type)) {
670,232✔
1413
    para2Bytes -= VARSTR_HEADER_SIZE;
547,538✔
1414
  }
1415
  if (para2Bytes <= 0 ||
670,232!
1416
      para2Bytes > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) {  // cast dst var type length limits to 4096 bytes
670,232!
1417
    if (TSDB_DATA_TYPE_NCHAR == para2Type) {
×
1418
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1419
                             "CAST function converted length should be in range (0, %d] NCHARS",
1420
                             (TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE);
1421
    } else {
1422
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1423
                             "CAST function converted length should be in range (0, %d] bytes",
1424
                             TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE);
1425
    }
1426
  }
1427

1428
  // add database precision as param
1429
  uint8_t dbPrec = pFunc->node.resType.precision;
670,232✔
1430
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
670,232✔
1431
  if (code != TSDB_CODE_SUCCESS) {
670,232!
1432
    return code;
×
1433
  }
1434

1435
  return TSDB_CODE_SUCCESS;
670,232✔
1436
}
1437

1438
static int32_t translateToIso8601(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
18,501✔
1439
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
18,501✔
1440
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
18,485!
1441
  // param1
1442
  if (numOfParams == 2) {
18,485✔
1443
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
81✔
1444
    if (!validateTimezoneFormat(pValue)) {
81✔
1445
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Invalid timzone format");
36✔
1446
    }
1447
  } else {  // add default client timezone
1448
    int32_t code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
18,404✔
1449
    if (code != TSDB_CODE_SUCCESS) {
18,404!
1450
      return code;
×
1451
    }
1452
  }
1453

1454
  // set result type
1455
  pFunc->node.resType = (SDataType){.bytes = 64, .type = TSDB_DATA_TYPE_BINARY};
18,449✔
1456
  return TSDB_CODE_SUCCESS;
18,449✔
1457
}
1458

1459
static int32_t translateToUnixtimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
18,359✔
1460
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
18,359✔
1461
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
18,308!
1462
  int16_t resType = TSDB_DATA_TYPE_BIGINT;
18,308✔
1463
  if (2 == numOfParams) {
18,308✔
1464
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
6✔
1465
    if (pValue->datum.i == 1) {
6✔
1466
      resType = TSDB_DATA_TYPE_TIMESTAMP;
3✔
1467
    } else if (pValue->datum.i == 0) {
3!
1468
      resType = TSDB_DATA_TYPE_BIGINT;
3✔
1469
    } else {
1470
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1471
                             "TO_UNIXTIMESTAMP function second parameter should be 0/1");
1472
    }
1473
  }
1474

1475
  // add database precision as param
1476
  uint8_t dbPrec = pFunc->node.resType.precision;
18,308✔
1477
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
18,308✔
1478
  if (code != TSDB_CODE_SUCCESS) {
18,308!
1479
    return code;
×
1480
  }
1481

1482
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
18,308✔
1483
  return TSDB_CODE_SUCCESS;
18,308✔
1484
}
1485

1486
static int32_t translateToTimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
819✔
1487
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
819!
1488
  pFunc->node.resType =
819✔
1489
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
819✔
1490
  return TSDB_CODE_SUCCESS;
819✔
1491
}
1492

1493
static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
18,366✔
1494
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
18,366✔
1495
  uint8_t dbPrec = pFunc->node.resType.precision;
18,150✔
1496
  // add database precision as param
1497
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
18,150✔
1498
  if (code != TSDB_CODE_SUCCESS) {
18,150!
1499
    return code;
×
1500
  }
1501

1502
  // add client timezone as param
1503
  code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
18,150✔
1504
  if (code != TSDB_CODE_SUCCESS) {
18,150!
1505
    return code;
×
1506
  }
1507

1508
  pFunc->node.resType =
18,150✔
1509
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
18,150✔
1510
  return TSDB_CODE_SUCCESS;
18,150✔
1511
}
1512

1513
static int32_t translateAddPrecOutBigint(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
116,286✔
1514
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
116,286✔
1515

1516
  // add database precision as param
1517
  uint8_t dbPrec = pFunc->node.resType.precision;
114,180✔
1518

1519
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
114,180✔
1520
  if (code != TSDB_CODE_SUCCESS) {
114,180!
1521
    return code;
×
1522
  }
1523

1524
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
114,180✔
1525
  return TSDB_CODE_SUCCESS;
114,180✔
1526
}
1527

1528
static int32_t translateToJson(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
13✔
1529
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
13!
1530
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_JSON].bytes, .type = TSDB_DATA_TYPE_JSON};
13✔
1531
  return TSDB_CODE_SUCCESS;
13✔
1532
}
1533

UNCOV
1534
static int32_t translateOutGeom(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
UNCOV
1535
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
UNCOV
1536
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
×
UNCOV
1537
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_GEOMETRY};
×
1538

UNCOV
1539
  return TSDB_CODE_SUCCESS;
×
1540
}
1541

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

UNCOV
1547
  return TSDB_CODE_SUCCESS;
×
1548
}
1549

UNCOV
1550
static int32_t translateIn2GeomOutBool(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
UNCOV
1551
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
UNCOV
1552
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes, .type = TSDB_DATA_TYPE_BOOL};
×
1553

UNCOV
1554
  return TSDB_CODE_SUCCESS;
×
1555
}
1556

1557
static int32_t translateSelectValue(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
44,833✔
1558
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
44,833!
1559
  if (numOfParams <= 0) {
44,833!
1560
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1561
  }
1562

1563
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
44,833✔
1564
  return TSDB_CODE_SUCCESS;
44,833✔
1565
}
1566

1567
static int32_t translateBlockDistFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1568
  pFunc->node.resType = (SDataType){.bytes = 128, .type = TSDB_DATA_TYPE_VARCHAR};
×
1569
  return TSDB_CODE_SUCCESS;
×
1570
}
1571

1572
static bool getBlockDistFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
4✔
1573
  pEnv->calcMemSize = sizeof(STableBlockDistInfo);
4✔
1574
  return true;
4✔
1575
}
1576
static bool getBlockDBUsageFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
1✔
1577
  pEnv->calcMemSize = sizeof(SDBBlockUsageInfo);
1✔
1578
  return true;
1✔
1579
}
1580

1581
static int32_t translateGroupKey(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
228,161✔
1582
  if (1 != LIST_LENGTH(pFunc->pParameterList)) {
228,161!
1583
    return TSDB_CODE_SUCCESS;
×
1584
  }
1585
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
228,161✔
1586
  return TSDB_CODE_SUCCESS;
228,161✔
1587
}
1588

1589
static int32_t translateServerStatusFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
736✔
1590
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
736✔
1591
  return TSDB_CODE_SUCCESS;
736✔
1592
}
1593

1594
static int32_t translateTagsPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
10✔
1595
  // The _tags pseudo-column will be expanded to the actual tags on the client side
1596
  return TSDB_CODE_SUCCESS;
10✔
1597
}
1598

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

1699
static int32_t translateHistogramImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
11,774✔
1700
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
11,774✔
1701
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
11,773!
1702
  int8_t  binType;
1703
  char*   binDesc;
1704
  for (int32_t i = 1; i < numOfParams; ++i) {
47,090✔
1705
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, i);
35,318✔
1706
    if (i == 1) {
35,318✔
1707
      binType = validateHistogramBinType(varDataVal(pValue->datum.p));
11,773✔
1708
      if (binType == UNKNOWN_BIN) {
11,773!
1709
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1710
                               "HISTOGRAM function binType parameter should be "
1711
                               "\"user_input\", \"log_bin\" or \"linear_bin\"");
1712
      }
1713
    }
1714

1715
    if (i == 2) {
35,318✔
1716
      char errMsg[128] = {0};
11,773✔
1717
      binDesc = varDataVal(pValue->datum.p);
11,773✔
1718
      if (TSDB_CODE_SUCCESS != validateHistogramBinDesc(binDesc, binType, errMsg, (int32_t)sizeof(errMsg))) {
11,773✔
1719
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, errMsg);
1✔
1720
      }
1721
    }
1722
  }
1723
  return TSDB_CODE_SUCCESS;
11,772✔
1724
}
1725

1726
static int32_t translateHitogram(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
9,244✔
1727
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
9,244✔
1728
  pFunc->node.resType = (SDataType){.bytes = 512, .type = TSDB_DATA_TYPE_BINARY};
9,242✔
1729
  return TSDB_CODE_SUCCESS;
9,242✔
1730
}
1731
static int32_t translateHistogramPartial(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
2,530✔
1732
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
2,530!
1733
  pFunc->node.resType =
2,530✔
1734
      (SDataType){.bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY};
2,530✔
1735
  return TSDB_CODE_SUCCESS;
2,530✔
1736
}
1737

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

5648
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