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

taosdata / TDengine / #3549

06 Dec 2024 09:44AM UTC coverage: 59.948% (+0.1%) from 59.846%
#3549

push

travis-ci

web-flow
Merge pull request #29057 from taosdata/docs/TD-33031-3.0

docs: description of user privileges

118833 of 254191 branches covered (46.75%)

Branch coverage included in aggregate %.

199893 of 277480 relevant lines covered (72.04%)

19006119.35 hits per line

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

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

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

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

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

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

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

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

51
  if (TSDB_TIME_PRECISION_MILLI == dbPrec &&
67,781✔
52
      (0 == strcasecmp(pVal->literal, "1u") || 0 == strcasecmp(pVal->literal, "1b"))) {
63,345✔
53
    return TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL;
77✔
54
  }
55

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

60
  if (pVal->literal[0] != '1' ||
67,673✔
61
      (pVal->literal[1] != 'u' && pVal->literal[1] != 'a' && pVal->literal[1] != 's' && pVal->literal[1] != 'm' &&
64,649✔
62
       pVal->literal[1] != 'h' && pVal->literal[1] != 'd' && pVal->literal[1] != 'w' && pVal->literal[1] != 'b')) {
27,325✔
63
    return TSDB_CODE_FUNC_TIME_UNIT_INVALID;
3,052✔
64
  }
65

66
  return TSDB_CODE_SUCCESS;
64,621✔
67
}
68

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

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

82
  return true;
67✔
83
}
84

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

90
  return false;
16✔
91
}
92

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

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

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

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

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

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

169
  return true;
51✔
170
}
171

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

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

186
  return numOfSpaces;
328✔
187
}
188

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

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

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

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

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

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

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

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

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

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

283
static bool paramSupportNull(uint64_t typeFlag) {
190,541✔
284
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NULL_TYPE) ||
380,923✔
285
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
190,382✔
286
}
287

288
static bool paramSupportBool(uint64_t typeFlag) {
13,984✔
289
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BOOL_TYPE) ||
27,832✔
290
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
13,848✔
291
}
292

293
static bool paramSupportTinyint(uint64_t typeFlag) {
92,694✔
294
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TINYINT_TYPE) ||
185,304✔
295
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
92,610✔
296
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
74,019✔
297
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
186,752✔
298
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,448!
299
}
300

301
static bool paramSupportSmallint(uint64_t typeFlag) {
106,074✔
302
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_SMALLINT_TYPE) ||
212,148✔
303
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
106,074✔
304
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
88,287✔
305
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
213,596!
306
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,448!
307
}
308

309
static bool paramSupportInt(uint64_t typeFlag) {
935,262✔
310
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INT_TYPE) ||
1,870,524✔
311
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
935,262✔
312
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
773,036✔
313
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,872,042!
314
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,518!
315
}
316

317
static bool paramSupportBigint(uint64_t typeFlag) {
895,145✔
318
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BIGINT_TYPE) ||
1,769,939✔
319
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
874,794✔
320
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
818,426✔
321
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,771,809✔
322
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,870✔
323
}
324

325
static bool paramSupportFloat(uint64_t typeFlag) {
84,443✔
326
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FLOAT_TYPE) ||
168,886✔
327
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
147,829!
328
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
63,386✔
329
}
330

331
static bool paramSupportDouble(uint64_t typeFlag) {
187,781✔
332
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_DOUBLE_TYPE) ||
375,550✔
333
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
332,268✔
334
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
144,487✔
335
}
336

337
static bool paramSupportVarchar(uint64_t typeFlag) {
977,341✔
338
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARCHAR_TYPE) ||
1,088,746✔
339
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
111,405✔
340
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
53,048✔
341
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
1,111,863!
342
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
23,117✔
343
}
344

345
static bool paramSupportTimestamp(uint64_t typeFlag) {
499,762✔
346
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE) ||
792,045✔
347
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
503,237✔
348
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
3,475✔
349
}
350

