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

taosdata / TDengine / #3630

06 Mar 2025 11:35AM UTC coverage: 63.629% (-0.06%) from 63.692%
#3630

push

travis-ci

web-flow
Merge pull request #30042 from taosdata/doc/internal

docs: format

149060 of 300532 branches covered (49.6%)

Branch coverage included in aggregate %.

233739 of 301077 relevant lines covered (77.63%)

17473135.72 hits per line

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

78.92
/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, ...) {
45,018✔
27
  va_list vArgList;
28
  va_start(vArgList, pFormat);
45,018✔
29
  (void)vsnprintf(pErrBuf, len, pFormat, vArgList);
45,018✔
30
  va_end(vArgList);
45,018✔
31
  return errCode;
45,018✔
32
}
33

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

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

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

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

51
  if (TSDB_TIME_PRECISION_MILLI == dbPrec &&
65,973✔
52
      (0 == strcasecmp(pVal->literal, "1u") || 0 == strcasecmp(pVal->literal, "1b"))) {
61,537✔
53
    return TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL;
74✔
54
  }
55

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

60
  if (pVal->literal[0] != '1' ||
65,868✔
61
      (pVal->literal[1] != 'u' && pVal->literal[1] != 'a' && pVal->literal[1] != 's' && pVal->literal[1] != 'm' &&
62,844✔
62
       pVal->literal[1] != 'h' && pVal->literal[1] != 'd' && pVal->literal[1] != 'w' && pVal->literal[1] != 'b')) {
20,185✔
63
    return TSDB_CODE_FUNC_TIME_UNIT_INVALID;
3,051✔
64
  }
65

66
  return TSDB_CODE_SUCCESS;
62,817✔
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) {
85✔
78
  if (hour < 0 || hour > 12) {
85!
79
    return false;
16✔
80
  }
81

82
  return true;
69✔
83
}
84

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

90
  return false;
16✔
91
}
92

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

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

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

116
          if (i == 2) {
202✔
117
            (void)memcpy(buf, &tz[i - 1], 2);
68✔
118
            hour = taosStr2Int8(buf, NULL, 10);
68✔
119
            if (!validateHourRange(hour)) {
68✔
120
              return false;
16✔
121
            }
122
          } else if (i == 4) {
134✔
123
            (void)memcpy(buf, &tz[i - 1], 2);
33✔
124
            minute = taosStr2Int8(buf, NULL, 10);
33✔
125
            if (!validateMinuteRange(hour, minute, tz[0])) {
33✔
126
              return false;
16✔
127
            }
128
          }
129
        }
130
        break;
36✔
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;
53✔
170
}
171

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

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

186
  return numOfSpaces;
288✔
187
}
188

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

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

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

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

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

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

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

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

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

272
static SDataType* getSDataTypeFromNode(SNode* pNode) {
7,926,139✔
273
  if (pNode == NULL) return NULL;
7,926,139!
274
  if (nodesIsExprNode(pNode)) {
7,926,139!
275
    return &((SExprNode*)pNode)->resType;
7,926,177✔
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) {
181,498✔
284
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NULL_TYPE) ||
362,850✔
285
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
181,352✔
286
}
287

288
static bool paramSupportBool(uint64_t typeFlag) {
13,087✔
289
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BOOL_TYPE) ||
26,046✔
290
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
12,959✔
291
}
292

293
static bool paramSupportTinyint(uint64_t typeFlag) {
101,035✔
294
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TINYINT_TYPE) ||
202,006✔
295
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
100,971✔
296
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
81,651✔
297
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
203,364✔
298
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,358!
299
}
300

301
static bool paramSupportSmallint(uint64_t typeFlag) {
100,290✔
302
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_SMALLINT_TYPE) ||
200,580✔
303
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
100,290✔
304
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
84,125✔
305
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
201,938!
306
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,358!
307
}
308

309
static bool paramSupportInt(uint64_t typeFlag) {
844,713✔
310
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INT_TYPE) ||
1,689,426✔
311
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
844,713✔
312
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
701,683✔
313
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,690,854!
314
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,428!
315
}
316

317
static bool paramSupportBigint(uint64_t typeFlag) {
857,671✔
318
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BIGINT_TYPE) ||
1,695,471✔
319
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
837,800✔
320
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
792,332✔
321
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,697,218✔
322
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,747✔
323
}
324

325
static bool paramSupportFloat(uint64_t typeFlag) {
86,649✔
326
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FLOAT_TYPE) ||
173,298✔
327
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
157,932!
328
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
71,283✔
329
}
330

331
static bool paramSupportDouble(uint64_t typeFlag) {
179,887✔
332
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_DOUBLE_TYPE) ||
359,762✔
333
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
323,410✔
334
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
143,523✔
335
}
336

337
static bool paramSupportVarchar(uint64_t typeFlag) {
922,335✔
338
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARCHAR_TYPE) ||
1,008,936✔
339
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
86,601✔
340
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
49,580✔
341
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
1,030,035!
342
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
21,099✔
343
}
344

345
static bool paramSupportTimestamp(uint64_t typeFlag) {
430,722✔
346
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE) ||
658,543✔
347
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
436,153✔
348
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
5,431✔
349
}
350

351
static bool paramSupportNchar(uint64_t typeFlag) {
189,252✔
352
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NCHAR_TYPE) ||
231,465✔
353
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
42,213✔
354
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
25,677✔
355
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
252,136!
356
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
20,671!
357
}
358

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

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

375
static bool paramSupportUInt(uint64_t typeFlag) {
10,978✔
376
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UINT_TYPE) ||
21,956✔
377
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
10,978✔
378
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
10,560!
379
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
21,956!
380
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
381
}
382

383
static bool paramSupportUBigInt(uint64_t typeFlag) {
11,374✔
384
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UBIGINT_TYPE) ||
22,748✔
385
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
11,374✔
386
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
3,511✔
387
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
22,748!
388
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
389
}
390

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

397
static bool paramSupportVarBinary(uint64_t typeFlag) {
50,911✔
398
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARB_TYPE) ||
101,822✔
399
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
50,911✔
400
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
152,712!
401
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE);
50,890✔
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,147✔
411
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VALUE_NODE) ||
764,229✔
412
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE);
221,082✔
413
}
414

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

421
static bool paramSupportFunctionNode(uint64_t typeFlag) {
529,716✔
422
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
529,748✔
423
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FUNCTION_NODE) ||
529,748!
424
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
32✔
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) {
1,076✔
434
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
1,076✔
435
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_CASE_WHEN_NODE) ||
1,076!
436
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
×
437
}
438

439
static bool paramSupportColumnNode(uint64_t typeFlag) {
2,765,272✔
440
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
2,813,429✔
441
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_COLUMN_NODE) ||
2,788,667✔
442
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
23,395✔
443
}
444

