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

taosdata / TDengine / #3533

20 Nov 2024 07:11AM UTC coverage: 58.848% (-1.9%) from 60.78%
#3533

push

travis-ci

web-flow
Merge pull request #28823 from taosdata/fix/3.0/TD-32587

fix:[TD-32587]fix stmt segmentation fault

115578 of 252434 branches covered (45.79%)

Branch coverage included in aggregate %.

1 of 4 new or added lines in 1 file covered. (25.0%)

8038 existing lines in 233 files now uncovered.

194926 of 275199 relevant lines covered (70.83%)

1494459.59 hits per line

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

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

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

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

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

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

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

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

51
  if (TSDB_TIME_PRECISION_MILLI == dbPrec &&
15,665✔
52
      (0 == strcasecmp(pVal->literal, "1u") || 0 == strcasecmp(pVal->literal, "1b"))) {
12,298✔
53
    return TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL;
57✔
54
  }
55

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

60
  if (pVal->literal[0] != '1' ||
15,587✔
61
      (pVal->literal[1] != 'u' && pVal->literal[1] != 'a' && pVal->literal[1] != 's' && pVal->literal[1] != 'm' &&
13,319✔
62
       pVal->literal[1] != 'h' && pVal->literal[1] != 'd' && pVal->literal[1] != 'w' && pVal->literal[1] != 'b')) {
5,275✔
63
    return TSDB_CODE_FUNC_TIME_UNIT_INVALID;
2,280✔
64
  }
65

66
  return TSDB_CODE_SUCCESS;
13,307✔
67
}
68

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

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

82
  return true;
66✔
83
}
84

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

90
  return false;
16✔
91
}
92

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

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

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

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

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

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

169
  return true;
50✔
170
}
171

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

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

186
  return numOfSpaces;
260✔
187
}
188

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

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

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

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

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

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

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

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

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

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

283
static bool paramSupportNull(uint64_t typeFlag) {
18,361✔
284
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NULL_TYPE) ||
36,635✔
285
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
18,274✔
286
}
287

288
static bool paramSupportBool(uint64_t typeFlag) {
3,326✔
289
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BOOL_TYPE) ||
6,538✔
290
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE);
3,212✔
291
}
292

293
static bool paramSupportTinyint(uint64_t typeFlag) {
31,772✔
294
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TINYINT_TYPE) ||
63,453✔
295
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
31,681✔
296
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
27,597✔
297
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
64,390!
298
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
937!
299
}
300

301
static bool paramSupportSmallint(uint64_t typeFlag) {
29,858✔
302
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_SMALLINT_TYPE) ||
59,716✔
303
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
29,858✔
304
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
26,735✔
305
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
60,653!
306
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
937!
307
}
308

309
static bool paramSupportInt(uint64_t typeFlag) {
456,255✔
310
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INT_TYPE) ||
912,510✔
311
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
456,255✔
312
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
373,241✔
313
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
913,471!
314
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
961!
315
}
316

317
static bool paramSupportBigint(uint64_t typeFlag) {
274,410✔
318
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_BIGINT_TYPE) ||
541,784✔
319
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
267,374✔
320
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
258,892✔
321
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
543,006✔
322
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
1,222!
323
}
324

325
static bool paramSupportFloat(uint64_t typeFlag) {
18,237✔
326
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FLOAT_TYPE) ||
36,474✔
327
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
33,613!
328
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
15,376✔
329
}
330

331
static bool paramSupportDouble(uint64_t typeFlag) {
42,547✔
332
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_DOUBLE_TYPE) ||
85,094✔
333
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
80,745!
334
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE);
38,198✔
335
}
336

337
static bool paramSupportVarchar(uint64_t typeFlag) {
364,042✔
338
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARCHAR_TYPE) ||
391,154✔
339
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
27,112✔
340
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
16,655✔
341
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
397,925!
342
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
6,771!
343
}
344

345
static bool paramSupportTimestamp(uint64_t typeFlag) {
51,969✔
346
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_TIMESTAMP_TYPE) ||
79,658✔
347
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
55,195✔
348
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
3,226!
349
}
350

351
static bool paramSupportNchar(uint64_t typeFlag) {
47,719✔
352
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NCHAR_TYPE) ||
59,137✔
353
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
11,418✔
354
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE) ||
7,610✔
355
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
65,688!
356
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
6,551!
357
}
358

359
static bool paramSupportUTinyInt(uint64_t typeFlag) {
6,454✔
360
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UTINYINT_TYPE) ||
12,908✔
361
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
6,454✔
362
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
3,302!
363
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
12,908!
364
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
365
}
366

367
static bool paramSupportUSmallInt(uint64_t typeFlag) {
6,478✔
368
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_USMALLINT_TYPE) ||
12,956✔
369
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
6,478✔
370
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
6,259!
371
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
12,956!
372
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
373
}
374

375
static bool paramSupportUInt(uint64_t typeFlag) {
9,301✔
376
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UINT_TYPE) ||
18,602✔
377
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
9,301✔
378
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
7,066!
379
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
18,602!
380
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
381
}
382

383
static bool paramSupportUBigInt(uint64_t typeFlag) {
8,517✔
384
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UBIGINT_TYPE) ||
17,034✔
385
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
8,517✔
386
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NUMERIC_TYPE) ||
3,835!
387
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_INTEGER_TYPE) ||
17,034!
388
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_UNIX_TS_TYPE);
×
389
}
390

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

397
static bool paramSupportVarBinary(uint64_t typeFlag) {
13,639✔
398
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VARB_TYPE) ||
27,278✔
399
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_ALL_TYPE) ||
13,639✔
400
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VAR_TYPE) ||
40,912!
401
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_STRING_TYPE);
13,634✔
402
}
403

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