351
static bool paramSupportNchar(uint64_t typeFlag) {
208,601✔
352
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NCHAR_TYPE) ||
257,608✔
353
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
49,007✔
354
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
27,523✔
355
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
280,279!
356
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
22,671!
357
}
358

359
static bool paramSupportUTinyInt(uint64_t typeFlag) {
10,336✔
360
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UTINYINT_TYPE) ||
20,672✔
361
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
10,336✔
362
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
3,255!
363
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
20,672!
364
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
365
}
366

367
static bool paramSupportUSmallInt(uint64_t typeFlag) {
10,508✔
368
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_USMALLINT_TYPE) ||
21,016✔
369
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
10,508✔
370
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
9,498!
371
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
21,016!
372
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
373
}
374

375
static bool paramSupportUInt(uint64_t typeFlag) {
21,423✔
376
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UINT_TYPE) ||
42,846✔
377
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
21,423✔
378
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
11,933!
379
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
42,846!
380
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
381
}
382

383
static bool paramSupportUBigInt(uint64_t typeFlag) {
21,725✔
384
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UBIGINT_TYPE) ||
43,450✔
385
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
21,725✔
386
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
5,168✔
387
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
43,450!
388
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
389
}
390

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

397
static bool paramSupportVarBinary(uint64_t typeFlag) {
54,232✔
398
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARB_TYPE) ||
108,464✔
399
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
54,232✔
400
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
162,670!
401
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE);
54,206✔
402
}
403

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

410
static bool paramSupportValueNode(uint64_t typeFlag) {
543,408✔
411
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VALUE_NODE) ||
755,302✔
412
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE);
211,894✔
413
}
414

415
static bool paramSupportOperatorNode(uint64_t typeFlag) {
53,762✔
416
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
53,931✔
417
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_OPERATOR_NODE) ||
53,931!
418
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
169✔
419
}
420

421
static bool paramSupportFunctionNode(uint64_t typeFlag) {
569,841✔
422
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
571,125✔
423
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FUNCTION_NODE) ||
571,125!
424
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
1,284✔
425
}
426

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

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

439
static bool paramSupportColumnNode(uint64_t typeFlag) {
3,023,436✔
440
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
3,071,311✔
441
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_COLUMN_NODE) ||
3,046,618✔
442
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
23,182✔
443
}
444

445
static bool paramSupportNodeType(SNode* pNode, uint64_t typeFlag) {
4,191,301✔
446
  switch (pNode->type) {
4,191,301!
447
    case QUERY_NODE_VALUE:
543,408✔
448
      return paramSupportValueNode(typeFlag);
543,408✔
449
    case QUERY_NODE_OPERATOR:
53,762✔
450
      return paramSupportOperatorNode(typeFlag);
53,762✔
451
    case QUERY_NODE_FUNCTION:
569,841✔
452
      return paramSupportFunctionNode(typeFlag);
569,841✔
453
    case QUERY_NODE_LOGIC_CONDITION:
×
454
      return paramSupportLogicConNode(typeFlag);
×
455
    case QUERY_NODE_CASE_WHEN:
841✔
456
      return paramSupportCaseWhenNode(typeFlag);
841✔
457
    case QUERY_NODE_COLUMN:
3,023,463✔
458
      return paramSupportColumnNode(typeFlag);
3,023,463✔
459
    default:
×
460
      return false;
×
461
  }
462
}
463

