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

taosdata / TDengine / #3910

23 Apr 2025 02:47AM UTC coverage: 62.362% (-0.7%) from 63.063%
#3910

push

travis-ci

web-flow
docs(datain): add missing health status types (#30828)

155061 of 317305 branches covered (48.87%)

Branch coverage included in aggregate %.

240172 of 316469 relevant lines covered (75.89%)

6269478.46 hits per line

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

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

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

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

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

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

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

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

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

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

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

69
  return TSDB_CODE_SUCCESS;
60,413✔
70
}
71

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

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

85
  return true;
69✔
86
}
87

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

93
  return false;
16✔
94
}
95

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

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

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

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

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

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

172
  return true;
53✔
173
}
174

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

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

189
  return numOfSpaces;
328✔
190
}
191

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

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

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

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

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

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

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

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

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

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

284
static bool paramSupportNull(uint64_t typeFlag) {
102,053✔
285
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NULL_TYPE) ||
203,918✔
286
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
101,865✔
287
}
288

289
static bool paramSupportBool(uint64_t typeFlag) {
14,163✔
290
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BOOL_TYPE) ||
28,154✔
291
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
13,991✔
292
}
293

294
static bool paramSupportTinyint(uint64_t typeFlag) {
114,933✔
295
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TINYINT_TYPE) ||
229,782✔
296
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
114,849✔
297
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
94,470✔
298
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
231,414✔
299
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,632!
300
}
301

302
static bool paramSupportSmallint(uint64_t typeFlag) {
120,376✔
303
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_SMALLINT_TYPE) ||
240,752✔
304
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
120,376✔
305
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
102,712✔
306
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
242,384!
307
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,632!
308
}
309

310
static bool paramSupportInt(uint64_t typeFlag) {
717,928✔
311
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INT_TYPE) ||
1,435,856✔
312
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
717,928✔
313
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
583,938✔
314
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,437,558!
315
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,702!
316
}
317

318
static bool paramSupportBigint(uint64_t typeFlag) {
813,038✔
319
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BIGINT_TYPE) ||
1,608,141✔
320
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
795,103✔
321
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
741,209✔
322
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,610,238✔
323
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
2,097✔
324
}
325

326
static bool paramSupportFloat(uint64_t typeFlag) {
85,736✔
327
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FLOAT_TYPE) ||
171,472✔
328
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
151,060!
329
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
65,324✔
330
}
331

332
static bool paramSupportDouble(uint64_t typeFlag) {
200,078✔
333
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_DOUBLE_TYPE) ||
400,144✔
334
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
352,491✔
335
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
152,413✔
336
}
337

338
static bool paramSupportVarchar(uint64_t typeFlag) {
1,016,588✔
339
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARCHAR_TYPE) ||
1,129,931✔
340
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
113,343✔
341
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
50,747✔
342
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
1,151,827!
343
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
21,896✔
344
}
345

346
static bool paramSupportTimestamp(uint64_t typeFlag) {
360,921✔
347
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE) ||
523,148✔
348
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
366,987✔
349
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
6,066✔
350
}
351

352
static bool paramSupportNchar(uint64_t typeFlag) {
209,493✔
353
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NCHAR_TYPE) ||
263,862✔
354
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
54,369✔
355
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
26,280✔
356
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
285,287!
357
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
21,425!
358
}
359

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

368
static bool paramSupportUSmallInt(uint64_t typeFlag) {
13,869✔
369
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_USMALLINT_TYPE) ||
27,738✔
370
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
13,869✔
371
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
12,359!
372
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
27,738!
373
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
374
}
375

376
static bool paramSupportUInt(uint64_t typeFlag) {
25,532✔
377
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UINT_TYPE) ||
51,064✔
378
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
25,532✔
379
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
14,864!
380
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
51,064!
381
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
382
}
383

384
static bool paramSupportUBigInt(uint64_t typeFlag) {
25,585✔
385
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UBIGINT_TYPE) ||
51,170✔
386
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
25,585✔
387
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
5,576✔
388
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
51,170!
389
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
390
}
391

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

398
static bool paramSupportVarBinary(uint64_t typeFlag) {
50,074✔
399
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARB_TYPE) ||
100,148✔
400
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
50,074✔
401
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
150,196!
402
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE);
50,048✔
403
}
404

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

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

416
static bool paramSupportValueNode(uint64_t typeFlag) {
543,215✔
417
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VALUE_NODE) ||
748,133✔
418
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE);
204,918✔
419
}
420

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

