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

taosdata / TDengine / #3796

31 Mar 2025 10:39AM UTC coverage: 30.372% (-7.1%) from 37.443%
#3796

push

travis-ci

happyguoxy
test:add test cases

69287 of 309062 branches covered (22.42%)

Branch coverage included in aggregate %.

118044 of 307720 relevant lines covered (38.36%)

278592.15 hits per line

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

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

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

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

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

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

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

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

54
  if (TSDB_TIME_PRECISION_MILLI == dbPrec &&
32!
55
      (0 == strcasecmp(pVal->literal, "1u") || 0 == strcasecmp(pVal->literal, "1b"))) {
32!
56
    return TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL;
×
57
  }
58

59
  if (TSDB_TIME_PRECISION_MICRO == dbPrec && 0 == strcasecmp(pVal->literal, "1b")) {
32!
60
    return TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL;
×
61
  }
62

63
  if (pVal->literal[0] != '1' ||
32!
64
      (pVal->literal[1] != 'u' && pVal->literal[1] != 'a' && pVal->literal[1] != 's' && pVal->literal[1] != 'm' &&
32!
65
       pVal->literal[1] != 'h' && pVal->literal[1] != 'd' && pVal->literal[1] != 'w' && pVal->literal[1] != 'b')) {
20!
66
    return TSDB_CODE_FUNC_TIME_UNIT_INVALID;
×
67
  }
68

69
  return TSDB_CODE_SUCCESS;
32✔
70
}
71

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

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

85
  return true;
2✔
86
}
87

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

93
  return false;
×
94
}
95

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

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

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

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

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

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

172
  return true;
2✔
173
}
174

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

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

189
  return numOfSpaces;
×
190
}
191

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

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

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

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

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

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

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

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

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

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

284
static bool paramSupportNull(uint64_t typeFlag) {
922✔
285
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NULL_TYPE) ||
1,844!
286
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
922!
287
}
288

289
static bool paramSupportBool(uint64_t typeFlag) {
43✔
290
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BOOL_TYPE) ||
86!
291
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
43!
292
}
293

294
static bool paramSupportTinyint(uint64_t typeFlag) {
197✔
295
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TINYINT_TYPE) ||
394✔
296
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
197✔
297
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
137!
298
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
394!
299
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
300
}
301

302
static bool paramSupportSmallint(uint64_t typeFlag) {
110✔
303
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_SMALLINT_TYPE) ||
220✔
304
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
110✔
305
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
90!
306
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
220!
307
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
308
}
309

310
static bool paramSupportInt(uint64_t typeFlag) {
686✔
311
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INT_TYPE) ||
1,372✔
312
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
686✔
313
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
547!
314
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
1,372!
315
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
316
}
317

318
static bool paramSupportBigint(uint64_t typeFlag) {
399✔
319
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BIGINT_TYPE) ||
780✔
320
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
381✔
321
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
371✔
322
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
785✔
323
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
5!
324
}
325

326
static bool paramSupportFloat(uint64_t typeFlag) {
90✔
327
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FLOAT_TYPE) ||
180✔
328
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
180!
329
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
90!
330
}
331

332
static bool paramSupportDouble(uint64_t typeFlag) {
139✔
333
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_DOUBLE_TYPE) ||
278✔
334
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
256!
335
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
117!
336
}
337

338
static bool paramSupportVarchar(uint64_t typeFlag) {
377✔
339
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARCHAR_TYPE) ||
497✔
340
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
120✔
341
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
83✔
342
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
551!
343
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
54✔
344
}
345

346
static bool paramSupportTimestamp(uint64_t typeFlag) {
568✔
347
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE) ||
1,061✔
348
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
597✔
349
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
29!
350
}
351

352
static bool paramSupportNchar(uint64_t typeFlag) {
66✔
353
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NCHAR_TYPE) ||
102✔
354
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
36!
355
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
36✔
356
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
136!
357
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
34!
358
}
359

360
static bool paramSupportUTinyInt(uint64_t typeFlag) {
1,147✔
361
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UTINYINT_TYPE) ||
2,294✔
362
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
1,147✔
363
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
99!
364
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
2,294!
365
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
366
}
367

368
static bool paramSupportUSmallInt(uint64_t typeFlag) {
416✔
369
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_USMALLINT_TYPE) ||
832✔
370
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
416✔
371
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
46!
372
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
832!
373
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
374
}
375

376
static bool paramSupportUInt(uint64_t typeFlag) {
343✔
377
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UINT_TYPE) ||
686✔
378
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
343✔
379
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
84!
380
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
686!
381
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
382
}
383

384
static bool paramSupportUBigInt(uint64_t typeFlag) {
42✔
385
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UBIGINT_TYPE) ||
84✔
386
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
42!
387
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
42!
388
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
84!
389
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
390
}
391

392
static bool paramSupportJSON(uint64_t typeFlag) {
×
393
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_JSON_TYPE) ||
×
394
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
×
395
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE);
×
396
}
397

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

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

411
static bool paramSupportDecimal(uint64_t typeFlag) {
×
412
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_DECIMAL_TYPE) ||
×
413
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
×
414
}
415

416
static bool paramSupportValueNode(uint64_t typeFlag) {
395✔
417
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VALUE_NODE) ||
569✔
418
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE);
174!
419
}
420

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

427
static bool paramSupportFunctionNode(uint64_t typeFlag) {
46✔
428
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
46✔
429
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FUNCTION_NODE) ||
46!
430
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
×
431
}
432

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

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

445
static bool paramSupportColumnNode(uint64_t typeFlag) {
4,991✔
446
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
5,011✔
447
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_COLUMN_NODE) ||
5,005✔
448
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
14!
449
}
450

451
static bool paramSupportNodeType(SNode* pNode, uint64_t typeFlag) {
5,467✔
452
  switch (pNode->type) {
5,467!
453
    case QUERY_NODE_VALUE:
395✔
454
      return paramSupportValueNode(typeFlag);
395✔
455
    case QUERY_NODE_OPERATOR:
35✔
456
      return paramSupportOperatorNode(typeFlag);
35✔
457
    case QUERY_NODE_FUNCTION:
46✔
458
      return paramSupportFunctionNode(typeFlag);
46✔
459
    case QUERY_NODE_LOGIC_CONDITION:
×
460
      return paramSupportLogicConNode(typeFlag);
×
461
    case QUERY_NODE_CASE_WHEN:
×
462
      return paramSupportCaseWhenNode(typeFlag);
×
463
    case QUERY_NODE_COLUMN:
4,991✔
464
      return paramSupportColumnNode(typeFlag);
4,991✔
465
    default:
×
466
      return false;
×
467
  }
468
}
469