464
static bool paramSupportDataType(SDataType* pDataType, uint64_t typeFlag) {
4,190,579✔
465
  switch (pDataType->type) {
4,190,579!
466
    case TSDB_DATA_TYPE_NULL:
190,539✔
467
      return paramSupportNull(typeFlag);
190,539✔
468
    case TSDB_DATA_TYPE_BOOL:
13,984✔
469
      return paramSupportBool(typeFlag);
13,984✔
470
    case TSDB_DATA_TYPE_TINYINT:
92,694✔
471
      return paramSupportTinyint(typeFlag);
92,694✔
472
    case TSDB_DATA_TYPE_SMALLINT:
106,074✔
473
      return paramSupportSmallint(typeFlag);
106,074✔
474
    case TSDB_DATA_TYPE_INT:
935,262✔
475
      return paramSupportInt(typeFlag);
935,262✔
476
    case TSDB_DATA_TYPE_BIGINT:
895,145✔
477
      return paramSupportBigint(typeFlag);
895,145✔
478
    case TSDB_DATA_TYPE_FLOAT:
84,443✔
479
      return paramSupportFloat(typeFlag);
84,443✔
480
    case TSDB_DATA_TYPE_DOUBLE:
187,781✔
481
      return paramSupportDouble(typeFlag);
187,781✔
482
    case TSDB_DATA_TYPE_VARCHAR:
933,552✔
483
      return paramSupportVarchar(typeFlag);
933,552✔
484
    case TSDB_DATA_TYPE_TIMESTAMP:
499,763✔
485
      return paramSupportTimestamp(typeFlag);
499,763✔
486
    case TSDB_DATA_TYPE_NCHAR:
187,236✔
487
      return paramSupportNchar(typeFlag);
187,236✔
488
    case TSDB_DATA_TYPE_UTINYINT:
10,336✔
489
      return paramSupportUTinyInt(typeFlag);
10,336✔
490
    case TSDB_DATA_TYPE_USMALLINT:
10,508✔
491
      return paramSupportUSmallInt(typeFlag);
10,508✔
492
    case TSDB_DATA_TYPE_UINT:
21,423✔
493
      return paramSupportUInt(typeFlag);
21,423✔
494
    case TSDB_DATA_TYPE_UBIGINT:
21,725✔
495
      return paramSupportUBigInt(typeFlag);
21,725✔
496
    case TSDB_DATA_TYPE_JSON:
24✔
497
      return paramSupportJSON(typeFlag);
24✔
498
    case TSDB_DATA_TYPE_VARBINARY:
33✔
499
      return paramSupportVarBinary(typeFlag);
33✔
500
    case TSDB_DATA_TYPE_GEOMETRY:
104✔
501
      return paramSupportGeometry(typeFlag);
104✔
502
    default:
×
503
      return false;
×
504
  }
505
}
506

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

509
static int8_t validateHistogramBinType(char* binTypeStr) {
13,268✔
510
  int8_t binType;
511
  if (strcasecmp(binTypeStr, "user_input") == 0) {
13,268✔
512
    binType = USER_INPUT_BIN;
5,202✔
513
  } else if (strcasecmp(binTypeStr, "linear_bin") == 0) {
8,066✔
514
    binType = LINEAR_BIN;
5,088✔
515
  } else if (strcasecmp(binTypeStr, "log_bin") == 0) {
2,978!
516
    binType = LOG_BIN;
2,978✔
517
  } else {
518
    binType = UNKNOWN_BIN;
×
519
  }
520

521
  return binType;
13,268✔
522
}
523

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

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

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

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

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

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

571
    int32_t counter = (int32_t)count->valueint;
7,897✔
572
    if (infinity->valueint == false) {
7,897✔
573
      startIndex = 0;
6,717✔
574
      numOfBins = counter + 1;
6,717✔
575
    } else {
576
      startIndex = 1;
1,180✔
577
      numOfBins = counter + 3;
1,180✔
578
    }
579

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

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

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

691
  cJSON_Delete(binDesc);
13,003✔
692
  taosMemoryFree(intervals);
13,003✔
693
  return TSDB_CODE_SUCCESS;
13,003✔
694
}
695

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

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

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

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

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

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

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

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

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

812
  // no need to check
813
  if (funcMgtBuiltins[pFunc->funcId].parameters.paramInfoPattern == 0) {
3,571,709✔
814
    return TSDB_CODE_SUCCESS;
433,164✔
815
  }