410
static bool paramSupportValueNode(uint64_t typeFlag) {
154,142✔
411
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_VALUE_NODE) ||
202,938✔
412
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE);
48,796✔
413
}
414

415
static bool paramSupportOperatorNode(uint64_t typeFlag) {
20,894✔
416
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
20,987✔
417
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_OPERATOR_NODE) ||
20,987!
418
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
93✔
419
}
420

421
static bool paramSupportFunctionNode(uint64_t typeFlag) {
258,459✔
422
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
259,268✔
423
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_FUNCTION_NODE) ||
259,268!
424
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
809✔
425
}
426

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

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

439
static bool paramSupportColumnNode(uint64_t typeFlag) {
919,708✔
440
  return FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_EXPR_NODE) ||
925,912✔
441
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_COLUMN_NODE) ||
921,852✔
442
         FUNC_MGT_TEST_MASK(typeFlag, FUNC_PARAM_SUPPORT_NOT_VALUE_NODE);
2,144✔
443
}
444

445
static bool paramSupportNodeType(SNode* pNode, uint64_t typeFlag) {
1,353,243✔
446
  switch (pNode->type) {
1,353,243!
447
    case QUERY_NODE_VALUE:
154,142✔
448
      return paramSupportValueNode(typeFlag);
154,142✔
449
    case QUERY_NODE_OPERATOR:
20,894✔
450
      return paramSupportOperatorNode(typeFlag);
20,894✔
451
    case QUERY_NODE_FUNCTION:
258,459✔
452
      return paramSupportFunctionNode(typeFlag);
258,459✔
453
    case QUERY_NODE_LOGIC_CONDITION:
×
454
      return paramSupportLogicConNode(typeFlag);
×
455
    case QUERY_NODE_CASE_WHEN:
40✔
456
      return paramSupportCaseWhenNode(typeFlag);
40✔
457
    case QUERY_NODE_COLUMN:
919,708✔
458
      return paramSupportColumnNode(typeFlag);
919,708✔
459
    default:
×
460
      return false;
×
461
  }
462
}
463

464
static bool paramSupportDataType(SDataType* pDataType, uint64_t typeFlag) {
1,352,874✔
465
  switch (pDataType->type) {
1,352,874!
466
    case TSDB_DATA_TYPE_NULL:
18,361✔
467
      return paramSupportNull(typeFlag);
18,361✔
468
    case TSDB_DATA_TYPE_BOOL:
3,326✔
469
      return paramSupportBool(typeFlag);
3,326✔
470
    case TSDB_DATA_TYPE_TINYINT:
31,772✔
471
      return paramSupportTinyint(typeFlag);
31,772✔
472
    case TSDB_DATA_TYPE_SMALLINT:
29,858✔
473
      return paramSupportSmallint(typeFlag);
29,858✔
474
    case TSDB_DATA_TYPE_INT:
456,255✔
475
      return paramSupportInt(typeFlag);
456,255✔
476
    case TSDB_DATA_TYPE_BIGINT:
274,410✔
477
      return paramSupportBigint(typeFlag);
274,410✔
478
    case TSDB_DATA_TYPE_FLOAT:
18,237✔
479
      return paramSupportFloat(typeFlag);
18,237✔
480
    case TSDB_DATA_TYPE_DOUBLE:
42,547✔
481
      return paramSupportDouble(typeFlag);
42,547✔
482
    case TSDB_DATA_TYPE_VARCHAR:
352,794✔
483
      return paramSupportVarchar(typeFlag);
352,794✔
484
    case TSDB_DATA_TYPE_TIMESTAMP:
51,969✔
485
      return paramSupportTimestamp(typeFlag);
51,969✔
486
    case TSDB_DATA_TYPE_NCHAR:
42,470✔
487
      return paramSupportNchar(typeFlag);
42,470✔
488
    case TSDB_DATA_TYPE_UTINYINT:
6,454✔
489
      return paramSupportUTinyInt(typeFlag);
6,454✔
490
    case TSDB_DATA_TYPE_USMALLINT:
6,478✔
491
      return paramSupportUSmallInt(typeFlag);
6,478✔
492
    case TSDB_DATA_TYPE_UINT:
9,301✔
493
      return paramSupportUInt(typeFlag);
9,301✔
494
    case TSDB_DATA_TYPE_UBIGINT:
8,517✔
495
      return paramSupportUBigInt(typeFlag);
8,517✔
496
    case TSDB_DATA_TYPE_JSON:
18✔
497
      return paramSupportJSON(typeFlag);
18✔
498
    case TSDB_DATA_TYPE_VARBINARY:
5✔
499
      return paramSupportVarBinary(typeFlag);
5✔
500
    case TSDB_DATA_TYPE_GEOMETRY:
104✔
501
      return paramSupportGeometry(typeFlag);
104✔
502
    default:
×
503
      return false;
×
504
  }
505
}
506

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

509
static int8_t validateHistogramBinType(char* binTypeStr) {
2,078✔
510
  int8_t binType;
511
  if (strcasecmp(binTypeStr, "user_input") == 0) {
2,078✔
512
    binType = USER_INPUT_BIN;
256✔
513
  } else if (strcasecmp(binTypeStr, "linear_bin") == 0) {
1,822✔
514
    binType = LINEAR_BIN;
1,023✔
515
  } else if (strcasecmp(binTypeStr, "log_bin") == 0) {
799!
516
    binType = LOG_BIN;
799✔
517
  } else {
518
    binType = UNKNOWN_BIN;
×
519
  }
520

521
  return binType;
2,078✔
522
}
523

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

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

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

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

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

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

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

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

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

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

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

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