470
static bool paramSupportDataType(SDataType* pDataType, uint64_t typeFlag) {
5,467✔
471
  switch (pDataType->type) {
5,467!
472
    case TSDB_DATA_TYPE_NULL:
922✔
473
      return paramSupportNull(typeFlag);
922✔
474
    case TSDB_DATA_TYPE_BOOL:
43✔
475
      return paramSupportBool(typeFlag);
43✔
476
    case TSDB_DATA_TYPE_TINYINT:
197✔
477
      return paramSupportTinyint(typeFlag);
197✔
478
    case TSDB_DATA_TYPE_SMALLINT:
110✔
479
      return paramSupportSmallint(typeFlag);
110✔
480
    case TSDB_DATA_TYPE_INT:
686✔
481
      return paramSupportInt(typeFlag);
686✔
482
    case TSDB_DATA_TYPE_BIGINT:
399✔
483
      return paramSupportBigint(typeFlag);
399✔
484
    case TSDB_DATA_TYPE_FLOAT:
90✔
485
      return paramSupportFloat(typeFlag);
90✔
486
    case TSDB_DATA_TYPE_DOUBLE:
139✔
487
      return paramSupportDouble(typeFlag);
139✔
488
    case TSDB_DATA_TYPE_VARCHAR:
333✔
489
      return paramSupportVarchar(typeFlag);
333✔
490
    case TSDB_DATA_TYPE_TIMESTAMP:
568✔
491
      return paramSupportTimestamp(typeFlag);
568✔
492
    case TSDB_DATA_TYPE_NCHAR:
32✔
493
      return paramSupportNchar(typeFlag);
32✔
494
    case TSDB_DATA_TYPE_UTINYINT:
1,147✔
495
      return paramSupportUTinyInt(typeFlag);
1,147✔
496
    case TSDB_DATA_TYPE_USMALLINT:
416✔
497
      return paramSupportUSmallInt(typeFlag);
416✔
498
    case TSDB_DATA_TYPE_UINT:
343✔
499
      return paramSupportUInt(typeFlag);
343✔
500
    case TSDB_DATA_TYPE_UBIGINT:
42✔
501
      return paramSupportUBigInt(typeFlag);
42✔
502
    case TSDB_DATA_TYPE_JSON:
×
503
      return paramSupportJSON(typeFlag);
×
504
    case TSDB_DATA_TYPE_VARBINARY:
×
505
      return paramSupportVarBinary(typeFlag);
×
506
    case TSDB_DATA_TYPE_GEOMETRY:
×
507
      return paramSupportGeometry(typeFlag);
×
508
    case TSDB_DATA_TYPE_DECIMAL64:
×
509
    case TSDB_DATA_TYPE_DECIMAL:
510
      return paramSupportDecimal(typeFlag);
×
511
    default:
×
512
      return false;
×
513
  }
514
}
515

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

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

530
  return binType;
4✔
531
}
532

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

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

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

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

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

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

580
    int32_t counter = (int32_t)count->valueint;
4✔
581
    if (infinity->valueint == false) {
4!
582
      startIndex = 0;
4✔
583
      numOfBins = counter + 1;
4✔
584
    } else {
585
      startIndex = 1;
×
586
      numOfBins = counter + 3;
×
587
    }
588

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

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

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

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

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

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

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

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

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

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

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

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

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

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

826
  // check param num
827
  if ((funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum != -1 &&
5,081✔
828
       LIST_LENGTH(paramList) > funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum) ||
3,431!
829
      LIST_LENGTH(paramList) < funcMgtBuiltins[pFunc->funcId].parameters.minParamNum) {
5,081!
830
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
831
  }
832

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