427
static bool paramSupportFunctionNode(uint64_t typeFlag) {
651,158✔
428
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
652,442✔
429
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FUNCTION_NODE) ||
652,442!
430
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
1,284✔
431
}
432

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

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

445
static bool paramSupportColumnNode(uint64_t typeFlag) {
2,526,407✔
446
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
2,575,540✔
447
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_COLUMN_NODE) ||
2,550,706✔
448
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
24,299✔
449
}
450

451
static bool paramSupportNodeType(SNode* pNode, uint64_t typeFlag) {
3,777,873✔
452
  switch (pNode->type) {
3,777,873!
453
    case QUERY_NODE_VALUE:
543,215✔
454
      return paramSupportValueNode(typeFlag);
543,215✔
455
    case QUERY_NODE_OPERATOR:
56,013✔
456
      return paramSupportOperatorNode(typeFlag);
56,013✔
457
    case QUERY_NODE_FUNCTION:
651,158✔
458
      return paramSupportFunctionNode(typeFlag);
651,158✔
459
    case QUERY_NODE_LOGIC_CONDITION:
×
460
      return paramSupportLogicConNode(typeFlag);
×
461
    case QUERY_NODE_CASE_WHEN:
1,081✔
462
      return paramSupportCaseWhenNode(typeFlag);
1,081✔
463
    case QUERY_NODE_COLUMN:
2,526,408✔
464
      return paramSupportColumnNode(typeFlag);
2,526,408✔
465
    default:
×
466
      return false;
×
467
  }
468
}
469

470
static bool paramSupportDataType(SDataType* pDataType, uint64_t typeFlag) {
3,777,096✔
471
  switch (pDataType->type) {
3,777,096!
472
    case TSDB_DATA_TYPE_NULL:
102,054✔
473
      return paramSupportNull(typeFlag);
102,054✔
474
    case TSDB_DATA_TYPE_BOOL:
14,163✔
475
      return paramSupportBool(typeFlag);
14,163✔
476
    case TSDB_DATA_TYPE_TINYINT:
114,933✔
477
      return paramSupportTinyint(typeFlag);
114,933✔
478
    case TSDB_DATA_TYPE_SMALLINT:
120,376✔
479
      return paramSupportSmallint(typeFlag);
120,376✔
480
    case TSDB_DATA_TYPE_INT:
717,928✔
481
      return paramSupportInt(typeFlag);
717,928✔
482
    case TSDB_DATA_TYPE_BIGINT:
813,038✔
483
      return paramSupportBigint(typeFlag);
813,038✔
484
    case TSDB_DATA_TYPE_FLOAT:
85,736✔
485
      return paramSupportFloat(typeFlag);
85,736✔
486
    case TSDB_DATA_TYPE_DOUBLE:
200,078✔
487
      return paramSupportDouble(typeFlag);
200,078✔
488
    case TSDB_DATA_TYPE_VARCHAR:
977,111✔
489
      return paramSupportVarchar(typeFlag);
977,111✔
490
    case TSDB_DATA_TYPE_TIMESTAMP:
360,922✔
491
      return paramSupportTimestamp(typeFlag);
360,922✔
492
    case TSDB_DATA_TYPE_NCHAR:
189,535✔
493
      return paramSupportNchar(typeFlag);
189,535✔
494
    case TSDB_DATA_TYPE_UTINYINT:
14,583✔
495
      return paramSupportUTinyInt(typeFlag);
14,583✔
496
    case TSDB_DATA_TYPE_USMALLINT:
13,869✔
497
      return paramSupportUSmallInt(typeFlag);
13,869✔
498
    case TSDB_DATA_TYPE_UINT:
25,532✔
499
      return paramSupportUInt(typeFlag);
25,532✔
500
    case TSDB_DATA_TYPE_UBIGINT:
25,585✔
501
      return paramSupportUBigInt(typeFlag);
25,585✔
502
    case TSDB_DATA_TYPE_JSON:
78✔
503
      return paramSupportJSON(typeFlag);
78✔
504
    case TSDB_DATA_TYPE_VARBINARY:
37✔
505
      return paramSupportVarBinary(typeFlag);
37✔
506
    case TSDB_DATA_TYPE_GEOMETRY:
104✔
507
      return paramSupportGeometry(typeFlag);
104✔
508
    case TSDB_DATA_TYPE_DECIMAL64:
1,441✔
509
    case TSDB_DATA_TYPE_DECIMAL:
510
      return paramSupportDecimal(typeFlag);
1,441✔
511
    default:
×
512
      return false;
×
513
  }
514
}
515

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