719
static int32_t checkFixedValue(SNode *pNode, const SParamInfo *paramPattern, int32_t paramIdx, bool *isMatch) {
13,634✔
720
  int32_t code = TSDB_CODE_SUCCESS;
13,634✔
721
  bool    checkStr = paramSupportVarBinary(paramPattern->validDataType) ||
24,882✔
722
                  paramSupportVarchar(paramPattern->validDataType) ||
24,882!
723
                  paramSupportNchar(paramPattern->validDataType);
5,249✔
724
  if (pNode->type == QUERY_NODE_VALUE) {
13,634!
725
    SValueNode* pVal = (SValueNode*)pNode;
13,634✔
726
    if (!checkStr) {
13,634✔
727
      for (int32_t k = 0; k < paramPattern->fixedValueSize; k++) {
8,497✔
728
        if (pVal->datum.i == paramPattern->fixedNumValue[k]) {
8,471✔
729
          code = TSDB_CODE_SUCCESS;
5,223✔
730
          *isMatch = true;
5,223✔
731
          break;
5,223✔
732
        } else {
733
          code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
3,248✔
734
          *isMatch = false;
3,248✔
735
        }
736
      }
737
    } else {
738
      for (int32_t k = 0; k < paramPattern->fixedValueSize; k++) {
22,010✔
739
        if (strcasecmp(pVal->literal, paramPattern->fixedStrValue[k]) == 0) {
21,940✔
740
          code = TSDB_CODE_SUCCESS;
8,315✔
741
          *isMatch = true;
8,315✔
742
          break;
8,315✔
743
        } else {
744
          code = TSDB_CODE_FUNC_FUNTION_PARA_VALUE;
13,625✔
745
          *isMatch = false;
13,625✔
746
        }
747
      }
748
    }
749
  } else {
750
    // for other node type, fixed value check should be done in process function
751
  }
752
  return code;
13,634✔
753
}
754

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

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

775
static int32_t checkHasColumn(SNode *pNode, bool *isMatch) {
2,161✔
776
  int32_t code = TSDB_CODE_SUCCESS;
2,161✔
777
  if (!nodesExprHasColumn(pNode)) {
2,161✔
778
    code = TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL;
30✔
779
    *isMatch = false;
30✔
780
  }
781
  return code;
2,161✔
782
}
783

784
static int32_t checkValueNodeNotNull(SNode *pNode, bool *isMatch) {
37,706✔
785
  int32_t code = TSDB_CODE_SUCCESS;
37,706✔
786
  if (IS_NULL_TYPE(getSDataTypeFromNode(pNode)->type) && QUERY_NODE_VALUE == nodeType(pNode)) {
37,706!
UNCOV
787
    code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
×
UNCOV
788
    *isMatch = false;
×
789
  }
790
  return code;
37,706✔
791
}
792