839
    while (1) {
840
      // one table can have at most 4096 columns, int32_t is enough.
841
      for (int32_t j = paramPattern[paramIdx].startParam;
5,826✔
842
           j <= (paramPattern[paramIdx].endParam == -1 ? INT32_MAX - 1 : paramPattern[paramIdx].endParam); j++) {
11,293✔
843
        if (j > LIST_LENGTH(paramList)) {
7,653!
844
          code = TSDB_CODE_SUCCESS;
2,186✔
845
          isMatch = true;
2,186✔
846
          break;
2,186✔
847
        }
848
        SNode* pNode = nodesListGetNode(paramList, j - 1);
5,467✔
849
        if (NULL == pNode) {
5,467!
850
          code = TSDB_CODE_FUNC_FUNTION_PARA_NUM;
×
851
          isMatch = false;
×
852
          break;
×
853
        }
854
        // check node type
855
        if (!paramSupportNodeType(pNode, paramPattern[paramIdx].validNodeType)) {
5,467!
856
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
×
857
          isMatch = false;
×
858
          break;
×
859
        }
860
        // check data type
861
        if (!paramSupportDataType(getSDataTypeFromNode(pNode), paramPattern[paramIdx].validDataType)) {
5,467!
862
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
×
863
          isMatch = false;
×
864
          break;
×
865
        }
866
        if (paramPattern[paramIdx].validNodeType == FUNC_PARAM_SUPPORT_VALUE_NODE) {
5,467✔
867
          SValueNode* pVal = (SValueNode*)pNode;
221✔
868
          pVal->notReserved = true;
221✔
869
        }
870
        switch (paramPattern[paramIdx].valueRangeFlag) {
5,467!
871
          case FUNC_PARAM_NO_SPECIFIC_VALUE:
5,320✔
872
            break;
5,320✔
873
          case FUNC_PARAM_HAS_RANGE:
97✔
874
            code = checkRangeValue(pNode, paramPattern[paramIdx].range, &isMatch);
97✔
875
            break;
97✔
876
          case FUNC_PARAM_HAS_FIXED_VALUE:
50✔
877
            code = checkFixedValue(pNode, &paramPattern[paramIdx], paramIdx, &isMatch);
50✔
878
            break;
50✔
879
          default:
×
880
            break;
×
881
        }
882
        if (!isMatch) {
5,467!
883
          break;
×
884
        }
885
        switch (paramPattern[paramIdx].paramAttribute) {
5,467!
886
          case FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE:
3,455✔
887
            break;
3,455✔
888
          case FUNC_PARAM_MUST_BE_PRIMTS:
6✔
889
            code = checkPrimTS(pNode, &isMatch);
6✔
890
            break;
6✔
891
          case FUNC_PARAM_MUST_BE_PK:
×
892
            code = checkPrimaryKey(pNode, &isMatch);
×
893
            break;
×
894
          case FUNC_PARAM_MUST_HAVE_COLUMN:
310✔
895
            code = checkHasColumn(pNode, &isMatch);
310✔
896
            break;
310✔
897
          case FUNC_PARAM_VALUE_NODE_NOT_NULL:
1,664✔
898
            code = checkValueNodeNotNull(pNode, &isMatch);
1,664✔
899
            break;
1,664✔
900
          case FUNC_PARAM_MUST_BE_TIME_UNIT:
32✔
901
            code = checkTimeUnit(pNode, pFunc->node.resType.precision, &isMatch);
32✔
902
            break;
32✔
903
          default:
×
904
            break;
×
905
        }
906
        if (!isMatch) {
5,467!
907
          break;
×
908
        }
909
      }
910

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

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

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

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

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

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

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

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

1013
static int32_t translateTrimStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len, bool isLtrim) {
12✔
1014
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
12!
1015

1016
  SDataType* pRestType1 = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
12✔
1017

1018
  int32_t numOfSpaces = 0;
12✔
1019
  SNode*  pParamNode1 = nodesListGetNode(pFunc->pParameterList, 0);
12✔
1020
  // for select trim functions with constant value from table,
1021
  // need to set the proper result result schema bytes to avoid
1022
  // trailing garbage characters
1023
  if (nodeType(pParamNode1) == QUERY_NODE_VALUE) {
12!
1024
    SValueNode* pValue = (SValueNode*)pParamNode1;
×
1025
    numOfSpaces = countTrailingSpaces(pValue, isLtrim);
×
1026
  }
1027

1028
  int32_t resBytes = pRestType1->bytes - numOfSpaces;
12✔
1029
  pFunc->node.resType = (SDataType){.bytes = resBytes, .type = pRestType1->type};
12✔
1030
  return TSDB_CODE_SUCCESS;
12✔
1031
}
1032

1033
static int32_t translateLtrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
6✔
1034
  return translateTrimStr(pFunc, pErrBuf, len, true);
6✔
1035
}
1036

1037
static int32_t translateRtrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
6✔
1038
  return translateTrimStr(pFunc, pErrBuf, len, false);
6✔
1039
}
1040

1041
// The return type is BIGINT type
1042
static int32_t translateOutBigInt(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,427✔
1043
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
1,427!
1044
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
1,427✔
1045
  return TSDB_CODE_SUCCESS;
1,427✔
1046
}
1047

1048
static int32_t translateSum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
123✔
1049
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
123!
1050

1051
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
123✔
1052
  uint8_t resType = 0;
123✔
1053
  uint8_t prec = 0, scale = 0;
123✔
1054
  if (IS_SIGNED_NUMERIC_TYPE(paraType) || TSDB_DATA_TYPE_BOOL == paraType || IS_NULL_TYPE(paraType)) {
123!
1055
    resType = TSDB_DATA_TYPE_BIGINT;
114✔
1056
  } else if (IS_UNSIGNED_NUMERIC_TYPE(paraType)) {
9!
1057
    resType = TSDB_DATA_TYPE_UBIGINT;
×
1058
  } else if (IS_FLOAT_TYPE(paraType)) {
9!
1059
    resType = TSDB_DATA_TYPE_DOUBLE;
9✔
1060
  } else if (IS_DECIMAL_TYPE(paraType)) {
×
1061
    resType = TSDB_DATA_TYPE_DECIMAL;
×
1062
    prec = TSDB_DECIMAL_MAX_PRECISION;
×
1063
    scale = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.scale;
×
1064
  }
1065

1066
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType, .precision = prec, .scale = scale};
123✔
1067
  return TSDB_CODE_SUCCESS;
123✔
1068
}
1069

1070
static int32_t translateWduration(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
14✔
1071
  // pseudo column do not need to check parameters
1072
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes,
14✔
1073
                                    .type = TSDB_DATA_TYPE_BIGINT,
1074
                                    .precision = pFunc->node.resType.precision};
14✔
1075
  return TSDB_CODE_SUCCESS;
14✔
1076
}
1077

1078
static int32_t translateNowToday(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
29✔
1079
  // pseudo column do not need to check parameters
1080

1081
  // add database precision as param
1082
  uint8_t dbPrec = pFunc->node.resType.precision;
29✔
1083
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
29✔
1084
  if (code != TSDB_CODE_SUCCESS) {
29!
1085
    return code;
×
1086
  }
1087

1088
  pFunc->node.resType =
29✔
1089
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
29✔
1090
  return TSDB_CODE_SUCCESS;
29✔
1091
}
1092

1093
static int32_t translateRand(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1094
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1095

1096
  if (!pFunc->dual) {
×
1097
    int32_t code = addPseudoParam(&pFunc->pParameterList);
×
1098
    if (code != TSDB_CODE_SUCCESS) {
×
1099
      return code;
×
1100
    }
1101
  }
1102

1103
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
×
1104
  return TSDB_CODE_SUCCESS;
×
1105
}
1106

1107
// return type is same as first input parameter's type
1108
static int32_t translateOutFirstIn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
2,014✔
1109
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
2,014!
1110
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
2,014✔
1111
  return TSDB_CODE_SUCCESS;
2,014✔
1112
}
1113

1114
static int32_t translateTimePseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,493✔
1115
  // pseudo column do not need to check parameters
1116

1117
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes,
1,493✔
1118
                                    .type = TSDB_DATA_TYPE_TIMESTAMP,
1119
                                    .precision = pFunc->node.resType.precision};
1,493✔
1120
  return TSDB_CODE_SUCCESS;
1,493✔
1121
}
1122

1123
static int32_t translateIsFilledPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1✔
1124
  // pseudo column do not need to check parameters
1125

1126
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes, .type = TSDB_DATA_TYPE_BOOL};
1✔
1127
  return TSDB_CODE_SUCCESS;