816

817
  // check param num
818
  if ((funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum != -1 &&
3,138,545✔
819
       LIST_LENGTH(paramList) > funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum) ||
2,852,909!
820
      LIST_LENGTH(paramList) < funcMgtBuiltins[pFunc->funcId].parameters.minParamNum) {
3,134,362✔
821
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
8,298✔
822
  }
823

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

830
    while (1) {
831
      for (int8_t j = paramPattern[paramIdx].startParam;
3,826,173✔
832
           j <= (paramPattern[paramIdx].endParam == -1 ? INT8_MAX : paramPattern[paramIdx].endParam); j++) {
7,978,382✔
833
        if (j > LIST_LENGTH(paramList)) {
4,900,234✔
834
          code = TSDB_CODE_SUCCESS;
708,914✔
835
          isMatch = true;
708,914✔
836
          break;
708,914✔
837
        }
838
        SNode* pNode = nodesListGetNode(paramList, j - 1);
4,191,320✔
839
        // check node type
840
        if (!paramSupportNodeType(pNode, paramPattern[paramIdx].validNodeType)) {
4,191,345✔
841
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
708✔
842
          isMatch = false;
708✔
843
          break;
708✔
844
        }
845
        // check data type
846
        if (!paramSupportDataType(getSDataTypeFromNode(pNode), paramPattern[paramIdx].validDataType)) {
4,190,613✔
847
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
29,636✔
848
          isMatch = false;
29,636✔
849
          break;
29,636✔
850
        }
851
        if (paramPattern[paramIdx].validNodeType == FUNC_PARAM_SUPPORT_VALUE_NODE) {
4,160,968✔
852
          SValueNode* pVal = (SValueNode*)pNode;
331,263✔
853
          pVal->notReserved = true;
331,263✔
854
        }
855
        switch (paramPattern[paramIdx].valueRangeFlag) {
4,160,968!
856
          case FUNC_PARAM_NO_SPECIFIC_VALUE:
3,994,810✔
857
            break;
3,994,810✔
858
          case FUNC_PARAM_HAS_RANGE:
111,959✔
859
            code = checkRangeValue(pNode, paramPattern[paramIdx].range, &isMatch);
111,959✔
860
            break;
111,959✔
861
          case FUNC_PARAM_HAS_FIXED_VALUE:
54,199✔
862
            code = checkFixedValue(pNode, &paramPattern[paramIdx], paramIdx, &isMatch);
54,199✔
863
            break;
54,199✔
864
          default:
×
865
            break;
×
866
        }
867
        if (!isMatch) {
4,160,968✔
868
          break;
5,315✔
869
        }
870
        switch (paramPattern[paramIdx].paramAttribute) {
4,155,653!
871
          case FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE:
3,716,737✔
872
            break;
3,716,737✔
873
          case FUNC_PARAM_MUST_BE_PRIMTS:
24,509✔
874
            code = checkPrimTS(pNode, &isMatch);
24,509✔
875
            break;
24,509✔
876
          case FUNC_PARAM_MUST_BE_PK:
1✔
877
            code = checkPrimaryKey(pNode, &isMatch);
1✔
878
            break;
1✔
879
          case FUNC_PARAM_MUST_HAVE_COLUMN:
19,506✔
880
            code = checkHasColumn(pNode, &isMatch);
19,506✔
881
            break;
19,506✔
882
          case FUNC_PARAM_VALUE_NODE_NOT_NULL:
327,121✔
883
            code = checkValueNodeNotNull(pNode, &isMatch);
327,121✔
884
            break;
327,119✔
885
          case FUNC_PARAM_MUST_BE_TIME_UNIT:
67,781✔
886
            code = checkTimeUnit(pNode, pFunc->node.resType.precision, &isMatch);
67,781✔
887
            break;
67,781✔
888
          default:
×
889
            break;
×
890
        }
891
        if (!isMatch) {
4,155,651✔
892
          break;
3,442✔
893
        }
894
      }
895

896
      if (paramPattern[paramIdx].isLastParam || !isMatch) {
3,826,163✔
897
        break;
898
      }
899
      paramIdx++;
695,944✔
900
    }