793
static int32_t checkTimeUnit(SNode *pNode, int32_t precision, bool *isMatch) {
15,665✔
794
  if (nodeType(pNode) != QUERY_NODE_VALUE || !IS_INTEGER_TYPE(getSDataTypeFromNode(pNode)->type)) {
15,665!
795
    *isMatch = false;
×
796
    return TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
×
797
  }
798

799
  if (IS_NULL_TYPE(getSDataTypeFromNode(pNode)->type)) {
15,665!
800
    *isMatch = true;
×
801
    return TSDB_CODE_SUCCESS;
×
802
  }
803

804
  int32_t code = validateTimeUnitParam(precision, (SValueNode*)pNode);
15,665✔
805
  if (TSDB_CODE_SUCCESS != code) {
15,665✔
806
    *isMatch = false;
2,358✔
807
  }
808
  return code;
15,665✔
809
}
810
static int32_t validateParam(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,077,386✔
811
  int32_t           code = TSDB_CODE_SUCCESS;
1,077,386✔
812
  SNodeList*        paramList = pFunc->pParameterList;
1,077,386✔
813
  char              errMsg[128] = {0};
1,077,386✔
814

815
  // no need to check
816
  if (funcMgtBuiltins[pFunc->funcId].parameters.paramInfoPattern == 0) {
1,077,386✔
817
    return TSDB_CODE_SUCCESS;
69,869✔
818
  }
819
  
820
  // check param num
821
  if ((funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum != -1 &&
1,007,517✔
822
       LIST_LENGTH(paramList) > funcMgtBuiltins[pFunc->funcId].parameters.maxParamNum) ||
970,977!
823
      LIST_LENGTH(paramList) < funcMgtBuiltins[pFunc->funcId].parameters.minParamNum) {
1,004,442!
824
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
5,873✔
825
  }
826

827
  // check each param
828
  for (int32_t i = 0; i < funcMgtBuiltins[pFunc->funcId].parameters.paramInfoPattern; i++) {
1,035,405✔
829
    bool              isMatch = true;
1,001,644✔
830
    int32_t           paramIdx = 0;
1,001,644✔
831
    const SParamInfo* paramPattern = funcMgtBuiltins[pFunc->funcId].parameters.inputParaInfo[i];
1,001,644✔
832

833
    while (1) {
834
      for (int8_t j = paramPattern[paramIdx].startParam; j <= (paramPattern[paramIdx].endParam == -1 ? INT8_MAX : paramPattern[paramIdx].endParam); j++) {
2,493,336✔
835
        if (j > LIST_LENGTH(paramList)) {
1,495,429!
836
          code = TSDB_CODE_SUCCESS;
142,186✔
837
          isMatch = true;
142,186✔
838
          break;
142,186✔
839
        }
840
        SNode* pNode = nodesListGetNode(paramList, j - 1);
1,353,243✔
841
        // check node type
842
        if (!paramSupportNodeType(pNode, paramPattern[paramIdx].validNodeType)) {
1,353,243✔
843
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
370✔
844
          isMatch = false;
370✔
845
          break;
370✔
846
        }
847
        // check data type
848
        if (!paramSupportDataType(getSDataTypeFromNode(pNode), paramPattern[paramIdx].validDataType)) {
1,352,873✔
849
          code = TSDB_CODE_FUNC_FUNTION_PARA_TYPE;
25,312✔
850
          isMatch = false;
25,312✔
851
          break;
25,312✔
852
        }
853
        if (paramPattern[paramIdx].validNodeType == FUNC_PARAM_SUPPORT_VALUE_NODE) {
1,327,562✔
854
          SValueNode* pVal = (SValueNode*)pNode;
105,240✔
855
          pVal->notReserved = true;
105,240✔
856
        }
857
        switch (paramPattern[paramIdx].valueRangeFlag) {
1,327,562!
858
          case FUNC_PARAM_NO_SPECIFIC_VALUE:
1,271,998✔
859
            break;
1,271,998✔
860
          case FUNC_PARAM_HAS_RANGE:
41,930✔
861
            code = checkRangeValue(pNode, paramPattern[paramIdx].range, &isMatch);
41,930✔
862
            break;
41,930✔
863
          case FUNC_PARAM_HAS_FIXED_VALUE:
13,634✔
864
            code = checkFixedValue(pNode, &paramPattern[paramIdx], paramIdx, &isMatch);
13,634✔
865
            break;
13,634✔
866
          default:
×
867
            break;
×
868
        }
869
        if (!isMatch) {
1,327,562✔
870
          break;
5,664✔
871
        }
872
        switch (paramPattern[paramIdx].paramAttribute) {
1,321,898!
873
          case FUNC_PARAM_NO_SPECIFIC_ATTRIBUTE:
1,262,335✔
874
            break;
1,262,335✔
875
          case FUNC_PARAM_MUST_BE_PRIMTS:
4,030✔
876
            code = checkPrimTS(pNode, &isMatch);
4,030✔
877
            break;
4,030✔
878
          case FUNC_PARAM_MUST_BE_PK:
1✔
879
            code = checkPrimaryKey(pNode, &isMatch);
1✔
880
            break;
1✔
881
          case FUNC_PARAM_MUST_HAVE_COLUMN:
2,161✔
882
            code = checkHasColumn(pNode, &isMatch);
2,161✔
883
            break;
2,161✔
884
          case FUNC_PARAM_VALUE_NODE_NOT_NULL:
37,706✔
885
            code = checkValueNodeNotNull(pNode, &isMatch);
37,706✔
886
            break;
37,706✔
887
          case FUNC_PARAM_MUST_BE_TIME_UNIT:
15,665✔
888
            code = checkTimeUnit(pNode, pFunc->node.resType.precision, &isMatch);
15,665✔
889
            break;
15,665✔
890
          default:
×
891
            break;
×
892
        }
893
        if (!isMatch) {
1,321,898✔
894
          break;
2,412✔
895
        }
896
      }
897

898
      if (paramPattern[paramIdx].isLastParam || !isMatch) {
1,173,851✔
899
        break;
900
      }
901
      paramIdx++;
172,206✔
902
    }
903
    if (isMatch) {
1,001,645✔
904
      return TSDB_CODE_SUCCESS;
967,884✔
905
    }
906
  }
907
  switch (code) {
33,761!
908
    case TSDB_CODE_FUNC_FUNTION_PARA_NUM:
×
909
      return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
910
    case TSDB_CODE_FUNC_FUNTION_PARA_TYPE:
25,682✔
911
      return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
25,682✔
912
    case TSDB_CODE_FUNC_FUNTION_PARA_VALUE:
96✔
913
      return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName);
96✔
914
    case TSDB_CODE_FUNC_FUNTION_PARA_RANGE:
5,568✔
915
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_RANGE, "Invalid parameter range : %s",
5,568✔
916
                             pFunc->functionName);
5,568✔
917
    case TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS:
24✔
918
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_PRIMTS, "Parameter should be primary timestamp : %s",
24✔
919
                             pFunc->functionName);
24✔
920
    case TSDB_CODE_FUNC_FUNTION_PARA_PK:
×
921
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_PK, "Parameter should be primary key : %s",
×
922
                             pFunc->functionName);
×
923
    case TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL:
30✔
924
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_PARA_HAS_COL, "Parameter should have column : %s",
30✔
925
                             pFunc->functionName);
30✔
926
    case TSDB_CODE_FUNC_TIME_UNIT_INVALID:
2,280✔
927
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_INVALID, "Invalid timzone format : %s",
2,280✔
928
                             pFunc->functionName);
2,280✔
929
    case TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL:
78✔
930
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_TIME_UNIT_TOO_SMALL, "Time unit is too small : %s",
78✔
931
                                     pFunc->functionName);
78✔
932
    case TSDB_CODE_FUNC_FUNCTION_HISTO_TYPE:
×
933
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNCTION_HISTO_TYPE, "Invalid histogram bin type : %s",
×
934
                             pFunc->functionName);
×
935
    case TSDB_CODE_FUNC_HISTOGRAM_ERROR:
×
936
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_HISTOGRAM_ERROR, errMsg, pFunc->functionName);
×
937
    default:
3✔
938
      return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, "Function check parameter failed : %s",
3✔
939
                             pFunc->functionName);
3✔
940
  }
941
}
942

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