1✔
1128
}
1129

1130
static int32_t translatePercentile(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
12✔
1131
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
12!
1132
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
12!
1133

1134
  // set result type
1135
  if (numOfParams > 2) {
12!
1136
    pFunc->node.resType = (SDataType){.bytes = 3200, .type = TSDB_DATA_TYPE_VARCHAR};
×
1137
  } else {
1138
    pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
12✔
1139
  }
1140
  return TSDB_CODE_SUCCESS;
12✔
1141
}
1142

1143
static int32_t translateVgIdColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
9✔
1144
  // pseudo column do not need to check parameters
1145
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
9✔
1146
  return TSDB_CODE_SUCCESS;
9✔
1147
}
1148

1149
static int32_t reserveFirstMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
2✔
1150
  int32_t code = nodesListMakeAppend(pParameters, pPartialRes);
2✔
1151
  if (TSDB_CODE_SUCCESS == code) {
2!
1152
    SNode* pNew = NULL;
2✔
1153
    code = nodesCloneNode(nodesListGetNode(pRawParameters, 1), &pNew);
2✔
1154
    if (TSDB_CODE_SUCCESS == code) {
2!
1155
      code = nodesListStrictAppend(*pParameters, pNew);
2✔
1156
    }
1157
  }
1158
  return code;
2✔
1159
}
1160

1161
int32_t topBotCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
2✔
1162
  return reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
2✔
1163
}
1164

1165
int32_t apercentileCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
×
1166
  int32_t code = reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
×
1167
  if (TSDB_CODE_SUCCESS == code && pRawParameters->length >= 3) {
×
1168
    SNode* pNew = NULL;
×
1169
    code = nodesCloneNode(nodesListGetNode(pRawParameters, 2), &pNew);
×
1170
    if (TSDB_CODE_SUCCESS == code) {
×
1171
      code = nodesListStrictAppend(*pParameters, pNew);
×
1172
    }
1173
  }
1174
  return code;
×
1175
}
1176

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

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

1181
static int32_t translateCsum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
17✔
1182
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
17!
1183
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
17✔
1184
  uint8_t resType;
1185
  if (IS_SIGNED_NUMERIC_TYPE(colType)) {
17!
1186
    resType = TSDB_DATA_TYPE_BIGINT;
13✔
1187
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
4!
1188
    resType = TSDB_DATA_TYPE_UBIGINT;
4✔
1189
  } else if (IS_FLOAT_TYPE(colType)) {
×
1190
    resType = TSDB_DATA_TYPE_DOUBLE;
×
1191
  } else {
1192
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
1193
  }
1194
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
17✔
1195
  return TSDB_CODE_SUCCESS;
17✔
1196
}
1197

1198
static EFuncReturnRows csumEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
13✔
1199

1200
static int32_t translateSampleTail(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
34✔
1201
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
34!
1202

1203
  SDataType* pSDataType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
34✔
1204
  uint8_t    colType = pSDataType->type;
34✔
1205

1206
  // set result type
1207
  pFunc->node.resType =
34✔
1208
      (SDataType){.bytes = IS_STR_DATA_TYPE(colType) ? pSDataType->bytes : tDataTypes[colType].bytes, .type = colType};
34!
1209
  return TSDB_CODE_SUCCESS;
34✔
1210
}
1211

1212
static EFuncReturnRows derivativeEstReturnRows(SFunctionNode* pFunc) {
6✔
1213
  return 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 2))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
6✔
1214
                                                                                 : FUNC_RETURN_ROWS_N_MINUS_1;
6!
1215
}
1216

1217
static int32_t translateAddPrecOutDouble(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
6✔
1218
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
6!
1219
  // add database precision as param
1220
  uint8_t dbPrec = pFunc->node.resType.precision;
6✔
1221
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
6✔
1222
  if (code != TSDB_CODE_SUCCESS) {
6!
1223
    return code;
×
1224
  }
1225

1226
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
6✔
1227
  return TSDB_CODE_SUCCESS;
6✔
1228
}
1229

1230
static int32_t translateInterp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1231
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1232
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
×
1233
  return TSDB_CODE_SUCCESS;
×
1234
}
1235

1236
static EFuncReturnRows interpEstReturnRows(SFunctionNode* pFunc) {
14✔
1237
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
14!
1238
  if (1 < numOfParams && 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i) {
14!
1239
    return FUNC_RETURN_ROWS_INDEFINITE;
×
1240
  } else {
1241
    return FUNC_RETURN_ROWS_N;
14✔
1242
  }
1243
}
1244

1245
static int32_t translateForecast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
29✔
1246
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
29!
1247
  if (2 != numOfParams && 1 != numOfParams) {
29!
1248
    return invaildFuncParaNumErrMsg(pErrBuf, len, "FORECAST require 1 or 2 parameters");
×
1249
  }
1250

1251
  uint8_t valType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
29✔
1252
  if (!IS_MATHABLE_TYPE(valType)) {
29!
1253
    return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST only support mathable column");
2✔
1254
  }
1255

1256
  if (numOfParams == 2) {
27!
1257
    uint8_t optionType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
27✔
1258
    if (TSDB_DATA_TYPE_BINARY != optionType) {
27!
1259
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be varchar");
×
1260
    }
1261

1262
    SNode* pOption = nodesListGetNode(pFunc->pParameterList, 1);
27✔
1263
    if (QUERY_NODE_VALUE != nodeType(pOption)) {
27!
1264
      return invaildFuncParaTypeErrMsg(pErrBuf, len, "FORECAST option should be value");
×
1265
    }
1266

1267
    SValueNode* pValue = (SValueNode*)pOption;
27✔
1268
    if (!taosAnalyGetOptStr(pValue->literal, "algo", NULL, 0) != 0) {
27!
1269
      return invaildFuncParaValueErrMsg(pErrBuf, len, "FORECAST option should include algo field");
×
1270
    }
1271

1272
    pValue->notReserved = true;
27✔
1273
  }
1274

1275
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[valType].bytes, .type = valType};
27✔
1276
  return TSDB_CODE_SUCCESS;
27✔
1277
}
1278

1279
static int32_t translateForecastConf(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
26✔
1280
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_FLOAT].bytes, .type = TSDB_DATA_TYPE_FLOAT};
26✔
1281
  return TSDB_CODE_SUCCESS;