518
static int8_t validateHistogramBinType(char* binTypeStr) {
11,437✔
519
  int8_t binType;
520
  if (strcasecmp(binTypeStr, "user_input") == 0) {
11,437✔
521
    binType = USER_INPUT_BIN;
3,107✔
522
  } else if (strcasecmp(binTypeStr, "linear_bin") == 0) {
8,330✔
523
    binType = LINEAR_BIN;
5,088✔
524
  } else if (strcasecmp(binTypeStr, "log_bin") == 0) {
3,242!
525
    binType = LOG_BIN;
3,242✔
526
  } else {
527
    binType = UNKNOWN_BIN;
×
528
  }
529

530
  return binType;
11,437✔
531
}
532

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

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

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

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

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

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

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

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

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

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

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

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

726
static int32_t checkFixedValue(SNode* pNode, const SParamInfo* paramPattern, int32_t paramIdx, bool* isMatch) {
50,037✔
727
  int32_t code = TSDB_CODE_SUCCESS;
50,037✔
728
  bool    checkStr = paramSupportVarBinary(paramPattern->validDataType) ||
89,514✔
729
                  paramSupportVarchar(paramPattern->validDataType) || paramSupportNchar(paramPattern->validDataType);
89,514!
730
  if (pNode->type == QUERY_NODE_VALUE) {
50,037!
731
    SValueNode* pVal = (SValueNode*)pNode;
50,037✔
732
    if (!checkStr) {
50,037✔
733
      for (int32_t k = 0; k < paramPattern->fixedValueSize; k++) {
32,901✔
734
        if (pVal->datum.i == paramPattern->fixedNumValue[k]) {
32,875✔
735
          code = TSDB_CODE_SUCCESS;
19,932✔
736
          *isMatch = true;
19,932✔
737
          break;
19,932✔
738
        } else {
739
          code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
12,943✔
740
          *isMatch = false;
12,943✔
741
        }
742
      }
743
    } else {
744
      for (int32_t k = 0; k < paramPattern->fixedValueSize; k++) {
69,519✔
745
        if (taosStrcasecmp(pVal->literal, paramPattern->fixedStrValue[k]) == 0) {
69,448✔
746
          code = TSDB_CODE_SUCCESS;
30,008✔
747
          *isMatch = true;
30,008✔
748
          break;
30,008✔
749
        } else {
750
          code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
39,440✔
751
          *isMatch = false;
39,440✔
752
        }
753
      }
754
    }
755
  } else {
756
    // for other node type, fixed value check should be done in process function
757
  }
758
  return code;
50,037✔
759
}
760

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

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

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

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

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

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

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

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

826
  // check param num
827
  if ((funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum != -1 &&
2,630,039✔
828
       LIST_LENGTH(paramList) > funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum) ||
2,413,888✔
829
      LIST_LENGTH(paramList) < funcMgtBuiltins[pFunc->funcId].parameters.minParamNum) {
2,625,728✔
830
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
8,679✔
831
  }
832

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