954
// There is only one parameter, and the return type is parameter type
955
static int32_t translateMinMax(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
289,819✔
956
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
289,819✔
957

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

965
// The return type is DOUBLE type
966
static int32_t translateOutDouble(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
75,501✔
967
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
75,501✔
968
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
73,555✔
969
  return TSDB_CODE_SUCCESS;
73,555✔
970
}
971

972

973
static int32_t translateTrimStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len, bool isLtrim) {
29,982✔
974
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
29,982✔
975

976
  SDataType* pRestType1 = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
23,682✔
977

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

988
  int32_t resBytes = pRestType1->bytes - numOfSpaces;
23,682✔
989
  pFunc->node.resType = (SDataType){.bytes = resBytes, .type = pRestType1->type};
23,682✔
990
  return TSDB_CODE_SUCCESS;
23,682✔
991
}
992

993
static int32_t translateLtrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
15,126✔
994
  return translateTrimStr(pFunc, pErrBuf, len, true);
15,126✔
995
}
996

997
static int32_t translateRtrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
14,856✔
998
  return translateTrimStr(pFunc, pErrBuf, len, false);
14,856✔
999
}
1000

1001
// The return type is BIGINT type
1002
static int32_t translateOutBigInt(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
156,660✔
1003
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
156,660✔
1004
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
149,451✔
1005
  return TSDB_CODE_SUCCESS;
149,451✔
1006
}
1007

1008
static int32_t translateSum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
218,051✔
1009
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
218,051✔
1010

1011
  uint8_t paraType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
218,012✔
1012
  uint8_t resType = 0;
218,012✔
1013
  if (IS_SIGNED_NUMERIC_TYPE(paraType) || TSDB_DATA_TYPE_BOOL == paraType || IS_NULL_TYPE(paraType)) {
218,012!
1014
    resType = TSDB_DATA_TYPE_BIGINT;
214,997✔
1015
  } else if (IS_UNSIGNED_NUMERIC_TYPE(paraType)) {
3,015!
1016
    resType = TSDB_DATA_TYPE_UBIGINT;
73✔
1017
  } else if (IS_FLOAT_TYPE(paraType)) {
2,942!
1018
    resType = TSDB_DATA_TYPE_DOUBLE;
2,942✔
1019
  }
1020

1021
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
218,012✔
1022
  return TSDB_CODE_SUCCESS;
218,012✔
1023
}
1024

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

1032
static int32_t translateNowToday(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
24,966✔
1033
  // pseudo column do not need to check parameters
1034

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

1042
  pFunc->node.resType =
24,966✔
1043
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
24,966✔
1044
  return TSDB_CODE_SUCCESS;
24,966✔
1045
}
1046

UNCOV
1047
static int32_t translateRand(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
UNCOV
1048
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1049

UNCOV
1050
  if (!pFunc->dual) {
×
UNCOV
1051
    int32_t code = addPseudoParam(&pFunc->pParameterList);
×
UNCOV
1052
    if (code != TSDB_CODE_SUCCESS) {
×
1053
      return code;
×
1054
    }
1055
  }
1056

UNCOV
1057
  pFunc->node.resType =
×
UNCOV
1058
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
×
UNCOV
1059
  return TSDB_CODE_SUCCESS;
×
1060
}
1061

1062
// return type is same as first input parameter's type
1063
static int32_t translateOutFirstIn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
107,813✔
1064
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
107,813✔
1065
  pFunc->node.resType = *getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
89,433✔
1066
  return TSDB_CODE_SUCCESS;
89,433✔
1067
}
1068

1069
static int32_t translateTimePseudoColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
10,344✔
1070
  // pseudo column do not need to check parameters
1071

1072
  pFunc->node.resType =
10,344✔
1073
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP,
10,344✔
1074
                  .precision = pFunc->node.resType.precision};
10,344✔
1075
  return TSDB_CODE_SUCCESS;
10,344✔
1076
}
1077

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

1081
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes, .type = TSDB_DATA_TYPE_BOOL};
2,000✔
1082
  return TSDB_CODE_SUCCESS;
2,000✔
1083
}
1084

1085
static int32_t translatePercentile(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,021✔
1086
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
1,021✔
1087
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
730!
1088

1089
  // set result type
1090
  if (numOfParams > 2) {
730✔
1091
    pFunc->node.resType = (SDataType){.bytes = 3200, .type = TSDB_DATA_TYPE_VARCHAR};
26✔
1092
  } else {
1093
    pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
704✔
1094
  }
1095
  return TSDB_CODE_SUCCESS;
730✔
1096
}
1097

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

1104

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

1117
int32_t topBotCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) {
602✔
1118
  return reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters);
602✔
1119
}
1120

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

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

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

1141
static int32_t translateCsum(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,883✔
1142
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
1,883✔
1143
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
1,608✔
1144
  uint8_t resType;
1145
  if (IS_SIGNED_NUMERIC_TYPE(colType)) {
1,608!
1146
    resType = TSDB_DATA_TYPE_BIGINT;
1,149✔
1147
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
459!
1148
    resType = TSDB_DATA_TYPE_UBIGINT;
115✔
1149
  } else if (IS_FLOAT_TYPE(colType)) {
344!
1150
    resType = TSDB_DATA_TYPE_DOUBLE;
344✔
1151
  } else {
1152
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
1153
  }
1154
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
1,608✔
1155
  return TSDB_CODE_SUCCESS;
1,608✔
1156
}
1157

1158
static EFuncReturnRows csumEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
1,463✔
1159

1160
static int32_t translateSampleTail(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
5,006✔
1161
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
5,006✔
1162

1163
  SDataType* pSDataType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0));
4,900✔
1164
  uint8_t    colType = pSDataType->type;
4,900✔
1165

1166
  // set result type