26✔
1282
}
1283

1284
static EFuncReturnRows forecastEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
27✔
1285

1286
static int32_t translateDiff(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
57✔
1287
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
57!
1288
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
57✔
1289

1290
  uint8_t resType;
1291
  if (IS_SIGNED_NUMERIC_TYPE(colType) || IS_TIMESTAMP_TYPE(colType) || TSDB_DATA_TYPE_BOOL == colType) {
57!
1292
    resType = TSDB_DATA_TYPE_BIGINT;
57✔
1293
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
×
1294
    resType = TSDB_DATA_TYPE_BIGINT;
×
1295
  } else {
1296
    resType = TSDB_DATA_TYPE_DOUBLE;
×
1297
  }
1298
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
57✔
1299
  return TSDB_CODE_SUCCESS;
57✔
1300
}
1301

1302
static EFuncReturnRows diffEstReturnRows(SFunctionNode* pFunc) {
46✔
1303
  if (1 == LIST_LENGTH(pFunc->pParameterList)) {
46!
1304
    return FUNC_RETURN_ROWS_N_MINUS_1;
46✔
1305
  }
1306
  return 1 < ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
×
1307
                                                                                : FUNC_RETURN_ROWS_N_MINUS_1;
×
1308
}
1309

1310
static int32_t translateConcatImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len, int32_t minParaNum,
37✔
1311
                                   int32_t maxParaNum, bool hasSep) {
1312
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
37!
1313
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
37!
1314

1315
  uint8_t resultType = TSDB_DATA_TYPE_BINARY;
37✔
1316
  int32_t resultBytes = 0;
37✔
1317
  int32_t sepBytes = 0;
37✔
1318

1319
  /* For concat/concat_ws function, if params have NCHAR type, promote the final result to NCHAR */
1320
  for (int32_t i = 0; i < numOfParams; ++i) {
117✔
1321
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
80✔
1322
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
80✔
1323
    if (TSDB_DATA_TYPE_NCHAR == paraType) {
80✔
1324
      resultType = paraType;
2✔
1325
    }
1326
  }
1327

1328
  for (int32_t i = 0; i < numOfParams; ++i) {
117✔
1329
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
80✔
1330
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
80✔
1331
    int32_t paraBytes = getSDataTypeFromNode(pPara)->bytes;
80✔
1332
    int32_t factor = 1;
80✔
1333
    if (IS_NULL_TYPE(paraType)) {
80!
1334
      resultType = TSDB_DATA_TYPE_VARCHAR;
×
1335
      resultBytes = 0;
×
1336
      sepBytes = 0;
×
1337
      break;
×
1338
    }
1339
    if (TSDB_DATA_TYPE_NCHAR == resultType && TSDB_DATA_TYPE_VARCHAR == paraType) {
80✔
1340
      factor *= TSDB_NCHAR_SIZE;
2✔
1341
    }
1342
    resultBytes += paraBytes * factor;
80✔
1343

1344
    if (i == 0) {
80✔
1345
      sepBytes = paraBytes * factor;
37✔
1346
    }
1347
  }
1348

1349
  if (hasSep) {
37✔
1350
    resultBytes += sepBytes * (numOfParams - 3);
6✔
1351
  }
1352

1353
  pFunc->node.resType = (SDataType){.bytes = resultBytes, .type = resultType};
37✔
1354
  return TSDB_CODE_SUCCESS;
37✔
1355
}
1356

1357
static int32_t translateConcat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
31✔
1358
  return translateConcatImpl(pFunc, pErrBuf, len, 2, 8, false);
31✔
1359
}
1360

1361
static int32_t translateConcatWs(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
6✔
1362
  return translateConcatImpl(pFunc, pErrBuf, len, 3, 9, true);
6✔
1363
}
1364

1365
static int32_t translateChar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
7✔
1366
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
7!
1367
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
7!
1368
  pFunc->node.resType = (SDataType){.bytes = 4 * numOfParams + 2, .type = TSDB_DATA_TYPE_VARCHAR};
7✔
1369
  return TSDB_CODE_SUCCESS;
7✔
1370
}
1371

1372
static int32_t translateAscii(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
8✔
1373
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
8!
1374
  pFunc->node.resType =
8✔
1375
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_UTINYINT].bytes, .type = TSDB_DATA_TYPE_UTINYINT};
8✔
1376
  return TSDB_CODE_SUCCESS;
8✔
1377
}
1378

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

1382
  uint8_t para0Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
2✔
1383
  int32_t resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
2✔
1384
  uint8_t type = para0Type;
2✔
1385

1386
  if (2 == LIST_LENGTH(pFunc->pParameterList)) {
2!
1387
    uint8_t para1Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
2✔
1388
    resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
2✔
1389
    type = para1Type;
2✔
1390
  }
1391
  if (type == TSDB_DATA_TYPE_NCHAR) {
2!
1392
    resLen *= TSDB_NCHAR_SIZE;
×
1393
  }
1394
  uint8_t trimType = pFunc->trimType;
2✔
1395
  int32_t code = addUint8Param(&pFunc->pParameterList, trimType);
2✔
1396
  if (code != TSDB_CODE_SUCCESS) {
2!
1397
    return code;
×
1398
  }
1399
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
2✔
1400
  return TSDB_CODE_SUCCESS;
2✔
1401
}
1402

1403
static int32_t translateReplace(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
8✔
1404
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
8!
1405

1406
  uint8_t orgType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
8✔
1407
  uint8_t fromType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
8✔
1408
  uint8_t toType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->type;
8✔
1409
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
8✔
1410
  int32_t fromLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
8✔
1411
  int32_t toLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->bytes;
8✔
1412

1413
  int32_t resLen;
1414
  // Since we don't know the accurate length of result, estimate the maximum length here.
1415
  // To make the resLen bigger, we should make fromLen smaller and toLen bigger.
1416
  if (orgType == TSDB_DATA_TYPE_VARBINARY && fromType != orgType) {
8!
1417
    fromLen = fromLen / TSDB_NCHAR_SIZE;
×
1418
  }
1419
  if (orgType == TSDB_DATA_TYPE_NCHAR && toType != orgType) {
8!
1420
    toLen = toLen * TSDB_NCHAR_SIZE;
2✔
1421
  }
1422
  resLen = TMAX(orgLen, orgLen + orgLen / fromLen * (toLen - fromLen));
8✔
1423
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = orgType};
8✔
1424
  return TSDB_CODE_SUCCESS;