839
    while (1) {
840
      // one table can have at most 4096 columns, int32_t is enough.
841
      for (int32_t j = paramPattern[paramIdx].startParam;
3,342,446✔
842
           j <= (paramPattern[paramIdx].endParam == -1 ? INT32_MAX - 1 : paramPattern[paramIdx].endParam); j++) {
7,077,149✔
843
        if (j > LIST_LENGTH(paramList)) {
4,440,812✔
844
          code = TSDB_CODE_SUCCESS;
662,936✔
845
          isMatch = true;
662,936✔
846
          break;
662,936✔
847
        }
848
        SNode* pNode = nodesListGetNode(paramList, j - 1);
3,777,876✔
849
        if (NULL == pNode) {
3,777,885!
850
          code = TSDB_CODE_FUNC_FUNTION_PARA_NUM;
×
851
          isMatch = false;
×
852
          break;
×
853
        }
854
        // check node type
855
        if (!paramSupportNodeType(pNode, paramPattern[paramIdx].validNodeType)) {
3,777,885✔
856
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
781✔
857
          isMatch = false;
781✔
858
          break;
781✔
859
        }
860
        // check data type
861
        if (!paramSupportDataType(getSDataTypeFromNode(pNode), paramPattern[paramIdx].validDataType)) {
3,777,096✔
862
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
32,933✔
863
          isMatch = false;
32,933✔
864
          break;
32,933✔
865
        }
866
        if (paramPattern[paramIdx].validNodeType == FUNC_PARAM_SUPPORT_VALUE_NODE) {
3,744,163✔
867
          SValueNode* pVal = (SValueNode*)pNode;
338,044✔
868
          pVal->notReserved = true;
338,044✔
869
        }
870
        switch (paramPattern[paramIdx].valueRangeFlag) {
3,744,163!
871
          case FUNC_PARAM_NO_SPECIFIC_VALUE:
3,578,785✔
872
            break;
3,578,785✔
873
          case FUNC_PARAM_HAS_RANGE:
115,341✔
874
            code = checkRangeValue(pNode, paramPattern[paramIdx].range, &isMatch);
115,341✔
875
            break;
115,341✔
876
          case FUNC_PARAM_HAS_FIXED_VALUE:
50,037✔
877
            code = checkFixedValue(pNode, &paramPattern[paramIdx], paramIdx, &isMatch);
50,037✔
878
            break;
50,037✔
879
          default:
×
880
            break;
×
881
        }
882
        if (!isMatch) {
3,744,163✔
883
          break;
6,024✔
884
        }
885
        switch (paramPattern[paramIdx].paramAttribute) {
3,738,139!
886
          case FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE:
3,365,499✔
887
            break;
3,365,499✔
888
          case FUNC_PARAM_MUST_BE_PRIMTS:
24,650✔
889
            code = checkPrimTS(pNode, &isMatch);
24,650✔
890
            break;
24,650✔
891
          case FUNC_PARAM_MUST_BE_PK:
1✔
892
            code = checkPrimaryKey(pNode, &isMatch);
1✔
893
            break;
1✔
894
          case FUNC_PARAM_MUST_HAVE_COLUMN:
18,512✔
895
            code = checkHasColumn(pNode, &isMatch);
18,512✔
896
            break;
18,512✔
897
          case FUNC_PARAM_VALUE_NODE_NOT_NULL:
265,904✔
898
            code = checkValueNodeNotNull(pNode, &isMatch);
265,904✔
899
            break;
265,910✔
900
          case FUNC_PARAM_MUST_BE_TIME_UNIT:
63,573✔
901
            code = checkTimeUnit(pNode, pFunc->node.resType.precision, &isMatch);
63,573✔
902
            break;
63,573✔
903
          default:
×
904
            break;
×
905
        }
906
        if (!isMatch) {
3,738,145✔
907
          break;
3,442✔
908
        }
909
      }
910

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1061
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
381,567✔
1062
  uint8_t resType = 0;
381,567✔
1063
  uint8_t prec = 0, scale = 0;
381,567✔
1064
  if (IS_SIGNED_NUMERIC_TYPE(paraType) || TSDB_DATA_TYPE_BOOL == paraType || IS_NULL_TYPE(paraType)) {
381,567!
1065
    resType = TSDB_DATA_TYPE_BIGINT;
366,763✔
1066
  } else if (IS_UNSIGNED_NUMERIC_TYPE(paraType)) {
14,804✔
1067
    resType = TSDB_DATA_TYPE_UBIGINT;
249✔
1068
  } else if (IS_FLOAT_TYPE(paraType)) {
14,555✔
1069
    resType = TSDB_DATA_TYPE_DOUBLE;
14,430✔
1070
  } else if (IS_DECIMAL_TYPE(paraType)) {
125!
1071
    resType = TSDB_DATA_TYPE_DECIMAL;
125✔
1072
    prec = TSDB_DECIMAL_MAX_PRECISION;
125✔
1073
    scale = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.scale;
125✔
1074
  }
1075

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1191
static int32_t translateCsum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
7,840✔
1192
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
7,840✔
1193
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
7,532✔
1194
  uint8_t resType;
1195
  if (IS_SIGNED_NUMERIC_TYPE(colType)) {
7,532!
1196
    resType = TSDB_DATA_TYPE_BIGINT;
5,444✔
1197
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
2,088!
1198
    resType = TSDB_DATA_TYPE_UBIGINT;
128✔
1199
  } else if (IS_FLOAT_TYPE(colType)) {
1,960!
1200
    resType = TSDB_DATA_TYPE_DOUBLE;
1,960✔
1201
  } else {
1202
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
1203
  }
1204
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
7,532✔
1205
  return TSDB_CODE_SUCCESS;
7,532✔
1206
}
1207

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

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

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

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

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

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

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

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

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

1255
static int32_t translateForecast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
27✔
1256
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
27!
1257
  if (numOfParams < 1) {
27!
1258
    return invaildFuncParaNumErrMsg(pErrBuf, len, "FORECAST require at least one parameter");
×
1259
  }