445
static bool paramSupportNodeType(SNode* pNode, uint64_t typeFlag) {
3,892,218✔
446
  switch (pNode->type) {
3,892,218!
447
    case QUERY_NODE_VALUE:
543,147✔
448
      return paramSupportValueNode(typeFlag);
543,147✔
449
    case QUERY_NODE_OPERATOR:
53,004✔
450
      return paramSupportOperatorNode(typeFlag);
53,004✔
451
    case QUERY_NODE_FUNCTION:
529,716✔
452
      return paramSupportFunctionNode(typeFlag);
529,716✔
453
    case QUERY_NODE_LOGIC_CONDITION:
×
454
      return paramSupportLogicConNode(typeFlag);
×
455
    case QUERY_NODE_CASE_WHEN:
1,076✔
456
      return paramSupportCaseWhenNode(typeFlag);
1,076✔
457
    case QUERY_NODE_COLUMN:
2,765,297✔
458
      return paramSupportColumnNode(typeFlag);
2,765,297✔
459
    default:
×
460
      return false;
×
461
  }
462
}
463

464
static bool paramSupportDataType(SDataType* pDataType, uint64_t typeFlag) {
3,891,481✔
465
  switch (pDataType->type) {
3,891,481!
466
    case TSDB_DATA_TYPE_NULL:
181,502✔
467
      return paramSupportNull(typeFlag);
181,502✔
468
    case TSDB_DATA_TYPE_BOOL:
13,087✔
469
      return paramSupportBool(typeFlag);
13,087✔
470
    case TSDB_DATA_TYPE_TINYINT:
101,035✔
471
      return paramSupportTinyint(typeFlag);
101,035✔
472
    case TSDB_DATA_TYPE_SMALLINT:
100,290✔
473
      return paramSupportSmallint(typeFlag);
100,290✔
474
    case TSDB_DATA_TYPE_INT:
844,713✔
475
      return paramSupportInt(typeFlag);
844,713✔
476
    case TSDB_DATA_TYPE_BIGINT:
857,671✔
477
      return paramSupportBigint(typeFlag);
857,671✔
478
    case TSDB_DATA_TYPE_FLOAT:
86,649✔
479
      return paramSupportFloat(typeFlag);
86,649✔
480
    case TSDB_DATA_TYPE_DOUBLE:
179,887✔
481
      return paramSupportDouble(typeFlag);
179,887✔
482
    case TSDB_DATA_TYPE_VARCHAR:
882,157✔
483
      return paramSupportVarchar(typeFlag);
882,157✔
484
    case TSDB_DATA_TYPE_TIMESTAMP:
430,724✔
485
      return paramSupportTimestamp(typeFlag);
430,724✔
486
    case TSDB_DATA_TYPE_NCHAR:
169,855✔
487
      return paramSupportNchar(typeFlag);
169,855✔
488
    case TSDB_DATA_TYPE_UTINYINT:
10,127✔
489
      return paramSupportUTinyInt(typeFlag);
10,127✔
490
    case TSDB_DATA_TYPE_USMALLINT:
11,249✔
491
      return paramSupportUSmallInt(typeFlag);
11,249✔
492
    case TSDB_DATA_TYPE_UINT:
10,978✔
493
      return paramSupportUInt(typeFlag);
10,978✔
494
    case TSDB_DATA_TYPE_UBIGINT:
11,374✔
495
      return paramSupportUBigInt(typeFlag);
11,374✔
496
    case TSDB_DATA_TYPE_JSON:
78✔
497
      return paramSupportJSON(typeFlag);
78✔
498
    case TSDB_DATA_TYPE_VARBINARY:
28✔
499
      return paramSupportVarBinary(typeFlag);
28✔
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) {
12,076✔
510
  int8_t binType;
511
  if (strcasecmp(binTypeStr, "user_input") == 0) {
12,076✔
512
    binType = USER_INPUT_BIN;
2,595✔
513
  } else if (strcasecmp(binTypeStr, "linear_bin") == 0) {
9,481✔
514
    binType = LINEAR_BIN;
6,223✔
515
  } else if (strcasecmp(binTypeStr, "log_bin") == 0) {
3,258!
516
    binType = LOG_BIN;
3,258✔
517
  } else {
518
    binType = UNKNOWN_BIN;
×
519
  }
520

521
  return binType;
12,076✔
522
}
523

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

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

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

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

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

564
    if (isinf(start->valuedouble) || (width != NULL && isinf(width->valuedouble)) ||
9,480!
565
        (factor != NULL && isinf(factor->valuedouble)) || (count != NULL && isinf(count->valuedouble))) {
9,480!
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;
9,480✔
572
    if (infinity->valueint == false) {
9,480✔
573
      startIndex = 0;
5,466✔
574
      numOfBins = counter + 1;
5,466✔
575
    } else {
576
      startIndex = 1;
4,014✔
577
      numOfBins = counter + 3;
4,014✔
578
    }
579

580
    intervals = taosMemoryCalloc(numOfBins, sizeof(double));
9,480!
581
    if (intervals == NULL) {
9,480!
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) {
9,480!
587
      // linear bin process
588
      if (width->valuedouble == 0) {
6,223!
589
        (void)snprintf(errMsg, msgLen, "%s", msg6);
×
590
        taosMemoryFree(intervals);
×
591
        cJSON_Delete(binDesc);
×
592
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
593
      }
594
      for (int i = 0; i < counter + 1; ++i) {
42,217✔
595
        intervals[startIndex] = start->valuedouble + i * width->valuedouble;
35,994✔
596
        if (isinf(intervals[startIndex])) {
35,994!
597
          (void)snprintf(errMsg, msgLen, "%s", msg5);
×
598
          taosMemoryFree(intervals);
×
599
          cJSON_Delete(binDesc);
×
600
          return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
601
        }
602
        startIndex++;
35,994✔
603
      }
604
    } else if (cJSON_IsNumber(factor) && width == NULL && binType == LOG_BIN) {
3,257!
605
      // log bin process
606
      if (start->valuedouble == 0) {
3,257!
607
        (void)snprintf(errMsg, msgLen, "%s", msg7);
×
608
        taosMemoryFree(intervals);
×
609
        cJSON_Delete(binDesc);
×
610
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
611
      }
612
      if (factor->valuedouble < 0 || factor->valuedouble == 0 || factor->valuedouble == 1) {
3,257!
613
        (void)snprintf(errMsg, msgLen, "%s", msg8);
×
614
        taosMemoryFree(intervals);
×
615
        cJSON_Delete(binDesc);
×
616
        return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
617
      }
618
      for (int i = 0; i < counter + 1; ++i) {
21,455✔
619
        intervals[startIndex] = start->valuedouble * pow(factor->valuedouble, i * 1.0);
18,198✔
620
        if (isinf(intervals[startIndex])) {
18,198!
621
          (void)snprintf(errMsg, msgLen, "%s", msg5);
×
622
          taosMemoryFree(intervals);
×
623
          cJSON_Delete(binDesc);
×
624
          return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
625
        }
626
        startIndex++;
18,198✔
627
      }
628
    } else {
629
      (void)snprintf(errMsg, msgLen, "%s", msg3);
×
630
      taosMemoryFree(intervals);
×
631
      cJSON_Delete(binDesc);
×
632
      return TSDB_CODE_FUNC_HISTOGRAM_ERROR;
×
633
    }
634

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

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

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

696
static int32_t checkRangeValue(SNode* pNode, SParamRange range, bool* isMatch) {
109,112✔
697
  int32_t code = TSDB_CODE_SUCCESS;
109,112✔
698
  if (pNode->type == QUERY_NODE_VALUE) {
109,112!
699
    SValueNode* pVal = (SValueNode*)pNode;
109,112✔
700
    if (IS_INTEGER_TYPE(getSDataTypeFromNode(pNode)->type)) {
109,112!
701
      if (pVal->datum.i < range.iMinVal || pVal->datum.i > range.iMaxVal) {
108,951✔
702
        code = TSDB_CODE_FUNC_FUNTION_PARA_RANGE;
5,198✔
703
        *isMatch = false;
5,198✔
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;
109,112✔
715
}
716

717
static int32_t checkFixedValue(SNode* pNode, const SParamInfo* paramPattern, int32_t paramIdx, bool* isMatch) {
50,883✔
718
  int32_t code = TSDB_CODE_SUCCESS;
50,883✔
719
  bool    checkStr = paramSupportVarBinary(paramPattern->validDataType) ||
91,061✔
720
                  paramSupportVarchar(paramPattern->validDataType) || paramSupportNchar(paramPattern->validDataType);
91,061!
721
  if (pNode->type == QUERY_NODE_VALUE) {
50,883!
722
    SValueNode* pVal = (SValueNode*)pNode;
50,883✔
723
    if (!checkStr) {
50,883✔
724
      for (int32_t k = 0; k < paramPattern->fixedValueSize; k++) {
31,066✔
725
        if (pVal->datum.i == paramPattern->fixedNumValue[k]) {
31,048✔
726
          code = TSDB_CODE_SUCCESS;
19,379✔
727
          *isMatch = true;
19,379✔
728
          break;
19,379✔
729
        } else {
730
          code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
11,669✔
731
          *isMatch = false;
11,669✔
732
        }
733
      }
734
    } else {
735
      for (int32_t k = 0; k < paramPattern->fixedValueSize; k++) {
84,272✔
736
        if (strcasecmp(pVal->literal, paramPattern->fixedStrValue[k]) == 0) {
84,224✔
737
          code = TSDB_CODE_SUCCESS;
31,438✔
738
          *isMatch = true;
31,438✔
739
          break;
31,438✔
740
        } else {
741
          code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
52,786✔
742
          *isMatch = false;
52,786✔
743
        }
744
      }
745
    }
746
  } else {
747
    // for other node type, fixed value check should be done in process function
748
  }
749
  return code;
50,883✔
750
}
751

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

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

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

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

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

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

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

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

817
  // check param num
818
  if ((funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum != -1 &&
2,878,509✔
819
       LIST_LENGTH(paramList) > funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum) ||
2,703,856✔
820
      LIST_LENGTH(paramList) < funcMgtBuiltins[pFunc->funcId].parameters.minParamNum) {
2,874,771✔
821
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
7,915✔
822
  }
823

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

830
    while (1) {
831
      // one table can have at most 4096 columns, int32_t is enough.
832
      for (int32_t j = paramPattern[paramIdx].startParam;
3,575,748✔
833
           j <= (paramPattern[paramIdx].endParam == -1 ? INT32_MAX - 1 : paramPattern[paramIdx].endParam); j++) {
7,430,975✔
834
        if (j > LIST_LENGTH(paramList)) {
4,472,689✔
835
          code = TSDB_CODE_SUCCESS;
580,441✔
836
          isMatch = true;
580,441✔
837
          break;
580,441✔
838
        }
839
        SNode* pNode = nodesListGetNode(paramList, j - 1);
3,892,248✔
840
        if (NULL == pNode) {
3,892,267!
841
          code = TSDB_CODE_FUNC_FUNTION_PARA_NUM;
×
842
          isMatch = false;
×
843
          break;
×
844
        }
845
        // check node type
846
        if (!paramSupportNodeType(pNode, paramPattern[paramIdx].validNodeType)) {
3,892,267✔
847
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
745✔
848
          isMatch = false;
745✔
849
          break;
745✔
850
        }
851
        // check data type
852
        if (!paramSupportDataType(getSDataTypeFromNode(pNode), paramPattern[paramIdx].validDataType)) {
3,891,501✔
853
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
27,594✔
854
          isMatch = false;
27,594✔
855
          break;
27,594✔
856
        }
857
        if (paramPattern[paramIdx].validNodeType == FUNC_PARAM_SUPPORT_VALUE_NODE) {
3,863,892✔
858
          SValueNode* pVal = (SValueNode*)pNode;
321,855✔
859
          pVal->notReserved = true;
321,855✔
860
        }
861
        switch (paramPattern[paramIdx].valueRangeFlag) {
3,863,892!
862
          case FUNC_PARAM_NO_SPECIFIC_VALUE:
3,703,897✔
863
            break;
3,703,897✔
864
          case FUNC_PARAM_HAS_RANGE:
109,112✔
865
            code = checkRangeValue(pNode, paramPattern[paramIdx].range, &isMatch);
109,112✔
866
            break;
109,112✔
867
          case FUNC_PARAM_HAS_FIXED_VALUE:
50,883✔
868
            code = checkFixedValue(pNode, &paramPattern[paramIdx], paramIdx, &isMatch);
50,883✔
869
            break;
50,883✔
870
          default:
×
871
            break;
×
872
        }
873
        if (!isMatch) {
3,863,892✔
874
          break;
5,264✔
875
        }
876
        switch (paramPattern[paramIdx].paramAttribute) {
3,858,628!
877
          case FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE:
3,574,830✔
878
            break;
3,574,830✔
879
          case FUNC_PARAM_MUST_BE_PRIMTS:
24,578✔
880
            code = checkPrimTS(pNode, &isMatch);
24,578✔
881
            break;
24,578✔
882
          case FUNC_PARAM_MUST_BE_PK:
1✔
883
            code = checkPrimaryKey(pNode, &isMatch);
1✔
884
            break;
1✔
885
          case FUNC_PARAM_MUST_HAVE_COLUMN:
17,638✔
886
            code = checkHasColumn(pNode, &isMatch);
17,638✔
887
            break;
17,638✔
888
          case FUNC_PARAM_VALUE_NODE_NOT_NULL:
175,621✔
889
            code = checkValueNodeNotNull(pNode, &isMatch);
175,621✔
890
            break;
175,622✔
891
          case FUNC_PARAM_MUST_BE_TIME_UNIT:
65,973✔
892
            code = checkTimeUnit(pNode, pFunc->node.resType.precision, &isMatch);
65,973✔
893
            break;
65,973✔
894
          default:
×
895
            break;
×
896
        }
897
        if (!isMatch) {
3,858,629✔
898
          break;
3,402✔
899
        }
900
      }
901

902
      if (paramPattern[paramIdx].isLastParam || !isMatch) {
3,575,732✔
903
        break;
904
      }
905
      paramIdx++;
705,168✔
906
    }
907
    if (isMatch) {
2,870,564✔
908
      return TSDB_CODE_SUCCESS;
2,833,569✔
909
    }
910
  }
911
  switch (code) {
37,009!
912
    case TSDB_CODE_FUNC_FUNTION_PARA_NUM:
×
913
      return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
914
    case TSDB_CODE_FUNC_FUNTION_PARA_TYPE:
28,447✔
915
      return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
28,447✔
916
    case TSDB_CODE_FUNC_FUNTION_PARA_VALUE:
66✔
917
      return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName);
66✔
918
    case TSDB_CODE_FUNC_FUNTION_PARA_RANGE:
5,198✔
919
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_RANGE, "Invalid parameter range : %s",
5,198✔
920
                             pFunc->functionName);
5,198✔
921
    case TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS:
98✔
922
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS,
98✔
923
                             "Parameter should be primary timestamp : %s", pFunc->functionName);
98✔
924
    case TSDB_CODE_FUNC_FUNTION_PARA_PK:
×
925
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_PK, "Parameter should be primary key : %s",
×
926
                             pFunc->functionName);
×
927
    case TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL:
40✔
928
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL, "Parameter should have column : %s",
40✔
929
                             pFunc->functionName);