8✔
1425
}
1426

1427
static int32_t translateRepeat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
7✔
1428
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
7!
1429

1430
  uint8_t type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
7✔
1431
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
7✔
1432
  int32_t resLen;
1433
  if (nodeType(nodesListGetNode(pFunc->pParameterList, 1)) == QUERY_NODE_VALUE) {
7!
1434
    resLen = orgLen * TMAX((int32_t)((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i, 1);
7✔
1435
  } else {
1436
    resLen = TSDB_MAX_BINARY_LEN;
×
1437
  }
1438
  pFunc->node.resType = (SDataType){.bytes = resLen, .type = type};
7✔
1439
  return TSDB_CODE_SUCCESS;
7✔
1440
}
1441

1442
static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
632✔
1443
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
632!
1444
  if (numOfParams <= 0) {
632!
1445
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1446
  }
1447

1448
  // The number of parameters has been limited by the syntax definition
1449

1450
  SExprNode* pPara0 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
632✔
1451
  uint8_t    para0Type = pPara0->resType.type;
632✔
1452
  if (TSDB_DATA_TYPE_VARBINARY == para0Type) {
632!
1453
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
1454
  }
1455

1456
  // The function return type has been set during syntax parsing
1457
  uint8_t para2Type = pFunc->node.resType.type;
632✔
1458

1459
  int32_t para2Bytes = pFunc->node.resType.bytes;
632✔
1460
  if (IS_STR_DATA_TYPE(para2Type)) {
632!
1461
    para2Bytes -= VARSTR_HEADER_SIZE;
617✔
1462
  }
1463
  if (para2Bytes <= 0 ||
632!
1464
      para2Bytes > TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) {  // cast dst var type length limits to 4096 bytes
632!
1465
    if (TSDB_DATA_TYPE_NCHAR == para2Type) {
×
1466
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1467
                             "CAST function converted length should be in range (0, %d] NCHARS",
1468
                             (TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE);
1469
    } else {
1470
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1471
                             "CAST function converted length should be in range (0, %d] bytes",
1472
                             TSDB_MAX_BINARY_LEN - VARSTR_HEADER_SIZE);
1473
    }
1474
  }
1475

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

1483
  return TSDB_CODE_SUCCESS;
632✔
1484
}
1485

1486
static int32_t translateToIso8601(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
43✔
1487
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
43!
1488
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
43!
1489
  // param1
1490
  if (numOfParams == 2) {
43✔
1491
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
2✔
1492
    if (!validateTimezoneFormat(pValue)) {
2!
1493
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Invalid timzone format");
×
1494
    }
1495
  } else {  // add default client timezone
1496
    int32_t code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
41✔
1497
    if (code != TSDB_CODE_SUCCESS) {
41!
1498
      return code;
×
1499
    }
1500
  }
1501

1502
  // set result type
1503
  pFunc->node.resType = (SDataType){.bytes = 64, .type = TSDB_DATA_TYPE_BINARY};
43✔
1504
  return TSDB_CODE_SUCCESS;
43✔
1505
}
1506

1507
static int32_t translateToUnixtimestamp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
10✔
1508
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
10!
1509
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
10!
1510
  int16_t resType = TSDB_DATA_TYPE_BIGINT;
10✔
1511
  if (2 == numOfParams) {
10!
1512
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
×
1513
    if (pValue->datum.i == 1) {
×
1514
      resType = TSDB_DATA_TYPE_TIMESTAMP;
×
1515
    } else if (pValue->datum.i == 0) {
×
1516
      resType = TSDB_DATA_TYPE_BIGINT;
×
1517
    } else {
1518
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1519
                             "TO_UNIXTIMESTAMP function second parameter should be 0/1");
1520
    }
1521
  }
1522

1523
  // add database precision as param
1524
  uint8_t dbPrec = pFunc->node.resType.precision;
10✔
1525
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
10✔
1526
  if (code != TSDB_CODE_SUCCESS) {
10!
1527
    return code;
×
1528
  }
1529

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

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

1541
static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
26✔
1542
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
26!
1543
  uint8_t dbPrec = pFunc->node.resType.precision;
26✔
1544
  // add database precision as param
1545
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
26✔
1546
  if (code != TSDB_CODE_SUCCESS) {
26!
1547
    return code;
×
1548
  }
1549

1550
  // add client timezone as param
1551
  code = addTimezoneParam(pFunc->pParameterList, pFunc->tz);
26✔
1552
  if (code != TSDB_CODE_SUCCESS) {
26!
1553
    return code;
×
1554
  }
1555

1556
  pFunc->node.resType =
26✔
1557
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
26✔
1558
  return TSDB_CODE_SUCCESS;
26✔
1559
}
1560

1561
static int32_t translateAddPrecOutBigint(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
57✔
1562
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
57!
1563

1564
  // add database precision as param
1565
  uint8_t dbPrec = pFunc->node.resType.precision;
57✔
1566

1567
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
57✔
1568
  if (code != TSDB_CODE_SUCCESS) {
57!
1569
    return code;
×
1570
  }
1571

1572
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
57✔
1573
  return TSDB_CODE_SUCCESS;
57✔
1574
}
1575

1576
static int32_t translateToJson(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
4✔
1577
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
4!
1578
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_JSON].bytes, .type = TSDB_DATA_TYPE_JSON};
4✔
1579
  return TSDB_CODE_SUCCESS;
4✔
1580
}
1581

1582
static int32_t translateOutGeom(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1583
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1584
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
×
1585
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_GEOMETRY};
×
1586

1587
  return TSDB_CODE_SUCCESS;
×
1588
}
1589

1590
static int32_t translateInGeomOutStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1591
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1592
  SDataType dt = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
×
1593
  pFunc->node.resType = (SDataType){.bytes = dt.bytes, .type = TSDB_DATA_TYPE_VARCHAR};
×
1594

1595
  return TSDB_CODE_SUCCESS;
×
1596
}
1597

1598
static int32_t translateIn2GeomOutBool(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1599
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1600
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes, .type = TSDB_DATA_TYPE_BOOL};
×
1601

1602
  return TSDB_CODE_SUCCESS;
×
1603
}
1604