1260

1261
  uint8_t valType = 0;
27✔
1262

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

1279
  if (numOfParams >= 2) {
24!
1280
    uint8_t optionType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, numOfParams - 1))->type;
24✔
1281
    if (TSDB_DATA_TYPE_VARCHAR != optionType) {
24!
1282
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be varchar");
×
1283
    }
1284

1285
    SNode* pOption = nodesListGetNode(pFunc->pParameterList, numOfParams - 1);
24✔
1286
    if (QUERY_NODE_VALUE != nodeType(pOption)) {
24!
1287
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be value");
×
1288
    }
1289

1290
    SValueNode* pValue = (SValueNode*)pOption;
24✔
1291
    if (!taosAnalyGetOptStr(pValue->literal, "algo", NULL, 0) != 0) {
24✔
1292
      return invaildFuncParaValueErrMsg(pErrBuf, len, "FORECAST option should include algo field");
1✔
1293
    }
1294

1295
    pValue->notReserved = true;
23✔
1296
  }
1297

1298
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[valType].bytes, .type = valType};
23✔
1299
  return TSDB_CODE_SUCCESS;
23✔
1300
}
1301

1302
static int32_t translateForecastConf(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
20✔
1303
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_FLOAT].bytes, .type = TSDB_DATA_TYPE_FLOAT};
20✔
1304
  return TSDB_CODE_SUCCESS;
20✔
1305
}
1306

1307
static EFuncReturnRows forecastEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
23✔
1308

1309
static int32_t translateDiff(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
7,404✔
1310
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
7,404✔
1311
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
7,182✔
1312

1313
  uint8_t resType;
1314
  if (IS_SIGNED_NUMERIC_TYPE(colType) || IS_TIMESTAMP_TYPE(colType) || TSDB_DATA_TYPE_BOOL == colType) {
7,182✔
1315
    resType = TSDB_DATA_TYPE_BIGINT;
5,351✔
1316
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
1,831!
1317
    resType = TSDB_DATA_TYPE_BIGINT;
472✔
1318
  } else {
1319
    resType = TSDB_DATA_TYPE_DOUBLE;
1,359✔
1320
  }
1321
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
7,182✔
1322
  return TSDB_CODE_SUCCESS;
7,182✔
1323
}
1324

1325
static EFuncReturnRows diffEstReturnRows(SFunctionNode* pFunc) {
7,053✔
1326
  if (1 == LIST_LENGTH(pFunc->pParameterList)) {
7,053!
1327
    return FUNC_RETURN_ROWS_N_MINUS_1;
4,536✔
1328
  }
1329
  return 1 < ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
2,517✔
1330
                                                                                : FUNC_RETURN_ROWS_N_MINUS_1;
2,517✔
1331
}
1332

1333
static int32_t translateConcatImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len, int32_t minParaNum,
165,356✔
1334
                                   int32_t maxParaNum, bool hasSep) {
1335
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
165,356✔
1336
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
158,732!
1337

1338
  uint8_t resultType = TSDB_DATA_TYPE_BINARY;
158,732✔
1339
  int32_t resultBytes = 0;
158,732✔
1340
  int32_t sepBytes = 0;
158,732✔
1341

1342
  /* For concat/concat_ws function, if params have NCHAR type, promote the final result to NCHAR */
1343
  for (int32_t i = 0; i < numOfParams; ++i) {
854,604✔
1344
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
695,872✔
1345
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
695,872✔
1346
    if (TSDB_DATA_TYPE_NCHAR == paraType) {
695,872✔
1347
      resultType = paraType;
68,326✔
1348
    }
1349
  }
1350

1351
  for (int32_t i = 0; i < numOfParams; ++i) {
854,564✔
1352
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
695,848✔
1353
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
695,848✔
1354
    int32_t paraBytes = getSDataTypeFromNode(pPara)->bytes;
695,848✔
1355
    int32_t factor = 1;
695,848✔
1356
    if (IS_NULL_TYPE(paraType)) {
695,848✔
1357
      resultType = TSDB_DATA_TYPE_VARCHAR;
16✔
1358
      resultBytes = 0;
16✔
1359
      sepBytes = 0;
16✔
1360
      break;
16✔
1361
    }
1362
    if (TSDB_DATA_TYPE_NCHAR == resultType && TSDB_DATA_TYPE_VARCHAR == paraType) {
695,832✔
1363
      factor *= TSDB_NCHAR_SIZE;
126,366✔
1364
    }
1365
    resultBytes += paraBytes * factor;
695,832✔
1366

1367
    if (i == 0) {
695,832✔
1368
      sepBytes = paraBytes * factor;
158,716✔
1369
    }
1370
  }
1371

1372
  if (hasSep) {
158,732✔
1373
    resultBytes += sepBytes * (numOfParams - 3);
69,912✔
1374
  }
1375

1376
  pFunc->node.resType = (SDataType){.bytes = resultBytes, .type = resultType};
158,732✔
1377
  return TSDB_CODE_SUCCESS;
158,732✔
1378
}
1379