40✔
930
    case TSDB_CODE_FUNC_TIME_UNIT_INVALID:
3,051✔
931
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_INVALID, "Invalid timzone format : %s",
3,051✔
932
                             pFunc->functionName);
3,051✔
933
    case TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL:
105✔
934
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL, "Time unit is too small : %s",
105✔
935
                             pFunc->functionName);
105✔
936
    case TSDB_CODE_FUNC_FUNCTION_HISTO_TYPE:
×
937
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNCTION_HISTO_TYPE, "Invalid histogram bin type : %s",
×
938
                             pFunc->functionName);
×
939
    case TSDB_CODE_FUNC_HISTOGRAM_ERROR:
×
940
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_HISTOGRAM_ERROR, errMsg, pFunc->functionName);
×
941
    default:
4✔
942
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Function check parameter failed : %s",
4✔
943
                             pFunc->functionName);
4✔
944
  }
945
}
946

947
// There is only one parameter of numeric type, and the return type is parameter type
948
static int32_t translateOutNum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
50,350✔
949
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
50,350✔
950
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
49,751✔
951
  if (IS_NULL_TYPE(paraType)) {
49,751✔
952
    paraType = TSDB_DATA_TYPE_BIGINT;
14✔
953
  }
954
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[paraType].bytes, .type = paraType};
49,751✔
955
  return TSDB_CODE_SUCCESS;