901
    if (isMatch) {
3,130,219✔
902
      return TSDB_CODE_SUCCESS;
3,091,098✔
903
    }
904
  }
905
  switch (code) {
39,139!
906
    case TSDB_CODE_FUNC_FUNTION_PARA_NUM:
×
907
      return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
908
    case TSDB_CODE_FUNC_FUNTION_PARA_TYPE:
30,488✔
909
      return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
30,488✔
910
    case TSDB_CODE_FUNC_FUNTION_PARA_VALUE:
93✔
911
      return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName);
93✔
912
    case TSDB_CODE_FUNC_FUNTION_PARA_RANGE:
5,222✔
913
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_RANGE, "Invalid parameter range : %s",
5,222✔
914
                             pFunc->functionName);
5,222✔
915
    case TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS:
98✔
916
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS,
98✔
917
                             "Parameter should be primary timestamp : %s", pFunc->functionName);
98✔
918
    case TSDB_CODE_FUNC_FUNTION_PARA_PK:
×
919
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_PK, "Parameter should be primary key : %s",
×
920
                             pFunc->functionName);
×
921
    case TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL:
40✔
922
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL, "Parameter should have column : %s",
40✔
923
                             pFunc->functionName);
40✔
924
    case TSDB_CODE_FUNC_TIME_UNIT_INVALID:
3,052✔
925
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_INVALID, "Invalid timzone format : %s",
3,052✔
926
                             pFunc->functionName);
3,052✔
927
    case TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL:
108✔
928
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL, "Time unit is too small : %s",
108✔
929
                             pFunc->functionName);
108✔
930
    case TSDB_CODE_FUNC_FUNCTION_HISTO_TYPE:
×
931
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNCTION_HISTO_TYPE, "Invalid histogram bin type : %s",
×
932
                             pFunc->functionName);
×
933
    case TSDB_CODE_FUNC_HISTOGRAM_ERROR:
×
934
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_HISTOGRAM_ERROR, errMsg, pFunc->functionName);
×
935
    default:
38✔
936
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Function check parameter failed : %s",
38✔
937
                             pFunc->functionName);
38✔
938
  }
939
}
940

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

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

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

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

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

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

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

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

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

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

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

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

1008
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
471,376✔
1009
  uint8_t resType = 0;
471,376✔
1010
  if (IS_SIGNED_NUMERIC_TYPE(paraType) || TSDB_DATA_TYPE_BOOL == paraType || IS_NULL_TYPE(paraType)) {
471,376!
1011
    resType = TSDB_DATA_TYPE_BIGINT;
458,251✔
1012
  } else if (IS_UNSIGNED_NUMERIC_TYPE(paraType)) {
13,125!
1013
    resType = TSDB_DATA_TYPE_UBIGINT;
125✔
1014
  } else if (IS_FLOAT_TYPE(paraType)) {
13,000!
1015
    resType = TSDB_DATA_TYPE_DOUBLE;
13,000✔
1016
  }
1017

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1267
  uint8_t resultType = TSDB_DATA_TYPE_BINARY;
141,927✔
1268
  int32_t resultBytes = 0;
141,927✔
1269
  int32_t sepBytes = 0;
141,927✔
1270

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

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

1296
    if (i == 0) {
591,592✔
1297
      sepBytes = paraBytes * factor;
141,915✔
1298
    }
1299
  }
1300

1301
  if (hasSep) {
141,927✔
1302
    resultBytes += sepBytes * (numOfParams - 3);
55,804✔
1303
  }
1304

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1435
  return TSDB_CODE_SUCCESS;
761,968✔
1436
}
1437

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1539
  return TSDB_CODE_SUCCESS;