1380
static int32_t translateConcat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
91,764✔
1381
  return translateConcatImpl(pFunc, pErrBuf, len, 2, 8, false);
91,764✔
1382
}
1383

1384
static int32_t translateConcatWs(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
73,592✔
1385
  return translateConcatImpl(pFunc, pErrBuf, len, 3, 9, true);
73,592✔
1386
}
1387

1388
static int32_t translateChar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
38✔
1389
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
38!
1390
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
38!
1391
  pFunc->node.resType = (SDataType){.bytes = 4 * numOfParams + 2, .type = TSDB_DATA_TYPE_VARCHAR};
38✔
1392
  return TSDB_CODE_SUCCESS;
38✔
1393
}
1394

1395
static int32_t translateAscii(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
54✔
1396
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
54✔
1397
  pFunc->node.resType =
53✔
1398
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_UTINYINT].bytes, .type = TSDB_DATA_TYPE_UTINYINT};
53✔
1399
  return TSDB_CODE_SUCCESS;
53✔
1400
}
1401

1402
static int32_t translateTrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
162✔
1403
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
162!
1404

1405
  uint8_t para0Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
162✔
1406
  int32_t resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
162✔
1407
  uint8_t type = para0Type;
162✔
1408

1409
  if (2 == LIST_LENGTH(pFunc->pParameterList)) {
162!
1410
    uint8_t para1Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
126✔
1411
    resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
126✔
1412
    type = para1Type;
126✔
1413
  }
1414
  if (type == TSDB_DATA_TYPE_NCHAR) {
162✔
1415
    resLen *= TSDB_NCHAR_SIZE;
32✔
1416
  }
1417
  uint8_t trimType = pFunc->trimType;
162✔
1418
  int32_t code = addUint8Param(&pFunc->pParameterList, trimType);
162✔
1419
  if (code != TSDB_CODE_SUCCESS) {
162!
1420
    return code;
×
1421
  }
1422
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
162✔
1423
  return TSDB_CODE_SUCCESS;
162✔
1424
}
1425

1426
static int32_t translateReplace(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
131✔
1427
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
131!
1428

1429
  uint8_t orgType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
131✔
1430
  uint8_t fromType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
131✔
1431
  uint8_t toType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->type;
131✔
1432
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
131✔
1433
  int32_t fromLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
131✔
1434
  int32_t toLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->bytes;
131✔
1435

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

1450
static int32_t translateRepeat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
74✔
1451
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
74!
1452

1453
  uint8_t type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
74✔
1454
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
74✔
1455
  int32_t resLen;
1456
  if (nodeType(nodesListGetNode(pFunc->pParameterList, 1)) == QUERY_NODE_VALUE) {
74✔
1457
    resLen = orgLen * TMAX((int32_t)((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i, 1);
65✔
1458
  } else {
1459
    resLen = TSDB_MAX_BINARY_LEN;
9✔
1460
  }
1461
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
74✔
1462
  return TSDB_CODE_SUCCESS;
74✔
1463
}
1464

1465
static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
927,065✔
1466
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
927,065!
1467
  if (numOfParams <= 0) {
927,065!
1468
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1469
  }
1470

1471
  // The number of parameters has been limited by the syntax definition
1472

1473
  SExprNode* pPara0 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
927,065✔
1474
  uint8_t    para0Type = pPara0->resType.type;
927,065✔
1475
  if (TSDB_DATA_TYPE_VARBINARY == para0Type) {
927,065✔
1476
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
1✔
1477
  }
1478

1479
  // The function return type has been set during syntax parsing
1480
  uint8_t para2Type = pFunc->node.resType.type;
927,064✔
1481

1482
  int32_t para2Bytes = pFunc->node.resType.bytes;
927,064✔
1483
  if (IS_STR_DATA_TYPE(para2Type)) {
927,064✔
1484
    para2Bytes -= VARSTR_HEADER_SIZE;
731,535✔
1485
  }
1486
  if (para2Bytes <= 0 ||
927,064!
1487
      para2Bytes > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) {  // cast dst var type length limits to 4096 bytes
927,064!
1488
    if (TSDB_DATA_TYPE_NCHAR == para2Type) {
×
1489
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1490
                             "CAST function converted length should be in range (0, %d] NCHARS",
1491
                             (TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE);
1492
    } else {
1493
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1494
                             "CAST function converted length should be in range (0, %d] bytes",
1495
                             TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE);
1496
    }
1497
  }
1498

1499
  // add database precision as param
1500
  uint8_t dbPrec = pFunc->node.resType.precision;
927,064✔
1501
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
927,064✔
1502
  if (code != TSDB_CODE_SUCCESS) {
927,064!
1503
    return code;
×
1504
  }
1505

1506
  return TSDB_CODE_SUCCESS;
927,064✔
1507
}
1508