49,751✔
956
}
957

958
// There is only one parameter, and the return type is parameter type
959
static int32_t translateMinMax(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
509,572✔
960
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
509,572✔
961

962
  SDataType* dataType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
509,495✔
963
  uint8_t    paraType = IS_NULL_TYPE(dataType->type) ? TSDB_DATA_TYPE_BIGINT : dataType->type;
509,495✔
964
  int32_t    bytes = IS_STR_DATA_TYPE(paraType) ? dataType->bytes : tDataTypes[paraType].bytes;
509,495!
965
  pFunc->node.resType = (SDataType){.bytes = bytes, .type = paraType};
509,495✔
966
  return TSDB_CODE_SUCCESS;
509,495✔
967
}
968

969
// The return type is DOUBLE type
970
static int32_t translateOutDouble(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
400,878✔
971
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
400,878✔
972
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
397,957✔
973
  return TSDB_CODE_SUCCESS;
397,957✔
974
}
975

976
static int32_t translateTrimStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len, bool isLtrim) {
73,317✔
977
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
73,317✔
978

979
  SDataType* pRestType1 = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
65,826✔
980

981
  int32_t numOfSpaces = 0;
65,826✔
982
  SNode*  pParamNode1 = nodesListGetNode(pFunc->pParameterList, 0);
65,826✔
983
  // for select trim functions with constant value from table,
984
  // need to set the proper result result schema bytes to avoid
985
  // trailing garbage characters
986
  if (nodeType(pParamNode1) == QUERY_NODE_VALUE) {
65,826✔
987
    SValueNode* pValue = (SValueNode*)pParamNode1;
288✔
988
    numOfSpaces = countTrailingSpaces(pValue, isLtrim);
288✔
989
  }
990

991
  int32_t resBytes = pRestType1->bytes - numOfSpaces;
65,826✔
992
  pFunc->node.resType = (SDataType){.bytes = resBytes, .type = pRestType1->type};
65,826✔
993
  return TSDB_CODE_SUCCESS;
65,826✔
994
}
995

996
static int32_t translateLtrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
34,623✔
997
  return translateTrimStr(pFunc, pErrBuf, len, true);
34,623✔
998
}
999

1000
static int32_t translateRtrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
38,694✔
1001
  return translateTrimStr(pFunc, pErrBuf, len, false);
38,694✔
1002
}
1003

1004
// The return type is BIGINT type
1005
static int32_t translateOutBigInt(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
623,956✔
1006
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
623,956✔
1007
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
618,286✔
1008
  return TSDB_CODE_SUCCESS;
618,286✔
1009
}
1010

1011
static int32_t translateSum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
426,496✔
1012
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
426,496✔
1013

1014
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
426,459✔
1015
  uint8_t resType = 0;
426,459✔
1016
  if (IS_SIGNED_NUMERIC_TYPE(paraType) || TSDB_DATA_TYPE_BOOL == paraType || IS_NULL_TYPE(paraType)) {
426,459!
1017
    resType = TSDB_DATA_TYPE_BIGINT;
413,221✔
1018
  } else if (IS_UNSIGNED_NUMERIC_TYPE(paraType)) {
13,238!
1019
    resType = TSDB_DATA_TYPE_UBIGINT;
253✔
1020
  } else if (IS_FLOAT_TYPE(paraType)) {
12,985!
1021
    resType = TSDB_DATA_TYPE_DOUBLE;
12,985✔
1022
  }
1023

1024
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
426,459✔
1025
  return TSDB_CODE_SUCCESS;
426,459✔
1026
}
1027

1028
static int32_t translateWduration(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
615✔
1029
  // pseudo column do not need to check parameters
1030
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes,
615✔
1031
                                    .type = TSDB_DATA_TYPE_BIGINT,
1032
                                    .precision = pFunc->node.resType.precision};
615✔
1033
  return TSDB_CODE_SUCCESS;
615✔
1034
}
1035

1036
static int32_t translateNowToday(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
142,891✔
1037
  // pseudo column do not need to check parameters
1038

1039
  // add database precision as param
1040
  uint8_t dbPrec = pFunc->node.resType.precision;
142,891✔
1041
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
142,891✔
1042
  if (code != TSDB_CODE_SUCCESS) {
142,891!
1043
    return code;
×
1044
  }
1045

1046
  pFunc->node.resType =
142,891✔
1047
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
142,891✔
1048
  return TSDB_CODE_SUCCESS;
142,891✔
1049
}
1050

1051
static int32_t translateRand(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
26✔
1052
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
26✔
1053

1054
  if (!pFunc->dual) {
22✔
1055
    int32_t code = addPseudoParam(&pFunc->pParameterList);
3✔
1056
    if (code != TSDB_CODE_SUCCESS) {
3!
1057
      return code;
×
1058
    }
1059
  }
1060

1061
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
22✔
1062
  return TSDB_CODE_SUCCESS;
22✔
1063
}
1064

1065
// return type is same as first input parameter's type
1066
static int32_t translateOutFirstIn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
343,000✔
1067
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
343,000✔
1068
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
324,831✔
1069
  return TSDB_CODE_SUCCESS;
324,834✔
1070
}
1071

1072
static int32_t translateTimePseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
87,547✔
1073
  // pseudo column do not need to check parameters
1074

1075
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes,
87,547✔
1076
                                    .type = TSDB_DATA_TYPE_TIMESTAMP,
1077
                                    .precision = pFunc->node.resType.precision};
87,547✔
1078
  return TSDB_CODE_SUCCESS;
87,547✔
1079
}
1080