74✔
1540
}
1541

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

1547
  return TSDB_CODE_SUCCESS;
9✔
1548
}
1549

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

1554
  return TSDB_CODE_SUCCESS;
54✔
1555
}
1556

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

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

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

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

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

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

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

1599
static int32_t translateOutVarchar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
516,663✔
1600
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
516,663✔
1601
  int32_t bytes = 0;
516,627✔
1602
  switch (pFunc->funcType) {
516,627!
1603
    case FUNCTION_TYPE_MD5:
286✔
1604
      bytes = MD5_OUTPUT_LEN + VARSTR_HEADER_SIZE;
286✔
1605
      break;
286✔
1606
    case FUNCTION_TYPE_USER:
×
1607
    case FUNCTION_TYPE_CURRENT_USER:
1608
      bytes = TSDB_USER_LEN;
×
1609
      break;
×
1610
    case FUNCTION_TYPE_SERVER_VERSION:
1,523✔
1611
    case FUNCTION_TYPE_CLIENT_VERSION:
1612
      bytes = TSDB_VERSION_LEN;
1,523✔
1613
      break;
1,523✔
1614
    case FUNCTION_TYPE_DATABASE:
385✔
1615
      bytes = TSDB_DB_NAME_LEN;
385✔
1616
      break;
385✔
1617
    case FUNCTION_TYPE_BLOCK_DIST:
14✔
1618
    case FUNCTION_TYPE_BLOCK_DIST_INFO:
1619
      bytes = sizeof(STableBlockDistInfo);
14✔
1620
      break;
14✔
1621
    case FUNCTION_TYPE_TO_CHAR:
9,166✔
1622
      bytes = 4096;
9,166✔
1623
      break;
9,166✔
1624
    case FUNCTION_TYPE_HYPERLOGLOG_STATE_MERGE:
3,408✔
1625
    case FUNCTION_TYPE_HYPERLOGLOG_PARTIAL:
1626
    case FUNCTION_TYPE_HYPERLOGLOG_STATE:
1627
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
3,408✔
1628
      break;
3,408✔
1629
    case FUNCTION_TYPE_SPREAD_PARTIAL:
1,384✔
1630
    case FUNCTION_TYPE_SPREAD_STATE:
1631
    case FUNCTION_TYPE_SPREAD_STATE_MERGE:
1632
      bytes = getSpreadInfoSize() + VARSTR_HEADER_SIZE;
1,384✔
1633
      break;
1,384✔
1634
    case FUNCTION_TYPE_APERCENTILE_PARTIAL:
1,475✔
1635
      bytes = getApercentileMaxSize() + VARSTR_HEADER_SIZE;
1,475✔
1636
      break;
1,475✔
1637
    case FUNCTION_TYPE_STD_STATE:
1,462✔
1638
    case FUNCTION_TYPE_STD_STATE_MERGE:
1639
    case FUNCTION_TYPE_STD_PARTIAL:
1640
      bytes = getStdInfoSize() + VARSTR_HEADER_SIZE;
1,462✔
1641
      break;
1,462✔
1642
    case FUNCTION_TYPE_AVG_PARTIAL:
62,866✔
1643
    case FUNCTION_TYPE_AVG_STATE:
1644
    case FUNCTION_TYPE_AVG_STATE_MERGE:
1645
      bytes = getAvgInfoSize() + VARSTR_HEADER_SIZE;
62,866✔
1646
      break;
62,866✔
1647
    case FUNCTION_TYPE_HISTOGRAM_PARTIAL:
×
1648
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
×
1649
      break;
×
1650
    case FUNCTION_TYPE_HISTOGRAM:
6,162✔
1651
    case FUNCTION_TYPE_HISTOGRAM_MERGE:
1652
      bytes = 512;
6,162✔
1653
      break;
6,162✔
1654
    case FUNCTION_TYPE_LEASTSQUARES:
6,503✔
1655
      bytes = LEASTSQUARES_BUFF_LENGTH;
6,503✔
1656
      break;
6,503✔
1657
    case FUNCTION_TYPE_TBNAME:
351,405✔
1658
      bytes = TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE;
351,405✔
1659
      break;
351,405✔
1660
    case FUNCTION_TYPE_TIMEZONE:
40,441✔
1661
      bytes = timeZoneStrLen();
40,441✔
1662
      break;
40,441✔
1663
    case FUNCTION_TYPE_IRATE_PARTIAL:
84✔
1664
      bytes = getIrateInfoSize((pFunc->hasPk) ? pFunc->pkBytes : 0) + VARSTR_HEADER_SIZE;
84✔
1665
      break;
84✔
1666
    case FUNCTION_TYPE_FIRST_PARTIAL:
30,041✔
1667
    case FUNCTION_TYPE_LAST_PARTIAL:
1668
    case FUNCTION_TYPE_FIRST_STATE:
1669
    case FUNCTION_TYPE_LAST_STATE:
1670
      bytes = getFirstLastInfoSize(getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes,
30,041✔
1671
                                   (pFunc->hasPk) ? pFunc->pkBytes : 0) +
30,041✔
1672
              VARSTR_HEADER_SIZE;
1673
      break;
30,041✔
1674
    case FUNCTION_TYPE_FIRST_STATE_MERGE:
20✔
1675
    case FUNCTION_TYPE_LAST_STATE_MERGE:
1676
      bytes = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
20✔
1677
      break;
20✔
1678
    case FUNCTION_TYPE_DB_USAGE:
2✔
1679
    case FUNCTION_TYPE_DB_USAGE_INFO:
1680
      bytes = 128;
2✔
1681
      break;
2✔
1682
    default:
×
1683
      bytes = 0;
×
1684
      break;
×
1685
  }