1509
static int32_t translateToIso8601(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
20,455✔
1510
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
20,455✔
1511
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
20,434!
1512
  // param1
1513
  if (numOfParams == 2) {
20,434✔
1514
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
110✔
1515
    if (!validateTimezoneFormat(pValue)) {
110✔
1516
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Invalid timzone format");
48✔
1517
    }
1518
  } else {  // add default client timezone
1519
    int32_t code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
20,324✔
1520
    if (code != TSDB_CODE_SUCCESS) {
20,324!
1521
      return code;
×
1522
    }
1523
  }
1524

1525
  // set result type
1526
  pFunc->node.resType = (SDataType){.bytes = 64, .type = TSDB_DATA_TYPE_BINARY};
20,386✔
1527
  return TSDB_CODE_SUCCESS;
20,386✔
1528
}
1529

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

1546
  // add database precision as param
1547
  uint8_t dbPrec = pFunc->node.resType.precision;
20,158✔
1548
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
20,158✔
1549
  if (code != TSDB_CODE_SUCCESS) {
20,158!
1550
    return code;
×
1551
  }
1552

1553
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
20,158✔
1554
  return TSDB_CODE_SUCCESS;
20,158✔
1555
}
1556

1557
static int32_t translateToTimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
823✔
1558
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
823!
1559
  pFunc->node.resType =
823✔
1560
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
823✔
1561
  return TSDB_CODE_SUCCESS;
823✔
1562
}
1563

1564
static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
20,200✔
1565
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
20,200✔
1566
  uint8_t dbPrec = pFunc->node.resType.precision;
19,912✔
1567
  // add database precision as param
1568
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
19,912✔
1569
  if (code != TSDB_CODE_SUCCESS) {
19,912!
1570
    return code;
×
1571
  }
1572

1573
  // add client timezone as param
1574
  code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
19,912✔
1575
  if (code != TSDB_CODE_SUCCESS) {
19,912!
1576
    return code;
×
1577
  }
1578

1579
  pFunc->node.resType =
19,912✔
1580
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
19,912✔
1581
  return TSDB_CODE_SUCCESS;
19,912✔
1582
}
1583

1584
static int32_t translateAddPrecOutBigint(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
116,662✔
1585
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
116,662✔
1586

1587
  // add database precision as param
1588
  uint8_t dbPrec = pFunc->node.resType.precision;
113,854✔
1589

1590
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
113,854✔
1591
  if (code != TSDB_CODE_SUCCESS) {
113,854!
1592
    return code;
×
1593
  }
1594

1595
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
113,854✔
1596
  return TSDB_CODE_SUCCESS;
113,854✔
1597
}
1598

1599
static int32_t translateToJson(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
17✔
1600
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
17✔
1601
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_JSON].bytes, .type = TSDB_DATA_TYPE_JSON};
16✔
1602
  return TSDB_CODE_SUCCESS;
16✔
1603
}
1604

1605
static int32_t translateOutGeom(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
77✔
1606
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
77✔
1607
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
74✔
1608
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_GEOMETRY};
74✔
1609

1610
  return TSDB_CODE_SUCCESS;
74✔
1611
}
1612

1613
static int32_t translateInGeomOutStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
12✔
1614
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
12✔
1615
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
9✔
1616
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_VARCHAR};
9✔
1617

1618
  return TSDB_CODE_SUCCESS;
9✔
1619
}
1620

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

1625
  return TSDB_CODE_SUCCESS;
54✔
1626
}
1627

1628
static int32_t translateSelectValue(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
121,290✔
1629
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
121,290!
1630
  if (numOfParams <= 0) {
121,290!
1631
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1632
  }
1633

1634
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
121,290✔
1635
  return TSDB_CODE_SUCCESS;
121,290✔
1636
}
1637