1081
static int32_t translateIsFilledPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
11,708✔
1082
  // pseudo column do not need to check parameters
1083

1084
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes, .type = TSDB_DATA_TYPE_BOOL};
11,708✔
1085
  return TSDB_CODE_SUCCESS;
11,708✔
1086
}
1087

1088
static int32_t translatePercentile(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,195✔
1089
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
1,195✔
1090
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
904!
1091

1092
  // set result type
1093
  if (numOfParams > 2) {
904✔
1094
    pFunc->node.resType = (SDataType){.bytes = 3200, .type = TSDB_DATA_TYPE_VARCHAR};
25✔
1095
  } else {
1096
    pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
879✔
1097
  }
1098
  return TSDB_CODE_SUCCESS;
904✔
1099
}
1100

1101
static int32_t translateVgIdColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
39,488✔
1102
  // pseudo column do not need to check parameters
1103
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
39,488✔
1104
  return TSDB_CODE_SUCCESS;
39,488✔
1105
}
1106

1107
static int32_t reserveFirstMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
4,530✔
1108
  int32_t code = nodesListMakeAppend(pParameters, pPartialRes);
4,530✔
1109
  if (TSDB_CODE_SUCCESS == code) {
4,530!
1110
    SNode* pNew = NULL;
4,530✔
1111
    code = nodesCloneNode(nodesListGetNode(pRawParameters, 1), &pNew);
4,530✔
1112
    if (TSDB_CODE_SUCCESS == code) {
4,530!
1113
      code = nodesListStrictAppend(*pParameters, pNew);
4,530✔
1114
    }
1115
  }
1116
  return code;
4,530✔
1117
}
1118

1119
int32_t topBotCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
1,244✔
1120
  return reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
1,244✔
1121
}
1122

1123
int32_t apercentileCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
3,286✔
1124
  int32_t code = reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
3,286✔
1125
  if (TSDB_CODE_SUCCESS == code && pRawParameters->length >= 3) {
3,286!
1126
    SNode* pNew = NULL;
362✔
1127
    code = nodesCloneNode(nodesListGetNode(pRawParameters, 2), &pNew);
362✔
1128
    if (TSDB_CODE_SUCCESS == code) {
362!
1129
      code = nodesListStrictAppend(*pParameters, pNew);
362✔
1130
    }
1131
  }
1132
  return code;
3,286✔
1133
}
1134

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

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

1139
static int32_t translateCsum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
9,190✔
1140
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
9,190✔
1141
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
8,882✔
1142
  uint8_t resType;
1143
  if (IS_SIGNED_NUMERIC_TYPE(colType)) {
8,882!
1144
    resType = TSDB_DATA_TYPE_BIGINT;
6,618✔
1145
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
2,264!
1146
    resType = TSDB_DATA_TYPE_UBIGINT;
124✔
1147
  } else if (IS_FLOAT_TYPE(colType)) {
2,140!
1148
    resType = TSDB_DATA_TYPE_DOUBLE;
2,140✔
1149
  } else {
1150
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
1151
  }
1152
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
8,882✔
1153
  return TSDB_CODE_SUCCESS;
8,882✔
1154
}
1155

1156
static EFuncReturnRows csumEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
8,628✔
1157

1158
static int32_t translateSampleTail(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
21,104✔
1159
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
21,104✔
1160

1161
  SDataType* pSDataType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
20,644✔
1162
  uint8_t    colType = pSDataType->type;
20,644✔
1163

1164
  // set result type
1165
  pFunc->node.resType =
20,644✔
1166
      (SDataType){.bytes = IS_STR_DATA_TYPE(colType) ? pSDataType->bytes : tDataTypes[colType].bytes, .type = colType};
20,644✔
1167
  return TSDB_CODE_SUCCESS;
20,644✔
1168
}
1169

1170
static EFuncReturnRows derivativeEstReturnRows(SFunctionNode* pFunc) {
1,106✔
1171
  return 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 2))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
1,106✔
1172
                                                                                 : FUNC_RETURN_ROWS_N_MINUS_1;
1,106✔
1173
}
1174

1175
static int32_t translateAddPrecOutDouble(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
2,751✔
1176
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
2,751✔
1177
  // add database precision as param
1178
  uint8_t dbPrec = pFunc->node.resType.precision;
2,643✔
1179
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
2,643✔
1180
  if (code != TSDB_CODE_SUCCESS) {
2,643!
1181
    return code;
×
1182
  }
1183

1184
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
2,643✔
1185
  return TSDB_CODE_SUCCESS;
2,643✔
1186
}
1187

1188
static int32_t translateInterp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1189
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1190
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
×
1191
  return TSDB_CODE_SUCCESS;
×
1192
}
1193

1194
static EFuncReturnRows interpEstReturnRows(SFunctionNode* pFunc) {
33,912✔
1195
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
33,912!
1196
  if (1 < numOfParams && 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i) {
33,912✔
1197
    return FUNC_RETURN_ROWS_INDEFINITE;
74✔
1198
  } else {
1199
    return FUNC_RETURN_ROWS_N;
33,838✔
1200
  }
1201
}
1202

1203
static int32_t translateForecast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
26✔
1204
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
26!
1205
  if (2 != numOfParams && 1 != numOfParams) {
26!
1206
    return invaildFuncParaNumErrMsg(pErrBuf, len, "FORECAST require 1 or 2 parameters");
×
1207
  }
1208

1209
  uint8_t valType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
26✔
1210
  if (!IS_MATHABLE_TYPE(valType)) {
26!
1211
    return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST only support mathable column");
2✔
1212
  }
1213

1214
  if (numOfParams == 2) {
24!
1215
    uint8_t optionType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
24✔
1216
    if (TSDB_DATA_TYPE_BINARY != optionType) {
24!
1217
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be varchar");
×
1218
    }
1219

1220
    SNode* pOption = nodesListGetNode(pFunc->pParameterList, 1);
24✔
1221
    if (QUERY_NODE_VALUE != nodeType(pOption)) {
24!
1222
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be value");
×
1223
    }
1224

1225
    SValueNode* pValue = (SValueNode*)pOption;
24✔
1226
    if (!taosAnalyGetOptStr(pValue->literal, "algo", NULL, 0) != 0) {
24!
1227
      return invaildFuncParaValueErrMsg(pErrBuf, len, "FORECAST option should include algo field");
×
1228
    }
1229

1230
    pValue->notReserved = true;
24✔
1231
  }
1232

1233
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[valType].bytes, .type = valType};
24✔
1234
  return TSDB_CODE_SUCCESS;
24✔
1235
}
1236

1237
static int32_t translateForecastConf(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
26✔
1238
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_FLOAT].bytes, .type = TSDB_DATA_TYPE_FLOAT};
26✔
1239
  return TSDB_CODE_SUCCESS;
26✔
1240
}
1241

1242
static EFuncReturnRows forecastEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
24✔
1243

1244
static int32_t translateDiff(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
6,095✔
1245
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
6,095✔
1246
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
5,886✔
1247

1248
  uint8_t resType;
1249
  if (IS_SIGNED_NUMERIC_TYPE(colType) || IS_TIMESTAMP_TYPE(colType) || TSDB_DATA_TYPE_BOOL == colType) {
5,886✔
1250
    resType = TSDB_DATA_TYPE_BIGINT;
4,449✔
1251
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
1,437!
1252
    resType = TSDB_DATA_TYPE_BIGINT;
42✔
1253
  } else {
1254
    resType = TSDB_DATA_TYPE_DOUBLE;
1,395✔
1255
  }
1256
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
5,886✔
1257
  return TSDB_CODE_SUCCESS;
5,886✔
1258
}
1259