1686
  pFunc->node.resType = (SDataType){.bytes = bytes, .type = TSDB_DATA_TYPE_VARCHAR};
516,627✔
1687
  return TSDB_CODE_SUCCESS;
516,627✔
1688
}
1689

1690
static int32_t translateHistogramImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
13,381✔
1691
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
13,381✔
1692
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
13,268!
1693
  int8_t  binType;
1694
  char*   binDesc;
1695
  for (int32_t i = 1; i < numOfParams; ++i) {
52,542✔
1696
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, i);
39,539✔
1697
    if (i == 1) {
39,539✔
1698
      binType = validateHistogramBinType(varDataVal(pValue->datum.p));
13,268✔
1699
      if (binType == UNKNOWN_BIN) {
13,268!
1700
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1701
                               "HISTOGRAM function binType parameter should be "
1702
                               "\"user_input\", \"log_bin\" or \"linear_bin\"");
1703
      }
1704
    }
1705

1706
    if (i == 2) {
39,539✔
1707
      char errMsg[128] = {0};
13,268✔
1708
      binDesc = varDataVal(pValue->datum.p);
13,268✔
1709
      if (TSDB_CODE_SUCCESS != validateHistogramBinDesc(binDesc, binType, errMsg, (int32_t)sizeof(errMsg))) {
13,268✔
1710
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, errMsg);
265✔
1711
      }
1712
    }
1713
  }
1714
  return TSDB_CODE_SUCCESS;
13,003✔
1715
}
1716

1717
static int32_t translateHitogram(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
10,300✔
1718
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
10,300✔
1719
  pFunc->node.resType = (SDataType){.bytes = 512, .type = TSDB_DATA_TYPE_BINARY};
9,922✔
1720
  return TSDB_CODE_SUCCESS;
9,922✔
1721
}
1722
static int32_t translateHistogramPartial(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
3,081✔
1723
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
3,081!
1724
  pFunc->node.resType =
3,081✔
1725
      (SDataType){.bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY};
3,081✔
1726
  return TSDB_CODE_SUCCESS;
3,081✔
1727
}
1728

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

5639
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