1167
  pFunc->node.resType = (SDataType){.bytes = IS_STR_DATA_TYPE(colType) ? pSDataType->bytes : tDataTypes[colType].bytes,
4,900!
1168
                                    .type = colType};
1169
  return TSDB_CODE_SUCCESS;
4,900✔
1170
}
1171

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

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

1186
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_DOUBLE].bytes, .type = TSDB_DATA_TYPE_DOUBLE};
790✔
1187
  return TSDB_CODE_SUCCESS;
790✔
1188
}
1189

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

1196
static EFuncReturnRows interpEstReturnRows(SFunctionNode* pFunc) {
2,901✔
1197
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
2,901!
1198
  if (1 < numOfParams && 1 == ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i) {
2,901✔
1199
    return FUNC_RETURN_ROWS_INDEFINITE;
59✔
1200
  } else {
1201
    return FUNC_RETURN_ROWS_N;
2,842✔
1202
  }
1203
}
1204

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

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

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

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

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

1232
    pValue->notReserved = true;
×
1233
  }
1234

1235
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[valType].bytes, .type = valType};
×
1236
  return TSDB_CODE_SUCCESS;
×
1237
}
1238

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

1244
static EFuncReturnRows forecastEstReturnRows(SFunctionNode* pFunc) { return FUNC_RETURN_ROWS_N; }
×
1245

1246
static int32_t translateDiff(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,952✔
1247
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
1,952✔
1248
  uint8_t colType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
1,774✔
1249

1250
  uint8_t resType;
1251
  if (IS_SIGNED_NUMERIC_TYPE(colType) || IS_TIMESTAMP_TYPE(colType) || TSDB_DATA_TYPE_BOOL == colType) {
1,774✔
1252
    resType = TSDB_DATA_TYPE_BIGINT;
1,383✔
1253
  } else if (IS_UNSIGNED_NUMERIC_TYPE(colType)) {
391!
1254
    resType = TSDB_DATA_TYPE_BIGINT;
85✔
1255
  } else {
1256
    resType = TSDB_DATA_TYPE_DOUBLE;
306✔
1257
  }
1258
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
1,774✔
1259
  return TSDB_CODE_SUCCESS;
1,774✔
1260
}
1261

1262
static EFuncReturnRows diffEstReturnRows(SFunctionNode* pFunc) {
1,759✔
1263
  if (1 == LIST_LENGTH(pFunc->pParameterList)) {
1,759!
1264
    return FUNC_RETURN_ROWS_N_MINUS_1;
1,221✔
1265
  }
1266
  return 1 < ((SValueNode*)nodesListGetNode(pFunc->pParameterList, 1))->datum.i ? FUNC_RETURN_ROWS_INDEFINITE
538✔
1267
                                                                                 : FUNC_RETURN_ROWS_N_MINUS_1;
538✔
1268
}
1269

1270
static int32_t translateConcatImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t len, int32_t minParaNum,
65,470✔
1271
                                   int32_t maxParaNum, bool hasSep) {
1272
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
65,470✔
1273
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
63,906!
1274

1275
  uint8_t resultType = TSDB_DATA_TYPE_BINARY;
63,906✔
1276
  int32_t resultBytes = 0;
63,906✔
1277
  int32_t sepBytes = 0;
63,906✔
1278

1279
  /* For concat/concat_ws function, if params have NCHAR type, promote the final result to NCHAR */
1280
  for (int32_t i = 0; i < numOfParams; ++i) {
329,007✔
1281
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
265,101✔
1282
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
265,101✔
1283
    if (TSDB_DATA_TYPE_NCHAR == paraType) {
265,101✔
1284
      resultType = paraType;
18,848✔
1285
    }
1286
  }
1287

1288
  for (int32_t i = 0; i < numOfParams; ++i) {
328,990✔
1289
    SNode*  pPara = nodesListGetNode(pFunc->pParameterList, i);
265,092✔
1290
    uint8_t paraType = getSDataTypeFromNode(pPara)->type;
265,092✔
1291
    int32_t paraBytes = getSDataTypeFromNode(pPara)->bytes;
265,092✔
1292
    int32_t factor = 1;
265,092✔
1293
    if (IS_NULL_TYPE(paraType)) {
265,092✔
1294
      resultType = TSDB_DATA_TYPE_VARCHAR;
8✔
1295
      resultBytes = 0;
8✔
1296
      sepBytes = 0;
8✔
1297
      break;
8✔
1298
    }
1299
    if (TSDB_DATA_TYPE_NCHAR == resultType && TSDB_DATA_TYPE_VARCHAR == paraType) {
265,084✔
1300
      factor *= TSDB_NCHAR_SIZE;
39,031✔
1301
    }
1302
    resultBytes += paraBytes * factor;
265,084✔
1303

1304
    if (i == 0) {
265,084✔
1305
      sepBytes = paraBytes * factor;
63,898✔
1306
    }
1307
  }
1308

1309
  if (hasSep) {
63,906✔
1310
    resultBytes += sepBytes * (numOfParams - 3);
25,628✔
1311
  }
1312

1313
  pFunc->node.resType = (SDataType){.bytes = resultBytes, .type = resultType};
63,906✔
1314
  return TSDB_CODE_SUCCESS;
63,906✔
1315
}
1316

1317
static int32_t translateConcat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
39,014✔
1318
  return translateConcatImpl(pFunc, pErrBuf, len, 2, 8, false);
39,014✔
1319
}
1320

1321
static int32_t translateConcatWs(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
26,456✔
1322
  return translateConcatImpl(pFunc, pErrBuf, len, 3, 9, true);
26,456✔
1323
}
1324

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

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