1260
static EFuncReturnRows diffEstReturnRows(SFunctionNode* pFunc) {
5,730✔
1261
  if (1 == LIST_LENGTH(pFunc->pParameterList)) {
5,730!
1262
    return FUNC_RETURN_ROWS_N_MINUS_1;
3,122✔
1263
  }
1264
  return 1 < ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
2,608✔
1265
                                                                                : FUNC_RETURN_ROWS_N_MINUS_1;
2,608✔
1266
}
1267

1268
static int32_t translateConcatImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len, int32_t minParaNum,
146,212✔
1269
                                   int32_t maxParaNum, bool hasSep) {
1270
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
146,212✔
1271
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
140,876!
1272

1273
  uint8_t resultType = TSDB_DATA_TYPE_BINARY;
140,876✔
1274
  int32_t resultBytes = 0;
140,876✔
1275
  int32_t sepBytes = 0;
140,876✔
1276

1277
  /* For concat/concat_ws function, if params have NCHAR type, promote the final result to NCHAR */
1278
  for (int32_t i = 0; i < numOfParams; ++i) {
728,291✔
1279
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
587,415✔
1280
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
587,415✔
1281
    if (TSDB_DATA_TYPE_NCHAR == paraType) {
587,415✔
1282
      resultType = paraType;
63,462✔
1283
    }
1284
  }
1285

1286
  for (int32_t i = 0; i < numOfParams; ++i) {
728,261✔
1287
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
587,397✔
1288
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
587,397✔
1289
    int32_t paraBytes = getSDataTypeFromNode(pPara)->bytes;
587,397✔
1290
    int32_t factor = 1;
587,397✔
1291
    if (IS_NULL_TYPE(paraType)) {
587,397✔
1292
      resultType = TSDB_DATA_TYPE_VARCHAR;
12✔
1293
      resultBytes = 0;
12✔
1294
      sepBytes = 0;
12✔
1295
      break;
12✔
1296
    }
1297
    if (TSDB_DATA_TYPE_NCHAR == resultType && TSDB_DATA_TYPE_VARCHAR == paraType) {
587,385✔
1298
      factor *= TSDB_NCHAR_SIZE;
105,598✔
1299
    }
1300
    resultBytes += paraBytes * factor;
587,385✔
1301

1302
    if (i == 0) {
587,385✔
1303
      sepBytes = paraBytes * factor;
140,864✔
1304
    }
1305
  }
1306

1307
  if (hasSep) {
140,876✔
1308
    resultBytes += sepBytes * (numOfParams - 3);
55,806✔
1309
  }
1310

1311
  pFunc->node.resType = (SDataType){.bytes = resultBytes, .type = resultType};
140,876✔
1312
  return TSDB_CODE_SUCCESS;
140,876✔
1313
}
1314

1315
static int32_t translateConcat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
87,646✔
1316
  return translateConcatImpl(pFunc, pErrBuf, len, 2, 8, false);
87,646✔
1317
}
1318

1319
static int32_t translateConcatWs(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
58,566✔
1320
  return translateConcatImpl(pFunc, pErrBuf, len, 3, 9, true);
58,566✔
1321
}
1322

1323
static int32_t translateChar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
32✔
1324
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
32!
1325
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
32!
1326
  pFunc->node.resType = (SDataType){.bytes = 4 * numOfParams + 2, .type = TSDB_DATA_TYPE_VARCHAR};
32✔
1327
  return TSDB_CODE_SUCCESS;
32✔
1328
}
1329

1330
static int32_t translateAscii(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
48✔
1331
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
48✔
1332
  pFunc->node.resType =
47✔
1333
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_UTINYINT].bytes, .type = TSDB_DATA_TYPE_UTINYINT};
47✔
1334
  return TSDB_CODE_SUCCESS;
47✔
1335
}
1336

1337
static int32_t translateTrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
158✔
1338
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
158!
1339

1340
  uint8_t para0Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
158✔
1341
  int32_t resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
158✔
1342
  uint8_t type = para0Type;
158✔
1343

1344
  if (2 == LIST_LENGTH(pFunc->pParameterList)) {
158!
1345
    uint8_t para1Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
126✔
1346
    resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
126✔
1347
    type = para1Type;
126✔
1348
  }
1349
  if (type == TSDB_DATA_TYPE_NCHAR) {
158✔
1350
    resLen *= TSDB_NCHAR_SIZE;
32✔
1351
  }
1352
  uint8_t trimType = pFunc->trimType;
158✔
1353
  int32_t code = addUint8Param(&pFunc->pParameterList, trimType);
158✔
1354
  if (code != TSDB_CODE_SUCCESS) {
158!
1355
    return code;
×
1356
  }
1357
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
158✔
1358
  return TSDB_CODE_SUCCESS;
158✔
1359
}
1360

1361
static int32_t translateReplace(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
125✔
1362
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
125!
1363

1364
  uint8_t orgType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
125✔
1365
  uint8_t fromType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
125✔
1366
  uint8_t toType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->type;
125✔
1367
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
125✔
1368
  int32_t fromLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
125✔
1369
  int32_t toLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->bytes;
125✔
1370

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

1385
static int32_t translateRepeat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
66✔
1386
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
66!
1387

1388
  uint8_t type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
66✔
1389
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
66✔
1390
  int32_t resLen;
1391
  if (nodeType(nodesListGetNode(pFunc->pParameterList, 1)) == QUERY_NODE_VALUE) {
66✔
1392
    resLen = orgLen * TMAX((int32_t)((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i, 1);
57✔
1393
  } else {
1394
    resLen = TSDB_MAX_BINARY_LEN;
9✔
1395
  }
1396
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
66✔
1397
  return TSDB_CODE_SUCCESS;
66✔
1398
}
1399

1400
static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
737,444✔
1401
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
737,444!
1402
  if (numOfParams <= 0) {
737,444!
1403
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1404
  }
1405

1406
  // The number of parameters has been limited by the syntax definition
1407

1408
  SExprNode* pPara0 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
737,444✔
1409
  uint8_t    para0Type = pPara0->resType.type;
737,444✔
1410
  if (TSDB_DATA_TYPE_VARBINARY == para0Type) {
737,444✔
1411
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
1✔
1412
  }
1413

1414
  // The function return type has been set during syntax parsing
1415
  uint8_t para2Type = pFunc->node.resType.type;
737,443✔
1416

1417
  int32_t para2Bytes = pFunc->node.resType.bytes;
737,443✔
1418
  if (IS_STR_DATA_TYPE(para2Type)) {
737,443✔
1419
    para2Bytes -= VARSTR_HEADER_SIZE;
602,545✔
1420
  }
1421
  if (para2Bytes <= 0 ||
737,443!
1422
      para2Bytes > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) {  // cast dst var type length limits to 4096 bytes
737,443!
1423
    if (TSDB_DATA_TYPE_NCHAR == para2Type) {
×
1424
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1425
                             "CAST function converted length should be in range (0, %d] NCHARS",
1426
                             (TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE);
1427
    } else {
1428
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1429
                             "CAST function converted length should be in range (0, %d] bytes",
1430
                             TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE);
1431
    }
1432
  }
1433

1434
  // add database precision as param
1435
  uint8_t dbPrec = pFunc->node.resType.precision;
737,443✔
1436
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
737,443✔
1437
  if (code != TSDB_CODE_SUCCESS) {
737,443!
1438
    return code;
×
1439
  }
1440

1441
  return TSDB_CODE_SUCCESS;
737,443✔
1442
}
1443