1605
static int32_t translateSelectValue(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,333✔
1606
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
1,333!
1607
  if (numOfParams <= 0) {
1,333!
1608
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1609
  }
1610

1611
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
1,333✔
1612
  return TSDB_CODE_SUCCESS;
1,333✔
1613
}
1614

1615
static int32_t translateBlockDistFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1616
  pFunc->node.resType = (SDataType){.bytes = 128, .type = TSDB_DATA_TYPE_VARCHAR};
×
1617
  return TSDB_CODE_SUCCESS;
×
1618
}
1619

1620
static bool getBlockDistFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
×
1621
  pEnv->calcMemSize = sizeof(STableBlockDistInfo);
×
1622
  return true;
×
1623
}
1624
static bool getBlockDBUsageFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
×
1625
  pEnv->calcMemSize = sizeof(SDBBlockUsageInfo);
×
1626
  return true;
×
1627
}
1628

1629
static int32_t translateGroupKey(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
286✔
1630
  if (1 != LIST_LENGTH(pFunc->pParameterList)) {
286!
1631
    return TSDB_CODE_SUCCESS;
×
1632
  }
1633
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
286✔
1634
  return TSDB_CODE_SUCCESS;
286✔
1635
}
1636

1637
static int32_t translateServerStatusFunc(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
6✔
1638
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes, .type = TSDB_DATA_TYPE_INT};
6✔
1639
  return TSDB_CODE_SUCCESS;
6✔
1640
}
1641

1642
static int32_t translateTagsPseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
10✔
1643
  // The _tags pseudo-column will be expanded to the actual tags on the client side
1644
  return TSDB_CODE_SUCCESS;
10✔
1645
}
1646

1647
static int32_t translateOutVarchar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
398✔
1648
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
398!
1649
  int32_t bytes = 0;
398✔
1650
  switch (pFunc->funcType) {
398!
1651
    case FUNCTION_TYPE_MD5:
×
1652
      bytes = MD5_OUTPUT_LEN + VARSTR_HEADER_SIZE;
×
1653
      break;
×
1654
    case FUNCTION_TYPE_USER:
8✔
1655
    case FUNCTION_TYPE_CURRENT_USER:
1656
      bytes = TSDB_USER_LEN;
8✔
1657
      break;
8✔
1658
    case FUNCTION_TYPE_SERVER_VERSION:
8✔
1659
    case FUNCTION_TYPE_CLIENT_VERSION:
1660
      bytes = TSDB_VERSION_LEN;
8✔
1661
      break;
8✔
1662
    case FUNCTION_TYPE_DATABASE:
23✔
1663
      bytes = TSDB_DB_NAME_LEN;
23✔
1664
      break;
23✔
1665
    case FUNCTION_TYPE_BLOCK_DIST:
12✔
1666
    case FUNCTION_TYPE_BLOCK_DIST_INFO:
1667
      bytes = sizeof(STableBlockDistInfo);
12✔
1668
      break;
12✔
1669
    case FUNCTION_TYPE_TO_CHAR:
9✔
1670
      bytes = 4096;
9✔
1671
      break;
9✔
1672
    case FUNCTION_TYPE_HYPERLOGLOG_STATE_MERGE:
×
1673
    case FUNCTION_TYPE_HYPERLOGLOG_PARTIAL:
1674
    case FUNCTION_TYPE_HYPERLOGLOG_STATE:
1675
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
×
1676
      break;
×
1677
    case FUNCTION_TYPE_SPREAD_PARTIAL:
×
1678
    case FUNCTION_TYPE_SPREAD_STATE:
1679
    case FUNCTION_TYPE_SPREAD_STATE_MERGE:
1680
      bytes = getSpreadInfoSize() + VARSTR_HEADER_SIZE;
×
1681
      break;
×
1682
    case FUNCTION_TYPE_APERCENTILE_PARTIAL:
×
1683
      bytes = getApercentileMaxSize() + VARSTR_HEADER_SIZE;
×
1684
      break;
×
1685
    case FUNCTION_TYPE_STD_STATE:
×
1686
    case FUNCTION_TYPE_STD_STATE_MERGE:
1687
    case FUNCTION_TYPE_STD_PARTIAL:
1688
      bytes = getStdInfoSize() + VARSTR_HEADER_SIZE;
×
1689
      break;
×
1690
    case FUNCTION_TYPE_AVG_PARTIAL:
8✔
1691
    case FUNCTION_TYPE_AVG_STATE:
1692
      pFunc->srcFuncInputType = ((SExprNode*)pFunc->pParameterList->pHead->pNode)->resType;
8✔
1693
      bytes = getAvgInfoSize(pFunc) + VARSTR_HEADER_SIZE;
8✔
1694
      break;
8✔
1695
    case FUNCTION_TYPE_AVG_STATE_MERGE:
×
1696
      if (pFunc->pSrcFuncRef) pFunc->srcFuncInputType = pFunc->pSrcFuncRef->srcFuncInputType;
×
1697
      bytes = getAvgInfoSize(pFunc) + VARSTR_HEADER_SIZE;
×
1698
      break;
×
1699
    case FUNCTION_TYPE_HISTOGRAM_PARTIAL:
×
1700
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
×
1701
      break;
×
1702
    case FUNCTION_TYPE_HISTOGRAM:
×
1703
    case FUNCTION_TYPE_HISTOGRAM_MERGE:
1704
      bytes = 512;
×
1705
      break;
×
1706
    case FUNCTION_TYPE_LEASTSQUARES:
10✔
1707
      bytes = LEASTSQUARES_BUFF_LENGTH;
10✔
1708
      break;
10✔
1709
    case FUNCTION_TYPE_TBNAME:
301✔
1710
      bytes = TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE;
301✔
1711
      break;
301✔
1712
    case FUNCTION_TYPE_TIMEZONE:{
8✔
1713
      if (pFunc->tz == NULL) {
8✔
1714
        bytes = VARSTR_HEADER_SIZE + strlen(tsTimezoneStr);
3✔
1715
      }else{
1716
        char *tzName  = (char*)taosHashGet(pTimezoneNameMap, &pFunc->tz, sizeof(timezone_t));
5✔
1717
        if (tzName == NULL){
5!
1718
          tzName = TZ_UNKNOWN;
×
1719
        }
1720
        bytes = strlen(tzName) + VARSTR_HEADER_SIZE;
5✔
1721
      }
1722
      break;
8✔
1723
    }
1724
    case FUNCTION_TYPE_IRATE_PARTIAL:
×
1725
      bytes = getIrateInfoSize((pFunc->hasPk) ? pFunc->pkBytes : 0) + VARSTR_HEADER_SIZE;
×
1726
      break;
×
1727
    case FUNCTION_TYPE_FIRST_PARTIAL:
11✔
1728
    case FUNCTION_TYPE_LAST_PARTIAL:
1729
    case FUNCTION_TYPE_FIRST_STATE:
1730
    case FUNCTION_TYPE_LAST_STATE:
1731
      bytes = getFirstLastInfoSize(getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes,
11✔
1732
                                   (pFunc->hasPk) ? pFunc->pkBytes : 0) +
11!
1733
              VARSTR_HEADER_SIZE;
1734
      break;
11✔
1735
    case FUNCTION_TYPE_FIRST_STATE_MERGE:
×
1736
    case FUNCTION_TYPE_LAST_STATE_MERGE:
1737
      bytes = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
×
1738
      break;
×
1739
    case FUNCTION_TYPE_DB_USAGE:
×
1740
    case FUNCTION_TYPE_DB_USAGE_INFO:
1741
      bytes = 128;
×
1742
      break;
×
1743
    default:
×
1744
      bytes = 0;
×
1745
      break;
×
1746
  }