UNCOV
1338
static int32_t translateTrim(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
UNCOV
1339
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1340

1341

UNCOV
1342
  uint8_t para0Type = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
UNCOV
1343
  int32_t resLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
×
UNCOV
1344
  uint8_t type = para0Type;
×
1345

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

UNCOV
1363
static int32_t translateReplace(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
UNCOV
1364
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1365

UNCOV
1366
  uint8_t orgType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->type;
×
UNCOV
1367
  uint8_t fromType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->type;
×
UNCOV
1368
  uint8_t toType = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->type;
×
UNCOV
1369
  int32_t orgLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
×
UNCOV
1370
  int32_t fromLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 1))->bytes;
×
UNCOV
1371
  int32_t toLen = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 2))->bytes;
×
1372

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

UNCOV
1387
static int32_t translateRepeat(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
×
UNCOV
1388
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
×
1389

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

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

1408
  // The number of parameters has been limited by the syntax definition
1409

1410
  SExprNode* pPara0 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0);
401,829✔
1411
  uint8_t para0Type = pPara0->resType.type;
401,829✔
1412
  if (TSDB_DATA_TYPE_VARBINARY == para0Type) {
401,829!
UNCOV
1413
    return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
×
1414
  }
1415

1416
  // The function return type has been set during syntax parsing
1417
  uint8_t para2Type = pFunc->node.resType.type;
401,829✔
1418

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

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

1443
  return TSDB_CODE_SUCCESS;
401,829✔
1444
}
1445

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

1462
  // set result type
1463
  pFunc->node.resType = (SDataType){.bytes = 64, .type = TSDB_DATA_TYPE_BINARY};
2,737✔
1464
  return TSDB_CODE_SUCCESS;
2,737✔
1465
}
1466

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

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

1490
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[resType].bytes, .type = resType};
2,522✔
1491
  return TSDB_CODE_SUCCESS;
2,522✔
1492
}
1493

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

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

1510
  // add client timezone as param
1511
  code = addTimezoneParam(pFunc->pParameterList);
5,007✔
1512
  if (code != TSDB_CODE_SUCCESS) {
5,007!
1513
    return code;
×
1514
  }
1515

1516
  pFunc->node.resType =
5,007✔
1517
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_TIMESTAMP].bytes, .type = TSDB_DATA_TYPE_TIMESTAMP};
5,007✔
1518
  return TSDB_CODE_SUCCESS;
5,007✔
1519
}
1520

1521
static int32_t translateAddPrecOutBigint(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
13,675✔
1522
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
13,675✔
1523

1524
  // add database precision as param
1525
  uint8_t dbPrec = pFunc->node.resType.precision;
11,569✔
1526

1527
  int32_t code = addUint8Param(&pFunc->pParameterList, dbPrec);
11,569✔
1528
  if (code != TSDB_CODE_SUCCESS) {
11,569!
1529
    return code;
×
1530
  }
1531

1532
  pFunc->node.resType =
11,569✔
1533
      (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes, .type = TSDB_DATA_TYPE_BIGINT};
11,569✔
1534
  return TSDB_CODE_SUCCESS;
11,569✔
1535
}
1536

1537
static int32_t translateToJson(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
9✔
1538
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
9!
1539
  pFunc->node.resType = (SDataType){.bytes = tDataTypes[TSDB_DATA_TYPE_JSON].bytes, .type = TSDB_DATA_TYPE_JSON};
9✔
1540
  return TSDB_CODE_SUCCESS;
9✔
1541
}
1542

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

1548
  return TSDB_CODE_SUCCESS;
74✔
1549
}
1550

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

1556
  return TSDB_CODE_SUCCESS;
9✔
1557
}
1558

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

1563
  return TSDB_CODE_SUCCESS;
54✔
1564
}
1565

1566
static int32_t translateSelectValue(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
23,078✔
1567
  int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
23,078!
1568
  if (numOfParams <= 0) {
23,078!
1569
    return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
×
1570
  }
1571

1572
  pFunc->node.resType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
23,078✔
1573
  return TSDB_CODE_SUCCESS;
23,078✔
1574
}
1575

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

1581
static bool getBlockDistFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
6✔
1582
  pEnv->calcMemSize = sizeof(STableBlockDistInfo);
6✔
1583
  return true;
6✔
1584
}
1585

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

1594

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

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