1444
static int32_t translateToIso8601(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
19,329✔
1445
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
19,329✔
1446
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
19,308!
1447
  // param1
1448
  if (numOfParams == 2) {
19,308✔
1449
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
110✔
1450
    if (!validateTimezoneFormat(pValue)) {
110✔
1451
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Invalid timzone format");
48✔
1452
    }
1453
  } else {  // add default client timezone
1454
    int32_t code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
19,198✔
1455
    if (code != TSDB_CODE_SUCCESS) {
19,198!
1456
      return code;
×
1457
    }
1458
  }
1459

1460
  // set result type
1461
  pFunc->node.resType = (SDataType){.bytes = 64, .type = TSDB_DATA_TYPE_BINARY};
19,260✔
1462
  return TSDB_CODE_SUCCESS;
19,260✔
1463
}
1464

1465
static int32_t translateToUnixtimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
19,105✔
1466
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
19,105✔
1467
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
19,036!
1468
  int16_t resType = TSDB_DATA_TYPE_BIGINT;
19,036✔
1469
  if (2 == numOfParams) {
19,036✔
1470
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
8✔
1471
    if (pValue->datum.i == 1) {
8✔
1472
      resType = TSDB_DATA_TYPE_TIMESTAMP;
4✔
1473
    } else if (pValue->datum.i == 0) {
4!
1474
      resType = TSDB_DATA_TYPE_BIGINT;
4✔
1475
    } else {
1476
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1477
                             "TO_UNIXTIMESTAMP function second parameter should be 0/1");
1478
    }
1479
  }
1480

1481
  // add database precision as param
1482
  uint8_t dbPrec = pFunc->node.resType.precision;
19,036✔
1483
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
19,036✔
1484
  if (code != TSDB_CODE_SUCCESS) {
19,036!
1485
    return code;
×
1486
  }
1487

1488
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
19,036✔
1489
  return TSDB_CODE_SUCCESS;
19,036✔
1490
}
1491

1492
static int32_t translateToTimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,133✔
1493
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
1,133!
1494
  pFunc->node.resType =
1,133✔
1495
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
1,133✔
1496
  return TSDB_CODE_SUCCESS;
1,133✔
1497
}
1498

1499
static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
20,185✔
1500
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
20,185✔
1501
  uint8_t dbPrec = pFunc->node.resType.precision;
19,897✔
1502
  // add database precision as param
1503
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
19,897✔
1504
  if (code != TSDB_CODE_SUCCESS) {
19,897!
1505
    return code;
×
1506
  }
1507

1508
  // add client timezone as param
1509
  code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
19,897✔
1510
  if (code != TSDB_CODE_SUCCESS) {
19,897!
1511
    return code;
×
1512
  }
1513

1514
  pFunc->node.resType =
19,897✔
1515
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
19,897✔
1516
  return TSDB_CODE_SUCCESS;
19,897✔
1517
}
1518

1519
static int32_t translateAddPrecOutBigint(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
124,960✔
1520
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
124,960✔
1521

1522
  // add database precision as param
1523
  uint8_t dbPrec = pFunc->node.resType.precision;
122,152✔
1524

1525
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
122,152✔
1526
  if (code != TSDB_CODE_SUCCESS) {
122,152!
1527
    return code;
×
1528
  }
1529

1530
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
122,152✔
1531
  return TSDB_CODE_SUCCESS;
122,152✔
1532
}
1533

1534
static int32_t translateToJson(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
17✔
1535
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
17✔
1536
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_JSON].bytes, .type = TSDB_DATA_TYPE_JSON};
16✔
1537
  return TSDB_CODE_SUCCESS;
16✔
1538
}
1539

1540
static int32_t translateOutGeom(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
77✔
1541
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
77✔
1542
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
74✔
1543
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_GEOMETRY};
74✔
1544

1545
  return TSDB_CODE_SUCCESS;
74✔
1546
}
1547

1548
static int32_t translateInGeomOutStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
12✔
1549
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
12✔
1550
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
9✔
1551
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_VARCHAR};
9✔
1552

1553
  return TSDB_CODE_SUCCESS;
9✔
1554
}
1555

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

1560
  return TSDB_CODE_SUCCESS;
54✔
1561
}
1562

1563
static int32_t translateSelectValue(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
54,664✔
1564
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
54,664!
1565
  if (numOfParams <= 0) {
54,664!
1566
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1567
  }
1568

1569
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
54,664✔
1570
  return TSDB_CODE_SUCCESS;
54,664✔
1571
}
1572

1573
static int32_t translateBlockDistFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1574
  pFunc->node.resType = (SDataType){.bytes = 128, .type = TSDB_DATA_TYPE_VARCHAR};
×
1575
  return TSDB_CODE_SUCCESS;
×
1576
}
1577

1578
static bool getBlockDistFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
1,628✔
1579
  pEnv->calcMemSize = sizeof(STableBlockDistInfo);
1,628✔
1580
  return true;
1,628✔
1581
}
1582
static bool getBlockDBUsageFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
1✔
1583
  pEnv->calcMemSize = sizeof(SDBBlockUsageInfo);
1✔
1584
  return true;
1✔
1585
}
1586

1587
static int32_t translateGroupKey(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
231,353✔
1588
  if (1 != LIST_LENGTH(pFunc->pParameterList)) {
231,353!
1589
    return TSDB_CODE_SUCCESS;
×
1590
  }
1591
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
231,353✔
1592
  return TSDB_CODE_SUCCESS;
231,353✔
1593
}
1594

1595
static int32_t translateServerStatusFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
780✔
1596
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
780✔
1597
  return TSDB_CODE_SUCCESS;
780✔
1598
}
1599

1600
static int32_t translateTagsPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
10✔
1601
  // The _tags pseudo-column will be expanded to the actual tags on the client side
1602
  return TSDB_CODE_SUCCESS;
10✔
1603
}
1604

1605
static int32_t translateOutVarchar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
474,226✔
1606
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
474,226✔
1607
  int32_t bytes = 0;