1638
static int32_t translateBlockDistFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1639
  pFunc->node.resType = (SDataType){.bytes = 128, .type = TSDB_DATA_TYPE_VARCHAR};
×
1640
  return TSDB_CODE_SUCCESS;
×
1641
}
1642

1643
static bool getBlockDistFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
7✔
1644
  pEnv->calcMemSize = sizeof(STableBlockDistInfo);
7✔
1645
  return true;
7✔
1646
}
1647
static bool getBlockDBUsageFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
2✔
1648
  pEnv->calcMemSize = sizeof(SDBBlockUsageInfo);
2✔
1649
  return true;
2✔
1650
}
1651

1652
static int32_t translateGroupKey(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
216,788✔
1653
  if (1 != LIST_LENGTH(pFunc->pParameterList)) {
216,788!
1654
    return TSDB_CODE_SUCCESS;
×
1655
  }
1656
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
216,788✔
1657
  return TSDB_CODE_SUCCESS;
216,788✔
1658
}
1659

1660
static int32_t translateServerStatusFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
780✔
1661
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
780✔
1662
  return TSDB_CODE_SUCCESS;
780✔
1663
}
1664

1665
static int32_t translateTagsPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
27✔
1666
  // The _tags pseudo-column will be expanded to the actual tags on the client side
1667
  return TSDB_CODE_SUCCESS;
27✔
1668
}
1669

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

1774
static int32_t invalidColsFunction(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1775
  return TSDB_CODE_PAR_INVALID_COLS_FUNCTION;
×
1776
}
1777

1778
static int32_t translateHistogramImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
11,550✔
1779
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
11,550✔
1780
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
11,437!
1781
  int8_t  binType;
1782
  char*   binDesc;
1783
  for (int32_t i = 1; i < numOfParams; ++i) {
45,218✔
1784
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, i);
34,046✔
1785
    if (i == 1) {
34,046✔
1786
      binType = validateHistogramBinType(varDataVal(pValue->datum.p));
11,437✔
1787
      if (binType == UNKNOWN_BIN) {
11,437!
1788
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1789
                               "HISTOGRAM function binType parameter should be "
1790
                               "\"user_input\", \"log_bin\" or \"linear_bin\"");
1791
      }
1792
    }
1793

1794
    if (i == 2) {
34,046✔
1795
      char errMsg[128] = {0};
11,437✔
1796
      binDesc = varDataVal(pValue->datum.p);
11,437✔
1797
      if (TSDB_CODE_SUCCESS != validateHistogramBinDesc(binDesc, binType, errMsg, (int32_t)sizeof(errMsg))) {
11,437✔
1798
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, errMsg);
265✔
1799
      }
1800
    }
1801
  }
1802
  return TSDB_CODE_SUCCESS;
11,172✔
1803
}
1804

1805
static int32_t translateHitogram(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
8,899✔
1806
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
8,899✔
1807
  pFunc->node.resType = (SDataType){.bytes = 512, .type = TSDB_DATA_TYPE_BINARY};
8,521✔
1808
  return TSDB_CODE_SUCCESS;
8,521✔
1809
}
1810
static int32_t translateHistogramPartial(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
2,651✔
1811
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
2,651!
1812
  pFunc->node.resType =
2,651✔
1813
      (SDataType){.bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY};
2,651✔
1814
  return TSDB_CODE_SUCCESS;
2,651✔
1815
}
1816

1817
#define NUMERIC_TO_STRINGS_LEN 25
1818
static int32_t translateGreatestleast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
500✔
1819
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
500✔
1820

1821
  bool mixTypeToStrings = tsCompareAsStrInGreatest;
495✔
1822

1823
  SDataType res = {.type = 0};
495✔
1824
  bool     resInit = false;
495✔
1825
  for (int32_t i = 0; i < LIST_LENGTH(pFunc->pParameterList); i++) {
2,917!
1826
    SDataType* para = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, i));
2,428✔
1827

1828
    if (IS_NULL_TYPE(para->type)) {
2,428✔
1829
      res.type = TSDB_DATA_TYPE_NULL;
6✔
1830
      res.bytes = tDataTypes[TSDB_DATA_TYPE_NULL].bytes;
6✔
1831
      break;
6✔
1832
    }
1833

1834
    if (!resInit) {
2,422✔
1835
      res.type = para->type;
493✔
1836
      res.bytes = para->bytes;
493✔
1837
      resInit = true;
493✔
1838
      continue;
493✔
1839
    }
1840

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

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

5891
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