1747
  pFunc->node.resType = (SDataType){.bytes = bytes, .type = TSDB_DATA_TYPE_VARCHAR};
398✔
1748
  return TSDB_CODE_SUCCESS;
398✔
1749
}
1750

1751
static int32_t invalidColsFunction(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1752
  return TSDB_CODE_PAR_INVALID_COLS_FUNCTION;
×
1753
}
1754

1755
static int32_t translateHistogramImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
4✔
1756
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
4!
1757
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
4!
1758
  int8_t  binType;
1759
  char*   binDesc;
1760
  for (int32_t i = 1; i < numOfParams; ++i) {
16✔
1761
    SValueNode* pValue = (SValueNode*)nodesListGetNode(pFunc->pParameterList, i);
12✔
1762
    if (i == 1) {
12✔
1763
      binType = validateHistogramBinType(varDataVal(pValue->datum.p));
4✔
1764
      if (binType == UNKNOWN_BIN) {
4!
1765
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR,
×
1766
                               "HISTOGRAM function binType parameter should be "
1767
                               "\"user_input\", \"log_bin\" or \"linear_bin\"");
1768
      }
1769
    }
1770

1771
    if (i == 2) {
12✔
1772
      char errMsg[128] = {0};
4✔
1773
      binDesc = varDataVal(pValue->datum.p);
4✔
1774
      if (TSDB_CODE_SUCCESS != validateHistogramBinDesc(binDesc, binType, errMsg, (int32_t)sizeof(errMsg))) {
4!
1775
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, errMsg);
×
1776
      }
1777
    }
1778
  }
1779
  return TSDB_CODE_SUCCESS;
4✔
1780
}
1781

1782
static int32_t translateHitogram(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
4✔
1783
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
4!
1784
  pFunc->node.resType = (SDataType){.bytes = 512, .type = TSDB_DATA_TYPE_BINARY};
4✔
1785
  return TSDB_CODE_SUCCESS;
4✔
1786
}
1787
static int32_t translateHistogramPartial(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1788
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
×
1789
  pFunc->node.resType =
×
1790
      (SDataType){.bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY};
×
1791
  return TSDB_CODE_SUCCESS;
×
1792
}
1793

1794
#define NUMERIC_TO_STRINGS_LEN 25
1795
static int32_t translateGreatestleast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
1796
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1797

1798
  bool mixTypeToStrings = tsCompareAsStrInGreatest;
×
1799

1800
  SDataType res = {.type = 0};
×
1801
  bool     resInit = false;
×
1802
  for (int32_t i = 0; i < LIST_LENGTH(pFunc->pParameterList); i++) {
×
1803
    SDataType* para = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, i));
×
1804

1805
    if (IS_NULL_TYPE(para->type)) {
×
1806
      res.type = TSDB_DATA_TYPE_NULL;
×
1807
      res.bytes = tDataTypes[TSDB_DATA_TYPE_NULL].bytes;
×
1808
      break;
×
1809
    }
1810

1811
    if (!resInit) {
×
1812
      res.type = para->type;
×
1813
      res.bytes = para->bytes;
×
1814
      resInit = true;
×
1815
      continue;
×
1816
    }
1817

1818
    if (IS_MATHABLE_TYPE(para->type)) {
×
1819
      if (res.type == para->type) {
×
1820
        continue;
×
1821
      } else if (IS_MATHABLE_TYPE(res.type) || !mixTypeToStrings) {
×
1822
        int32_t resType = vectorGetConvertType(res.type, para->type);
×
1823
        res.type = resType == 0 ? res.type : resType;
×
1824
        res.bytes = tDataTypes[res.type].bytes;
×
1825
      } else {
1826
        // last res is strings, para is numeric and mixTypeToStrings is true
1827
        res.bytes = TMAX(res.bytes, NUMERIC_TO_STRINGS_LEN);
×
1828
      }
1829
    } else {
1830
      if (IS_COMPARE_STR_DATA_TYPE(res.type)) {
×
1831
        int32_t resType = vectorGetConvertType(res.type, para->type);
×
1832
        res.type = resType == 0 ? res.type : resType;
×
1833
        res.bytes = TMAX(res.bytes, para->bytes);
×
1834
      } else if (mixTypeToStrings) {
×
1835
        // last res is numeric, para is string, and mixTypeToStrings is true
1836
        res.type = para->type;
×
1837
        res.bytes = TMAX(para->bytes, NUMERIC_TO_STRINGS_LEN);
×
1838
      } else {
1839
        // last res is numeric, para is string, and mixTypeToStrings is false
1840
        int32_t resType = vectorGetConvertType(res.type, para->type);
×
1841
        res.type = resType == 0 ? res.type : resType;
×
1842
        res.bytes = tDataTypes[resType].bytes;
×
1843
      }
1844
    }
1845
  }
1846
  pFunc->node.resType = res;
×
1847
  return TSDB_CODE_SUCCESS;
×
1848
}
1849

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

5836
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