474,198✔
1608
  switch (pFunc->funcType) {
474,198!
1609
    case FUNCTION_TYPE_MD5:
287✔
1610
      bytes = MD5_OUTPUT_LEN + VARSTR_HEADER_SIZE;
287✔
1611
      break;
287✔
1612
    case FUNCTION_TYPE_USER:
8✔
1613
    case FUNCTION_TYPE_CURRENT_USER:
1614
      bytes = TSDB_USER_LEN;
8✔
1615
      break;
8✔
1616
    case FUNCTION_TYPE_SERVER_VERSION:
1,544✔
1617
    case FUNCTION_TYPE_CLIENT_VERSION:
1618
      bytes = TSDB_VERSION_LEN;
1,544✔
1619
      break;
1,544✔
1620
    case FUNCTION_TYPE_DATABASE:
390✔
1621
      bytes = TSDB_DB_NAME_LEN;
390✔
1622
      break;
390✔
1623
    case FUNCTION_TYPE_BLOCK_DIST:
32✔
1624
    case FUNCTION_TYPE_BLOCK_DIST_INFO:
1625
      bytes = sizeof(STableBlockDistInfo);
32✔
1626
      break;
32✔
1627
    case FUNCTION_TYPE_TO_CHAR:
9,419✔
1628
      bytes = 4096;
9,419✔
1629
      break;
9,419✔
1630
    case FUNCTION_TYPE_HYPERLOGLOG_STATE_MERGE:
3,546✔
1631
    case FUNCTION_TYPE_HYPERLOGLOG_PARTIAL:
1632
    case FUNCTION_TYPE_HYPERLOGLOG_STATE:
1633
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
3,546✔
1634
      break;
3,546✔
1635
    case FUNCTION_TYPE_SPREAD_PARTIAL:
1,549✔
1636
    case FUNCTION_TYPE_SPREAD_STATE:
1637
    case FUNCTION_TYPE_SPREAD_STATE_MERGE:
1638
      bytes = getSpreadInfoSize() + VARSTR_HEADER_SIZE;
1,549✔
1639
      break;
1,549✔
1640
    case FUNCTION_TYPE_APERCENTILE_PARTIAL:
1,643✔
1641
      bytes = getApercentileMaxSize() + VARSTR_HEADER_SIZE;
1,643✔
1642
      break;
1,643✔
1643
    case FUNCTION_TYPE_STD_STATE:
1,622✔
1644
    case FUNCTION_TYPE_STD_STATE_MERGE:
1645
    case FUNCTION_TYPE_STD_PARTIAL:
1646
      bytes = getStdInfoSize() + VARSTR_HEADER_SIZE;
1,622✔
1647
      break;
1,622✔
1648
    case FUNCTION_TYPE_AVG_PARTIAL:
65,384✔
1649
    case FUNCTION_TYPE_AVG_STATE:
1650
    case FUNCTION_TYPE_AVG_STATE_MERGE:
1651
      bytes = getAvgInfoSize() + VARSTR_HEADER_SIZE;
65,384✔
1652
      break;
65,384✔
1653
    case FUNCTION_TYPE_HISTOGRAM_PARTIAL:
×
1654
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
×
1655
      break;
×
1656
    case FUNCTION_TYPE_HISTOGRAM:
5,242✔
1657
    case FUNCTION_TYPE_HISTOGRAM_MERGE:
1658
      bytes = 512;
5,242✔
1659
      break;
5,242✔
1660
    case FUNCTION_TYPE_LEASTSQUARES:
6,447✔
1661
      bytes = LEASTSQUARES_BUFF_LENGTH;
6,447✔
1662
      break;
6,447✔
1663
    case FUNCTION_TYPE_TBNAME:
325,156✔
1664
      bytes = TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE;
325,156✔
1665
      break;
325,156✔
1666
    case FUNCTION_TYPE_TIMEZONE:{
40,591✔
1667
      if (pFunc->tz == NULL) {
40,591✔
1668
        bytes = VARSTR_HEADER_SIZE + strlen(tsTimezoneStr);
40,586✔
1669
      }else{
1670
        char *tzName  = (char*)taosHashGet(pTimezoneNameMap, &pFunc->tz, sizeof(timezone_t));
5✔
1671
        if (tzName == NULL){
5!
1672
          tzName = TZ_UNKNOWN;
×
1673
        }
1674
        bytes = strlen(tzName) + VARSTR_HEADER_SIZE;
5✔
1675
      }
1676
      break;
40,591✔
1677
    }
1678
    case FUNCTION_TYPE_IRATE_PARTIAL:
64✔
1679
      bytes = getIrateInfoSize((pFunc->hasPk) ? pFunc->pkBytes : 0) + VARSTR_HEADER_SIZE;
64✔
1680
      break;
64✔
1681
    case FUNCTION_TYPE_FIRST_PARTIAL:
11,252✔
1682
    case FUNCTION_TYPE_LAST_PARTIAL:
1683
    case FUNCTION_TYPE_FIRST_STATE:
1684
    case FUNCTION_TYPE_LAST_STATE:
1685
      bytes = getFirstLastInfoSize(getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes,
11,252✔
1686
                                   (pFunc->hasPk) ? pFunc->pkBytes : 0) +
11,252✔
1687
              VARSTR_HEADER_SIZE;
1688
      break;
11,252✔
1689
    case FUNCTION_TYPE_FIRST_STATE_MERGE:
20✔
1690
    case FUNCTION_TYPE_LAST_STATE_MERGE:
1691
      bytes = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
20✔
1692
      break;
20✔
1693
    case FUNCTION_TYPE_DB_USAGE:
2✔
1694
    case FUNCTION_TYPE_DB_USAGE_INFO:
1695
      bytes = 128;
2✔
1696
      break;
2✔
1697
    default:
×
1698
      bytes = 0;
×
1699
      break;
×
1700
  }
1701
  pFunc->node.resType = (SDataType){.bytes = bytes, .type = TSDB_DATA_TYPE_VARCHAR};
474,198✔
1702
  return TSDB_CODE_SUCCESS;
474,198✔
1703
}
1704

1705
static int32_t invalidColsFunction(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1706
  return TSDB_CODE_PAR_INVALID_COLS_FUNCTION;
×
1707
}
1708

1709
static int32_t translateHistogramImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
12,077✔
1710
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
12,077✔
1711
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
12,076!
1712
  int8_t  binType;
1713
  char*   binDesc;
1714
  for (int32_t i = 1; i < numOfParams; ++i) {
48,302✔
1715
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, i);
36,227✔
1716
    if (i == 1) {
36,227✔
1717
      binType = validateHistogramBinType(varDataVal(pValue->datum.p));
12,076✔
1718
      if (binType == UNKNOWN_BIN) {
12,076!
1719
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1720
                               "HISTOGRAM function binType parameter should be "
1721
                               "\"user_input\", \"log_bin\" or \"linear_bin\"");
1722
      }
1723
    }
1724

1725
    if (i == 2) {
36,227✔
1726
      char errMsg[128] = {0};
12,076✔
1727
      binDesc = varDataVal(pValue->datum.p);
12,076✔
1728
      if (TSDB_CODE_SUCCESS != validateHistogramBinDesc(binDesc, binType, errMsg, (int32_t)sizeof(errMsg))) {
12,076✔
1729
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, errMsg);
1✔
1730
      }
1731
    }
1732
  }
1733
  return TSDB_CODE_SUCCESS;
12,075✔
1734
}
1735

1736
static int32_t translateHitogram(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
9,456✔
1737
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
9,456✔
1738
  pFunc->node.resType = (SDataType){.bytes = 512, .type = TSDB_DATA_TYPE_BINARY};
9,454✔
1739
  return TSDB_CODE_SUCCESS;
9,454✔
1740
}
1741
static int32_t translateHistogramPartial(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
2,621✔
1742
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
2,621!
1743
  pFunc->node.resType =
2,621✔
1744
      (SDataType){.bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY};
2,621✔
1745
  return TSDB_CODE_SUCCESS;
2,621✔
1746
}
1747

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

5662
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