1605
static int32_t translateOutVarchar(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
82,489✔
1606
  FUNC_ERR_RET(validateParam(pFunc, pErrBuf, len));
82,489✔
1607
  int32_t bytes = 0;
82,453✔
1608
  switch (pFunc->funcType) {
82,453!
1609
    case FUNCTION_TYPE_MD5:
59✔
1610
      bytes = MD5_OUTPUT_LEN + VARSTR_HEADER_SIZE;
59✔
1611
      break;
59✔
1612
    case FUNCTION_TYPE_USER:
×
1613
    case FUNCTION_TYPE_CURRENT_USER:
1614
      bytes = TSDB_USER_LEN;
×
1615
      break;
×
1616
    case FUNCTION_TYPE_SERVER_VERSION:
166✔
1617
    case FUNCTION_TYPE_CLIENT_VERSION:
1618
      bytes = TSDB_VERSION_LEN;
166✔
1619
      break;
166✔
1620
    case FUNCTION_TYPE_DATABASE:
46✔
1621
      bytes = TSDB_DB_NAME_LEN;
46✔
1622
      break;
46✔
1623
    case FUNCTION_TYPE_BLOCK_DIST:
16✔
1624
    case FUNCTION_TYPE_BLOCK_DIST_INFO:
1625
      bytes = sizeof(STableBlockDistInfo);
16✔
1626
      break;
16✔
1627
    case FUNCTION_TYPE_TO_CHAR:
1,062✔
1628
      bytes = 4096;
1,062✔
1629
      break;
1,062✔
1630
    case FUNCTION_TYPE_HYPERLOGLOG_STATE_MERGE:
1,157✔
1631
    case FUNCTION_TYPE_HYPERLOGLOG_PARTIAL:
1632
    case FUNCTION_TYPE_HYPERLOGLOG_STATE:
1633
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
1,157✔
1634
      break;
1,157✔
1635
    case FUNCTION_TYPE_SPREAD_PARTIAL:
1,024✔
1636
    case FUNCTION_TYPE_SPREAD_STATE:
1637
    case FUNCTION_TYPE_SPREAD_STATE_MERGE:
1638
      bytes = getSpreadInfoSize() + VARSTR_HEADER_SIZE;
1,024✔
1639
      break;
1,024✔
1640
    case FUNCTION_TYPE_APERCENTILE_PARTIAL:
1,118✔
1641
      bytes = getApercentileMaxSize() + VARSTR_HEADER_SIZE;
1,118✔
1642
      break;
1,118✔
1643
    case FUNCTION_TYPE_STD_STATE:
872✔
1644
    case FUNCTION_TYPE_STD_STATE_MERGE:
1645
    case FUNCTION_TYPE_STD_PARTIAL:
1646
      bytes = getStdInfoSize() + VARSTR_HEADER_SIZE;
872✔
1647
      break;
872✔
1648
    case FUNCTION_TYPE_AVG_PARTIAL:
3,830✔
1649
    case FUNCTION_TYPE_AVG_STATE:
1650
    case FUNCTION_TYPE_AVG_STATE_MERGE:
1651
      bytes = getAvgInfoSize() + VARSTR_HEADER_SIZE;
3,830✔
1652
      break;
3,830✔
1653
    case FUNCTION_TYPE_HISTOGRAM_PARTIAL:
×
1654
      bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE;
×
1655
      break;
×
1656
    case FUNCTION_TYPE_HISTOGRAM:
1,426✔
1657
    case FUNCTION_TYPE_HISTOGRAM_MERGE:
1658
      bytes = 512;
1,426✔
1659
      break;
1,426✔
1660
    case FUNCTION_TYPE_LEASTSQUARES:
488✔
1661
      bytes = LEASTSQUARES_BUFF_LENGTH;
488✔
1662
      break;
488✔
1663
    case FUNCTION_TYPE_TBNAME:
57,760✔
1664
      bytes = TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE;
57,760✔
1665
      break;
57,760✔
1666
    case FUNCTION_TYPE_TIMEZONE:
6,156✔
1667
      bytes = timeZoneStrLen();
6,156✔
1668
      break;
6,156✔
1669
    case FUNCTION_TYPE_IRATE_PARTIAL:
91✔
1670
      bytes = getIrateInfoSize((pFunc->hasPk) ? pFunc->pkBytes : 0) + VARSTR_HEADER_SIZE;
91✔
1671
      break;
91✔
1672
    case FUNCTION_TYPE_FIRST_PARTIAL:
7,182✔
1673
    case FUNCTION_TYPE_LAST_PARTIAL:
1674
    case FUNCTION_TYPE_FIRST_STATE:
1675
    case FUNCTION_TYPE_LAST_STATE:
1676
      bytes = getFirstLastInfoSize(getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes,
7,182✔
1677
                                   (pFunc->hasPk) ? pFunc->pkBytes : 0) + VARSTR_HEADER_SIZE;
7,182✔
1678
      break;
7,182✔
UNCOV
1679
    case FUNCTION_TYPE_FIRST_STATE_MERGE:
×
1680
    case FUNCTION_TYPE_LAST_STATE_MERGE:
UNCOV
1681
      bytes = getSDataTypeFromNode(nodesListGetNode(pFunc->pParameterList, 0))->bytes;
×
UNCOV
1682
      break;
×
1683
    default:
×
1684
      bytes = 0;
×
1685
      break;
×
1686
  }
1687
  pFunc->node.resType = (SDataType){.bytes = bytes, .type = TSDB_DATA_TYPE_VARCHAR};
82,453✔
1688
  return TSDB_CODE_SUCCESS;
82,453✔
1689
}
1690

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

1707
    if (i == 2) {
5,970✔
1708
      char errMsg[128] = {0};
2,078✔
1709
      binDesc = varDataVal(pValue->datum.p);
2,078✔
1710
      if (TSDB_CODE_SUCCESS != validateHistogramBinDesc(binDesc, binType, errMsg, (int32_t)sizeof(errMsg))) {
2,078✔
1711
        return buildFuncErrMsg(pErrBuf, len, TSDB_CODE_FUNC_FUNTION_ERROR, errMsg);
264✔
1712
      }
1713
    }
1714
  }
1715
  return TSDB_CODE_SUCCESS;
1,814✔
1716
}
1717

1718
static int32_t translateHitogram(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
1,477✔
1719
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
1,477✔
1720
  pFunc->node.resType = (SDataType){.bytes = 512, .type = TSDB_DATA_TYPE_BINARY};
1,101✔
1721
  return TSDB_CODE_SUCCESS;
1,101✔
1722
}
1723
static int32_t translateHistogramPartial(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
713✔
1724
  FUNC_ERR_RET(translateHistogramImpl(pFunc, pErrBuf, len));
713!
1725
  pFunc->node.resType =
713✔
1726
      (SDataType){.bytes = getHistogramInfoSize() + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_BINARY};
713✔
1727
  return TSDB_CODE_SUCCESS;
713✔
1728
}
1729

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

5602
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